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

Если вы являетесь поклонником телесериала HBO Силиконовая долина, вы, возможно, знаете о знаменитом приложении Not Hotdog, которое создал Джинг-Ян. Это похоже, очень просто и определяет, есть ли на изображении я или нет.

Для начала нам нужно установить Darknet с двумя зависимостями — OpenCV и CUDA для более быстрых вычислений. Следующее было на машине Ubuntu 16.04 с Nvidia GTX 1060.

Установка даркнета

git clone https://github.com/pjreddie/darknet.git cd darknet make mkdir -p obj

Чтобы проверить вашу установку, запустите даркнет с помощью

./darknet output: usage: ./darknet <function>

Если вы получите приведенный выше вывод, вы можете перейти к следующему шагу!

Компиляция с помощью CUDA (необязательно)

Компиляция с помощью вашего графического процессора во много раз быстрее, чем ваш процессор. Чтобы установить CUDA, вам понадобится совместимый графический процессор Nvidia. Для установки скачайте CUDA (убедитесь, что это версия 8) и следуйте инструкциям на сайте.

Чтобы включить CUDA, измените первую строку Makefile в базовом каталоге на GPU = 1 и «make» в терминале.

Компиляция с помощью OpenCV (необязательно)

Для поддержки нескольких форматов мультимедиа установите OpenCV. Посмотреть инструкцию здесь

Как и в случае с CUDA, измените Makefile на OPENCV=1, чтобы включить OpenCV, а затем «создайте» в терминале, чтобы создать приложение для даркнета.

Создайте файл yolo-obj.cfg с тем же содержимым, что и в yolo-voc.2.0.cfg (или скопируйте yolo-voc.2.0.cfg в yolo-obj.cfg) и:

  • изменить пакет строки на пакет = 64
  • изменить подразделения строки на подразделения = 8
  • измените class=20 на ваше количество объектов
  • измените строку # 237 с filter = 125 на: filter = (classes + 5) * 5, поэтому, если class = 2, тогда должно быть filter = 35.

Создайте файл obj.names в каталоге darknet\data\, с именами объектов — каждое с новой строки

Создайте файл obj.data в каталоге darknet\data\, содержащий (где классы = количество объектов):

classes= 2 train = data/train.txt valid = data/test.txt names = data/obj.names backup = backup/

Поместите изображения-файлы (.jpg) ваших объектов в директорию darknet\obj\

Создать .txt-файл для каждого .jpg-файла-изображения — в той же директории и с тем же именем, но с .txt-расширением, и поместить в файл: номер объекта и координаты объекта на этом изображении, для каждого объекта в новом строка: ‹object-class› ‹x› ‹y› ‹width› ‹высота›

Где:

  • ‹object-class› — целое число объекта от 0 до (классы-1)
  • изменить подразделения строки на подразделения = 8
  • измените class=20 на ваше количество объектов
  • измените строку # 237 с filter = 125 на: filter = (classes + 5) * 5, поэтому, если class = 2, тогда должно быть filter = 35.

Используйте BBox-Label-Tool, чтобы получить координаты лица из ваших изображений.

Например, для img1.jpg вы должны создать img1.txt, содержащий:

1 0.716797 0.395833 0.216406 0.147222 0 0.687109 0.379167 0.255469 0.158333 1 0.420312 0.395833 0.140625 0.166667

Создайте файл train.txt в каталоге darknet\data\ с именами файлов ваших изображений, каждое имя файла в новой строке, с путем относительно ./darknet, например, содержащий:

data/obj/img1.jpg data/obj/img2.jpg data/obj/img3.jpg

Загрузите предварительно обученные веса для сверточных слоев (76 МБ): здесь и поместите в основной каталог.

Начните обучение с помощью командной строки:

После завершения обучения — получить результат yolo-obj_xxxxx.weights из даркнета\бэкапа\

После каждой 1000 итераций вы можете остановиться, а затем начать обучение с этой точки. Например, после 2000 итераций вы можете остановить обучение, а позже просто скопировать yolo-obj_2000.weights из darknet\backup\ в основной каталог и начать обучение, используя: obj_2000.веса

Во время обучения вы увидите различные индикаторы ошибок,

Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8 9002: 0.211667, 0.060730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

Когда вы увидите, что средняя потеря 0.xxxxxx avg больше не уменьшается на многих итерациях, вам следует прекратить обучение.

Проверьте свои тренированные веса с помощью команды

./darknet detector test data/obj.data yolo-obj.cfg yolo-obj_xxxx.weights

После более чем 40000 итераций я обнаружил, что мои результаты достаточно точны. По умолчанию YOLO отображает только объекты, обнаруженные с достоверностью 0,25 или выше. Вы можете изменить это, передав флаг -thresh ‹val› команде yolo.

./darknet detector test data/obj.data yolo-obj.cfg yolo-obj_xxxx.weights images/test.jpg -thresh 0.6

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

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

Первоначально опубликовано на ashishkhan.com.