Время прочтения: 5 мин.

Библиотека MMDetection является открытым инструментом определения объектов на изображениях. Инструмент основан на фреймворке PyTorch.

Основные преимущества библиотеки:

  • Модульная архитектура: структура обнаружения объектов (detection framework) разбита на различные части, одна из которых позволяет создавать собственные архитектуры за счет комбинаций различных модулей.
  • Поддержка сторонних архитектур: поддерживает популярные архитектуры (detection frameworks), такие как: Faster RCNN, Mask RCNN, RetinaNet и др.
  • Высокая производительность: операции запускаются на GPU. Скорость обучения быстрее, чем у других библиотек (Detectron2, maskrcnn-benchmark и SimpleDet)
  • Эффективность: инструмент основан на базе кода, разработанного командой MMDet, которая выиграла COCO Detection Challenge в 2018 году

Рассмотрим процесс установки и использования библиотеки для двух задач:

  1. Применение готовой модели для обнаружения объектов.
  2. Обучение собственной модели

Обе задачи решались на платформе Kaggle, код также представлен для реализации в упомянутой платформе.

Подготовка

Установка нужных библиотек

Для установки библиотеки и депозитария с GitHub нужно ввести следующие команды:

!pip install mmcv-full
!rm -rf mmdetection
!git clone https://github.com/open-mmlab/mmdetection.git
%cd mmdetection
!pip install -r requirements.txt

Учтите, что этот процесс занимает более 10 минут.

Применение готовой модели

В данном разделе покажем, как с помощью обученных ранее моделей определить объекты на изображении. Для демонстрации работы используется следующее изображение:

На переднем плане изображения присутствуют следующие объекты: собаки, человек, автомобиль.

Разберем последовательность операций при пользовании данной библиотекой.

1. Выбираем поддерживаемую модель и осуществляем загрузку весов

Для демонстрации примера выбрана RCNN модель с предобученными весами на датасете COCO-2017:

!mkdir checkpoints
!wget -c https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth \
      -O checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth

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

2. Импортируем необходимые библиотеки:

from mmcv import Config
from mmdet.apis import set_random_seed
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector, init_detector, inference_detector
from IPython.display import clear_output
import torch
import mmcv
import matplotlib.pyplot as plt
from mmdet.apis import inference_detector, init_detector, show_result_pyplot

3. Определяем конфигурацию:

config = 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py'

4. Установка контрольного файла:

checkpoint = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'

5. Определение модели:

model = init_detector(config, checkpoint, device='cuda:0')

6. Применение модели:

img = '/kaggle/input/funny-photo/1bc8aa0a-f41c-41aa-a63c-eda4c192a5d5.JPG'
result = inference_detector(model, img

Результат работы:

Модель успешно определила автомобиль, собак и человека, однако она также обнаружила человека, которого на самом деле на изображении нет.

Обучение собственной модели

Как и при применении готовых моделей, первым шагом является выбор поддерживаемых предобученных моделей и осуществить загрузку весов. Для демонстрации примера выбрана VFNET модель с предобученными на датасете COCO-2017 весами.

!mkdir checkpoints
!wget -c https://openmmlab.oss-cn-hangzhou.aliyuncs.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-6879c318.pth\
-O checkpoints/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-6879c318.pth

Далее построим процесс конфигурации модели и обучения. Написанная один раз программа позволит быстро менять модель и использовать другие датасеты.

Построение модели

Шаг 1. Импортируем необходимые библиотеки:

from mmcv import Config
from mmdet.apis import set_random_seed
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector, init_detector, inference_detector

from IPython.display import clear_output
import torch

Шаг 2. Осуществим конфигурацию модели:

cfg = Config.fromfile('./configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py')
DATASET_TYPE = 'CocoDataset'
PREFIX = '../../input/vinbigdata-coco-dataset-with-wbf-3x-downscaled/vinbigdata-coco-dataset-with-wbf-3x-downscaled/'
cfg.dataset_type = DATASET_TYPE
cfg.classes = ("Aortic_enlargement", "Atelectasis", 
               "Calcification", "Cardiomegaly", 
               "Consolidation", "ILD", "Infiltration", 
               "Lung_Opacity", "Nodule/Mass", "Other_lesion", 
               "Pleural_effusion", "Pleural_thickening", 
               "Pneumothorax", "Pulmonary_fibrosis")
cfg.model.bbox_head.num_classes = 14

Шаг 3. Определение выборок

Определение тренировочной выборки:

cfg.data.train.img_prefix = PREFIX
cfg.data.train.classes = cfg.classes
cfg.data.train.ann_file = PREFIX + 'train_annotations.json'
cfg.data.train.type = DATASET_TYPE

Определение валидационной выборки:

cfg.data.val.img_prefix = PREFIX
cfg.data.val.classes = cfg.classes
cfg.data.val.ann_file = PREFIX + 'val_annotations.json'
cfg.data.val.type = DATASET_TYPE

Определение тестовой выборки:

cfg.data.test.img_prefix = PREFIX
cfg.data.test.classes = cfg.classes
cfg.data.test.ann_file = PREFIX + 'train_annotations.json'
cfg.data.test.type = DATASET_TYPE

Шаг 4. Настройка гиперпараметров модели:

cfg.optimizer.lr = 0.02 / 8
cfg.lr_config.warmup = None
cfg.lr_config.policy = 'step'
cfg.log_config.interval = 100

Выбираем метрику для оценки:

cfg.evaluation.metric = 'bbox'

Установка промежутка проведения оценки:

cfg.evaluation.interval = 5

Установка интервала для сохранения контрольной точки:

cfg.checkpoint_config.interval = 5

Установка начальной точки:

cfg.seed = 0
set_random_seed(0, deterministic=False)
cfg.gpu_ids = range(1)

Использование готовой архитектуры:

cfg.load_from = ' checkpoints/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-6879c318.pth'
cfg.work_dir = "../vinbig_output"

Установка максимального количества итераций обучения (эпох):

cfg.runner.max_epochs = 12
cfg.total_epochs = 12

Шаг 5. Определим модель и датасет:

clear_output()
model = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))datasets = [build_dataset(cfg.data.train)]
model.CLASSES = datasets[0].CLASSES

Шаг 6. Обучение модели:

train_detector(model, datasets, cfg, distributed=False, validate=True)

Результаты обучения:

Можно заменить, что за выделенное количество эпох модель не успела достаточно обучиться. Решением может быть повышение количества эпох. Проверим это предположение и зададим ограничение на количество эпох равное 25:

cfg.runner.max_epochs = 25
cfg.total_epochs = 25

Результаты работы модели представлены на рисунке ниже:

Результаты показывают, что увеличение количества эпох повысило качество модели (согласно метрикам), однако это значительно увеличивает время вычисления. Для дальнейшего повышения качества требуется дальнейшее повышение ограничения эпох. Для различных наборов данных требуется различное количество эпох, так как процесс обучения модели на собственном наборе данных был пройден, считаем, что главная задача выполнена.

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