trainYOLOv2ObjectDetector

Обучите детектор объектов YOLO v2

Описание

Обучите детектор

пример

detector = trainYOLOv2ObjectDetector(trainingData,lgraph,options) возвращает детектор объектов, обученный с использованием сетевой архитектуры версии 2 (YOLO v2), заданной входом lgraph. The options вход задает параметры обучения для сети обнаружения.

пример

[detector,info] = trainYOLOv2ObjectDetector(___) также возвращает информацию о процессе обучения, такие как точность обучения и скорость обучения для каждой итерации.

Возобновите обучение детектора

пример

detector = trainYOLOv2ObjectDetector(trainingData,checkpoint,options) возобновляет обучение с сохраненной контрольной точки детектора.

Можно использовать этот синтаксис для:

  • Добавьте больше обучающих данных и продолжите обучение.

  • Улучшите точность обучения, увеличив максимальное количество итераций.

Точная настройка детектора

detector = trainYOLOv2ObjectDetector(trainingData,detector,options) продолжает обучение детектора объектов YOLO v2. Используйте этот синтаксис для настройки детектора.

Многомасштабное обучение

detector = trainYOLOv2ObjectDetector(___,'TrainingImageSize',trainingSizes) задает размеры изображений для многомасштабного обучения с помощью пары "имя-значение" в дополнение к входным параметрам в любом из предыдущих синтаксисов.

Примеры

свернуть все

Загрузите обучающие данные для обнаружения транспортного средства в рабочую область.

data = load('vehicleTrainingData.mat');
trainingData = data.vehicleTrainingData;

Укажите директории, в которых хранятся обучающие выборки. Добавьте полный путь к именам файлов в обучающих данных.

dataDir = fullfile(toolboxdir('vision'),'visiondata');
trainingData.imageFilename = fullfile(dataDir,trainingData.imageFilename);

Случайным образом перетасуйте данные для обучения.

rng(0);
shuffledIdx = randperm(height(trainingData));
trainingData = trainingData(shuffledIdx,:);

Создайте imageDatastore с помощью файлов из таблицы.

imds = imageDatastore(trainingData.imageFilename);

Создайте boxLabelDatastore с помощью столбцов меток из таблицы.

blds = boxLabelDatastore(trainingData(:,2:end));

Объедините хранилища данных.

ds = combine(imds, blds);

Загрузка предварительно инициализированной сети обнаружения объектов YOLO v2.

net = load('yolov2VehicleDetector.mat');
lgraph = net.lgraph
lgraph = 
  LayerGraph with properties:

         Layers: [25×1 nnet.cnn.layer.Layer]
    Connections: [24×2 table]
     InputNames: {'input'}
    OutputNames: {'yolov2OutputLayer'}

Просмотрите слои в сети YOLO v2 и их свойства. Можно также создать сеть YOLO v2 путем выполнения шагов, описанных в разделе «Создание сети обнаружения объектов YOLO v2».

lgraph.Layers
ans = 
  25x1 Layer array with layers:

     1   'input'               Image Input                128x128x3 images
     2   'conv_1'              Convolution                16 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     3   'BN1'                 Batch Normalization        Batch normalization
     4   'relu_1'              ReLU                       ReLU
     5   'maxpool1'            Max Pooling                2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv_2'              Convolution                32 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     7   'BN2'                 Batch Normalization        Batch normalization
     8   'relu_2'              ReLU                       ReLU
     9   'maxpool2'            Max Pooling                2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv_3'              Convolution                64 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'BN3'                 Batch Normalization        Batch normalization
    12   'relu_3'              ReLU                       ReLU
    13   'maxpool3'            Max Pooling                2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    14   'conv_4'              Convolution                128 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'BN4'                 Batch Normalization        Batch normalization
    16   'relu_4'              ReLU                       ReLU
    17   'yolov2Conv1'         Convolution                128 3x3 convolutions with stride [1  1] and padding 'same'
    18   'yolov2Batch1'        Batch Normalization        Batch normalization
    19   'yolov2Relu1'         ReLU                       ReLU
    20   'yolov2Conv2'         Convolution                128 3x3 convolutions with stride [1  1] and padding 'same'
    21   'yolov2Batch2'        Batch Normalization        Batch normalization
    22   'yolov2Relu2'         ReLU                       ReLU
    23   'yolov2ClassConv'     Convolution                24 1x1 convolutions with stride [1  1] and padding [0  0  0  0]
    24   'yolov2Transform'     YOLO v2 Transform Layer.   YOLO v2 Transform Layer with 4 anchors.
    25   'yolov2OutputLayer'   YOLO v2 Output             YOLO v2 Output with 4 anchors.

