0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手把手教你操作Faster R-CNN和Mask R-CNN

电子工程师 来源:lp 2019-04-04 16:32 次阅读

机器视觉领域的核心问题之一就是目标检测(Object Detection),它的任务是找出图像当中所有感兴趣的目标(物体),确定其位置和大小。

作为经典的目标检测框架Faster R-CNN,虽然是2015年的论文,但是它至今仍然是许多目标检测算法的基础,这在飞速发展的深度学习领域十分难得。而在Faster R-CNN的基础上改进的Mask R-CNN在2018年被提出,并斩获了ICCV2017年的最佳论文。Mask R-CNN可以应用到人体姿势识别,并且在实例分割、目标检测、人体关键点检测三个任务都取得了很好的效果。

因此,一些深度学习框架如百度PaddlePaddle开源了用于目标检测的RCNN模型,从而可以快速构建满足各种场景的应用,包括但不仅限于安防监控、医学图像识别、交通车辆检测、信号灯识别、食品检测等等。

目标检测(Object Detection)与实例分割(Instance Segmentation)

目标检测的任务就是确定图像当中是否有感兴趣的目标存在,接着对感兴趣的目标进行精准定位。当下非常火热的无人驾驶汽车,就非常依赖目标检测和识别,这需要非常高的检测精度和定位精度。

目前,用于目标检测的方法通常属于基于机器学习的方法或基于深度学习的方法。 对于机器学习方法,首先使用SIFT、HOG等方法定义特征,然后使用支持向量机(SVM)、Adaboost等技术进行分类。 对于深度学习方法,深度学习技术能够在没有专门定义特征的情况下进行端到端目标检测,并且通常基于卷积神经网络(CNN)。但是传统的目标检测方法有如下几个问题:光线变化较快时,算法效果不好;缓慢运动和背景颜色一致时不能提取出特征像素点;时间复杂度高;抗噪性能差。

因此,基于深度学习的目标检测方法得到了广泛应用,该框架包含有Faster R-CNN,Yolo,Mask R-CNN等,图1和图2分别显示的是基于PaddlePaddle深度学习框架训练的Faster R-CNN和Mask R-CNN模型对图片中的物体进行目标检测。

从图1中可以看出,目标检测主要是检测一张图片中有哪些目标,并且使用方框表示出来,方框中包含的信息有目标所属类别。图2与图1的最大区别在于,图2除了把每一个物体的方框标注出来,并且把每个方框中像素所属的类别也标记了出来。

图1 基于paddlepaddle训练的Faster R-CNN模型预测结果

图2 基于paddlepaddle训练的Mask R-CNN模型预测结果

从R-CNN到Mask R-CNN

Mask R-CNN是承继于Faster R-CNN,Mask R-CNN只是在Faster R-CNN上面增加了一个Mask Prediction Branch(Mask预测分支),并且在ROI Pooling的基础之上提出了ROI Align。所以要想理解Mask R-CNN,就要先熟悉Faster R-CNN。同样的,Faster R-CNN是承继于Fast R-CNN,而Fast R-CNN又承继于R-CNN,因此,为了能让大家更好的理解基于CNN的目标检测方法,我们从R-CNN开始切入,一直介绍到Mask R-CNN。

R-CNN

区域卷积神经网络(Regions with CNN features)使用深度模型来解决目标检测。

R-CNN的操作步骤

Selective search(选择性搜索):首先对每一张输入图像使用选择性搜索来选取多个高质量的提议区域(region proposal),大约提取2000个左右的提议区域;

Resize(图像尺寸调整):接着对每一个提议区域,将其缩放(warp)成卷积神经网络需要的输入尺寸(277*277);

特征抽取:选取一个预先训练好的卷积神经网络,去掉最后的输出层来作为特征抽取模块;

SVM(类别预测):将每一个提议区域提出的CNN特征输入到支持向量机(SVM)来进行物体类别分类。注:这里第 i 个 SVM 用来预测样本是否属于第 i 类;

