Что такое Object Detection и для чего это используют
Object Detection - технология глубокого обучения для распознавания и классификации каких-то сущностей на изображениях. Если не углубляться в математическую часть, то обнаружение объекта заключается в том, что определенный набор функций даёт вероятность того, что на изображении в определённой позиции и определённого размера находится сущность того или иного класса. На основе данной вероятности мы используем функцию активации.
Распознавание объектов - это технология компьютерного зрения. В наши дни она уже не является революционной или прорывной, и повсеместно используется в разных отраслях, начиная от распознавания табличек с номерами автомобилей на трассах, заканчивая AR технологиями по типу очков дополненной реальности с трекингом каких-то объектов.
Свёрточные сети и их популярные архитектуры
На сегодняшний день для распознавания объектов используют зачастую свёрточные нейронные сети (Convolutional Neural Networks) или CNN. Чтобы разобраться со свёрточными нейросетями, нужно сначала разобраться с тем, что такое нейросети. См. Нейронные сети для начинающих. Часть 1 / Хабр
Из книги “Глубокое Обучение” (Я. Гудфеллоу, И. Бенджио, А. Курвилль):
У изображений есть много статистических свойств, инвариантных к параллельному переносу. Например, фотография кошки остается таковой, если сдвинуть ее на один пиксель вправо. В CNN это свойство учитывается с помощью разделения параметров по нескольким областям изображения. Один и тот же признак вычисляется по нескольким участкам входных данных. Это означает, что один и тот же детектор кошек найдет кошку вне зависимости от того, находится она в столбце изображения с номером i или i + 1.
Свёрточные нейросети получили своё название из-за этой самой операции свёртки. В общем смысле это математическая функция усреднения положений объекта, чтобы получить менее зашумлённую оценку положения.
Популярные архитектуры CNN
- RetinaNet - медленная, но довольно точная
- YOLO - очень быстрая с хорошей точностью
- SSD - неплохая точность, не очень быстрая
- Feature Pyramid Networks (FPN) - точная, но также медленная. Хорошо распознаёт мелкие объекты
Производительность на COCO датасете
Model | Train | Test | mAP | FLOPS | FPS | Cfg | Weights |
---|---|---|---|---|---|---|---|
SSD300 | COCO trainval | test-dev | 41.2 | - | 46 | link | |
SSD500 | COCO trainval | test-dev | 46.5 | - | 19 | link | |
YOLOv2 608x608 | COCO trainval | test-dev | 48.1 | 62.94 Bn | 40 | cfg | weights |
Tiny YOLO | COCO trainval | test-dev | 23.7 | 5.41 Bn | 244 | cfg | weights |
SSD321 | COCO trainval | test-dev | 45.4 | - | 16 | link | |
DSSD321 | COCO trainval | test-dev | 46.1 | - | 12 | link | |
R-FCN | COCO trainval | test-dev | 51.9 | - | 12 | link | |
SSD513 | COCO trainval | test-dev | 50.4 | - | 8 | link | |
DSSD513 | COCO trainval | test-dev | 53.3 | - | 6 | link | |
FPN FRCN | COCO trainval | test-dev | 59.1 | - | 6 | link | |
Retinanet-50-500 | COCO trainval | test-dev | 50.9 | - | 14 | link | |
Retinanet-101-500 | COCO trainval | test-dev | 53.1 | - | 11 | link | |
Retinanet-101-800 | COCO trainval | test-dev | 57.5 | - | 5 | link | |
YOLOv3-320 | COCO trainval | test-dev | 51.5 | 38.97 Bn | 45 | cfg | weights |
YOLOv3-416 | COCO trainval | test-dev | 55.3 | 65.86 Bn | 35 | cfg | weights |
YOLOv3-608 | COCO trainval | test-dev | 57.9 | 140.69 Bn | 20 | cfg | weights |
YOLOv3-tiny | COCO trainval | test-dev | 33.1 | 5.56 Bn | 220 | cfg | weights |
YOLOv3-spp | COCO trainval | test-dev | 60.6 | 141.45 Bn | 20 | cfg | weights |
Создание своей системы распознавания объектов на примере аимбота на YOLOv3-tiny
Для наших целей мы выберем архитектуру YOLOv3-tiny. YOLOv3 оптимизирована, чтобы хорошо распознавать человекоподобных сущностей. YOLO часто упоминается как одна из самых быстрых архитектур для распознавания объектов на основе глубокого обучения, достигающая более высокой частоты кадров в секунду. YOLOv3, например, более чем в 1000 раз быстрее, чем R-CNN, и в 100 раз быстрее, чем Fast R-CNN.
YOLOv3-tiny - “облегченная” (если так можно выразиться) модель YOLOv3, оптимизированная для большего FPS и работы на устройствах, подобных Raspberry Pi, однако за свою скорость она платить точностью.
Процесс разработки
Процесса разработки не будет, так как я уже разработал всё за вас. Исходник на C++ вы можете найти на моём гитхабе. Всё что вам остаётся сделать - собрать свой датасет и обучить модель.
Обучение нейросети
Для того, чтобы можно было обучить нейросеть детектить нужные нам объекты, нам нужно для начало иметь то, на чём мы будем обучать. Нам нужны данные, большое количество данных! По моему опыту, нужно минимум 500 скриншотов интересующего нас объекта. Скриншоты должны быть разнообразны.
Шаг 1: подготовьте огромное количество скриншотов.
Минимум 500 скриншотов для обучения и ещё какое-то количество для теста модели. Если карта коридорная и однообразная, модельки персонажей не меняются, то скриншотов может быть понадобится куда меньше. Если карта и модельки разнообразны, то скриншотов может быть понадобится куда больше.
Шаг 2: выделите объекты на ваших скриншотах.
Началась рутина. Это очень долгий процесс, ибо вам придётся на каждом из ваших скриншотах выделять прямоугольную область расположения объекта. Я рекомендую вам использовать программу опенсурсную labelImg (работает на MacOS, Windows, Linux).
В labelimg не забудьте поменять формат сохранения на YOLO:
Для каждого скриншота должен быть свой .txt файл выделенной области (YOLO формата). В итоге выглядеть это должно примерно вот так:
Шаг 3: генерируйте файлы сопоставления.
Вам нужно создать файлы train.txt и test.txt, которые будут содержать в себе построчный список ваших скриншотов для обучения и ваших скриншотов для тестирования. Я написал небольшой Python скрипт, который будет делать это за вас:
import os
# мои скриншоты хранятся в папке "data/obj"
# храните скриншоты для тестирования и обучения в разных папках,
# затем меняйте в коде название папок
files_in_dir = os.listdir(os.path.join(os.path.dirname(__file__), 'obj'))
for file in files_in_dir:
if file.split('.')[1] == 'jpg':
print('data/obj/' + file)
Итоговые 2 файла выглядеть должны примерно вот так:
Шаг 4: создайте файл obj.data
Создайте файл obj.data с примерно таким содержанием:
classes = 80
train = data/train.txt
valid = data/test.txt
names = data/coco-dataset.labels
backup = backup/
train - ваш файл, в котором содержится список скриншотов для обучения.
valid - ваш файл, в котором содержится список скриншотов для тестирования (валидации).
names - название лейблов coco датасета. Скачайте этот файл: coco-dataset.txt (703 Байта) (не забудьте изменить расширение)
Шаг 5: преступайте к тренировке.
Я подготовил для вас блокнот на Google Colab, в котором пошагово описал всё то, что вам нужно будет сделать. В данном блокноте вы можете бесплатно воспользоваться вычислительными мощностями на GPU. Спасибо Гуглу за такую щедрость.
За более подробной информацией и при возникновении проблем:
Я не стал подробно разжевывать процесс обучения своей модели, так как там по сути очень всё легко, если у вас есть хоть малейшие знания английского языка. Если всё-таки у вас будут серьёзные проблемы с этим, я запишу видео.