Это еще одна история из текущей серии об обнаружении объектов с помощью YOLO (You Only Look Once), первая из которых представляет собой введение в алгоритм и краткое исследование (некоторых) различных его реализаций: https://medium.com/@monocasero/object-detection-with-yolo-implementations-and-how-to-use-them-5da928356035

Вступление

Различные реализации YOLO (Darknet, Darkflow и т. Д.) - это потрясающие инструменты, которые можно использовать, чтобы начать обнаружение общих объектов на изображениях или видео из коробки, для этого необходимо только скачать и установить систему и уже натренированные гири. Например, на официальном сайте Darknet мы можем найти шаги для получения и использования весов, обученных для COCO dataset или VOC PASCAL.

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

Это руководство будет шаг за шагом следовать процедуре создания набора данных и запуска обучения с использованием Darkflow (перевод Darknet для работы с TensorFlow).

Шаг 1. Получите изображения

В этом руководстве мы научим Darkflow обнаруживать текст на иллюстрированных картах.

Как вы понимаете, изображения такого типа создают проблему, потому что они обычно очень большие по размеру и содержат множество экземпляров класса, который мы обнаруживаем (текст). Поэтому мы будем использовать плиточную версию изображений. Для создания этих плиток мы можем использовать следующий инструмент:

Https://pinetools.com/split-image

В моем случае я создал сетку квадратов 608 пикселей. на 608 пикселей.

Естественно, этот шаг не является обязательным и может не потребоваться, если ваши изображения одинакового размера и не содержат много объектов.

Шаг 2. Добавьте аннотации к объектам

Поскольку эта конкретная проблема (поиск текста на картах) требует обнаружения только одного класса, мы будем использовать мою вилку BBox-Label-Tool https://github.com/enriqueav/BBox-Label-Tool для аннотирования изображений. Его также проще установить и проще использовать, чем другие альтернативы.