Сконфигурируйте сетевые опции обучения.

options = trainingOptions('sgdm',...
          'InitialLearnRate',0.001,...
          'Verbose',true,...
          'MiniBatchSize',16,...
          'MaxEpochs',30,...
          'Shuffle','never',...
          'VerboseFrequency',30,...
          'CheckpointPath',tempdir);

Обучите сеть YOLO v2.

[detector,info] = trainYOLOv2ObjectDetector(ds,lgraph,options);
*************************************************************************
Training a YOLO v2 Object Detector for the following object classes:

* vehicle

Training on single CPU.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     RMSE     |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:01 |         7.13 |         50.8 |          0.0010 |
|       2 |          30 |       00:00:14 |         1.35 |          1.8 |          0.0010 |
|       4 |          60 |       00:00:27 |         1.13 |          1.3 |          0.0010 |
|       5 |          90 |       00:00:39 |         0.64 |          0.4 |          0.0010 |
|       7 |         120 |       00:00:51 |         0.65 |          0.4 |          0.0010 |
|       9 |         150 |       00:01:04 |         0.72 |          0.5 |          0.0010 |
|      10 |         180 |       00:01:16 |         0.52 |          0.3 |          0.0010 |
|      12 |         210 |       00:01:28 |         0.45 |          0.2 |          0.0010 |
|      14 |         240 |       00:01:41 |         0.61 |          0.4 |          0.0010 |
|      15 |         270 |       00:01:52 |         0.43 |          0.2 |          0.0010 |
|      17 |         300 |       00:02:05 |         0.42 |          0.2 |          0.0010 |
|      19 |         330 |       00:02:17 |         0.52 |          0.3 |          0.0010 |
|      20 |         360 |       00:02:29 |         0.43 |          0.2 |          0.0010 |
|      22 |         390 |       00:02:42 |         0.43 |          0.2 |          0.0010 |
|      24 |         420 |       00:02:54 |         0.59 |          0.4 |          0.0010 |
|      25 |         450 |       00:03:06 |         0.61 |          0.4 |          0.0010 |
|      27 |         480 |       00:03:18 |         0.65 |          0.4 |          0.0010 |
|      29 |         510 |       00:03:31 |         0.48 |          0.2 |          0.0010 |
|      30 |         540 |       00:03:42 |         0.34 |          0.1 |          0.0010 |
|========================================================================================|
Detector training complete.
*************************************************************************

Проверьте свойства детектора.

detector
detector = 
  yolov2ObjectDetector with properties:

            ModelName: 'vehicle'
              Network: [1×1 DAGNetwork]
    TrainingImageSize: [128 128]
          AnchorBoxes: [4×2 double]
           ClassNames: vehicle

Можно проверить точность обучения путем проверки потерь обучения для каждой итерации.

figure
plot(info.TrainingLoss)
grid on
xlabel('Number of Iterations')
ylabel('Training Loss for Each Iteration')

Прочтите тестовое изображение в рабочую область.

img = imread('detectcars.png');

Запустите обученный детектор объектов YOLO v2 на тестовом изображении для обнаружения транспортного средства.

[bboxes,scores] = detect(detector,img);

Отображение результатов обнаружения.

if(~isempty(bboxes))
    img = insertObjectAnnotation(img,'rectangle',bboxes,scores);
end
figure
imshow(img)

Входные параметры

свернуть все

