|
inputSize = [224 224 3]; |
|
|
|
preprossedTrainingData = transform(trainingData, @(data)preprocessData(data,inputSize)); |
|
numAnchors = 3; |
|
anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData,numAnchors) |
|
|
|
featuresExtractionNetwork = resnet50; |
|
|
|
featureLayer - "activation_40_relu"; |
|
|
|
numClasses = width(vehicleDataset)-1; |
|
|
|
lgraph = fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer); |
|
|
|
augmentedTrainingData = transform(trainingData,@aumentData); |
|
|
|
augmentedData = cell(4,1); |
|
for k = 1:4 |
|
data = read(augmentedTrainingData); |
|
augmentedData{k} = insertShape)data{1},"rectangle",data{2}); |
|
reset(augmentedTrainingData); |
|
end |
|
figure |
|
montage(augmentedData,BorderSize=10) |
|
|
|
trainingData = transform(augmentedTrainingData,@(data)preprocessData(data,inputSize)); |
|
validationData = transform(validationData,@(data)preprocessData(data,inputSize)); |
|
|
|
data = read(trainingData); |
|
|
|
I = data{1}; |
|
bbox = data{2}; |
|
annotatedImage = insertShape(I,"rectangle",bbox); |
|
annotatedImage = imresize(annotatedImage,2); |
|
figure |
|
imshow(annotatedImage) |
|
|
|
// Train Faster R-CNN |
|
|
|
options = trainingOptions("sgdm",... |
|
MaxEpochs=10,... |
|
MiniBatchSize=2,... |
|
InitialLearnRate=1e-3,... |
|
CheckpointPatin=tempdir,... |
|
ValidationData=validationData); |
|
|
|
if doTraining |
|
% Train the Faster R-CNN detector. |
|
% * Adjust NegativeOveralpRange and PositiveOverlapRange to ensure |
|
% that training samples tightly overlap with ground truth. |
|
[detector, info] = trainFasterRCNNObjectDetector(training |
|
NegativeOverlapRange=[0 0.3], ... |
|
PositiveOverlapRange=[0.6 1]); |
|
else |
|
% Load pretrained detector for the example. |
|
pretrained = load("fasterRCNNResNet50EndToEndVehicleExample.mat"); |
|
detector = pretrained.detetor; |
|
end |
|
|
|
I = imread(testDataTbl.imageFilename{3}); |
|
I = imresize(I,inputSize(1:2)); |
|
[bboxes,scores] = detect(detector,I); |
|
|
|
I = insertObjectAnnotation(I,"rectangle",bboxes,scores); |
|
figure |
|
imshow(I) |
|
|
|
testData = transform(testData,@(data)preprocessData(data,inputSize)); |
|
|
|
detectionResults = detect(detector,testData,... |
|
Threshold=0.2,... |
|
MiniBatchSize=4); |
|
|
|
classID = 1; |
|
metrics = evaluateObjectDetection(detectionResults,testData); |
|
precision = metrics.ClassMetrics.Precision{classID}; |
|
recall = metrics.ClassMetrics.Recall{classID}; |
|
|
|
figure |
|
plot(recall,precision) |
|
xlabel("Recall") |
|
ylable("Precision") |
|
grid on |
|
title(sprintf("Average Precision = %.2f", metrics.ClassMetrics.mAP(classID))) |
|
|
|
function data = augmentData(data) |
|
% Randomly flip images and bounding boxes horizontally. |
|
tform = randomAffine2d("XReflection",true); |
|
sz = size(data{1}); |
|
rout = affineOutputView(sz,tform); |
|
data{1} = imwarp(data{1},tform,"OutputView",rout); |
|
|
|
% Sanitize boxes, if needed. This helper function is attached as a |
|
% supporting file. Open the example in MATLAB to open this function. |
|
data{2} = helperSanitizeBoxes(data{2}); |
|
|
|
% Warp boxes. |
|
data{2} = bboxwwarp(data{2},tform,rout); |
|
end |
|
|
|
function data = preprocessData(data,targetSize) |
|
% Resize image and bounding boxes to targetSize. |
|
sz = size(data{1},[1 2]); |
|
scale = targetSize(1:2)./sz; |
|
data{1} = imresize(data{1},targetSize(1:2)); |
|
|
|
% Sanitize boxes, if needed. This helper function is attached as a |
|
% supporting file. Open the example in MATLAB to open this function. |
|
data{2} = helperSanitizeBoxes(data{2}); |
|
|
|
% Resize boxes. |
|
data{2} = bboxresize(data{2},scale); |
|
end |