(Если ваша проблема включает обнаружение нескольких классов для изображения, я предлагаю вам использовать что-то более сложное, например https://github.com/tzutalin/labelImg)

Для установки BBox-Label-Tool запустим:

pip install pillow
git clone https://github.com/enriqueav/BBox-Label-Tool.git
cd BBox-Label-Tool

Структура каталогов организована как

BBox-Label-Tool
|
|--main.py # source code for the tool
|--Images/ # directory containing the images to be labeled
|--Labels/ # directory for the labeling results
|--Examples/ # directory for the example bboxes
|--AnnotationsXML/ # directory for the labeling results to be used by Darkflow

Внутри Images, Labels, Examples и AnnotationsXML инструмент ожидает найти пронумерованные каталоги, которые будут содержать подмножества изображений и их соответствующие аннотации. Мы создадим номер 002 для хранения изображений в нашем наборе данных.

mkdir Images/002 Labels/002 Examples/002 AnnotationsXML/002

А затем нам нужно скопировать все изображения (или плитки) из предыдущего шага в каталог Images/002

cp /path/to/your/images/*.jpg Images/002

И тогда мы можем запустить инструмент и пометить звездочкой!

python main.py

В исходном графическом интерфейсе в разделе «Image Dir:» мы введем «2» (для загрузки подмножества «002») и нажмем «Загрузить»:

Это загрузит все изображения в каталог Images/002, после чего мы сможем начать рисовать ограничивающие рамки, содержащие текст.

Закончив с изображением, мы нажимаем «Далее ››», чтобы перейти к следующему. Также можно вернуться назад или перейти к определенному номеру изображения с помощью панели инструментов навигации внизу.

Теперь нам нужно проделать этот процесс для каждого изображения. Естественно, это будет самый длинный и самый скучный этап процесса, но мы ничего не можем с этим поделать ¯ \ _ (ツ) _ / ¯.

Как только мы закончим с аннотациями, все полезные файлы .xml будут сохранены в AnnotationsXML/002 это то, что мы будем использовать для обучения Darkflow!

Шаг 3: Установка Darkflow

Чтобы загрузить и установить систему, проще всего выполнить следующие команды (вам может потребоваться заранее установить tenorflow и numpy):

git clone https://github.com/thtrieu/darkflow.git
cd darkflow
python3 setup.py build_ext --inplace

Дополнительную информацию можно найти на странице проекта на github: https://github.com/thtrieu/darkflow

Шаг 4: Изменение файлов конфигурации (настройка сети)

Существует две возможные конфигурации сети, которые можно использовать для обучения: yolo или tiny-yolo. Как следует из названия, tiny-yolo - это сеть меньшего размера, которая, очевидно, будет обрабатываться быстрее, но будет страдать от более низкой точности. В разделе cfg/ есть файлы конфигурации для обеих этих версий:

$ ls -1 cfg/ | grep yolo.cfg
tiny-yolo.cfg
yolo.cfg

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

cp cfg/yolo.cfg cfg/yolo-new.cfg
# modify cfg/yolo-new.cfg
vi cfg/yolo-new.cfg

Нам нужно изменить две строки:

  1. В последнем разделе [сверточный] нам нужно изменить количество filters, формула filters=(number of classes + 5)*5, так как у нас только один класс, мы устанавливаем filters=30.
  2. В разделе [регион] есть строка, в которой можно указать количество классов (около строки 244), изменить его на classes=1 или количество классов, которые у вас есть.

ПРИМЕЧАНИЕ: есть ряд параметров, особенно в начале файла, которые взяты непосредственно из Darknet, но не имеют значения в Darkflow. Например, batch=32 будет игнорироваться Darkflow, нам нужно указать размер пакета в командной строке (с --batch <batch_size>), иначе он примет значение по умолчанию 16. Другой пример - скорость обучения, которую вам нужно указать с помощью --lr <learning_rate>.

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

echo "map_text" >> one_label.txt

Шаг 5: Начало обучения

Мы прошли долгий путь, не так ли? Хорошая новость в том, что мы готовы проводить обучение.

Напоминаем, что на шаге 2 мы создали обучающий набор, состоящий из нескольких файлов изображений и соответствующего им XML-файла, содержащего аннотации. Они будут храниться в этих местах (вам нужно заменить ‹path_to_bbox-label-tool› на фактический путь, по которому вы установили скрипт.

<path_to_bbox-label-tool>/Images/002
<path_to_bbox-label-tool>/AnnotationsXML/002

Теперь, возвращаясь к Darkflow, чтобы начать обучение, нам нужно запустить

python3 flow --model cfg/yolo-new.cfg \
    --labels one_label.txt  \
    --train --trainer adam \
    --dataset "<path_to_bbox-label-tool>/Images/002" \
    --annotation "<path_to_bbox-label-tool>/AnnotationsXML/002"

Если у вас есть GPU для обучения (а вам нужно!), Вы можете добавить в эту команду

--gpu 1.0

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

...
step 1 - loss 227.32052612304688 - moving ave loss 227.3205261230469
step 2 - loss 226.1829376220703 - moving ave loss 227.2067672729492
step 3 - loss 225.60186767578125 - moving ave loss 227.046277313232
step 4 - loss 227.2750701904297 - moving ave loss 227.0691566009522
step 5 - loss 227.2261199951172 - moving ave loss 227.0848529403687
...

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

По умолчанию Darkflow будет сохранять контрольную точку каждые 250 шагов, поэтому вы можете остановить тренировку в любое время, чтобы сделать перерыв и / или проверить текущие веса. Если вы хотите перезапустить с последней контрольной точки, вам просто нужно добавить --load -1 к той же команде, которую вы использовали для начала обучения.

Я рекомендую вам ознакомиться с этими советами и приемами терминала, чтобы легко отслеживать текущее состояние вашего обучения, включая мгновенное построение значения потерь https://medium.com/@monocasero/useful-terminal -советы-хитрости-для-практиков-машинного обучения-6e96b61b2bc2

Шаг 6. Проверка результатов

В любой момент вы можете остановить обучение и протестировать обнаружение в наборе изображений (надеюсь, никогда не просматриваемом при обучении), если у вас есть эти изображения в <path_to_imgs>:

python3 flow --model cfg/yolo-new.cfg \
    --imgdir <path_to_imgs> \
    --load -1 \
    --labels one_label.txt \
    --gpu 1.0

По умолчанию он создает каталог с именем out внутри <path_to_imags> с аннотированными изображениями. Например, это некоторые результаты после дневной тренировки на моем наборе данных. Не идеально, но вполне разумно, учитывая размер обучающей выборки (не очень большой) и сложность задачи.

Где я могу найти модель и веса?

Обновление 2018–09–11

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

Darkflow сохранит веса в том же каталоге, что и информация о контрольных точках. По умолчанию будет использоваться <your_git_directory>/darkflow/ckpt. Для каждой контрольной точки будут созданы четыре файла, а текстовый файл с именем checkpoint будет обновлен.

Согласно этому, в файле .meta хранятся веса. И здесь говорится, что .meta, .index и .data относятся к TensorFlow.