MATLAB上使用FasterRcnn实现目标(温湿度计)检测

2023-11-19

本文硬件环境是:win7 64位;MATLAB R2018a;
由于第一次接触目标检测,很多东西只是照猫画虎,不甚了解,将自己成功的测试流程记录如下,方便和自己有同样需求的人拿来就用,减少学习过程中的不必要的困难。 主要参照资料1和4中的方法,进行网络的生成与测试。

本文目标

本文的目标是实现在图片中对温湿度计的目标检测,效果类似于下面的图。

标注照片

在生成网络前,需要对数据进行处理,即在图像中标注出温湿度计的位置。

打开MATLAB R2018a,输入命令trainingImageLabeler,使用matlab自带的trainingImageLabeler来对图片进行标注。

在matlab命令框处,输入:imageLabeler 打开Image Labeler对话框。
imageLabeler
打开Image Labeler 后,点击Load—>Add images from folder,选中所有要标注的图片,点击确定

本次选择51张图片标注,标注方法如上图所示,也可以参照资料1,4对数据进行标注。如果之前已经有标注好的文件,可以点击“Import Labels——>From File” 导入。这里只说两点要注意的,一是选择图像的时候,可以选择所有照片;二是标注完成后,电机工具栏右侧的“Export Labels”将文本导出,导出过程中选择文件类型,这里选的是“table”。

文件标注完毕后,可以选择“Save ”保存本次标过程文件,方便下次修改(注意:标注的结果,需要用Export Labels)。

导出的文件,格式为‘.mat’。若选择导出到工作区,变量名默认选择默认即可,格式,选择table

整理训练图像

如果用保存到工作区的标注结果用来训练,这部分可以忽略。

图片标注好后,我们可以得到训练图片的地址,和图片上表示温湿度计位置的数组。在训练前,需要将标注的温湿度计提取出来,更改成 227 × 227 227\times 227 227×227大小,按顺序保存下来,效果如下:

这里每张图片的分辨率都是 227 × 227 227\times 227 227×227,用来进行训练的。
图片的更改函数为:extractpeople(matpath,savepath),extractpeople这个名字来自于参考资料1,文件是识别人物的,所以是extractpeople
其中,matpath为原图片地址路径;
matpath 填入的是一个mat文件,比如

matpath=(‘D:\MATLAB\toolbox\vision\visiondata\people\tset_1\peopledata.mat’)

savepath为图像处理完成后的保存路径;

savepath=(‘D:\MATLAB\toolbox\vision\visiondata\people\tset_1\people’);
%框选图片保存位置

function extractpeople(matpath,savepath)
    %batch change image size
    load(matpath); 
    %get image
    [length b]=size(gTruth.DataSource.Source);   
    %get the number of image
    for i=1:length
        img=imread(gTruth.DataSource.Source{i});
        str=zeros(1,4);