Маркированные основные истины изображения, заданные как datastore или таблица.

  • Если вы используете datastore, ваши данные должны быть настроены так, чтобы вызывать datastore с read и readall функции возвращают массив ячеек или таблицу с двумя или тремя столбцами. Когда выход содержит два столбца, первый столбец должен содержать ограничительные рамки, а второй столбец должен содержать метки {boxes, labels}. Если выход содержит три столбца, второй столбец должен содержать ограничительные рамки, а третий столбец должен содержать метки. В этом случае первый столбец может содержать данные любого типа. Например, первый столбец может содержать изображения или данные облака точек.

    databoxeslabels
    Первый столбец может содержать данные, такие как данные облака точек или изображения.Второй столбец должен быть массивом ячеек, который содержит M на 5 матриц ограничивающих рамок формы [x center, y center, width, height, yaw]. Векторы представляют расположение и размер ограничивающих рамок для объектов на каждом изображении.Третий столбец должен быть массивом ячеек, который содержит M категориальных векторов -by-1, содержащих имена классов объектов. Все категориальные данные, возвращенные datastore, должны содержать одни и те же категории.

    Для получения дополнительной информации смотрите Datastores for Глубокое Обучение (Deep Learning Toolbox).

  • Если вы используете таблицу, таблица должна иметь два или более столбцов. Первый столбец таблицы должен содержать имена файлов изображений с путями. Изображения должны быть полутоновыми или truecolor (RGB), и они могут быть в любом формате, поддерживаемом imread. Каждый из остальных столбцов должен быть вектором камеры, который содержит M на 4 матрицы, которые представляют один класс объекта, такой как vehicle, flower или stop sign. Столбцы содержат двойные массивы с 4 элементами M ограничивающих прямоугольников в формате [x, y, width, height]. Формат задает положение верхнего левого угла и размер ограничивающего прямоугольника на соответствующем изображении. Чтобы создать таблицу основной истины, можно использовать приложение Image Labeler или Video Labeler app. Чтобы создать таблицу обучающих данных из сгенерированной основной истины, используйте objectDetectorTrainingData функция.

Примечание

Когда обучающие данные заданы с помощью таблицы, trainYOLOv2ObjectDetector функция проверяет эти условия

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

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

График слоев, заданный как LayerGraph объект. График слоев содержит архитектуру сети YOLO v2. Вы можете создать эту сеть, используя yolov2Layers функция. Также можно создать слои сети при помощи yolov2TransformLayer, yolov2ReorgLayer, и yolov2OutputLayer функций. Дополнительные сведения о создании пользовательской сети YOLO v2 см. в разделе Проекте сети обнаружения YOLO v2.

Опции обучения, заданные как TrainingOptionsSGDM, TrainingOptionsRMSProp, или TrainingOptionsADAM объект, возвращенный trainingOptions (Deep Learning Toolbox) функция. Чтобы задать имя решателя и другие опции для сетевого обучения, используйте trainingOptions (Deep Learning Toolbox) функция.

Примечание

The trainYOLOv2ObjectDetector функция не поддерживает следующие опции обучения:

  • trainingOptions Shuffle значения, 'once' и 'every-epoch' не поддерживаются при использовании входов datastore.

  • Входы Datastore не поддерживаются при установке DispatchInBackground опция обучения для true.

Сохраненная контрольная точка детектора, заданная как yolov2ObjectDetector объект. Чтобы сохранить детектор после каждой эпохи, установите 'CheckpointPath' аргумент имя-значение при использовании trainingOptions функция. Сохранение контрольной точки после каждой эпохи рекомендуется, потому что сетевое обучение может занять несколько часов.

Чтобы загрузить контрольную точку для ранее обученного детектора, загрузите MAT-файл из пути контрольной точки. Для примера, если CheckpointPath свойство объекта, заданное как options является '/checkpath'можно загрузить MAT-файл контрольной точки с помощью этого кода.

data = load('/checkpath/yolov2_checkpoint__216__2018_11_16__13_34_30.mat');
checkpoint = data.detector;

Имя MAT-файла включает номер итерации и временную метку момента сохранения контрольной точки детектора. Детектор сохранен в detector переменная файла. Передайте этот файл обратно в trainYOLOv2ObjectDetector функция:

yoloDetector = trainYOLOv2ObjectDetector(trainingData,checkpoint,options);

Ранее обученный детектор объектов YOLO v2, заданный как yolov2ObjectDetector объект. Используйте этот синтаксис, чтобы продолжить обучение детектора с дополнительными обучающими данными или выполнить больше итераций обучения, чтобы улучшить точность детектора.

Набор размеров изображений для многомасштабного обучения, заданный как матрица M-на-2, где каждая строка имеет вид [height width]. Для каждой эпохи обучения входные обучающие изображения случайным образом изменяются на один из M размеров изображений, заданных в этом наборе.

