ScaledYOLOv4 - лучшая из доступных на данный момент моделей обнаружения объектов. Но насколько хорошо это работает с изображениями вне набора данных? В этом блоге мы проверим, насколько хорошо модель обобщает, пропустив ее через набор данных CityPersons (https://www.cityscapes-dataset.com/downloads/), используя предварительно обученные веса модели. Для этой демонстрации мы будем с помощью Google Colab, так как он обеспечивает бесплатный доступ к графическим процессорам для ноутбуков и, кстати, бесплатный. Давайте начнем.

Вот блокнот colab, чтобы подписаться на блог в тандеме: ScaledYOLOv4 Notebook

Установка масштабируемых зависимостей YOLOv4

Оказавшись внутри ноутбука, измените время выполнения на GPU.

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

Сначала клонируйте репо Scaled-YOLOv4 и переключитесь на ветку yolov4-large.

# clone Scaled_YOLOv4
!git clone https://github.com/swaingotnochill/ScaledYOLOv4.git # clone repo
%cd /content/ScaledYOLOv4/
#checkout the yolov4-large branch
!git checkout yolov4-large

Давайте проверим, правильно ли работает графический процессор.

import torch
print(‘Using torch %s %s’ % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else ‘CPU’))

Затем мы установим mish-cuda, чтобы быстро запустить функции активации mish на графическом процессоре ноутбука. После этого нам нужно выполнить обновление до последней версии pyYaml, поскольку colab по умолчанию предлагает более старую версию.

#install mish activation function for Cuda
%cd /content/
!git clone https://github.com/JunnYu/mish-cuda
%cd mish-cuda
!python setup.py build install
!pip install -U PyYAML

Выглядит неплохо! Мы закончили с зависимостями. Далее мы загрузим веса модели.

Загрузка весов моделей

Мы будем использовать предварительно обученные веса модели для нашего тестирования. Мы сделаем это, используя команду «gdown» и передав ее нашему идентификатору Google Диска, чтобы загрузить предварительно обученные веса модели.

Сначала перейдите в каталог ScaledYOLOv4 и создайте новую папку weights для хранения предварительно обученных весов модели.

%cd /content/ScaledYOLOv4/ #path to the ScaledYOLOv4 directory
%mkdir weights
%cd weights

Теперь загрузим веса.

!gdown — id 1aXZZE999sHMP1gev60XhNChtHPRMH3Fz #yolov4-p5.pt
!gdown — id 15CL05ZufFk2krbRS993fqlG40Wb0HTyr #yolov4-p5_.pt
!gdown — id 1aB7May8oPYzBqbgwYSZHuATPXyxh9xnf #yolov4-p6.pt
!gdown — id 1Q8oG3lBVVoS0-UwNOBsDsPkq9VKs9UcC #yolov4-p6_.pt
!gdown — id 18fGlzgEJTkUEiBG4hW00pyedJKNnYLP3 #yolov4-p7.pt

У нас есть шесть модельных весов, обученных на разных контрольных точках, среди которых yolov4-p7.pt является лучшим. А теперь перейдем к следующему шагу.

Подготовка пользовательского набора данных

