Загрузите обучающие данные для обнаружения транспортного средства в рабочую область.
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)