trainYOLOv2ObjectDetector

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

Описание

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

пример

detector = trainYOLOv2ObjectDetector(trainingData,lgraph,options) возвращается детектор объектов обучил использование, вы только смотрите однажды версия 2 (YOLO v2) архитектура сети, заданная входом lgraph. 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-by-5 матрицы ограничительных рамок формы [центр x, центр y, width, height, yaw]. Векторы представляют местоположение и размер ограничительных рамок для объектов в каждом изображении.Третий столбец должен быть массивом ячеек, который содержит M-by-1 категориальные векторы, содержащие имена класса объекта. Все категориальные данные, возвращенные 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 (Deep Learning Toolbox) функция. Чтобы задать имя решателя и другие опции для сетевого обучения, используйте trainingOptions (Deep Learning Toolbox) функция.

Примечание

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-by-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 является весом для ошибки классификации, когда объект обнаруживается в ячейке сетки. Увеличьте это значение, чтобы увеличить весомость за потерю классификации.

Советы

  • Чтобы сгенерировать основную истину, используйте приложение 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