Main Content
Train Fast R-CNN Stop Sign Detector
Load training data.
data = load('rcnnStopSigns.mat', 'stopSigns', 'fastRCNNLayers'); stopSigns = data.stopSigns; fastRCNNLayers = data.fastRCNNLayers;
Add fullpath to image files.
stopSigns.imageFilename = fullfile(toolboxdir('vision'),'visiondata', ... stopSigns.imageFilename);
Randomly shuffle data for training.
rng(0); shuffledIdx = randperm(height(stopSigns)); stopSigns = stopSigns(shuffledIdx,:);
Create an imageDatastore using the files from the table.
imds = imageDatastore(stopSigns.imageFilename);
Create a boxLabelDatastore using the label columns from the table.
blds = boxLabelDatastore(stopSigns(:,2:end));
Combine the datastores.
ds = combine(imds, blds);
The stop sign training images have different sizes. Preprocess the data to resize the image and boxes to a predefined size.
ds = transform(ds,@(data)preprocessData(data,[920 968 3]));
Set the network training options.
options = trainingOptions('sgdm', ... 'MiniBatchSize', 10, ... 'InitialLearnRate', 1e-3, ... 'MaxEpochs', 10, ... 'CheckpointPath', tempdir);
Train the Fast R-CNN detector. Training can take a few minutes to complete.
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. *******************************************************************
Test the Fast R-CNN detector on a test image.
img = imread('stopSignTest.jpg');
Run the detector.
[bbox, score, label] = detect(frcnn, img);
Display detection results.
detectedImg = insertObjectAnnotation(img,'rectangle',bbox,score);
figure
imshow(detectedImg)
Supporting Functions
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