Computer vision, Machine Learning

Детектирование пользовательских объектов

Время прочтения: 7 мин.

Код вы можете скачать на моей странице GitHub (ссылка)

Добро пожаловать в статью по распознаванию. Так как большую часть рабочего времени я провожу в офисном пространстве open space, где каждое место пронумеровано, решил рассказать вам о компьютерном зрении на примере обычной таблички с номером рабочего места. Здесь мы дообучим нейросеть детектировать выбранную нами табличку.

Я использую python3.7 и названия всех модулей с версиями хранятся в файле requirements.txt.

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

Для обучения нужно пройти следующие шаги:

  • Соберите по крайней мере 500 изображений, содержащих ваш объект — абсолютный минимум будет около 100, в идеале больше 1000 или больше, но чем больше изображений у вас есть, тем более утомительным будет Шаг 2.
  • Разделите эти данные на обучающие/тестовые образцы. Обучающие данные должны составлять около 80%, а тестовые-около 20%.
  • Генерируйте записи TF для этих изображений.
  • Настройте файл. config для выбранной модели (вы можете обучить свою собственную с нуля, но мы будем использовать трансферное обучение).
  • Тренируйте вашу модель.
  • Экспорт графа вывода из новой обученной модели.
  • Обнаружение пользовательских объектов.

TensorFlow нуждается в сотнях изображений объекта, чтобы обучить хороший классификатор обнаружения, лучше всего было бы по крайней мере 1000 изображений для одного объекта. Чтобы обучить надежный классификатор, обучающие изображения должны иметь случайные объекты в изображении наряду с желаемыми объектами, а также должны иметь различные фоны и условия освещения. Должно быть несколько изображений, где нужный объект частично скрыт, перекрывается с чем-то другим или только наполовину на картинке.

В моем классификаторе я буду использовать один объект, который я хочу обнаружить (табличка).

Изображения:

А вот тут начинается самое интересное. Когда все фотографии собраны, пришло время пометить нужные объекты на каждой картинке. LabelImg-это отличный инструмент для маркировки изображений, и на его странице GitHub есть очень четкие инструкции о том, как его установить и использовать.

LabelImg ссылка на GitHub (ссылка)

LabelImg ссылка для скачивания (ссылка)

Загрузите и установите LabelImg, при запуске этого приложения вы должны получить окно GUI. Отсюда выберите пункт — Открыть каталог dir и выберите каталог, в который вы сохранили все свои изображения. Теперь вы можете начать аннотировать изображения с помощью кнопки create rectbox. Нарисуйте свою коробку, добавьте имя и нажмите кнопку ОК. Сохраните, нажмите на следующее изображение и повторите! Вы можете нажать клавишу w, чтобы нарисовать поле, и сделать ctrl+s, чтобы сохранить его быстрее. Для меня это заняло в среднем 1 час на 100 изображений, это зависит от количества объектов, которые у вас есть на изображении. Имейте в виду, это займет некоторое время!

LabelImg сохраняет xml-файл, содержащий данные метки для каждого изображения. Эти xml-файлы будут использоваться для создания TFRecords, которые являются одним из входных данных для тренера TensorFlow. После того, как вы пометили и сохранили каждое изображение, для каждого изображения в каталогах \test и \train будет создан один xml-файл.

Как только вы пометите свои изображения, мы разделим их на обучающие и тестовые группы. Чтобы сделать это, просто скопируйте около 20% ваших фотографий и их аннотаций XML-файлов в новый каталог под названием test, а затем скопируйте оставшиеся в новый каталог под названием train.

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

Во-первых, данные image .xml будут использоваться для создания csv-файлов, содержащих все данные для тренировочных и тестовых изображений. Из главной папки, если вы используете ту же структуру файлов выполните в командной строке следующую команду: python xml_to_csv.py.

Это создает файл train_labels.csv и test_labels.csv в папке CSGO_images. Чтобы избежать использования cmd, я создал короткий скрипт .bat под названием xml_to_csv.bat.

Затем откройте generate_tfrecord.py файл в текстовом редакторе. Замените карту меток своей собственной картой меток, где каждому объекту присваивается идентификационный номер. Это же присвоение номера будет использоваться при настройке файла labelmap.pbtxt.

Например, если вы обучаете свой собственный классификатор, вы замените следующий код в generate_tfrecord.py:

# TO-DO замените это на label map
def class_text_to_int(row_label):
    if row_label == 'table':
        return 1
    else:
        return None

Затем сгенерируйте файлы TFRecord, запустив мой созданный файл generate_tfrecord.bat.

Эти строки генерируют файлы train.record и test.record в папке training. Они будут использоваться для обучения нового классификатора обнаружения объектов.

