Matlab实现Faster-RCNN目标检测

用Matlab自带的FastRcnnNetwork工具箱实现深度学习目标检测

一.搭建训练数据集和验证数据集

用的是Matlab2018a以上版本里的应用程序带的ImageLabeler来进行数据标记:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcV7if0B-1615620664784)(C:\Users\pc\Desktop\新建文件夹.png)]

将标记好的数据以.groundTruth格式导入到工作区间,并且要存储到文件夹里。这里是以.mat的格式存储到了matlab的路径下。一定要注意要将.groundTruth变量中的LabelData数据全部转化为double格式(如果以struct格式存在,后面数据集提取时会报错。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c5Ygf9C3-1615620664786)(C:\Users\pc\Desktop\新建文件夹.png)]

二.数据整合与模型训练

详见Matlab参考文档

或者直接在命令行输入指令:

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

赛亚茂

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

YOLOV5学习笔记

Yolov5有很多版本,但是 Yolov5s网络最小,速度最少,AP精度也最低。但如果检测的以大目标为主,追求速度,倒也是个不错的选择。其他的三种网络,在此基础