%	这里的1,2,3,4分别是标注框的坐标
%   坐标提取形式应该与你保存的数据格式(就是Image Labeler中“Export Labels”的数据格式)相对应。
%   我存下来的是cell形式,所以用{i}(j)的形式
        str(1)=gTruth.LabelData.clock{i}(1);
        str(2)=gTruth.LabelData.clock{i}(2);
        str(3)=gTruth.LabelData.clock{i}(3);
        str(4)=gTruth.LabelData.clock{i}(4);   
        rect=str;      
        I=imcrop(img,rect);
        I=imresize(I,[227 227]);
        imwrite(I,[savepath,'\',num2str(i),'.jpg']);
        %resize image
    end
end

网络生成与测试

设定参数,生成网络

%% Step 1: 设置网络参数
% options = trainingOptions('sgdm', ...
% 'MiniBatchSize', 4, ... %Faster-RCNN中的minibatch只能设置成1
% 'InitialLearnRate', 1e-4, ... %学习率,设置大的话训练速度快但效果比较差,甚至会发散,设置小了训练速度会较慢
% 'LearnRateSchedule', 'piecewise', ...
% 'LearnRateDropFactor', 0.1, ...
% 'LearnRateDropPeriod', 100, ...
% 'MaxEpochs', 20, ...
% 'CheckpointPath', tempdir, ...
% 'Verbose', true);
%% Step 2: 生成网络
% detector = trainFasterRCNNObjectDetector(gTruth,alexnet,options);

trainingOptions 用来设置网络训练的一些参数选项;
trainFasterRCNNObjectDetector 用来生成网络,gTruth 是对目标标注的结果;alexnet 是选择的主干网络;options 为trainingOptions设定结果。
参考资料4中,说 ‘MiniBatchSize’, 4, … %Faster-RCNN中的minibatch只能设置成1 但是我在运行过程中报错,说这里最低设成4。

保存和载入网络

用save命令可以保存训练好的网络,load用来载入保存的网络。
save(‘FasterRCNN_net_20190825.mat’, detector) #保存训练网络
load(‘FasterRCNN_net_20190825.mat’);
save和load还有其他运行格式,另外,可以在工作区网络变处,右键单击,选择另存为。我这里训练好的网络保存后,大概有1.2G数据,不知道是不是正常。
在这里插入图片描述

测试

选择一张图像进行测试。在测试过程中,我发现测试图像的大小对结果影响较大。最开始我测试图像的分辨率是 4608 × 2112 4608\times 2112 4608×2112,最后测试出的结果并不准确,如下图,在图像中找到了三个疑似目标,都是圆形的部分。

将测试图像的尺寸更改后,得到效果如下:

我做了一个测试,改变图像的尺寸后在进行目标检测,结果如下:
在这里插入图片描述
测试总共用了12张图片。每一列表示相同的图片在不同尺寸下目标检测得分,每一行表示一次测试过程中,不同图像检测结果得分。如果没有检测到目标,填入0,如果检测到多个目标,则填入检测到的目标数量。
从表中可以看到,图像尺寸对检测结果存在影响,很难说尺寸越小检测越准确。但是如果我们检测到多个目标,或未检测到目标时,可以试着改变图像尺寸再进行检测。

测试代码如下:

    img = imread('E:\DL\test\w_20190824082731.jpg');
    img=imresize(img,[528 1152]);%跟图像尺寸有关系,尺寸太大,不准了,可能出现找不到,或者找到更多的问题
    [bbox, score, label] = detect(detector, img);
    detectedImg = insertShape(img, 'Rectangle', bbox);
    figure
    imshow(detectedImg)
    title('检测目标')

关于一些细节

缓存文件清理

在网络生成过程中,会产生几十G的缓存文件,很占C盘位置,所以结束后一定要对这部分文件进行清理。我找到的办法,就是用360安全卫士清理电脑。

GPU支持

最开始的时候没有装GPU的驱动,用CPU产生网络,速度真的很慢。所以建议安装GPU支持,能够极大的缩短网络训练时间。
安装GPU支持,需要2步。

安装显卡驱动

去官网找到支持电脑显卡的驱动,并进行安装。

安装CUDA

首先检查你电脑支持哪个版本的CUDA。
1>首先打开控制面板,在控制面板进行搜索。

2>然后,双击NVIDIA控制面板,打开如下的控制面板

3> 单击帮助按钮,选择系统信息,然后打开如下面板

4>选择组件,然后会看到红色框的内容,箭头所指的CUDA版本,就是你电脑支持的CUDA版本。

cuda历史各个版本下载链接
https://developer.nvidia.com/cuda-toolkit-archive

安装CUDA的时候,默认安装即可,一路下一步

参考资料

  1. MATLAB2017a使用FasterRcnn目标检测训练及其测试流程
  2. fast RCNN训练车型模块
  3. 官网教程:Train a Faster R-CNN deep learning object detector
  4. MATLAB2018B下用Faster-RCNN做目标检测的训练和测试步骤
  5. 本文代码,可以在这里下载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB上使用FasterRcnn实现目标(温湿度计)检测 的相关文章

  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • 计算数组中接下来的 n 个元素的乘积

    我想计算下一个的乘积n矩阵的相邻元素 号码n要相乘的元素数应在函数的输入中给出 例如 对于此输入 我应该从第一个开始计算每 3 个连续元素的乘积 p ind max product 1 2 2 1 3 1 3 这给出了 1 2 2 2 2
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • Matlab Mex文件编译

    我正在尝试编译一个 mex 文件以在 matlab 中使用套接字连接 问题是它总是说我没有安装sdk或编译器 但我已经安装了 Visual Studio 2010 Express Visual Studio 2012 Express Vis
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • Matlab没有优化以下内容吗?

    我有一个很长的向量 1xrv 和一个很长的向量w1xs 和一个矩阵Arxs 它是稀疏的 但维度非常大 我期望 Matlab 对以下内容进行优化 这样我就不会遇到内存问题 A v w 但看起来 Matlab 实际上是在尝试生成完整的v w矩阵
  • MATLAB 特征函数

    我很好奇哪里可以找到完整的描述FEATURE功能 它接受哪些论点 没有找到文档 我只听说过memstats and getpid 还要别的吗 gt gt which feature built in undocumented 注意 更完整的
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在matlab中绘制给定区域内(两个圆之间)的向量场

    我想在 Matlab 中绘制下面的向量场 u cos x x 0 y y 0 v sin x x 0 y y 0 我可以在网格中轻松完成 例如 x 和 y 方向从 2 到 2 x 0 2 y 0 1 x y meshgrid 2 0 2 2
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 检测数据集中线性行为的算法

    我已经发布了一个关于对数据集的一部分进行多项式拟合的算法 https stackoverflow com q 17595932 2320757前一段时间收到一些建议去做我想做的事 但我现在面临另一个问题 我尝试应用答案中建议的想法 我的目标

随机推荐