【云驻共创】AI论文精读会第四期 目标检测之Dynamic RCNN:一种有效提升RCNN系列网络表现的动态训练方法

目录:

一、概述

二、论文解读

2.1基本信息

2.2简介

2.3论文解读----研究背景

2.4论文解读----基本思想

2.5论文解读----实验数据与环境

2.6论文解读----实验结果

三、模型源代码

四、使用方法介绍


一、概述

此模型基于Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training中突出的模型结构实现,该算法可以载入预训练好的,达到论文精度的模型作为特征提取网络,可以在用户的数据集上进行训练,用于其他场景的预测。训练后生成的模型可以直接在modelArts平台部署成在线服务。
图像目标检测的评估手段一般使用mAp,详细说明请参考:coco数据集评价指标
本算法的其他信息如下表所示:

项目

说明

参考论文

Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training

使用框架

Pytorch-1.0.0-python3.6

训练集

COCO 2017 train

训练总iteration数

270k

训练batch_size

使用8卡训练,每张卡IMS_PER_GPU = 2,相当于总batch_size为16

训练硬件及耗时

8*v100,54.9小时

测试集

COCO 2017test-dev

推理硬件及速度

GPU,2.3s/pic(GPU型号v100NV32)

输入图像尺寸

multi-scale训练,有400*400,600*600,800*800,1000*1000,1200*1200五种,可以支持多尺度

原论文准确率

mAP=49.2

本算法准确率

map=49.2

 

详细内容可见链接:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=6842fa7f-2b4c-4b73-8001-82070ac47f5c

二、论文解读

2.1 基本信息

2.2 简介

R-CNN 首次将 CNN 用于目标检测。相比使用 HOG 等特征,使用 CNN 能够大大提高物体检测的性能。为了在目标检测中使用 CNN,主要有两个问题:

(1):怎么使用 CNN 来定位目标;(2):怎么用少量的带标记的检测数据来训练一个大容量的模型。(现在数据量的问题已经不是问题)

与识别任务不同,检测任务需要去检测图片中的物体的位置。检测位置有两种常用方法:(1):回归;(2):滑动窗。滑动窗使用CNN时,为了保持高分辨率,这些CNN一般只有两层conv和pool。作者也对滑动窗进行了实验,但作者使用的CNN 有 5层 conv,从而有很大的感受野。

作者进行目标识别的框架是“recognition using regions”,这种框架已经被成功的用于了目标检测、场景分割。在本文,我们对比了 R-CNN 和 OverFeat(使用 滑动窗CNN)。R-CNN 的性能远超 OverFeat。

作者在文中使用了预训练的模型来缓解目标检测标记数据较少的情况。

模型失效分析对于提高模型的性能非常重要。作者基于 Hoiem 等人的 detection analysis tool 对模型进行了分析。通过分析,我们说明了:一个简单的 bounding-box 回归方法能够大大减少错误的定位,因为这种错误是主要的错误模式。

因为使用了 R-CNN,所以将其扩展到场景分割任务很简单,通过简单修改,作者在场景分割任务上也取得了非常好的结果。

2.3论文解读----研究背景

目标检测是计算机视觉里很重要的一个分支,它是由图像分类任务发展而来的,它跟图像分类任务发展而来的区别:不仅仅只对一张图像单一类型的目标进行分类,而是增加了一个任务:寻找图像中的物体并进行定位。我们不单单要知道这张图片是什么类别,我们更是要找出这张图片里感兴趣的目标、位置,然后再进行准确的分类。如果项目的需求是精确的定位出图像中某一物体类别信息和所在位置,则应该选择目标检测算法。

目标检测有广泛的应用场景,比如当前比较火的自动驾驶、人脸识别、路上行人的检测、医疗检测等,同时目标检测也可以做图像分割,图像描述,目标跟踪,识别等这些更为复杂更为高层的计算机视觉研究基础。

一般来说,目标检测可以分为以下三个步骤:图像特征的提取、候选区域的生成和候选区域的分类

候选区域的生成可以分为一阶段的算法和两阶段的算法,如下:

One-stage:(精度较低,速度较快,实用更强一些)

  • 直接回归物体的类别概率和位置坐标值(无regionproposal)。
  • YOLO系列,SSD等。

