Вы только посмотрите один раз (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.