matlab实现RCNN(二)

2023-11-15

本文在MatlabR2016b上使用自带的深度学习工具实现RCNN来进行车辆检测。

实验环境

训练图片数量:825(网上收集+部分公共数据集)

图片车辆数量:2300(对每张图片手工标注label得到)

实验环境:MatlabR2016b(自带深度学习工具)

CPU:I7-4510U

显卡:NVIDIA GeForce840M(必须是N卡,因为需要使用cuda加速)

内存:8G

图片标注

使用matlab自带的M文件trainingImageLabeler.m来对图片进行标注,which一下就知道这个文件在哪了。

which trainingImageLabeler.m

打开之后运行就会出现这个界面

1

选择AddImages将要训练的图片放进去(可以放入多张图片),在ROI Label区域右键可以选择改变label 的color和name,如果要训练多个类,也可以点击Add ROI Label来添加label。

2

所有label标注完后点击 Export ROIs 就会得到像这样的一个table文件。

3

imageFilename代表了图片所存储的位置;
vehicle和pedestrian代表了图片中标注的车辆和行人,用矩阵存储,分别为图片左上的坐标(x,y)和图片的大小(width,height);
在有的公共数据集中,可能会提供原始图片和图片的标注信息,只要将标注信息做成这样的table就可以。如BIT-vehicle数据集中就提供了图片标注信息,用以下代码做成类似RCNN的数据格式。

clear;clc;
load('VehicleInfo.mat');
n=size(VehicleInfo,1);
a=cell(n,2);
d='F:\1work\车型识别\BIT-vehicle\BITVehicle_Dataset\';
for i=1:n
    path=[d VehicleInfo(i).name];
    m=VehicleInfo(i).nVehicles;
    b=[];c=[];
    for j=1:m
        x=VehicleInfo(i).vehicles(j).left;
        y=VehicleInfo(i).vehicles(j).top;
        w=VehicleInfo(i).vehicles(j).right-VehicleInfo(i).vehicles(j).left;
        h=VehicleInfo(i).vehicles(j).bottom-VehicleInfo(i).vehicles(j).top;
        b=[x,y,w,h];
        c=[c;b];
    end
    a{i,1}=path;
    a{i,2}=c;
end

RCNN训练

trainRCNNObjectDetector

RCNN的训练主要使用trainRCNNObjectDetector.m函数

detector = trainRCNNObjectDetector(groundTruth,network,options)

groundTruth - 具有2个或更多列的表。 第一列必须包含图像文件名。 图像可以是灰度或真彩色,可以是IMREAD支持的任何格式。 其余列必须包含指定每个图像内对象位置的[x,y,width,height]边框的M×4矩阵。 每列表示单个对象类,例如。 人,车,狗。 其实就是之前使用trainingImageLabeler做标注得到的数据。

network - 即为CNN的网络结构

options - 即为网络训练的参数。包括初始化学习率、迭代次数、BatchSize等等。

除了以上三个参数外,还有

‘PositiveOverlapRange’ - 一个双元素向量,指定0和1之间的边界框重叠比例范围。与指定范围内(即之前做图片标注画出的框)的边界框重叠的区域提案被用作正训练样本。Default: [0.5 1]

‘NegativeOverlapRange’ - 一个双元素向量,指定0和1之间的边界框重叠比例范围。与指定范围内(即之前做图片标注画出的框)的边界框重叠的区域提案被用作负训练样本。Default: [0.1 0.5]

在训练之前,RCNN会从训练图片中得到很多候选框,其中满足正样本要求的会被当做训练正样本,而满足负样本要求的会被当做训练负样本。

‘NumStrongestRegions’ - 用于生成训练样本的最强区域建议的最大数量(即最后得到的候选框数量)。 降低该值以加快处理时间,以训练准确性为代价。 将此设置为inf以使用所有区域提案。Default: 2000

迁移学习

CNN的训练是非常耗费时间的,所以直接使用网上训练好的模型继续训练可以大大的节约训练时间。cifar10Net是matlab自带的,其结构如下图。同时也可以去http://www.vlfeat.org/matconvnet/models/ 下载alexnet、VGG16等结构。(由于显卡配置太低,跑了一晚上alexnet都没反应,所以无法使用复杂结构的CNN结构,无奈)

