trainYOLOv2ObjectDetector

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

Описание

пример

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

пример

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

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

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

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

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

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

пример

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

Примеры

свернуть все

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

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]

Смотрите слои в сети 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

Checking training data...done.
Initializing input data normalization.
Training on single GPU.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     RMSE     |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |         7.14 |         50.9 |          0.0010 |
|       2 |          30 |       00:00:15 |         1.41 |          2.0 |          0.0010 |
|       4 |          60 |       00:00:29 |         1.33 |          1.8 |          0.0010 |
|       5 |          90 |       00:00:43 |         0.85 |          0.7 |          0.0010 |
|       7 |         120 |       00:00:58 |         0.92 |          0.8 |          0.0010 |
|       9 |         150 |       00:01:12 |         1.05 |          1.1 |          0.0010 |
|      10 |         180 |       00:01:26 |         0.65 |          0.4 |          0.0010 |
|      12 |         210 |       00:01:40 |         0.74 |          0.5 |          0.0010 |
|      14 |         240 |       00:01:55 |         0.72 |          0.5 |          0.0010 |
|      15 |         270 |       00:02:08 |         0.60 |          0.4 |          0.0010 |
|      17 |         300 |       00:02:23 |         0.55 |          0.3 |          0.0010 |
|      19 |         330 |       00:02:37 |         0.53 |          0.3 |          0.0010 |
|      20 |         360 |       00:02:50 |         0.52 |          0.3 |          0.0010 |
|      22 |         390 |       00:03:04 |         0.54 |          0.3 |          0.0010 |
|      24 |         420 |       00:03:18 |         0.50 |          0.3 |          0.0010 |
|      25 |         450 |       00:03:32 |         0.48 |          0.2 |          0.0010 |
|      27 |         480 |       00:03:46 |         0.64 |          0.4 |          0.0010 |
|      29 |         510 |       00:04:00 |         0.44 |          0.2 |          0.0010 |
|      30 |         540 |       00:04:13 |         0.43 |          0.2 |          0.0010 |
|========================================================================================|
Detector training complete.
*************************************************************************

Смотрите свойства детектора.

detector
detector = 
  yolov2ObjectDetector with properties:

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

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

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 функции должны возвратить массив ячеек или таблицу с тремя столбцами, {images, boxes, labels}.

    • изображения Первый столбец должен быть вектором ячейки изображений, которые могут быть шкалой полутонов, RGB или M-by-N-by-P многоканальное изображение.).

    • boxes — Второй столбец должен быть вектором ячейки, который содержит M-by-4 матрицы ограничительных рамок в формате [x, y, width, height]. Векторы представляют местоположение и размер ограничительных рамок для объектов в каждом изображении.

    • labels — Третий столбец должен быть вектором ячейки, который содержит M-by-1 категориальные векторы, содержащие имена класса объекта. Все категориальные данные, возвращенные datastore, должны содержать те же категории.

    Можно использовать combine функция, чтобы создать datastore, чтобы использовать в обучении.

    • imageDatastore — Создайте datastore, содержащий изображения.

    • boxLabelDatastore — Создайте datastore, содержащий ограничительные рамки и метки.

    • combineimds , blds) — Комбинируют изображения, ограничительные рамки и метки в один datastore.

    Для получения дополнительной информации смотрите Хранилища данных для Глубокого обучения (Deep Learning Toolbox).

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

Примечание

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

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

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

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

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

Примечание

trainYOLOv2ObjectDetector функция не поддерживает эти опции обучения:

  • 'training-progress' значение Plots опция обучения

  • ValidationData, ValidationFrequency, или ValidationPatience опции обучения

  • OutputFcn опция.

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

Сохраненная контрольная точка детектора, заданная как 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-by-2 матрица, где каждая строка имеет форму [height width]. В течение каждой учебной эпохи входные изображения обучения случайным образом изменены к одному из размеров изображения M, заданных в этом наборе.

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

Примечание

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

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

свернуть все

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

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

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

  • TrainingRMSE — Учебная среднеквадратическая ошибка (RMSE) является RMSE, вычисленным от учебной потери в каждой итерации.

  • BaseLearnRate — Темп обучения в каждой итерации.

Каждое поле является числовым вектором с одним элементом на учебную итерацию. Значения, которые не были вычислены в определенной итерации, присвоены как NaN.

Больше о

свернуть все

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

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

  • Изменение размеров входа отображает, чтобы совпадать с входным размером сети.

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

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

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

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

  • Произвольный цвет, дрожащий для яркости, оттенка, насыщения и контраста.

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

Учебная потеря

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

где:

  • S является количеством ячеек сетки.

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

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

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

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

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

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

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

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

    • , центр ограничительной рамки jth относительно ячейки сетки i.

    • , центр основной истины относительно ячейки сетки i.

    • ширина и высота ограничительной рамки jth в ячейке сетки 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.

    • фактическая условная вероятность класса для класса объекта c в ячейке сетки i.

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

Советы

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

  • Улучшить точность прогноза,

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

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

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

Ссылки

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

[2] Джозеф. R и Ф. Али. "YOLO 9000: Лучше, Быстрее, Более сильный". В Продолжениях Конференции по IEEE по Компьютерному зрению и Распознаванию образов (CVPR), стр 6517–6525. Гонолулу, HI: CVPR, 2017.

Введенный в R2019a