Последнее, что нужно сделать перед обучением — это создать карту меток и отредактировать файл конфигурации обучения. Карта меток сообщает тренеру, что представляет собой каждый объект, определяя сопоставление имен классов с идентификационными номерами классов. С помощью текстового редактора создал новый файл и сохранил его как labelmap.pbtxt в папке CSGO_training. В текстовом редакторе создал карту меток. Идентификационные номера карт меток должны быть такими же, как определено в generate_tfrecord.py.

item {
 id: 1
 name: 'table'
}

Настройка обучения:

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

Перешел в каталог TensorFlow research\ object_detection\ samples\ configs и скопировал файл faster_rcnn_ inception_v2_ coco.config в каталог CSGO_training. Затем открыл файл с помощью текстового редактора. В этот файл .config необходимо внести несколько изменений, в основном изменив количество классов, примеров и добавив пути к файлам для обучающих данных. Строка 10. изменил num_classes на количество различных объектов, которые должен обнаружить классификатор. Для моего случая было так:

num_classes : 1
строка 107. изменил fine_tune_checkpoint на:
fine_tune_checkpoint : "faster_rcnn_inception_v2_coco_2018_01_28 / model.ckpt"
Строки 122 и 124. в разделе train_input_reader изменил input_path и label_map_path на:
input_path: "CSGO_images / train. record"
label_map_path: "CSGO_training / labelmap.pbtxt"
Линия 128. Изменил num_examples на количество изображений, имеющихся в каталоге CSGO_images\test. У меня есть 113 изображений, поэтому я меняю их на:
num_examples: 113
(Загружать все не стал)
Строки 136 и 138. в разделе eval_input_reader измените input_path и label_map_path на:
input_path: "CSGO_images / test. record"
label_map_path: "CSGO_training / labelmap.pbtxt"

Сохранил файл после внесения изменений. Вот и все! Обучающие файлы подготовлены и настроены для обучения. До тренировки остался еще один шаг.

Запустите тренировку:

Осталось запустить обучение, запустив файл train.bat.

Если все было настроено правильно, TensorFlow инициализирует обучение. Инициализация может занять от 30 до 60 секунд, прежде чем начнется фактическое обучение. Когда начнется тренировка, она будет выглядеть так:

На рисунке выше каждый шаг обучения сообщает о потере. Он будет начинаться высоко и становиться все ниже и ниже по мере тренировки. Для моего обучения он начинался примерно с 1.5 . Я рекомендую позволить вашей модели тренироваться до тех пор, пока потеря последовательно не упадет ниже 0,05, что может занять довольно большое количество шагов или около нескольких часов (в зависимости от того, насколько мощен ваш процессор или графический процессор). При использовании другой модели, цифры потерь могут быть разными. Кроме того, это зависит от объектов, которые вы хотите обнаружить.

Теперь нужно экспортировать график вывода и обнаруживать наши собственные пользовательские объекты.

Экспорт Графика Вывода:

Теперь, когда обучение завершено, последний шаг — это создание замороженного графика вывода (наша модель обнаружения). В папке graph лежит файл export_inference_graph.py, затем из командной строки  выполните следующую команду, где “XXXX” в” model.ckpt-XXXX » должен быть заменен на самый высокий номер файла .ckpt в папке обучения:

python export_inference_graph.py --input_type image_tensor --pipeline_config_path CSGO_training/faster_rcnn_inception_v2_coco.config --trained_checkpoint_prefix CSGO_training/model.ckpt-XXXX --output_directory CSGO_inference_graph

Используйте наш обученный пользовательский классификатор обнаружения объектов:

Приведенная выше строка создает файл frozen_inference_graph.pb в папке /coco_v3/ CSGO_inference_ graph. Файл .pb содержит классификатор обнаружения объектов. Переименуйте его в frozen_inference_graph.pb . В папке coco_v3 возьмите файл predict.py Изменил строку 39 на мой замороженный файл графика вывода.

PATH_TO_FROZEN_GRAPH = 'graph/frozen_inference_graph.pb'

Изменена строка 41 в мой файл labelmap.

PATH_TO_LABELS = 'graph/labelmap.pbtxt'

И, наконец, перед запуском скриптов Python вам нужно изменить переменную NUM_CLASSES в скрипте, чтобы она равнялась количеству классов, которые мы хотим обнаружить. Я использую только 1 класс, поэтому я изменил его на 1:
NUM_CLASSES = 1

В 65 строчке вам нужно задать картинку, на которой будет происходить детектирование.

После запуска вы увидите окно и распознанную табличку.

На этом все, спасибо за внимание.

Советуем почитать