load('rcnnStopSigns.mat','cifar10Net');

4

由于是车辆检测,只有有车和无车两类,所以需要将最后一个全连接层输出改为2,后面接上softmax层和classoutput层。整个训练过程如下:

clear;clc;
load data_v.mat;
load('rcnnStopSigns.mat','cifar10Net');
x=cifar10Net.Layers(1:end-3);

lastlayers = [
fullyConnectedLayer(2,'Name','fc8','WeightLearnRateFactor',1, 'BiasLearnRateFactor',1)
softmaxLayer('Name','softmax')
classificationLayer('Name','classification')
];

mylayers=[x;lastlayers];

options = trainingOptions('sgdm', ...
     'MiniBatchSize', 32, ...
     'InitialLearnRate', 1e-6, ...
     'MaxEpochs', 100);

myRCNN = trainRCNNObjectDetector(data_v, mylayers, options, ...
 'NegativeOverlapRange', [0 0.3]);

RCNN测试

tic;
detectedImg = imread('15.bmp');

[bbox, score, label] = detect(myRCNN2, detectedImg, 'MiniBatchSize', 20);

%显示最强检测结果
% [score, idx] = max(score);

idx=find(score>0.9);
bbox = bbox(idx, :);

% annotation = sprintf('%s: (Confidence = %f)', label(idx(1)), score(idx(1)));
% detectedImg = insertObjectAnnotation(img, 'rectangle', bbox(1,:), annotation);

n=size(idx,1);
for i=1:n
    annotation = sprintf('%s: (Confidence = %f)', label(idx(i)), score(idx(i)));
    detectedImg = insertObjectAnnotation(detectedImg, 'rectangle', bbox(i,:), annotation);
end

figure
imshow(detectedImg);
toc;

部分测试结果如下图:
t1
t2
t3

从检测结果看出:
1.对于背景简单且车辆数目不多的图像,检测效果良好;
2.对于背景复杂且车辆数目较多的图像,容易出现误检测和多个重复的检测窗口;
3.外观类似车辆外形的物体也容易被检测出来;
4.有的图像只能检测出车辆的一部分,检测不出车辆整体;
5.有的图像中车辆部分的score高于车辆整体;
6.远处小物体的检测,误检率更高。

如何改进:
1.增加训练样本的数量和多样性以及训练的次数,让网络更好地学习到车辆的特征;(本次实验的样本单一,且数量较少,以及只有100次的迭代次数,loss较高)
2.CNN网络改为AlexNet、VGG16或者其他泛化能力更好的结构,提高识别率;(显卡性能太低,无法使用更好的网络结构)
3.训练样本的选择优先选择车辆数量较少的图像且单独不密集;(在图片训练的过程中,选择PositiveOverlapRange,NegativeOverlapRange两个参数的值获得正训练样本和负训练样本。如果车辆较密集且遮挡物较多,做标注的时候很难将所有车辆标注出来,很容易在训练时将车辆的部分当成负样本处理,同时在检测的时候也会将多个车辆用一个框标出来)
4.尽量不要选取远处车辆作为label;(由于远处的车辆目标较小,导致特征少,在检测的时候很容易混淆一些小物体和车辆)

个人理解:RCNN的优点在于使用了CNN对目标进行识别,近几年来证明CNN的识别效率高于其他传统算法;而缺点就是对于候选框的搜索还是用的前几年的传统方法,在时间效率上虽然高于传统方法DPM,但是对于实时检测还是略显不足。后来的YOLO弥补了这方面的缺点,直接使用CNN预测检测框,不再proposal,大大缩短了检测时间。

