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

Мы будем двигаться от А до Я, используя следующий подход. (Убедитесь, что вы следите за каждым шагом для лучшего понимания.)

Что такое обнаружение объектов?

Доступны алгоритмы обнаружения объектов

Почему YoloV3?

Ярлыки изображений

Установка

Наконец, обучение модели.

Что такое обнаружение объектов и почему ему уделяется так много внимания?

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

Сценарии использования бесконечны, будь то слежение за объектами, видеонаблюдение, обнаружение пешеходов, обнаружение аномалий, Подсчет людей, Беспилотные автомобили или Распознавание лиц, список можно продолжить.

Алгоритмы обнаружения объектов:

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

  • Быстрее R-CNN
  • YOLO (смотришь только один раз)
  • SSD (Single Shot MultiBox Defender)

Есть еще R-CNN, Fast R-CNN, Mask R-CNN (да, они разные). Мы должны решить, что использовать, исходя из наших требований, у каждого из них есть свои плюсы и минусы.

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

YOLO - смотришь только один раз

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

Все остальные алгоритмы обнаружения объектов используют области для локализации объекта на изображении. В сети не смотрит полное изображение. Вместо этого части изображения, которые с высокой вероятностью содержат объект. YOLO или You Only Look Once - это алгоритм обнаружения объектов, сильно отличающийся от алгоритмов на основе регионов. В YOLO единственная сверточная сеть предсказывает ограничивающие прямоугольники и вероятности классов для этих прямоугольников.

Если вы хотите глубже погрузиться в Yolo и посмотреть, как работают слои, обратитесь к этому официальному исследованию.

Преимущества и недостатки YOLO

  • YOLO на порядки быстрее (45 кадров в секунду), чем другие алгоритмы обнаружения объектов.
  • Ограничение алгоритма YOLO заключается в том, что он борется с небольшими объектами на изображении, например, у него могут быть трудности с обнаружением стаи птиц. Это связано с пространственными ограничениями алгоритма.

Сбор данных и аннотации

Теперь у нас есть основная информация об обнаружении объектов и Yolo, давайте перейдем к самой утомительной задаче, то есть к получению данных для обучения и тестирования. Если вы не хотите путаться с частью обработки данных, вы можете использовать изображения и метки для кубика Рубика из здесь.

Если вы хотите обучить модель на собственном наборе данных, вы можете получить изображения и метки из Kaggle. Для обучения в Yolo аннотации должны быть в формате .txt. Если у вас есть аннотации в формате XML, вы можете изменить их на формат Yolo .txt с помощью этого скрипта, он не идеален, но решает задачу. Просто измените строки 19 и 26, и все готово.

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

Файл аннотации для Yolo будет выглядеть примерно так:

0 0.332853 0.575862 0.210375 0.489655

Процесс аннотирования генерирует текстовый файл для каждого изображения, содержащий номер класса объекта и координацию для каждого объекта в нем, так как этот формат «(идентификатор объекта) (центр x) (центр y) (ширина) (высота)» в каждой строке для каждого объекта. Значения координат (x, y, ширина и высота) относятся к ширине и высоте изображения.

Если вы загружаете изображения из Google или из любого другого источника, вам понадобится инструмент для аннотирования изображений, инструмент LabelImg решит эту задачу, так как это было быстро и легко установить.

Шаги по аннотированию изображений с помощью LabelImg:

  1. Создайте папку, которая будет содержать изображения, и назовите ее «изображения».
  2. Создайте папку для файлов аннотаций и назовите ее «label». Папки «изображения» и «ярлыки» должны находиться в одном каталоге.
  3. Откройте приложение LabelImg.
  4. Нажмите «Открыть каталог», а затем выберите папку «Изображения».
  5. Нажмите «Изменить папку для сохранения» и выберите папку с ярлыками.
  6. Прямо под кнопкой «Сохранить» на панели инструментов нажмите кнопку «PascalVOC», чтобы переключиться в формат YOLO.
  7. Вы обнаружите, что все изображения перечислены на панели «Список файлов».
  8. Щелкните изображение, которое хотите аннотировать.
  9. Щелкните букву «W» на клавиатуре, чтобы нарисовать прямоугольник на желаемом объекте изображения, введите имя объекта во всплывающем окне.
  10. Нажмите «CTRL + S», чтобы сохранить аннотацию в папке с этикетками.
  11. Повторяйте шаги с 8 по 10, пока не завершите аннотирование всех изображений.

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

Darknet - это фреймворк нейронной сети с открытым исходным кодом, поддерживающий вычисления CPU и GPU.

Установка Darknet:

git clone https://github.com/pjreddie/darknet
cd darknet

Если у вас есть выделенная машина с графическим процессором для обучения, это хорошо, если вы похожи на меня, вы можете использовать для этого AWS, я использовал спотовый экземпляр (p2.xlarge). Если вам нужна помощь в настройке спотового экземпляра GPU на AWS, дайте мне знать, я опубликую отдельную статью. Я предполагаю, что вы, ребята, уже знаете, как настроить компьютер с графическим процессором.

