文章目录[隐藏]
用Matlab自带的FastRcnnNetwork工具箱实现深度学习目标检测
一.搭建训练数据集和验证数据集
用的是Matlab2018a以上版本里的应用程序带的ImageLabeler来进行数据标记:
将标记好的数据以.groundTruth格式导入到工作区间,并且要存储到文件夹里。这里是以.mat的格式存储到了matlab的路径下。一定要注意要将.groundTruth变量中的LabelData数据全部转化为double格式(如果以struct格式存在,后面数据集提取时会报错。)
二.数据整合与模型训练
或者直接在命令行输入指令:
help trainFasterRCNNObjectDetector
查看参考文档对数据集进行划分和参数设置操作。
load('gTruth.mat');
holesTrainingDataset = objectDetectorTrainingData(gTruth);
trainingData = holesTrainingDataset;
rng(0);
shuffledIdx = randperm(height(trainingData));
trainingData = trainingData(shuffledIdx,:);
imds = imageDatastore(trainingData.imageFilename);
blds = boxLabelDatastore(trainingData(:,2:end));
ds = combine(imds, blds);
options = trainingOptions('sgdm', ...
'MiniBatchSize', 1, ...
'InitialLearnRate', 1e-3, ...
'MaxEpochs', 10, ...
'VerboseFrequency', 200, ...
'CheckpointPath', tempdir);
inputImageSize = [70 86 3];
numClasses = 1;
anchorBoxes = [8,8; 12,12; 24 24];
network = 'resnet50';
featureLayer = 'activation_40_relu';
lgraph = fasterRCNNLayers(inputImageSize, numClasses, anchorBoxes,network,featureLayer);
detector = trainFasterRCNNObjectDetector(ds,lgraph,options);
%% 以下是将数据进行保存在RCNNStructure2.mat中的操作
save('RCNNStructure2','detector');
当模型训练完成后会在命令行有如下提示:
*************************************************************************
Training a Faster R-CNN Object Detector for the following object classes:
* holes
警告: 数据存储输入不可乱序,但 trainingOptions 指定了乱序。训练将继续,而不进行乱序处理。
> In nnet.internal.cnn.DataDispatcherFactory>iCheckDatastoreSupportTrainingOptions (line 346)
In nnet.internal.cnn/DataDispatcherFactory/createDataDispatcherMIMO (line 127)
In vision.internal.cnn.trainNetwork>iCreateTrainingDataDispatcher (line 180)
In vision.internal.cnn.trainNetwork (line 34)
In trainFasterRCNNObjectDetector>iTrainEndToEnd (line 868)
In trainFasterRCNNObjectDetector (line 419)
In Untitled2 (line 28)
在单 CPU 上训练。
正在初始化输入数据归一化。
|=============================================================================================================|
| 轮 | 迭代 | 经过的时间 | 小批量损失 | 小批量准确度 | 小批量 RMSE | RPN Mini-batch | RPN Mini-batch | 基础学习率 |
| | | (hh:mm:ss) | | | | Accuracy | RMSE | |
|=============================================================================================================|
| 1 | 1 | 00:00:42 | 1.5564 | 68.99% | 0.17 | 83.67% | 0.85 | 0.0010 |
| 7 | 200 | 02:19:00 | 0.2222 | 97.67% | 0.14 | 100.00% | 0.52 | 0.0010 |
| 10 | 300 | 03:27:41 | 0.4296 | 97.12% | 0.06 | 100.00% | 0.97 | 0.0010 |
|=============================================================================================================|
Detector training complete.
*******************************************************************
三.模型的测试
以下是测试代码:
function vecI = fastRCNNTest
load('RCNNStructure2.mat');
[filename pathname filterindex] = uigetfile(...
{'*.png','图像文件(*.png)';...
'*.jpg','图像文件(*.jpg)';...
'*.*','所有文件(*.*)'},...
'选择图像文件','MultiSelect','off',...
pwd);
filePath = 0;
if isequal(filename,0)||isequal(pathname,0) %只要这里面表示返回或没有合适的文件时候
return;
end
Path = fullfile(pathname,filename);
I = imread(Path);
[bboxes,scores] = detect(detector,I);
allShow = inputdlg('请问是否显示检测图片','显示图片',1,{'yes'});
if strcmp(allShow{1},'yes')
X = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure(100);
imshow(X);
end
everyShow = inputdlg('请问是否显示每张图片','显示图片',1,{'yes'});
if strcmp(everyShow{1},'yes')
numbers = size(bboxes,1);
testPic = cell(numbers,3);
for i = 1:numbers
figure(i)
M = bboxes(i,:);
vecI{i} = I(M(2):(M(2)+ M(4)),M(1):(M(1)+M(3)),:);
imshow(vecI{i});
end
end
end
随机拿一张测试图片进行测试操作:
可见右侧的孔还是没有监测出来,还有就是训练的时间太长了。
版权声明:本文为CSDN博主「赛亚茂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shengzimao/article/details/114748956
暂无评论