Глубоко и интересно | 09 Классификация изображений Inception-v3

искусственный интеллект TensorFlow глубокое обучение Нейронные сети
Глубоко и интересно | 09 Классификация изображений Inception-v3

Введение

Inception-v3 — это нейронная сеть, предложенная Google для реализации проекта ImageNet Large Visual Recognition Challenge.

Inception模型结构

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 официально предоставляет код для переобучения

GitHub.com/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четыре страницы

TensorBoard可视化

Если вам нужно выполнить другие задачи классификации изображений, организуйте соответствующие помеченные изображения и используйте имя метки в качестве имени подпапки.

Если вы хотите использовать обученную модель, обратитесь к следующему коду.

  • 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')

Ссылаться на

видеоурок

Глубоко и интересно (1)