Загрузите обучающие данные.
data = load('rcnnStopSigns.mat', 'stopSigns', 'fastRCNNLayers'); stopSigns = data.stopSigns; fastRCNNLayers = data.fastRCNNLayers;
Добавьте полный путь в файлы изображений.
stopSigns.imageFilename = fullfile(toolboxdir('vision'),'visiondata', ... stopSigns.imageFilename);
Случайным образом переставьте данные для обучения.
rng(0); shuffledIdx = randperm(height(stopSigns)); stopSigns = stopSigns(shuffledIdx,:);
Создайте imageDatastore использование файлов из таблицы.
imds = imageDatastore(stopSigns.imageFilename);
Создайте boxLabelDatastore использование столбцов меток из таблицы.
blds = boxLabelDatastore(stopSigns(:,2:end));
Объедините хранилища данных.
ds = combine(imds, blds);
Изображения обучения знака Стоп имеют различные размеры. Предварительно обработайте данные, чтобы изменить размер изображения и полей к предопределенному размеру.
ds = transform(ds,@(data)preprocessData(data,[920 968 3]));
Установите сетевые опции обучения.
options = trainingOptions('sgdm', ... 'MiniBatchSize', 10, ... 'InitialLearnRate', 1e-3, ... 'MaxEpochs', 10, ... 'CheckpointPath', tempdir);
Обучите Быстрый детектор R-CNN. Обучение может занять несколько минут, чтобы завершиться.
frcnn = trainFastRCNNObjectDetector(ds, fastRCNNLayers , options, ... 'NegativeOverlapRange', [0 0.1], ... 'PositiveOverlapRange', [0.7 1]);
******************************************************************* Training a Fast R-CNN Object Detector for the following object classes: * stopSign --> Extracting region proposals from training datastore...done. Training on single GPU. |=======================================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Mini-batch | Mini-batch | Base Learning | | | | (hh:mm:ss) | Loss | Accuracy | RMSE | Rate | |=======================================================================================================| | 1 | 1 | 00:00:29 | 0.3787 | 93.59% | 0.96 | 0.0010 | | 10 | 10 | 00:05:14 | 0.3032 | 98.52% | 0.95 | 0.0010 | |=======================================================================================================| Detector training complete. *******************************************************************
Протестируйте Быстрый детектор R-CNN на тестовом изображении.
img = imread('stopSignTest.jpg');
Запустите детектор.
[bbox, score, label] = detect(frcnn, img);
Отобразите результаты обнаружения.
detectedImg = insertObjectAnnotation(img,'rectangle',bbox,score);
figure
imshow(detectedImg)
function data = preprocessData(data,targetSize) % Resize image and bounding boxes to the targetSize. scale = targetSize(1:2)./size(data{1},[1 2]); data{1} = imresize(data{1},targetSize(1:2)); bboxes = round(data{2}); data{2} = bboxresize(bboxes,scale); end