Bounding Box Regression(边框预测):对于支持向量机分好类的提议区域做边框回归,训练一个线性回归模型来预测真实边界框,校正原来的建议窗口,生成预测窗口坐标。

R-CNN优缺点分析

优点:R-CNN 对之前物体识别算法的主要改进是使用了预先训练好的卷积神经网络来抽取特征,有效的提升了识别精度。

缺点:速度慢。对一张图像我们可能选出上千个兴趣区域,这样导致每张图像需要对卷积网络做上千次的前向计算。

Fast R-CNN

R-CNN 的主要性能瓶颈在于需要对每个提议区域(region proposal)独立的抽取特征,这会造成区域会有大量重叠,独立的特征抽取导致了大量的重复计算。因此,Fast R-CNN 对 R-CNN 的一个主要改进在于首先对整个图像进行特征抽取,然后再选取提议区域,从而减少重复计算。

Fast R-CNN 的操作步骤

Selective Search(选择性搜索):首先对每一张输入图像使用选择性搜索(selective search)算法来选取多个高质量的提议区域(region proposal),大约提取2000个左右的提议区域;

将整张图片输入卷积神经网络,对全图进行特征提取;

把提议区域映射到卷积神经网络的最后一层卷积(feature map)上;

RoI Pooling:引入了兴趣区域池化层(Region of Interest Pooling)来对每个提议区域提取同样大小的输出;

Softmax:在物体分类时,Fast R-CNN 不再使用多个 SVM,而是像之前图像分类那样使用 Softmax 回归来进行多类预测。

Fast R-CNN优缺点分析

优点:对整个图像进行特征抽取,然后再选取提议区域,从而减少重复计算;

缺点:选择性搜索费时;

缺点:不用Resize,不适合求导;

Faster R-CNN

Faster R-CNN 对 Fast R-CNN 做了进一步改进,它将 Fast R-CNN 中的选择性搜索替换成区域提议网络(region proposal network)。RPN 以锚框(anchors)为起始点,通过一个小神经网络来选择区域提议。

Faster R-CNN整体网络可以分为4个主要内容:

基础卷积层(CNN):作为一种卷积神经网络目标检测方法,Faster R-CNN首先使用一组基础的卷积网络提取图像的特征图。特征图被后续RPN层和全连接层共享。本示例采用ResNet-50作为基础卷积层。

区域生成网络(RPN):RPN网络用于生成候选区域(proposals)。该层通过一组固定的尺寸和比例得到一组锚点(anchors), 通过softmax判断锚点属于前景或者背景,再利用区域回归修正锚点从而获得精确的候选区域。

RoI Pooling:该层收集输入的特征图和候选区域,将候选区域映射到特征图中并池化为统一大小的区域特征图,送入全连接层判定目标类别, 该层可选用RoIPool和RoIAlign两种方式,在config.py中设置roi_func。

检测层:利用区域特征图计算候选区域的类别,同时再次通过区域回归获得检测框最终的精确位置。

Faster R-CNN优缺点分析

优点:RPN 通过标注来学习预测跟真实边界框更相近的提议区域,从而减小提议区域的数量同时保证最终模型的预测精度。

缺点:无法达到实时目标检测。

Mask R-CNN

Faster R-CNN 在物体检测中已达到非常好的性能,Mask R-CNN在此基础上更进一步:得到像素级别的检测结果。 对每一个目标物体,不仅给出其边界框,并且对边界框内的各个像素是否属于该物体进行标记。Mask R-CNN同样为两阶段框架,第一阶段扫描图像生成候选框;第二阶段根据候选框得到分类结果,边界框,同时在原有Faster R-CNN模型基础上添加分割分支,得到掩码结果,实现了掩码和类别预测关系的解藕。

图3 Mask R-CNN网络结构泛化图

