Глубокое развлечение | 12 Давайте сделаем это вместе

Google искусственный интеллект TensorFlow GitHub
Глубокое развлечение | 12 Давайте сделаем это вместе

Введение

Реализуйте детектор рук в реальном времени с помощью TensorFlow.

Подобно пользовательской задаче классификации изображений Inception-v3 посредством трансферного обучения.

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

данные

Данные об обнаружении рук поступают из

vision.so IC.Indiana.quota/projects/spoof…

Фотография была сделана с помощью Google Class,egohands_data.zipЭто сжатый пакет, содержащий в общей сложности 48 папок, что соответствует в общей сложности 4800 помеченным изображениям в 48 различных сценах (в помещении, на улице, в шахматы и т. д.), а все метки представляют собой контурные точки рук.

Egohands数据集示例

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

egohands_dataset_clean.pyПоследовательно выполните следующие задания

  • Если нет текущего каталогаegohands_data.zipпотом скачать, то есть позвонитьdownload_egohands_dataset()
  • В противном случае распаковатьegohands_data.zipи получитьegohandsпапку и выполнить данные изображения в нейrename_files()
  • rename_files()Все изображения будут переименованы, а также имя их родительской папки, чтобы избежать дублирования имен изображений, и вызватьgenerate_csv_files()
  • generate_csv_files()Прочитайте картинку в каждой сцене, позвонитеget_bbox_visualize(), согласно файлу аннотацииpolygons.matНарисуйте контур руки и Anchor Box и отобразите его, а также преобразуйте и сохраните аннотацию изображения в виде файла csv.После завершения всей обработки вызовите его снова.split_data_test_eval_train()
  • split_data_test_eval_train()Завершите разделение тренировочного набора и тестового набора вimagesновый в папкеtrainиtestДве папки, в которых хранятся соответствующие изображения и аннотации csv соответственно.
  • После выполнения вышеперечисленных работ можно вручную удалить полученные в начале распакованные файлы.egohandsпапка

то есть изegohands_data.zipполучитьimagesпапка, в общей сложности на моем ноутбуке это заняло около 6 минут

Следующий звонокgenerate_tfrecord.py, организуйте обучающий набор и тестовый набор в файлы TFRecord

Поскольку здесь нужно обнаружить только руку, существует только одна категория объектов, а именноhand, если вам нужно настроить другие задачи обнаружения объектов, измените следующий код

def class_text_to_int(row_label):
    if row_label == 'hand':
        return 1
    else:
        None

Запустите следующие две команды, чтобы сгенерировать файлы TFRecord, соответствующие обучающему набору и тестовому набору.

python generate_tfrecord.py --csv_input=images/train/train_labels.csv  --output_path=retrain/train.record
python generate_tfrecord.py --csv_input=images/test/test_labels.csv  --output_path=retrain/test.record

Модель

Все еще используется в предыдущем классеssd_mobilenet_v1_coco, но здесь нужно обнаружить только руку, поэтому необходимо выполнить трансферное обучение на основе настраиваемых размеченных данных.

retrainСодержимое папки следующее

  • train.recordиtest.record: Аннотированные данные для пользовательских задач обнаружения объектов.
  • ssd_mobilenet_v1_coco_11_06_2017: предварительно обученныйssd_mobilenet_v1_cocoМодель
  • ssd_mobilenet_v1_coco.config: файл конфигурации для обучения модели с использованием трансферного обучения.
  • hand_label_map.pbtxt: Указывает сопоставление имени и номера категорий обнаружения.
  • retrain.py: обучающий код для трансферного обучения
  • object_detection: некоторые вспомогательные файлы

конфигурационный файлssd_mobilenet_v1_coco.configШаблон здесь

GitHub.com/tensorflow/…

Измените файл конфигурации по мере необходимости, в основном включаяPATH_TO_BE_CONFIGUREDэлемент конфигурации

  • num_classes: количество категорий объектов, здесь 1
  • fine_tune_checkpoint: файл контрольной точки предварительно обученной модели.
  • train_input_reader: указать данные тренировкиinput_pathи путь к файлу картыlabel_map_path
  • eval_input_reader: указать тестовые данныеinput_pathи путь к файлу картыlabel_map_path

файл картыhand_label_map.pbtxtСодержание следующее, есть только одна категория

item {
    id: 1
    name: 'hand'
}

