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

Создание набора данных

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

  1. Зарегистрируйтесь в roboflow и нажмите «Создать новый проект».

2. Загрузите изображение и нажмите на изображение, чтобы начать аннотирование. После того, как вы аннотировали все изображения, нажмите «Завершить загрузку», чтобы разделить данные на тестовые и обучающие.

3. Теперь перейдите на страницу «генерировать», здесь вы можете применить некоторые шаги предварительной обработки, такие как обрезка и другие вещи, а также некоторые дополнения, прежде чем вы сможете создать свой набор данных. Пришло время нажать на кнопку генерации.

4. Нажмите кнопку экспорта и выберите нужный формат. Если вы будете следовать дальше, мы будем использовать yolov5 PyTorch. Roboflow предлагает различные варианты загрузки набора данных.
а. Вы можете загрузить ZIP-файл на свой компьютер
b. Вы можете получить код Python, который загрузит ваш набор данных
c. Вы можете получить команду терминала
d.Вы можете получить URL

Вы можете выбрать что угодно, я имею в виду, что все получат ваш набор данных, верно? Кому как удобно.

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

ЙОЛО v5

Есть большая вероятность, что вы уже слышали о YOLO, что означает «You Only Look Once». Это пятый выпуск серии моделей YOLO, созданной Ultralytics в 2020 году. YOLO была первой моделью обнаружения объектов, в которой предсказание ограничительной рамки сочетается с классификацией объектов в единую сквозную дифференцируемую сеть. Он был написан и поддерживается с использованием фреймворка под названием Darknet. Как первая модель YOLO, написанная на PyTorch, YOLOv5 легкая и простая в использовании. Несмотря на это, YOLOv5 существенно не изменил архитектуру YOLOv4. Это также не повысило точность до заметного уровня по сравнению с YOLOv4 при тестировании на общем эталоне COCO. Но при сравнении по размеру и скорости YOLOv5 показал лучшие результаты. Он на 88% меньше и на 188% быстрее предыдущей модели. YOLOv5 предложит вам гораздо более быстрый темп разработки при переходе к развертыванию.

Настройка файлов YAML

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

В первом файле yaml мы укажем расположение данных обучения, данных проверки, количество классов для прогнозирования и их имена. Я назвал этот файл «data.yaml».

train: ./train/images 
val: ./valid/images  
nc: 1
names: ['Ball']

Во втором файле yaml вы указываете конфигурацию модели. Здесь вы настраиваете архитектуру нейронной сети, такую ​​как якоря, головные узлы и основу. Вы можете внести изменения в этот файл, если хотите. Но я бы рекомендовал оставить все как есть и изменить только количество классов. И я назвал этот файл «custom_yolov5.yaml».

# parameters
nc: 1  # number of classes  # CHANGED HERE
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32
# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]
# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13
   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17 (P3/8-small)
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20 (P4/16-medium)
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23 (P5/32-large)
   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

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

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

Модель обучения

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

python train.py --img 416 --batch 64 --epochs 500 --data '/content/data.yaml' --cfg '/content/custom_yolov5s.yaml' --weights ''

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

Все обученные модели будут доступны в runs→train→exp1. Если у вас было более одного сеанса обучения, вы будете получать один файл exp каждый раз, когда будете обучать свою модель. Например, если у вас было четыре тренировки, в папке поезда вы найдете exp1, exp2, exp3 и exp4. exp1 обозначает обученные данные первого сеанса обучения, а exp2 обозначает обученные данные для второго сеанса обучения и так далее. Веса будут созданы во время тренировки, в конце концов, именно поэтому мы тренируем модель. Чтобы найти оптимальные веса. Лучшие веса и последние веса будут храниться в папке прогонов. Хорошей практикой является использование лучших весов. Потому что последние веса не обязательно должны быть лучшими для некоторых случаев. Запускаем программу обнаружения.

Папка обучения в прогонах содержит все проведенные нами тренировочные эксперименты и их результирующие веса. В папке весов в ней будут лучшие и последние файлы «.pt» и кривая f1 тренировочного процесса, матрица путаницы, кривая pr и так далее. Позже мы будем обращаться к ним для анализа модели с помощью тензорной доски.

Tensorboard — это инструмент, который может показать прогресс обучения нашей модели.

tensorboard --logdir '/content/yolov5/runs/train/exp2'

Это позволит вам проанализировать детали обучения текущего эксперимента, если быть точным, приведенная выше команда предоставит вам отчет об анализе второго эксперимента. Отчет содержит кривую f1 и кривую pr и многое другое. Это позволит вам увидеть значения точности и отзыва текущей модели.

Запуск detect.py с аргументами командной строки даст вам ожидаемый результат.

python yolov5/detect.py --weights '/yolov5/runs/train/exp2/weights/best.pt' --img 416 --conf 0.4 --source './test/images'

Результаты обнаружения сохраняются в папке обнаружения. Каждый результат обнаружения сохраняется в папке exp. Не волнуйтесь, простыми словами, он просто содержит изображения с ограничивающими рамками.

Если объект обнаружен, отлично! Что делать, если объект не обнаружен?

Просто обучите модель с большим количеством эпох, если это не сработает, попробуйте добавить больше данных или другие данные.

Обнаружение мяча с помощью веб-камеры

Для обнаружения нужного объекта с помощью веб-камеры достаточно изменить аргумент командной строки «— исходный путь/к/файлу» на «— исходный 0».

python detect.py --weights 'weights/last_yolov5s_custom.pt' --img 416 --conf 0.4 --source 0

Это будет работать просто отлично. Если это не сработает, или у вас несколько веб-камер, или вы используете свой мобильный телефон в качестве веб-камеры с помощью iriun cam, попробуйте изменить число с 0 на 1 или 2. Каждому номеру будет присвоен индекс для каждой из ваших камер. .

Теперь вы обнаруживаете объект, который хотели. Проект завершен.

Вы также можете использовать веб-камеру iriun, чтобы использовать мобильный телефон в качестве веб-камеры для обнаружения объектов. Выглядит весело, не так ли?

Заключение

Обнаружение объектов имеет огромное количество приложений. После завершения этого вы можете попробовать проекты, которые требуют обнаружения объектов, но где это не весь проект. Например, я сделал трекер мячей, в котором камера автоматически отслеживает футбольный мяч и всегда настраивается так, чтобы мяч оставался в центре кадра. Должен сказать, что это не полный программный проект, но он использует 85% программного обеспечения и очень мало аппаратного обеспечения. Если подумать, сколько времени Месси фальсифицировал операторов на футбольном поле? Я думаю, вы поняли, что я пытаюсь сказать. Постараюсь в скором времени опубликовать статью про трекер мячей. Спасибо, люди!