exponenta event banner

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);

Создайте боксLabelDatastore, используя столбцы меток из таблицы.

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)

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

свернуть все

Помеченные изображения истинности грунта, указанные как хранилище данных или таблица.

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

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

    Дополнительные сведения см. в разделе Хранилища данных для глубокого обучения (панель инструментов глубокого обучения).

  • При использовании таблицы таблица должна иметь два или более столбцов. Первый столбец таблицы должен содержать имена файлов изображений с путями. Изображения должны иметь оттенки серого или цветные (RGB) и могут быть в любом формате, поддерживаемом imread. Каждый из оставшихся столбцов должен быть вектором ячейки, который содержит M-by-4 матрицы, представляющие один класс объектов, такие как транспортное средство, цветок или знак остановки. Столбцы содержат 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' не поддерживаются при использовании входных данных хранилища данных.

  • Входные данные хранилища данных не поддерживаются при установке 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]. Для каждого периода обучения входные обучающие изображения случайным образом изменяются в соответствии с одним из М размеров изображения, указанных в этом наборе.

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

Примечание

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

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

свернуть все

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

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

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

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

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

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

  • ValidationRMSE - Проверка RMSE на каждой итерации.

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

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

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

Подробнее

свернуть все

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

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

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

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

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

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

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

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

При указании данных обучения с помощью хранилища данных trainYOLOv2ObjectDetector функция не выполняет увеличение данных. Вместо этого можно расширить учебные данные в хранилище данных с помощью transform и затем обучайте сеть дополненными данными обучения. Дополнительные сведения о применении дополнений при использовании хранилищ данных см. в разделе Применение дополнений к учебным данным в хранилищах данных (панель инструментов глубокого обучения).

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

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

K1∑i=0S2∑j=0B1ijobj [(xi x ^ i) 2 + (yi y ^ i) 2] + K1∑i=0S2∑j=0B1ijobj [(wi w ^ i) 2 + (hi h ^ i) 2] +K2∑i=0S2∑j=0B1ijobj (Ci C ^ i) 2 +K3∑i=0S2∑j=0B1ijnoobj (Ci C ^ i) 2 + K4∑i=0S21iobj∑c∈classes (pi (c) p ^ i (c)) 2

где:

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

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

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

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

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

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

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

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

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

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

    • (x ^ i, y ^ i), является центром истинности земли относительно ячейки сетки i.

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

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

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

  • Потеря доверия

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

    • Ci - оценка достоверности j-ой ограничивающей рамки в ячейке сетки 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 функция.

  • Для повышения точности прогнозирования

    • Увеличьте количество изображений, которые можно использовать для обучения сети. Набор учебных данных можно расширить путем увеличения объема данных. Сведения о применении увеличения данных для предварительной обработки см. в разделе Изображения предварительной обработки для глубокого обучения (панель инструментов глубокого обучения).

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

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

Ссылки

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

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

Представлен в R2019a