Это еще одна история из текущей серии об обнаружении объектов с помощью 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
Нам нужно изменить две строки:
- В последнем разделе [сверточный] нам нужно изменить количество
filters
, формулаfilters=(number of classes + 5)*5
, так как у нас только один класс, мы устанавливаемfilters=30
. - В разделе [регион] есть строка, в которой можно указать количество классов (около строки 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.