特别说明:本文为本人学习所做笔记。
具体参考:http://blog.csdn.net/Mr_Curry/article/details/53286562

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab实现RCNN(二) 的相关文章

  • MATLAB 黑洞变量

    MATLAB 是否有 黑洞 或丢弃变量 假设我正在做类似的事情 rows cols size A 但我不想存储行 是否有一个 黑洞 变量可以让我发送值去死 所以任务就像 BLACKHOLE cols size A 其中 BLACKHOLE
  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos
  • 笛卡尔散点图上的极坐标网格线

    我有一个脚本来创建散点图 使用gscatter 基于另一个脚本生成的 x y 数据 离散数据点 不连续 由于这些数据点实际上是圆形空间中某些对象的位置 因此添加极坐标网格线将使绘图更有意义 有谁知道如何在笛卡尔散点图上显示极坐标网格线 或者
  • Google Chrome 的互联网历史记录脚本

    我并不是在寻找 最佳 或最有效的脚本来执行此操作 但我想知道是否存在一个脚本可以从 Google Chrome 中提取一天的互联网历史记录并将其记录到 txt 文件中 我更喜欢用 Python 或 MATLAB 编写 如果你们有不同的方法
  • 在 MATLAB 中高效地形成动态窗口

    有人可以帮助我提供一种有效的方法 或者帮助我执行提供的代码 以尽可能少的步骤获得相同的结果 我将感激你 我有一个原始数组 A 1 1 1 4 3 4 5 4 4 3 3 1 0 0 2 6 2 6 3 6 6 2 7 4 8 7 2 2 2
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 是否有一个函数可以将两个元胞数组“压缩”在一起? [复制]

    这个问题在这里已经有答案了 假设我有一个元胞数组A and B as so A A B C D B 1 2 3 4 我想创建元胞数组C通过将 A 和 B 压缩 在一起 如下所示 C zip A B C A 1 B 2 C 3 D 4 这样的
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • 使用 varargin (...) 时如何显示不同的函数用法?

    当您输入 Matlab 函数名称并打开大括号时 例如sum 在命令窗口中 将打开一个工具提示 显示此函数的所有可能用法 当我编写自己的接受函数时varargin 工具提示仅显示一个选项 而不是varargin puts e g myfunc
  • 如何将Matlab代码库与Android集成?

    我有一个算法和 MATLAB 中的一些其他代码 我想在我的 Android 应用程序中使用它 我怎样才能做到这一点 我可以从 MATLAB 制作 jar 文件以便与 Android 一起使用吗 我必须做点别的事吗 如果您还有其他产品 适用于
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一