Если вы не задаете trainingSizesфункция устанавливает это значение в размер на слое входа изображений сети YOLO v2. Сеть изменяет размер всех обучающих изображений на это значение.

Примечание

Область входа trainingSizes значения, заданные для многомасштабного обучения, должны быть больше или равны размеру входа в входном слое изображения lgraph входной параметр.

Выходные аргументы

свернуть все

Обученный детектор объектов YOLO v2, возвращенный как yolov2ObjectDetector объект. Можно обучить детектор объектов YOLO v2 обнаруживать несколько классов объектов.

Информация о процессе обучения, возвращенная как массив структур с семью полями. Каждое поле соответствует этапу обучения.

  • TrainingLoss - Потеря обучения при каждой итерации является средней квадратичной невязкой (MSE), рассчитанной как сумма ошибки локализации, доверительной потери и потерь классификации. Для получения дополнительной информации о функции потерь обучения см. Раздел «Потеря обучения».

  • TrainingRMSE - Обучающая средняя квадратичная невязка (RMSE) является RMSE, вычисленным из потерь обучения при каждой итерации.

  • BaseLearnRate - Скорость обучения на каждой итерации.

  • ValidationLoss - Потеря валидации при каждой итерации.

  • ValidationRMSE - Валидация RMSE при каждой итерации.

  • FinalValidationLoss - Окончательная потеря валидации в конце обучения.

  • FinalValidationRMSE - Окончательная валидация RMSE в конце обучения.

Каждое поле является числовым вектором с одним элементом на итерацию обучения. Значения, которые не были вычислены при определенной итерации, назначаются как NaN. Этот struct содержит ValidationLoss, ValidationAccuracy, ValidationRMSE, FinalValidationLoss, и FinalValidationRMSE поля только при options задает данные валидации.

Подробнее о

свернуть все

Предварительная обработка данных

По умолчанию в trainYOLOv2ObjectDetector функция предварительно обрабатывает обучающие изображения путем:

  • Изменение размера входа изображений в соответствии с входом размером сети.

  • Нормализация значений пикселей входа изображений к значению в область значений [0, 1].

Когда вы задаете обучающие данные при помощи таблицы, trainYOLOv2ObjectDetector функция выполняет увеличение данных для предварительной обработки. Функция дополняет вход набор данных:

  • Горизонтальное отражение обучающих данных. Вероятность горизонтального поворота каждого изображения в обучающих данных составляет 0,5.

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

  • Случайное дрожание цвета для яркости, оттенка, насыщения и контрастности.

Когда вы задаете обучающие данные при помощи datastore, trainYOLOv2ObjectDetector функция не выполняет увеличение данных. Вместо этого можно увеличить обучающие данные в datastore с помощью transform и затем обучите сеть с дополненными обучающими данными. Для получения дополнительной информации о том, как применить увеличение при использовании хранилищ данных, смотрите Применить Увеличение к Обучающим Данным в Хранилищах Данных (Deep Learning Toolbox).

Потеря обучения

Во время обучения сеть обнаружения объектов YOLO v2 оптимизирует потери MSE между предсказанными ограничивающими рамками и основной истиной. Функция потерь определяется как

K1i=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+K1i=0S2j=0B1ijobj[(wiw^i)2+(hih^i)2]+K2i=0S2j=0B1ijobj(CiC^i)2+K3i=0S2j=0B1ijnoobj(CiC^i)2+K4i=0S21iobjcclasses(pi(c)p^i(c))2

где:

  • S - количество камер сетки.

  • B количество ограничивающих рамок в каждой камере сетки.

  • 1ijobj равен 1, если jth ограничивающий прямоугольник в камере сетки i отвечает за обнаружение объекта. В противном случае значение устанавливается равным 0. За обнаружение объекта отвечает i камеры сетки, если перекрытие между основной истиной и ограничивающим прямоугольником в этой камере сетки больше или равно 0,6.

  • 1ijnoobj равен 1, если jth ограничивающий прямоугольник в i камер сетки не содержит объекта. В противном случае значение устанавливается равным 0.

  • 1iobj равен 1, если объект обнаружен в i камер сетки. В противном случае значение устанавливается равным 0.

  • K1, K2, K3 и K4 - это веса. Чтобы настроить веса, измените LossFactors свойство выходного слоя при помощи yolov2OutputLayer функция.

