Загрузите обучающие данные.
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);
Обучите детектор Fast 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. *******************************************************************
Протестируйте детектор Fast 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