随机推荐

  • Postman设置中文

    1 下载资源 postman官网下载地址 postman汉化包 2 配置 Mac 访达 应用程序 Postman app 右键查看包内容 替换Postman app Contents Resources app windows 复制到Pos
  • vue新增删除内容排序问题解决处理

    本次答题选项的删除添加是个人最初比较头疼的地方 比如ABCD四个选项 删除c选项后 点击 新增答题类型 选项按钮 则默认创建是E选项 再或者就是ABCD四个选项位置删除任意一个后 顺序被打乱等 最后解决了 就是多写好几行代码 有点繁琐 1
  • vue 使用 scss 的坑

    vue 使用 scss 的坑 日常记录开发中遇到的坑 1 使用 npm install sass loader node sass save dev 进行安装 2 在页面中直接使用 有时候可以 有时候不行 原因 我个人觉得安装的两个插件本版
  • vscode 终端 npm 命令运行时 自动弹出如何打开这个文件?

    解决
  • wireshark数据包分析实战 读书笔记

    由头 永久链接 之前读了很多书籍 但是现在回顾的时候 很多内容仅仅是熟悉 而不是真正掌握 所以尝试一种新的方式 将读书时觉得比较重要的 或者是自己还不理解的东西记录下来 达到这本书我已经不需要再去翻 只要看笔记即可的效果 第一章 数据包分析
  • sql语句查询A表有而B表没有的数据

    SELECT A 户名FROM TABLE A A TABLE B BWHERE A 户名 B 户名 WHERE B 户名 IS NULL 还可以有其他方法 1 select distinct A ID from A where A ID
  • ps多种去水印方法与技巧-适合各种水印

    ps作为一款功能强大的图片处理软件 有着丰富的功能 ps去水印也是我们常用的一种功能 但是在我们日常使用中遇到的水印千奇百怪 不同的水印就需要使用不同的去水印方法 方法一 ps内容识别去水印 1 套索工具圈出水印 2 选择 编辑 填充 内容
  • 深度学习中的优化算法之Adam

    之前在https blog csdn net fengbingchun article details 124909910 介绍过深度学习中的优化算法Adadelta 这里介绍下深度学习的另一种优化算法Adam 论文名字为 ADAM A M
  • 在linux中怎么查看错误日志

    在linux中怎么查看错误日志 cat或者tail f命令日 志 文 件 说 明 var log message 系统启动后的信息和错误日志 是Red Hat Linux中最常用的日志之一 var log secure 与安全相关的日志信息
  • Arthur and Table 【CodeForces - 557C】【Splay】

    题目链接 有一张桌子 有n个腿 第i根腿的长度是li 现在要拿掉一些腿 使得桌子稳定 拿掉第i根腿需要di的能量 稳定的条件是 假如拿掉若干条腿之后 桌子还有k个腿 那么长度最长的腿的数目要超过一半 比如桌子有5根腿 那么至少要有三根腿是最
  • 2016年终总结与来年计划

    光阴似箭 日月如梭 眨眼间已到年底 今年感慨颇丰 获益良多 因为我认为努力了就肯定会有收获 哪怕是收获那一滴滴辛勤的汗水 我在公司任务轻松时 加了些前端群 重点推荐豪情群 在群里分享技术以及生活的点滴 同时认识了一些志同道合的朋友 有大牛建
  • C/C++: 生成不重复的一组随机数

    在程序编写过程中 很多情况下回用到随机数 然而单纯的随机数不能保证每一次的数据都不同 下面方法返回一组不重复的数据 1 方法 随机一组数据 std vector
  • 432. 全 O(1) 的数据结构

    题目 请你设计一个用于存储字符串计数的数据结构 并能够返回计数最小和最大的字符串 实现 AllOne 类 AllOne 初始化数据结构的对象 inc String key 字符串 key 的计数增加 1 如果数据结构中尚不存在 key 那么
  • kubernetes最佳实践(二) - dashboard ui和heapster监控部署

    前言 本章节主要包行两个部分 官方dashboard部署 版本是1 6 3 1 5 0我也试过成功的 给dashboard加上仪表盘监控 我们安装heapster为dashboard安装统计功能和仪表盘 如下图 1 安装dashboard
  • kubeadm搭建k8s高可用集群(keepalived+nginx+3master)

    目录 前言 服务器准备 架构讲解 环境初始化 安装keepalived软件 安装nginx软件 初始化k8s节点 安装docker 初始化master01节点的控制面板 master02 master03节点加入集群 node01 node
  • Java中进行H264数据的I帧判断

    要判断从编码器中获取到的一帧Byte数组是I帧还是P帧 首先需要了解H264数据的基本格式 I帧 帧内编码 P帧 前向预测编码 与前一个I帧比较差异 B帧 双向预测编码 与前后帧比较差异 H264流 首帧数据为SPS和PPS 后面为IPPP
  • 旅行售货员问题-回溯法

    排列树问题 问题描述 某售货员要到若干城市去推销商品 已知各城市之间的路程 旅费 他要选定一条从驻地出发 经过每个城市一遍 最后回到驻地的路线 使总的路程 总旅费 最小 输出结果
  • Android傻瓜式脚本录制

    网易游戏的AirtestIDE是目前比较优秀的脚本录制工具 它不需要手机ROOT 也不需要其他的任何操作 直接普通的手机就可以在线调试 执行脚本 而且支持跨平台 也就是说PC WEB IOS它一样行 如上图 Airtest 是图像匹配的方式
  • 解决goland代码全部莫名报错 找不到依赖的问题

    我遇到的问题是 代码在一台电脑上完全能够运行 切到另一台电脑 git pull之后 代码依旧能运行 但goland识别到依赖全部报错 找不到各种依赖 go mod download未能解决问题 因为代码能跑 说明第三方包都安装了 解决方案
  • matlab实现RCNN(二)

    本文在MatlabR2016b上使用自带的深度学习工具实现RCNN来进行车辆检测 实验环境 训练图片数量 825 网上收集 部分公共数据集 图片车辆数量 2300 对每张图片手工标注label得到 实验环境 MatlabR2016b 自带深