Обнаружение объектов в режиме реального времени с помощью нейросети (как создать аимбот на нейросети)

Давно хотел написать статью, но руки всё никак не доходили. Но вот на фоне хайпа NAIM думаю, что самое время, ибо найдутся люди, которым это будет очень интересно. В техническом плане я уже давно всё реализовал и уже успел получить бан в одной игре.

Что такое 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:
image

Для каждого скриншота должен быть свой .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 файла выглядеть должны примерно вот так:
image

Шаг 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. Спасибо Гуглу за такую щедрость.

За более подробной информацией и при возникновении проблем:

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

7 лайков

Пожалуйста, пишите, если вам что-то в этом процессе будет непонятно. Я постараюсь подробнее объяснить и расписать.

1 лайк

Добрый день, мы можем списаться в вк, или другом мессенджере? Очень хочу научиться с помощью нейронки находить объекты в игре в реальном времени

Так этот топик вам в помощь!
Тут уже всё сделали за вас, вам осталось только обучить нейросеть распознавать объекты, которые вам нужны.