Введение в глубокое обучение. Узнайте, как обучать модели с помощью TensorFlow.

искусственный интеллект TensorFlow глубокое обучение API

Приветствую всех вСообщество облачных технологий Tencent, получить больше крупной технической практики Tencent по галантерее ~

автор:Фу Юэ

Введение

Tensorflow добавил много новых функций после обновления до версии 1.0, среди которых много глубоких сетевых структур, написанных на tf framework (GitHub.com/tensorflow/…), что значительно снижает сложность разработки.Использование готовой структуры сети гораздо удобнее для тонкой настройки или переобучения. Недавно автор, наконец, пробежался по модели ssd_mobilenet_v1 API обнаружения объектов TensorFlow. Здесь я описываю весь процесс подготовки данных к использованию модели. Я считаю, что это может быть полезно для меня и некоторых студентов.

API обнаружения объектов предоставляет предварительно обученные веса для 5 сетевых структур, все из которыхCOCOПять моделей: SSD+mobilenet, SSD+inception_v2, R-FCN+resnet101, более быстрая RCNN+resnet101 и более быстрая RCNN+inception+resnet101. Точность каждой модели и время, необходимое для расчета, следующие. Ниже приведено введение в то, как использовать обнаружение объектов для обучения вашей собственной модели.

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

Подготовка перед тренировкой:

Используйте protobuf для настройки модели и параметров обучения, поэтому библиотека protobuf должна быть скомпилирована до того, как API будет нормально использоваться.Здесь вы можете скачать напрямую скомпилированную библиотеку pb (GitHub.com/Google/pro Т…), после распаковки сжатого пакета добавьте protoc в переменную окружения:

$ cd tensorflow/models