Mask R-CNN的创新点

解决特征图与原始图像上的RoI不对准问题:在Faster R-CNN中,没有设计网络的输入和输出的像素级别的对齐机制(pixel to pixel)。为了解决特征不对准的问题,文章作者提出了RoIAlign层来解决这个问题,它能准确的保存空间位置,进而提高mask的准确率。

将掩模预测(mask prediction)和分类预测(class prediction)拆解:该框架结构对每个类别独立的预测一个二值mask,不依赖分类(classification)分支的预测结果

掩模表示(mask representation):有别于类别,框回归,这几个的输出都可以是一个向量,但是mask必须要保持一定的空间结构信息,因此作者采用全连接层(FCN)对每一个RoI中预测一个m*m的掩模。

图4展示了Mask R-CNN在像素级别的目标检测结果:

图4 Mask R-CNN:像素级别的目标检测

基于PaddlePaddle的实战

环境准备:需要PaddlePaddle Fluid的v.1.3.0或以上的版本。如果你的运行环境中的PaddlePaddle低于此版本,请根据安装文档中的说明来更新PaddlePaddle。

数据准备:在MS-COCO数据集上进行训练,可以通过脚本来直接下载数据集:

cddataset/coco./download.sh

数据目录结构如下:

data/coco/├──annotations│├──instances_train2014.json│├──instances_train2017.json│├──instances_val2014.json│├──instances_val2017.json|...├──train2017│├──000000000009.jpg│├──000000580008.jpg|...├──val2017│├──000000000139.jpg│├──000000000285.jpg|...

模型训练:下载预训练模型:本示例提供Resnet-50预训练模型,该模性转换自Caffe,并对批标准化层(Batch Normalization Layer)进行参数融合。采用如下命令下载预训练模型。

sh./pretrained/download.sh

通过初始化pretrained_model加载预训练模型。同时在参数微调时也采用该设置加载已训练模型。 请在训练前确认预训练模型下载与加载正确,否则训练过程中损失可能会出现NAN。

安装cocoapi:

训练前需要首先下载cocoapi:

gitclonehttps://github.com/cocodataset/cocoapi.gitcdcocoapi/PythonAPI#ifcythonisnotinstalledpipinstallCython#Installintoglobalsite-packagesmakeinstall#Alternatively,ifyoudonothavepermissionsorprefer#nottoinstalltheCOCOAPIintoglobalsite-packagespython2setup.pyinstall--user

数据准备完毕后,可以通过如下的方式启动训练:

Faster RCNN

pythontrain.py--model_save_dir=output/--pretrained_model=${path_to_pretrain_model}--data_dir=${path_to_data}--MASK_ON=False

Mask RCNN

pythontrain.py--model_save_dir=output/--pretrained_model=${path_to_pretrain_model}--data_dir=${path_to_data}--MASK_ON=False

通过设置export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7指定8卡GPU训练。

通过设置MASK_ON选择Faster RCNN和Mask RCNN模型。

可选参数见:

python train.py –help

数据读取器说明:

数据读取器定义在reader.py中。所有图像将短边等比例缩放至scales,若长边大于max_size, 则再次将长边等比例缩放至max_size。在训练阶段,对图像采用水平翻转。支持将同一个batch内的图像padding为相同尺寸。

模型设置:

分别使用RoIAlign和RoIPool两种方法。

训练过程pre_nms=12000,post_nms=2000,测试过程pre_nms=6000, post_nms=1000。nms阈值为0.7。

RPN网络得到labels的过程中,fg_fraction=0.25,fg_thresh=0.5,bg_thresh_hi=0.5,bg_thresh_lo=0.0

RPN选择anchor时,rpn_fg_fraction=0.5,rpn_positive_overlap=0.7,rpn_negative_overlap=0.3

训练策略:

采用momentum优化算法训练,momentum=0.9。