vim Makefile

(Если вы используете GPU, измените GPU с 0 на 1, а если вы установили OpenCV, установите OPENCV на «1», в противном случае не нужно)

сохраните Makefile и запустите команду в корневом каталоге, чтобы начать процесс сборки.

make

Вы можете проверить, все ли скомпилировано правильно, выполнив эту команду

./darknet

Вы должны увидеть что-то вроде:

usage: ./darknet <function>

вы также можете обратиться к Yolo-Darknet для установки, загрузки cfg и предварительно обученных весов.

Перед началом тренировочного процесса

После сбора и аннотирования набора данных у нас есть две папки в одном каталоге: папка «изображения» и папка «метки».

Скопируйте все содержимое папки с изображениями и этикетками и поместите их в одну папку. Наконец, сохраните папку в корневом каталоге даркнета.

Теперь нам нужно разделить набор данных для обучения и тестирования, предоставив два текстовых файла, один из которых содержит пути к изображениям для обучающего набора (train.txt), а другой - для тестового набора ( test.txt)

Это можно сделать с помощью скрипта. После этого шага вы скопируете файлы train.txt и test.txt в корневой каталог даркнета.

train.txt и test.txt будут выглядеть примерно так:

Подготовка файлов конфигурации YoloV3

YOLO нужны определенные файлы, чтобы знать, как и что тренировать.

Нам нужно будет изменить крошечную модель YOLOv3 (yolov3-tiny.cfg), чтобы обучить наш пользовательский детектор. В данную модификацию входят:

  1. Раскомментируйте строки 5, 6 и 7 и измените обучающий пакет на 64, а subdivisions на 2.
  2. Измените количество фильтров для сверточного слоя «[свертка]» непосредственно перед каждым выводом yolo «[yolo]» так, чтобы количество фильтров = #anchors x (5 + #ofclasses) = 3 * (5 + 1) = 18. Число 5 - это количество параметров center_x, center_y, width, height и Scoreness Score. Итак, измените строки 127 и 171 на «filters = 18».
  3. Для каждого слоя ёло [yolo] измените количество классов на 1, как в строках 135 и 177.

Необходимо создать еще два файла «objects.names», название которых подразумевает, что он содержит имена классов, и файл «training.data», который содержит параметры, необходимые для обучение.

  • cfg / obj.data
classes= 1
train  = ./darknet/train.txt  
valid  = ./darknet/test.txt  
names = ./darknet/cfg/objects.names  
backup = ./darknet/backup/
  • cfg / obj.names
Rubiks Cube   #name you used while annotation

Убедитесь, что вы сохранили эти три файла в этом месте: ./darknet/cfg/.

Скачать предварительно обученные сверточные веса

Для тренировки YOLOv3 мы используем сверточные веса, которые предварительно натренированы на Imagenet. Мы используем веса из модели darknet53. Вы можете просто скачать веса для сверточных слоев здесь (76 МБ) и поместить их в основной каталог даркнета.

Начать обучение

Время для веселья! Введите следующую команду в свой терминал и наблюдайте, как ваш графический процессор делает то, что у него лучше всего получается.

./darknet detector train cfg/obj.data cfg/yolov3-tiny.cfg darknet53.conv.74

Примечания

  1. Веса будут сохраняться в резервной папке каждые 100 итераций до 900, а затем каждые 10000.
  2. Завершите тренировочный процесс, когда средний проигрыш станет меньше 0,06 или когда среднее значение больше не будет увеличиваться.
Region 23 Avg IOU: 0.880141, Class: 0.999959, Obj: 0.999842, No Obj: 0.000690, .5R: 1.000000, .75R: 1.000000,  count: 1498591: 0.033501, 0.063296 avg, 0.000010 rate, 0.004106 seconds, 498591 images
Loaded: 0.003061 seconds

Полученные результаты

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

./darknet detector test cfg/obj.data cfg/yolov3-tiny.cfg backup/yolov3-tiny_900.weights data/rubicks.jpg

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

Если результаты не соответствуют вашим ожиданиям, пора вам узнать, как играть с learning_rate, batch, sub_divisions.

Если вы хотите изменить скорость сохранения веса, вы можете поиграть с «шагами» в файле cfg.

Если вам нужен скрипт, который может работать как детектор в реальном времени на веб-камере, вы можете попробовать этот скрипт, вам просто нужно предоставить yolov3.weights, yolov3-tiny.cfg и objects.names в качестве аргумента.

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

Полезные блоги, к которым вы можете обратиться за подробным описанием:

Обучение обнаружению нестандартных объектов в YoloV2

Чем отличаются Yolo, YoloV2 и YoloV3?

Для блога о кубике рубика перейдите по этой ссылке

Подробнее об алгоритмах обнаружения объектов