$ protoc object_detection/protos/*.proto --python_out=.


(Я добавил protoc в переменную среды и столкнулся с ошибкой, что файл *.proto не найден. Позже я поместил protoc.exe в каталог models/object_detection и повторно запустил его)

Затем добавьте модели и slim (расширенный фреймворк tf) в переменные окружения python:

PYTHONPATH=$PYTHONPATH:/your/path/to/tensorflow/models:/your/path/to/tensorflow/models/slim


подготовка данных:

Набор данных необходимо преобразовать в структуру PASCAL VOC API предоставляет create_pascal_tf_record.py для преобразования набора данных структуры VOC в формат .record. Но мы нашли более легкий путь,DatitranОбеспечивает более простой способ создания формата .record.

Прежде всего, вам нужно отметить соответствующую метку изображения, здесь вы можете использоватьlabelImgинструмент. Каждый раз, когда образец маркируется, создается файл маркировки xml. Затем эти помеченные xml-файлы помещаются в два каталога в соответствии с набором для обучения и набором для проверки, а в Datitran предоставляется сценарий xml_to_csv.py. Здесь вам нужно только указать имя отмеченного каталога. Затем нам нужно преобразовать соответствующий формат csv в формат .record.

def main():
    # image_path = os.path.join(os.getcwd(), 'annotations')
    image_path = r'D:\training-sets\object-detection\sunglasses\label\test'
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('sunglasses_test_labels.csv', index=None)
    print('Successfully converted xml to csv.')


Вызов generate_tfrecord.py, обратите внимание на два параметра --csv_input и --output_path. Выполните следующую команду:

python generate_tfrecord.py --csv_input=sunglasses_test_labels.csv --output_path=sunglass_test.record


Это генерирует train.record и test.record для обучения и проверки. Затем укажите имя метки, перейдите по ссылке models/object_detection/data/pet_label_map.pbtxt, заново создайте файл и укажите имя метки.

item {
  id: 1
  name: 'sunglasses'
}


тренироваться:

В соответствии с вашими потребностями выберите модель, предварительно обученную с помощью набора данных кокоса, и поместите префикс model.ckpt в каталог для обучения.Здесь метафайл сохраняет график и метаданные, а ckpt сохраняет веса сети. Эти файлы представляют начальное состояние предварительно обученной модели.

Откройте файл ssd_mobilenet_v1_pets.config и внесите следующие изменения:

  1. num_classes: изменить на свои собственные классы num

  1. Измените все места PATH_TO_BE_CONFIGURED на пути, которые вы установили ранее (всего 5 мест)

Все остальные параметры остаются параметрами по умолчанию.

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

python object_detection/train.py \
--logtostderr \
--pipeline_config_path= D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config \
--train_dir=D:/training-sets/data-translate/training


Мониторинг TensorBoard:

Через инструмент tensorboard можно следить за процессом обучения.После ввода команды west введите в браузере localhost:6006 (по умолчанию).

tensorboard --logdir= D:/training-sets/data-translate/training


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

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

Экспорт модели Freeze Model:

Перед просмотром фактического эффекта модели нам нужно экспортировать файл процесса обучения, чтобы создать файл модели .pb. Первоначально tensorflow/python/tools/freeze_graph.py предоставляет API модели замораживания, но ему необходимо предоставить окончательные имена узлов вывода (обычно это имя функции активации последнего слоя, такого как softmax) и обнаружение объекта. API предоставляет предварительно обученную сеть, конечное имя узла найти непросто, поэтому файл export_inference_graph.py также предоставляется в каталоге object_detection.

python export_inference_graph.py \
--input_type image_tensor
--pipeline_config_path D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config \
--trained_checkpoint_prefix D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config /model.ckpt-* \
--output_directory D:/training-sets /data-translate/training/result


После завершения экспорта в каталоге output_directory будут созданы файлы Frozen_inference_graph.pb, model.ckpt.data-00000-of-00001, model.ckpt.meta и model.ckpt.data.

Вызовите генеративную модель:

Есть пример вызова в самой директории, немного измененный следующим образом:

import cv2
import numpy as np
import tensorflow as tf
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util


class TOD(object):
    def __init__(self):
        self.PATH_TO_CKPT = r'D:\lib\tf-model\models-master\object_detection\training\frozen_inference_graph.pb'
        self.PATH_TO_LABELS = r'D:\lib\tf-model\models-master\object_detection\training\sunglasses_label_map.pbtxt'
        self.NUM_CLASSES = 1
        self.detection_graph = self._load_model()
        self.category_index = self._load_label_map()

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

    def _load_label_map(self):
        label_map = label_map_util.load_labelmap(self.PATH_TO_LABELS)
        categories = label_map_util.convert_label_map_to_categories(label_map,
                                                                    max_num_classes=self.NUM_CLASSES,
                                                                    use_display_name=True)
        category_index = label_map_util.create_category_index(categories)
        return category_index

    def detect(self, image):
        with self.detection_graph.as_default():
            with tf.Session(graph=self.detection_graph) as sess:
                # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
                image_np_expanded = np.expand_dims(image, axis=0)
                image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
                boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
                scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
                classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
                num_detections = self.detection_graph.get_tensor_by_name('num_detections:0')
                # Actual detection.
                (boxes, scores, classes, num_detections) = sess.run(
                    [boxes, scores, classes, num_detections],
                    feed_dict={image_tensor: image_np_expanded})
                # Visualization of the results of a detection.
                vis_util.visualize_boxes_and_labels_on_image_array(
                    image,
                    np.squeeze(boxes),
                    np.squeeze(classes).astype(np.int32),
                    np.squeeze(scores),
                    self.category_index,
                    use_normalized_coordinates=True,
                    line_thickness=8)

        cv2.namedWindow("detection", cv2.WINDOW_NORMAL)
        cv2.imshow("detection", image)
        cv2.waitKey(0)

if __name__ == '__main__':
    image = cv2.imread('image.jpg')
    detecotr = TOD()
    detecotr.detect(image)


Вот некоторые эффекты распознавания изображений:

Связанное Чтение

Когда обучение с подкреплением встречается с функциональным анализом

Google Cloud: бедняки могут играть в глубокое обучение

[Я Джарвис]: расскажите об алгоритме глубокого обучения, лежащем в основе FaceID.

Эта статья была разрешена автором для публикации в сообществе Tencent Cloud Technology Community, укажите это при перепечатке.Источник статьи
Исходная ссылка: https://cloud.tencent.com/community/article/351424