Введение
Inception-v3 — это нейронная сеть, предложенная Google для реализации проекта ImageNet Large Visual Recognition Challenge.
Inception-v3 неоднократно использует Inception Block, включая множество сверток и пулов, в то время как ImageNet включает более 14 миллионов изображений с более чем 1000 категориями.
Поэтому ручное обучение Inception-v3 на ImageNet требует много ресурсов и времени.
Здесь мы выбираем загрузку предварительно обученной модели Inception-v3 для выполнения некоторых задач классификации изображений.
Подготовить
Предобученная модель состоит из трех частей
-
classify_image_graph_def.pb
: Структура и параметры модели Inception-v3 -
imagenet_2012_challenge_label_map_proto.pbtxt
: Соответствие номера категории строке категории -
imagenet_synset_to_human_label_map.txt
: Соответствие строки категории названию категории.
Например,169
соответствоватьn02510455
,соответствоватьgiant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca
Классификация изображений
загрузить библиотеку
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
Расположите два файла сопоставления, чтобы получить соответствие от номера категории к названию категории.
uid_to_human = {}
for line in tf.gfile.GFile('imagenet_synset_to_human_label_map.txt').readlines():
items = line.strip().split('\t')
uid_to_human[items[0]] = items[1]
node_id_to_uid = {}
for line in tf.gfile.GFile('imagenet_2012_challenge_label_map_proto.pbtxt').readlines():
if line.startswith(' target_class:'):
target_class = int(line.split(': ')[1])
if line.startswith(' target_class_string:'):
target_class_string = line.split(': ')[1].strip('\n').strip('\"')
node_id_to_uid[target_class] = target_class_string
node_id_to_name = {}
for key, value in node_id_to_uid.items():
node_id_to_name[key] = uid_to_human[value]
модель нагрузки
def create_graph():
with tf.gfile.FastGFile('classify_image_graph_def.pb', 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
Определите функцию для классификации изображений
def classify_image(image, top_k=1):
image_data = tf.gfile.FastGFile(image, 'rb').read()
create_graph()
with tf.Session() as sess:
# 'softmax:0': A tensor containing the normalized prediction across 1000 labels
# 'pool_3:0': A tensor containing the next-to-last layer containing 2048 float description of the image
# 'DecodeJpeg/contents:0': A tensor containing a string providing JPEG encoding of the image
softmax_tensor = sess.graph.get_tensor_by_name('softmax:0')
predictions = sess.run(softmax_tensor, feed_dict={'DecodeJpeg/contents:0': image_data})
predictions = np.squeeze(predictions)
top_k = predictions.argsort()[-top_k:]
for node_id in top_k:
human_string = node_id_to_name[node_id]
score = predictions[node_id]
print('%s (score = %.5f)' % (human_string, score))
Вызовите функцию классификации изображений и укажите параметрыtop_k
Может возвращать наиболее вероятные множественные результаты классификации
classify_image('test1.png')
Результаты классификации следующие
-
test1
: гигантская панда, панда, медведь-панда, медведь-енот, Ailuropoda melanoleuca (оценка = 0,89107) -
test2
: пекинес, пекинес, пекинес (балл = 0,90348) -
test3
: самоед, самоед (балл = 0,92054)
Пользовательские задачи классификации
Inception-v3 предназначен для задач классификации изображений ImageNet, поэтому количество нейронов в последнем полносвязном слое совпадает с количеством классификационных меток.
Если вам нужно настроить задачу классификации, вам нужно только использовать свои собственные размеченные данные, а затем заменить последний полносвязный слой.
Количество нейронов в полносвязном слое последнего слоя равно количеству меток для пользовательской задачи классификации.Модель обучает только параметры последнего слоя, а остальные параметры остаются неизменными.
Он сохраняет способность Inception-v3 понимать и абстрагировать изображения, удовлетворяя при этом индивидуальные задачи классификации, что является типичным прикладным сценарием трансферного обучения.
TensorFlow официально предоставляет руководство по обучению миграции на Inception-v3.
woohoo.tensorflow.org/tutorials/i…
Используемые данные состояли из сфотографированных изображений пяти видов цветов.
- маргаритка: маргаритка
- одуванчик: одуванчик
- розы: розы
- подсолнухи: подсолнухи
- тюльпаны: тюльпаны
После удаления последнего полносвязного слоя для входного изображения представление выходных данных модели называется узким местом.
Вычисление Узкого места всех изображений заранее и их кэширование может сэкономить много времени на обучение, потому что в будущем нужно только вычислить и изучить только скрытый слой между Узким местом и выходной меткой.
TensorFlow официально предоставляет код для переобучения
Используется в командной строке, некоторые необязательные аргументы командной строки включают
-
--image_dir
: каталог обучающих изображений -
--output_graph
: Каталог сохранения модели -
--output_labels
: Папка для сохранения этикетки модели -
--summaries_dir
: Каталог для сохранения журнала модели. -
--how_many_training_steps
: количество итераций обучения, по умолчанию 4000 -
--learning_rate
: скорость обучения, по умолчанию 0,01 -
--testing_percentage
: Доля тестового набора, по умолчанию 10% -
--validation_percentage
: проверьте установленное соотношение, по умолчанию 10% -
--eval_step_interval
: частота оценки модели, по умолчанию раз в 10 итераций. -
--train_batch_size
: размер тренировочного пакета, по умолчанию 100 -
--print_misclassified_test_images
: нужно ли выводить все неправильно классифицированные изображения набора тестов, по умолчанию — False. -
--model_dir
: Путь к модели Inception-v3 -
--bottleneck_dir
: Каталог кэша узких мест -
--final_tensor_name
: имя недавно добавленного последнего полносвязного слоя, по умолчаниюfinal_result
-
--flip_left_right
: Отражать ли половину изображения по горизонтали случайным образом, по умолчанию установлено значение False. -
--random_crop
: коэффициент случайного кадрирования, по умолчанию 0, что означает отсутствие кадрирования. -
--random_scale
: коэффициент случайного увеличения, по умолчанию 0, что означает отсутствие увеличения -
--random_brightness
: коэффициент случайного повышения яркости, по умолчанию 0, что означает отсутствие повышения яркости. -
--architecture
: модель для переноса, по умолчаниюinception_v3
, самая высокая точность, но более длительное время обучения, вы также можете выбрать'mobilenet_<parameter size>_<input_size>[_quantized]'
,Напримерmobilenet_1.0_224
иmobilenet_0.25_128_quantized
запустить код
python retrain.py --image_dir flower_photos --output_graph output_graph.pb --output_labels output_labels.txt --summaries_dir summaries_dir --model_dir .. --bottleneck_dir bottleneck_dir
Опечатки для контента в видео здесь
- будет
--output_graph
Послеoutput_graph
изменить наoutput_graph.pb
- будет
--output_labels
Послеoutput_labels
изменить наoutput_labels.txt
Показатели точности классификации на проверочном и тестовом наборах составляют 91% и 91,2% соответственно.
Всего на моем ноутбуке это заняло 55 минут, из которых 44 минуты ушло на кэширование узких мест, но без кэширования пришлось бы пересчитывать каждую итерацию во время обучения
summaries_dir
Журналы обучения в каталоге можно использовать для визуализации TensorBorad.
tensorboard --logdir summaries_dir
затем посетите в своем браузереhttp://localhost:6006, вы можете увидеть эффект визуализации, в том числеSCALARS
,GRAPHS
,DISTRIBUTIONS
,HISTOGRAMS
четыре страницы
Если вам нужно выполнить другие задачи классификации изображений, организуйте соответствующие помеченные изображения и используйте имя метки в качестве имени подпапки.
Если вы хотите использовать обученную модель, обратитесь к следующему коду.
-
output_labels.txt
: путь к файлу категории категории -
output_graph.pb
: путь обученной модели -
read_image()
: Функция чтения изображения -
input_operation
: соответствует вводу изображенияoperation
-
output_operation
: соответствует выходу классификацииoperation
-
test.jpg
: путь к изображению для классификации
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
labels = []
for line in tf.gfile.GFile('output_labels.txt').readlines():
labels.append(line.strip())
def create_graph():
graph = tf.Graph()
graph_def = tf.GraphDef()
with open('output_graph.pb', 'rb') as f:
graph_def.ParseFromString(f.read())
with graph.as_default():
tf.import_graph_def(graph_def)
return graph
def read_image(path, height=299, width=299, mean=128, std=128):
file_reader = tf.read_file(path, 'file_reader')
if path.endswith('.png'):
image_reader = tf.image.decode_png(file_reader, channels=3, name='png_reader')
elif path.endswith('.gif'):
image_reader = tf.squeeze(tf.image.decode_gif(file_reader, name='gif_reader'))
elif path.endswith('.bmp'):
image_reader = tf.image.decode_bmp(file_reader, name='bmp_reader')
else:
image_reader = tf.image.decode_jpeg(file_reader, channels=3, name='jpeg_reader')
image_np = tf.cast(image_reader, tf.float32)
image_np = tf.expand_dims(image_np, 0)
image_np = tf.image.resize_bilinear(image_np, [height, width])
image_np = tf.divide(tf.subtract(image_np, [mean]), [std])
sess = tf.Session()
image_data = sess.run(image_np)
return image_data
def classify_image(image, top_k=1):
image_data = read_image(image)
graph = create_graph()
with tf.Session(graph=graph) as sess:
input_operation = sess.graph.get_operation_by_name('import/Mul')
output_operation = sess.graph.get_operation_by_name('import/final_result')
predictions = sess.run(output_operation.outputs[0], feed_dict={input_operation.outputs[0]: image_data})
predictions = np.squeeze(predictions)
top_k = predictions.argsort()[-top_k:]
for i in top_k:
print('%s (score = %.5f)' % (labels[i], predictions[i]))
classify_image('test.jpg')
Ссылаться на
- Глубокое обучение с Tensorflow, часть 2 — Классификация изображений:к data science.com/deep - ааа, позволь тебе…
- Углубление с извилинами:АР Вест V.org/PDF/1409.48…
- Имиджнет:image-net.org/
- Распознавание изображений:woohoo.tensorflow.org/tutorials/i…
- Как переобучить последний слой Inception для новых категорий:woohoo.tensorflow.org/tutorials/i…
- Сверточная нейронная сеть — Эндрю Нг Специалист по глубокому обучению — NetEase Cloud ClassroomМу OC.study.163.com/learn/20012…