Для тестирования модели обнаружения объектов мы будем использовать набор данных CityPerson, подмножество набора данных CityScapes (https://www.cityscapes-dataset.com) - широко используемого набора данных, полученного из разных городов мира. В нашем случае мы будем использовать небольшое подмножество исходного набора данных, состоящее из трех городов - Франкфурта, Линдау и Мюнстера. Мы уже подготовили изображения и этикетки в формате YOLO, так что вам не нужно!

Чтобы загрузить набор данных из Kaggle, мы будем использовать пакет opendatasets. Следующая строка кода показывает, как это можно сделать.

!pip install opendatasets
import opendatasets as od
download_url = ‘https://www.kaggle.com/meviole/cityperson-validation’
od.download(download_url, ‘.’)

Примечание. Чтобы загрузить набор данных из Kaggle, вам понадобится токен API, который можно создать из вашей учетной записи Kaggle. Щелкните значок профиля в правом верхнем углу окна → Нажмите «Учетная запись» → «Создать новый токен API». Введите свое имя пользователя и этот ключ API после выполнения вышеуказанных строк кода.

Создание собственного файла Yaml

YOLOv4 использует файл Yaml для хранения местоположения набора данных, количества классов и имен классов для обучения и тестирования. Поскольку мы используем настраиваемый набор данных, нам нужно создать новый файл YAML для тестирования. Для этого перейдите в папку данных в каталоге ScaledYOLOv4 и создайте файл cityperson.yaml.

%cd /content/ScaledYOLOv4/data/
!touch cityperson.yaml
%cd /content/ScaledYOLOv4/data/

И введите следующие строки.

%%writefile cityperson.yaml
val: ../cityperson-validation/cityperson/images/
nc: 1
names: [‘person’]

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

Вот и все. Мы готовы протестировать модель на наборе данных городского человека.

Тестирование модели

Перейдите в каталог ScaledYOLOv4. Вы увидите файл test.py. Этот файл можно использовать для запуска процессов проверки и тестирования. Запустите приведенную ниже строку кода, чтобы запустить проверку.

!python test.py — conf 0.001 — batch 9 — device 0 — data customdata.yaml — weights weights/yolov4-p7.pt — single-cls

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

Namespace(augment=False, batch_size=9, conf_thres=0.001, data=’customdata.yaml’, device=’0', img_size=640, iou_thres=0.65, merge=False, save_json=False, save_txt=False, single_cls=True, task=’val’, verbose=False, weights=[‘weights/yolov4-p7.pt’])
Using CUDA device0 _CudaDeviceProperties(name=’Tesla T4', total_memory=15109MB)
Fusing layers… Model Summary: 503 layers, 2.87475e+08 parameters, 2.7862e+08 gradients
Scanning images: 100% 500/500 [00:01<00:00, 320.34it/s]
Scanning labels ../cityperson-validation/cityperson/labels.cache (441 found, 0 missing, 59 empty, 0 duplicate, for 500 images): 100% 500/500 [00:00<00:00, 15430.67it/s]
 Class Images Targets P R [email protected] [email protected]:.95: 100% 56/56 [00:30<00:00, 1.85it/s]
 all 500 4.16e+03 0.489 0.448 0.433 0.19
Speed: 26.2/2.9/29.2 ms inference/NMS/total per 640x640 image at batch-size 9

Если вы запустите приведенный выше код, вы найдете изображение test_batch0 и изображение test_batch0_pred в каталоге ScaledYOLOv4. Давайте посмотрим на это.

Это наше помеченное изображение. Как видите, ярлык только один - «человек». Теперь давайте посмотрим на предсказанное изображение.

На этих изображениях мы можем заметить несколько вещей:

  1. Само по себе обнаружение объекта довольно хорошее. Он смог нарисовать ограничивающие рамки вокруг 2 из 3 человек и вокруг обеих машин.
  2. Он ошибочно классифицировал одну машину как личность.

Количественно Precision и Recall составляют 0,489 и 0,448 соответственно. Для сравнения: в наших экспериментах с набором COCO Validation 2017 ScaledYOLOv4 набрал 0,47 балла по точности и 0,85 по отзыву для «личного» класса и 0,397 по точности и 0,75 по отзыву, в среднем по всем 80 классам. Таким образом, несмотря на резкое снижение отзыва, точность фактически получила незначительное повышение. Мы выбрали набор данных CityPersons специально потому, что его перспектива отличается от изображений, которые обычно находятся в наборе данных COCO, на котором обучается модель. Учитывая это, результаты на самом деле не так уж и плохи.

Но есть ли способы их улучшить? Конечно, есть. Самый простой - просто обучить модель на ваших пользовательских данных. Если вы хотите использовать предварительно обученные веса, то другим решением может быть замораживание нескольких слоев, кроме последних, сокращение классификации до «человек» и «not_person» и обучение этой настраиваемой настройке на ваших данных. Окончательным решением для дальнейшего улучшения результатов является улучшение ваших этикеток для обучения и проверки.

Мы в Mindkosh всегда ищем способы улучшить качество аннотированных данных и делать все это с невероятной скоростью. Следите за нашими блогами, чтобы узнать, как мы творит чудеса!