Функция потерь может быть разделена на три части:

  • Потеря локализации

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

    • (xi,yi), - центр jth ограничивающего прямоугольника относительно i камер сетки.

    • (x^i,y^i), - центр основной истины относительно сетки камеры i.

    • wiиhi - ширина и высота jth ограничивающего прямоугольника в i камер сетки, соответственно. Размер предсказанного ограничивающего прямоугольника задается относительно входа размера изображения.

    • w^iиh^i - ширина и высота основной истины в сетке камеры i, соответственно.

    • K1 - вес потерь локализации. Увеличьте это значение, чтобы увеличить вес ошибок предсказания ограничивающего прямоугольника.

  • Доверие

    Третий и четвертый условия в функции потерь состоят в доверительной потере. Третий термин измеряет objectness (оценка достоверности) ошибку, когда объект обнаруживается в jth ограничивающем прямоугольнике сетки камеры i. Четвертый член измеряет ошибку возражаемости, когда ни один объект не обнаружен в jth ограничивающем прямоугольнике сетки камеры i. Параметры для вычисления потерь доверия заданы следующим образом.

    • Ci - оценка достоверности jth ограничивающего прямоугольника в сетке камеры i.

    • Ĉi - оценка достоверности основной истины в сетке камеры i.

    • K2 - вес ошибки возражаемости, когда объект обнаруживается в предсказанном ограничивающем прямоугольнике. Можно настроить значение K2, чтобы взвесить оценки достоверности из камер сетки, которые содержат объекты.

    • K3 - вес ошибки возражаемости, когда объект не обнаруживается в предсказанном ограничивающем прямоугольнике. Можно настроить значение K3, чтобы взвесить оценки достоверности из камер сетки, которые не содержат объектов.

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

  • Классификационные потери

    Пятый член функции потерь включает классификационные потери. Например, предположим, что объект обнаружен в предсказанном ограничивающем прямоугольнике, содержащемся в i камер сетки. Затем классификационные потери измеряют квадратичную невязку между условными вероятностями класса для каждого класса в i камер сетки. Параметры для вычисления классификационных потерь определяются следующим образом.

    • pi (c) является оцененной вероятностью условного класса для класса объекта, c в i камер сетки.

    • p^i(c) является фактической вероятностью условного класса для класса объекта, c в i камер сетки.

    • K4 - вес ошибки классификации, когда объект обнаруживается в камере сетки. Увеличьте это значение, чтобы увеличить вес классификационных потерь.

Совет

  • Чтобы сгенерировать основную истину, используйте Image Labeler или Video Labeler приложение. Чтобы создать таблицу обучающих данных из сгенерированной основной истины, используйте objectDetectorTrainingData функция.

  • Чтобы улучшить точность предсказания,

    • Увеличьте количество изображений, которые можно использовать для обучения сети. Можно расширить обучающий набор данных путем увеличения данных. Для получения информации о том, как применить увеличение данных для предварительной обработки, смотрите Preprocess Images for Глубокое Обучение (Deep Learning Toolbox).

    • Выполните многомасштабное обучение при помощи trainYOLOv2ObjectDetector функция. Для этого задайте 'TrainingImageSize'аргумент trainYOLOv2ObjectDetector функция для настройки сети.

    • Выберите якорные рамки, соответствующие набору данных для обучения сети. Вы можете использовать estimateAnchorBoxes функция для вычисления анкерных коробок непосредственно из обучающих данных.

Ссылки

[1] Джозеф. Р, С. К. Диввала, Р. Б. Гиршик, и Ф. Али. «Вы смотрите только один раз: унифицированное обнаружение объектов в реальном времени». В работе Конференции IEEE по компьютерному зрению и распознаванию шаблона (CVPR), стр. 779-788. Лас-Вегас, NV: CVPR, 2016.

[2] Джозеф. Р и Ф. Али. «ЙОЛО 9000: Лучше, Быстрее, Сильнее». В работе Конференции IEEE по компьютерному зрению и распознаванию шаблона (CVPR), стр. 6517-6525. Гонолулу, HI: CVPR, 2017.

Введенный в R2019a