权重衰减系数为0.0001,前500轮学习率从0.00333线性增加至0.01。在120000,160000轮时使用0.1,0.01乘子进行学习率衰减,最大训练180000轮。同时我们也提供了2x模型,该模型采用更多的迭代轮数进行训练,训练360000轮,学习率在240000,320000轮衰减,其他参数不变,训练最大轮数和学习率策略可以在config.py中对max_iter和lr_steps进行设置。

非基础卷积层卷积bias学习率为整体学习率2倍。

基础卷积层中,affine_layers参数不更新,res2层参数不更新。

模型评估:模型评估是指对训练完毕的模型评估各类性能指标。本示例采用COCO官方评估。eval_coco_map.py是评估模块的主要执行程序,调用示例如下:

Faster RCNN

pythoneval_coco_map.py--dataset=coco2017--pretrained_model=${path_to_trained_model}--MASK_ON=False

Mask RCNN

pythoneval_coco_map.py--dataset=coco2017--pretrained_model=${path_to_trained_model}--MASK_ON=True

通过设置--pretrained_model=${path_to_trained_model}指定训练好的模型,注意不是初始化的模型。

通过设置export CUDA\_VISIBLE\_DEVICES=0指定单卡GPU评估。

通过设置MASK_ON选择Faster RCNN和Mask RCNN模型。

模型精度:下表为模型评估结果。

Faster RCNN:

End2End Faster R-CNN: 使用RoIPool,不对图像做填充处理。

End2End Faster R-CNN RoIAlign 1x:使用RoIAlign,不对图像做填充处理。

End2End Faster R-CNN RoIAlign 2x:使用RoIAlign,不对图像做填充处理。训练360000轮,学习率在240000,320000轮衰减。

Mask RCNN:

End2End Mask R-CNN: 使用RoIAlign,不对图像做填充处理。

模型推断:模型推断可以获取图像中的物体及其对应的类别,infer.py是主要执行程序,调用示例如下:

pythoninfer.py--pretrained_model=${path_to_trained_model}--image_path=dataset/coco/val2017/000000000139.jpg--draw_threshold=0.6

注意,请正确设置模型路径${path_to_trained_model}和预测图片路径。默认使用GPU设备,也可通过设置--use_gpu=False使用CPU设备。可通过设置draw_threshold调节得分阈值控制检测框的个数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器视觉
    +关注

    关注

    161

    文章

    4365

    浏览量

    120263
  • 无人驾驶
    +关注

    关注

    98

    文章

    4054

    浏览量

    120429
  • 深度学习
    +关注

    关注

    73

    文章

    5497

    浏览量

    121096