Two-stage:(精度较高,速度较慢)

  • 先由算法生成一系列作为样本的候选框,再通过卷积神经网络进行样本分类。
  • R-CNN系列。

我们要根据不同的应用场景来选择一阶段还是二阶段的算法。比如使用手机端(没有云服务器)的话,更倾向使用一阶段的算法,因为框架比较小,需要的计算力比较弱,速度比较快就可以满足人们日常的使用。

Region Proposal:

生成候选框(bounding box)。

Selective search, category-independent object proposals,RPN等。

region proposal是让模型学会去看哪里有物体,GT box就是给它进行参考,告诉它是不是看错了,该往哪些地方看才对。

如何利用深度的神经网络去做目标的定位?

借鉴了滑动窗口思想,R-CNN 采用对区域进行识别的方案。

具体是:

1.给定一张输入图片,从图片中提取 2000 个类别独立的候选区域。

2.对于每个区域利用 CNN 抽取一个固定长度的特征向量。

3.再对每个区域利用 SVM 进行目标分类。

下面的图像来自论文本身。

R-CNN算法分为4个步骤

1.候选区域生成: 一张图像生成1K~2K个候选区域 ,使用Selective search生成region proposal,每张图片大概有2000个proposal,将其缩放至固定大小。

2.特征提取: 对每个候选区域,使用深度卷积网络提取特征(CNN),CNN从每个region proposal中提取出一个4096维的特征,输出大致为2000x4096。类别分类:SVM对4096维特征进行分类,得到一个2000x20的矩阵(20种类别),然后对每一列进行NMS非极大值抑制。

卷积神经网络(CNN)是局部连接网络。相对于全连接网络其最大的特点就是:局部连接性和权值共享性。

3.类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类

4.位置精修: 使用回归器精细修正候选框位置,回归器校正非极大值抑制后剩下的region proposal,输入CNN网络pool5层的特征,输出为xy方向的缩放和平移。

 

相对于传统的算法来说,R-CNN最大的长处是不需要人工的去预设计特征算子,因为传统的算法里面,很多时候都是基于常识或者是数学上的计算来得到这些图像上的特征,R-CNN通过CNN网络自己学习图像上的特征,来进行目标的检测,这是它最好的一个长处。

  • CNN本身也存在一些缺陷:
  1. 训练分为多个阶段且相对独立,导致训练过程比较繁琐,没有办法实现端到端的训练,不能得到全局的一个最优解。
  2. 对于特征向量用的是CNN,在候选区域选择的时候传统启发式的算法,基于底层视觉的特征得到的这些候选区,相对来说,没有深度学习的质量那么高。
  3. 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;速度慢:使用GPU,VGG16模型处理一张图像需要47s;测试速度慢:每个候选区域需要运行整个前向CNN计算;
  4. SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新。

 

为了解决R-CNN本身的这些缺陷,Fast R-CNN 的结构如下:

Faster R-CNN是一个two-stage目标检测网络,其整体包括特征提取、获取候选框、目标精确定位与分类三个步骤。

FRCNN针对RCNN在训练时是multi-stage pipeline和训练的过程中很耗费时间空间的问题进行改进。它主要是将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。主要做以下改进:

最后一个卷积层后加了一个ROI pooling layer。ROI pooling layer首先可以将image中的ROI定位到feature map,然后是用一个单层的SPP layer将这个feature map patch池化为固定大小的feature之后再传入全连接层。

损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。

detection有两项task:定位和识别,RPN就是单独用来location(定位)的网络。由于RPN的输入是接的卷积层后的feature maps,已经是被高度抽象的特征图了,所以RPN并不需要花参数层在特征提取上,因此RPN可以是一个比较轻量级的网络,这也是计算更fast的原因。

第一步是在一个滑动窗口上生成不同大小和长宽比例的anchor box,取定IoU的阈值来标定这些anchor box的正负。于是,传入RPN网络的样本数据被整理为anchor box(坐标)和每个anchor box是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchor box有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。
由RPN得到Region Proposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。

Faster RCNN其实可以分为4个主要内容:

Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。

Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。

Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。

Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Faster RCNN的IOU:

预测的边框 真实的边框 的交集和并集的比例 称为 IoU(Intersection over Union)。这个指标又名 “Jaccard Index”,由 Paul Jaccard 在 19 世纪早期提出。

设置一定的IOU阈值来区分anchors是前景(Positive)还是背景(Negetive)

Positive类别的anchors用于接下来的进一步分类和回归预测。

1.对于R-CNN系列的网络,随着训练迭代次数的增加,候选区域的IOU会逐渐增加,使用单一的IOU阈值来区分前景和背景,会影响模型的精度。

2.损失函数中的超参数会影响反向传播的梯度,从而对模型优化产生影响。

3.采用一定的训练策略可以提高模型的表现。

2.4论文解读----基本思想

作者在论文中提出了两个核心部分:

第一个针对训练过程中的候选区域的选择设置Dynamic LabelAssignment(DLA)用于动态调节IOU的阈值,然后来改善模型。

第二个就是针对损失函数中的参数设置DynamicSmoothLlLoss(DSL),通过调节损失函数里面的参数,改变损失,从而改变梯度,改变模型的训练。

训练过程中,不断调整获取候选区域时IOU阈值的大小。

label = 1if max IoU(b,G) Tnow

label = 0if max IoU(b,G) Tnow

根据RPNproposals,不断地自动调整1OU的大小,具体为:计算每个batch的第K,个最大的IOU,经过每C次迭代取其均值来对IOU进行更新。

随着proposals质量的不断提高,IOU阈值也会不断提高。

目标检测中最终目标框所在位置的损失时使用SmoothLl损失函数计算得到的。β是一个超参数,对于相同的error,其值越小,损失越大,优化器的梯度也越大。使用越小的β模型收敛速度越快,也会带来越好的结果,但是要避免梯度爆炸问题。

根据proposalerror动态调整β,具体为:计算每个batch的第Kβ个最小的crror,经过每C次迭代取其中值来对β进行更新。

2.5论文解读----实验数据与环境

实验数据:MS CoCO2017。下载地址:https://cocodataset.org/#download

使用ResNet101作为ackbone,多尺度训练270kiteration得到最终的模型参数。

环境:python3.6+pytorch1.0.1

2.6论文解读----实验结果

三、模型源代码

为了公平的比较,论文中所有的实验都遵循MaskRCNN-benchmark的基本设置。https://github.com/facebookresearch/maskrcnn-benchmark

模型代码已经开源,可以在https://github.com/hkzhang95/DynamicRCNN进行下载。

代码核心:

着重增强了动态调节训练,代码改动不大。

记录每个batch的第K,个最大的IOU,Kβ个最大的error

C(iteration_count)iteration,更新一次IOU阈值和β。

四、使用方法介绍

模型源代码讲解----复现过程

ModelArts是一个一站式的开发平台,能够支撑开发者从数据到AI应用的全流程开发过程。包含数据处理、模型训练、模型管理、模型部署等操作,并且提供AI Gallery功能,能够在市场内与其他开发者分享模型。

复现过程主要有两大步骤,一是根据模型源代码的实际情况来适配ModelArts的环境,二是按照论文中的描述来设置超参,在ModelArts上跑训练,验证最终训练得到的模型是否能达到论文中的精度。

首先需要在OBS对象存储服务中新建自己的数据桶,其结构如下:

Annotation标记信息文件需要按照MS COCO数据的标准格式。

华为AI Gallery官方网站: https:/marketplace.huaweicloud.com/markets/aihub/modelhub/list/

搜索“DynamicRCNN”,进入选择订阅,之后在自己的ModelArts控制台算法管理“我的订阅”中便可以看到该算法。

创建训练作业,在OBS对象存储服务中选择待训练的数据作为数据来源设置参数进行训练。详细的模型使用过程请参考:https://bbs.huaweicloud.com/forum/thread-92565-1-1.html

注:本文整理自华为云社区内容共创活动之【线上直播】AI论文精读会第四期:Dynamic RCNN:一种有效提升RCNN系列网络表现的动态训练方法点此回看直播

查看活动详情:https://bbs.huaweicloud.com/forum/thread-139540-1-1.html

(完)