Запустите обучение переносу модели с помощью следующей команды:train_dirвыходной путь для модели,pipeline_config_pathпуть для элементов конфигурации

python retrain.py --logtostderr --train_dir=output/ --pipeline_config_path=ssd_mobilenet_v1_coco.config

После завершения обучения переносу модели вoutputВ папке можно увидеть сгенерированный.data,.index,.metaфайл модели

Используйте TensorBoard для просмотра процесса обучения модели, общая потеря модели выглядит следующим образом

tensorboard --logdir='output'

手部检测模型训练总损失

Наконец, используйтеexport_inference_graph.pyупаковать модель в.pbдокумент

  • --pipeline_config_path: путь к файлу конфигурации
  • --trained_checkpoint_prefix: Путь контрольной точки модели
  • --output_directory:.pbпуть вывода файла
python export_inference_graph.py --input_type image_tensor --pipeline_config_path retrain/ssd_mobilenet_v1_coco.config  --trained_checkpoint_prefix retrain/output/model.ckpt-153192 --output_directory hand_detection_inference_graph

После запуска папка будет сгенерированаhand_detection_inference_graph, вы можете найтиfrozen_inference_graph.pbдокумент

применение

Теперь вы можете использовать обученную модель обнаружения рук для реализации детектора рук в реальном времени.

В основном измените следующие три строки кода

PATH_TO_CKPT = 'hand_detection_inference_graph/frozen_inference_graph.pb'
PATH_TO_LABELS = 'retrain/hand_label_map.pbtxt'
NUM_CLASSES = 1

Полный код выглядит следующим образом

# -*- coding: utf-8 -*-

import numpy as np
import tensorflow as tf

from utils import label_map_util
from utils import visualization_utils as vis_util

import cv2
cap = cv2.VideoCapture(0)

PATH_TO_CKPT = 'hand_detection_inference_graph/frozen_inference_graph.pb'
PATH_TO_LABELS = 'retrain/hand_label_map.pbtxt'
NUM_CLASSES = 1

detection_graph = tf.Graph()
with detection_graph.as_default():
	od_graph_def = tf.GraphDef()
	with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
		od_graph_def.ParseFromString(fid.read())
		tf.import_graph_def(od_graph_def, name='')

label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)

with detection_graph.as_default():
	with tf.Session(graph=detection_graph) as sess:
	    image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
	    detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
	    detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
	    detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
	    num_detections = detection_graph.get_tensor_by_name('num_detections:0')
	    while True:
	    	ret, image_np = cap.read()
	    	image_np = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
	    	image_np_expanded = np.expand_dims(image_np, axis=0)
	    	(boxes, scores, classes, num) = sess.run(
	    		[detection_boxes, detection_scores, detection_classes, num_detections], 
	    		feed_dict={image_tensor: image_np_expanded})
	    	
	    	vis_util.visualize_boxes_and_labels_on_image_array(image_np, np.squeeze(boxes), np.squeeze(classes).astype(np.int32), np.squeeze(scores), category_index, use_normalized_coordinates=True, line_thickness=8)
	    	
	    	cv2.imshow('hand detection', cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR))
	    	if cv2.waitKey(25) & 0xFF == ord('q'):
	    		cap.release()
	    		cv2.destroyAllWindows()
	    		break

После запуска кода вы можете увидеть результат обнаружения руки в камере.

手部检测结果

Пользовательские задачи проверки

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

использоватьlabelImgДля аннотации изображения, пожалуйста, обратитесь к следующей ссылке для способа установки

GitHub.com/Тайзу Таллинн/Ла…

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

python labelImg.py ../imgs/ ../predefined_classes.txt

Интерфейс маркировки показан на рисунке ниже, нажмитеwЧтобы начать рисовать прямоугольник, нажмитеCtrl+SСохранить аннотацию вxmlпапка

labelImg标注界面

бежать заxml_to_csv.pyдля преобразования.xmlфайл в.csvдокумент

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

  • новыйtrainиtestПапка и назначение изображений
  • Вручную пометьте изображения обучающего набора и тестового набора соответственно.
  • Обучающий набор и тестовый набор, соответствующие нескольким.xmlпревратиться в.csv
  • По оригинальной картинке и.csvСгенерируйте соответствующий TFRecord

Ссылаться на

видеоурок

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