原文标题:完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    手把手教你使用LabVIEW实现Mask R-CNN图像实例分割(含源码)

    使用LabVIEW实现Mask R-CNN图像实例分割
    的头像 发表于 03-21 13:39 2303次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>使用LabVIEW实现<b class='flag-5'>Mask</b> <b class='flag-5'>R-CNN</b>图像实例分割(含源码)

    美女手把手教你如何装机(下)

    美女手把手教你如何装机(下) 接著下来就是今天的重头戏,开核萝!~
    发表于 01-27 11:16 2923次阅读

    介绍目标检测工具Faster R-CNN,包括它的构造及实现原理

    在本篇文章中,公司的研究人员介绍了他们在研究过程中所使用的先进目标检测工具Faster R-CNN,包括它的构造及实现原理。
    的头像 发表于 01-27 11:49 1.8w次阅读
    介绍目标检测工具<b class='flag-5'>Faster</b> <b class='flag-5'>R-CNN</b>,包括它的构造及实现原理

    Mask R-CNN:自动从视频中制作目标物体的GIF动图

    用深度学习模型——Mask R-CNN,自动从视频中制作目标物体的GIF动图。
    的头像 发表于 02-03 14:19 1.1w次阅读

    手把手教你如何开始DSP编程

    手把手教你如何开始DSP编程。
    发表于 04-09 11:54 12次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何开始DSP编程

    什么是Mask R-CNNMask R-CNN的工作原理

    掩模(mask)。和前两个输出不同,这个新输出需要提取更精细的空间布局,为此,Mask R-CNNFaster-RCNN上添加一个分支网络:Fully Convolution Net
    的头像 发表于 07-20 08:53 6.8w次阅读

    引入Mask R-CNN思想通过语义分割进行任意形状文本检测与识别

    网络架构由四部分组成,骨干网feature pyramid network (FPN) ,文本候选区域生成网络region proposal network (RPN) ,文本包围盒回归网络Fast R-CNN ,文本实例分割与字符分割网络mask branch。
    的头像 发表于 08-07 14:24 1.4w次阅读

    手把手教你学LabVIEW视觉设计

    手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视
    发表于 03-06 01:41 3128次阅读

    一种新的带有不确定性的边界框回归损失,可用于学习更准确的目标定位

    目标检测是一种多任务学习问题,包含目标定位和目标分类。当前最佳的目标检测器(比如 Faster RCNN、Cascade R-CNNMask R-CNN)都依靠边界框回归来定位目
    的头像 发表于 04-23 16:38 6444次阅读
    一种新的带有不确定性的边界框回归损失,可用于学习更准确的目标定位

    基于改进Faster R-CNN的目标检测方法

    为提高小尺度行人检测的准确性,提出一种基于改进 Faster r-CNN的目标检测方法。通过引入基于双线性插值的对齐池化层,避免感兴趣区域池化过程中两次量化操作导致的位置偏差,同时设计基于级联的多层
    发表于 03-23 14:52 3次下载
    基于改进<b class='flag-5'>Faster</b> <b class='flag-5'>R-CNN</b>的目标检测方法

    一种基于Mask R-CNN的人脸检测及分割方法

    针对现有主流的人脸检测算法不具备像素级分割,从而存在人脸特征具有噪声及检测精度不理想的问题提出了一种基于 Mask r-CNN的人脸检测及分割方法。通过 Res Net-l01结合RPN网络生成候选
    发表于 04-01 10:42 5次下载
    一种基于<b class='flag-5'>Mask</b> <b class='flag-5'>R-CNN</b>的人脸检测及分割方法

    基于Mask R-CNN的遥感图像处理技术综述

    较为密集,且容易与港口混合。当前对舰船检测的输岀结果主要是检测框,缺少对舰船掩码的输岀,使得无法全面分析岀模型存在的不足;冋时,由于遙感图像中的舰船停靠密集,容易产生漏检问題。为解决上述问题,利用 Mask r-cnn对舰
    发表于 05-08 16:39 3次下载

    用于实例分割的Mask R-CNN框架

    我们的方法称为 Mask R-CNN,扩展了 Faster RCNN ,方法是在每个感兴趣区域 (RoI) 上添加一个用于预测分割掩码的分支,与用于分类和边界框回归的现有分支并行(图 1)。掩码分支
    的头像 发表于 04-13 10:40 2624次阅读

    PyTorch教程14.8之基于区域的CNN(R-CNN)

    电子发烧友网站提供《PyTorch教程14.8之基于区域的CNN(R-CNN).pdf》资料免费下载
    发表于 06-05 11:09 0次下载
    PyTorch教程14.8之基于区域的<b class='flag-5'>CNN</b>(<b class='flag-5'>R-CNN</b>)

    PyTorch教程-14.8。基于区域的 CNN (R-CNN)

    )、faster R-CNN ( Ren et al. , 2015 )和掩模 R-CNN ( He等,2017)。由于篇幅有限,我们将只关注这些模型的设计。 14.8.1。R
    的头像 发表于 06-05 15:44 641次阅读
    PyTorch教程-14.8。基于区域的 <b class='flag-5'>CNN</b> (<b class='flag-5'>R-CNN</b>)