作者:Jonathan Hui编译:ronghuaiyang

物体检测器,像基于区域的检测或者一阶段的检测器,从不同的起点起步,最后越来越相似,都是朝着更快更准的目的地在前进。事实上,有些性能的差距可能来自于一些微小的实现上的差别,而不是模型上的优劣。在第三部分,我们会研究一些这些具体的设计上的差别。然后我们会总结这一路走来的一些经验教训。

边界框的编码和损失函数

不同的检测器用到了不同的损失函数和边界框编码的方法。例如,SSD预测是归一化的宽和高的平方根损失。所以,对于一个小的边界框来说,一个2像素的误差要比大的边界框更加显著。这里是不同的方法使用的的损失函数和边界框的编码方式。

为了让模型训练的更好,我们为不同的loss使用了不同的权重。例如,在YOLO中,定位的loss的权重要比分类的高,所以我们可以更好的定位物体。

特征提取器(VGG16, ResNet, Inception, MobileNet)

特征提取器及影响准确率也影响速度。如果准确率比速度重要的话,常常使用ResNet和Inception。MobileNet结合SSD提供一个轻量级的检测器,可以用在移动设备上,进行实时的检测。对于Faster R-CNN和R-FCN,选择特征提取器的时候,相比SSD会更偏向于准确性。

非极大值抑制 (nms)

nms只运行在CPU上的话,对于一阶段的模型来说往往会占用运行时间。

数据增强

通过剪裁来增强数据可以帮助训练检测不同尺度的物体。在推理的时候,我们可以对输入图像使用不同的检测来提升准确性。但是往往这样会很慢,对于有实时性要求的场景是不合适的。

特征图的步长

一阶段的检测器使用哪个特征层来进行物体检测常常是可选的。如果每个维度的分辨率降低2倍的话,那么特征图的步长是2。低分辨率的特征图常常用来检测高阶的结构,这对物体检测有益。但是空间分辨率的降低有使得检测小物体变得困难。

速度 v.s. 准确率

最重要的问题并不是哪个检测器是最好的。真正的问题是哪个检测器或者哪种配置能够给我们最好的速度与准确率的平衡。下面是速度和准确率之间的权衡。

通常来说,Faster R-CNN更加准确, R-FCN 和 SSD 更加快速。Faster R-CNN使用Inception ResNet,采用300个建议框,在1FPS的时候达到最佳的准确率。SSD使用了MobileNet在最快速的模型中具有最高的mAP。这个图也帮助我们定位速度与准确率之间的好的平衡点。使用了残差网络的R-FCN模型在准确率和速度之间达到了很好的平衡,使用了Resnet的Faster R-CNN能够达到类似的性能,如果我们把建议框的数量限制在50的时候。

特征提取器精度

论文中研究了特征提取器的精度是如何影响检测器的准确率的。Faster R-CNN和R-FCN都利用了更好的特征提取器,但是影响不如SSD大。

物体尺寸

对于大的物体,SSD即使使用最简单的检测器都表现的非常好。SSD甚至可以匹配上其他的更好的检测器的精度。但是相比之下,SSD在小物体上的表现很差。

输入图像的分辨率

高分辨率可以显著提高检测小物体的能力,同时对大物体也有好处。当分辨率降低时,准确率平均降低了15.88%,不过推理时间也平均减少了27.4%。

建议框的数量

在 Faster R-CNN (FRCNN)中,生成的建议框的数量可以显著的影响速度,但是并不会大大的降低准确率。例如,使用Inception Resnet,使用50个建议框代替300个建议框,Faster R-CNN可以提升3倍的速度,准确率的降低只有4%。由于R-FCN中每个ROI的工作量更少,所以速度的提升不是那么明显。

一路走来的过程和未来的趋势

我们开始于使用滑动窗口来进行物体检测。

# Sliding windows for window in windows patch = get_patch(image, window) results = detector(patch)

为了提升速度,我们要么减少窗口的数量,要么减少每个ROI的工作量(比如说将一些工作移到循环外面)。R-CNN使用了一个建议区域生成的网络来减少窗口数量到2000。Fast R-CNN通过特征图来代替对每个图像块进行检测的方式,减少了每个ROI的工作量。这个方法从特征提取中节省了2000倍的时间。

# Fast R-CNNfeature_maps = process(image)ROIs = region_proposal(feature_maps)for ROI in ROIs patch = roi_pooling(feature_maps, ROI) results = detector2(patch)

但是,建议区域的生成仍然很花时间。Faster R-CNN使用一个卷积网络来进行建议区域的生成,代替了原来的外部的建议区域生成的方法,将推理时间从2.3s减少到了0.3s。Faster R-CNN 还使用了anchors,因此我们的预测的多样性更好,而且更加容易训练。减少每个ROI的工作量的路并没有走完,R-FCN为每个ROIs计算了位置敏感得分图。这个得分图记录了每个部分找到这个类别的物体的可能性。找到这个物体的概率就是所有的得分的平均。

# R-FCNfeature_maps = process(image)ROIs = region_proposal(feature_maps) score_maps = compute_score_map(feature_maps)for ROI in ROIs V = pool(score_maps, ROI)  class_scores = average(V)  class_probabilities = softmax(class_scores)

虽然R-FCN很快,比Faster R-CNN准确性稍差一点。但是,我们为什么一定要2阶段的计算呢,一阶段进行ROIs的提取,另一阶段进行物体检测。一阶段的检测器移除了ROIs的提取的步骤,同时的进行边界框的预测和类别的预测。

feature_maps = process(image) results = detector3(feature_maps) # No more separate step for ROIs

SSD和YOLO都是一阶段的物体检测器。都使用了卷积层来提取特征,后面跟一个卷积来进行预测。都使用了低分辨率的特征图来进行物体检测。因为他们对小物体检测效果不好,准确率相比基于区域的检测器要差。为了补救这个问题,一阶段的检测器添加了高分辨的特征来进行物体的检测。但是,高分辨率的特征中高阶的结构信息很少,对物体的预测不够准确。FPN通过从原始的特征图进行上采样的方式得到高分辨率特征图,这样既能够得到高分辨率的特征图,有添加了高阶的结构化信息,能够缓解一下这个问题。由于使用了不同的尺寸进行检测,整体的准确率有了提高。

在训练中,相比物体,我们会遇到更多的是背景。我们会把检测背景训练的很好,但是检测真正的物体却效果一般。Focal loss减少了哪些已训练的很好的类别的重要性。通过组合更加复杂的特征提取器,FPN和Focal loss,RetinaNet获得了最佳的准确率的结果。

检测器的差距在缩小。一阶段的检测器使用了更加复杂的设计,准确率越来越高,基于区域的检测器优化了操作,越来越快。比如说YOLO,就是吸收了其他的检测器的许多的优点。最终,差距可能并不是在基本的模型上,而是在实现细节中。

经验教训

  • 特征金字塔网络产生了丰富的语义信息,同时具有高空间分辨率,提升了准确率。
  • 如果速度不是很重要的话,复杂的特征提取器如ResNet 和 Inception ResNet是高准确率的关键。
  • 使用轻量级的特征提取器如MobileNet的一阶段检测器适合做实时的操作,特别是移动设备。
  • 使用batch normalization。
  • 进行不同的特征提取器的实验,找到速度和准确性的均衡点。一些轻量级的网络能够显著的提升速度,而准确性降低并不多。
  • 使用anchors来进行边界框的预测。
  • 仔细的选择anchors。
  • 在训练的时候进行图像的剪裁,可以学习到不同尺度的特征(图像增强)。
  • 牺牲一些速度,高分辨率的输入图像可以提高准确率,特别是对于小物体。
  • Faster R-CNN使用少一点的建议框可以提高很多速度,准确率降低也不多。
  • 端到端的多任务训练可以提升性能。
  • 对于每个网格的建议框或者预测框的数量进行试验。
  • 对不同的loss(定位,分类等)的权重进行试验。
  • 试一试空洞卷积,在同样的计算量下,可以提供大的感受野,有助于准确率。

对于一阶段的检测器:

  • 速度快,但是能否超过 Faster R-CNN或者R-FCN的准确率需要进一步验证。
  • 同时使用卷积来预测边界框和分类。
  • 使用多个特征图来进行物体检测。
  • 对于挨得很近的物体,检测起来有问题。
  • 特征提取是速度的瓶颈。可以看看轻量级的网络,对准确率影响不大的那种。

英文原文:https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9

更多文章,请关注微信公众号:AI公园

下拉多选择框 实现方式_物体检测之旅(三)|设计选择,经验教训和物体检测的趋势...相关推荐

  1. 下拉多选择框 实现方式_非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...

    这是独立于薰风读论文的投稿,作为目标检测模型的拓展阅读,目的是帮助读者详细了解一些模型细节的实现. 薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制, ...

  2. 组态王下拉式组合框使用教程_组态王下拉列表框问题

    对于列表框控件中数据项的添加.修改.获取或删除等操作都是通过列表框控件函数实现的.首先认识一下列表框控件的函数: listLoadList("ControlName"," ...

  3. el select 清空_解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题

    这是一个项目中常见的需求,el-select 为下拉多选,默认值不可删除,或者指定值不可删除. 实现效果: el-select 如下源码中 tag closable 属性为 el-select 的 d ...

  4. tkinter自定义下拉多选框

    使用tkinter实现下拉多选框 效果如图: 1.选择一些选项: 2.全选选项: 代码如下: import tkinterfrom ComBoPicker import Combopickerlist ...

  5. [小黄书小程序]主页面标签栏水平滑动和下拉弹出框

    上一章我们实现了小黄书小程序的搜索栏的界面呈现.这一章我们将会参考小红书实现搜索栏下面的标签栏. 该标签栏存在的意义是,用户可以根据选择的标签来快速呈现相关的内容.该标签栏界面主要是两个功能模块. 一 ...

  6. excel添加列下拉框票价_excel表格下拉表格添加数据-excel2017表格中怎么制作下拉菜单列表框...

    在Excel表中,如何将增加下拉菜单的选项? excel中的下拉菜单选项,就是筛选的功能,具体操作如下: 1.首先选中a.b两列数据,在"开始"选项卡上选择"筛选&quo ...

  7. html 下拉多选框代码,js实现下拉复选框效果(代码实例)

    本章给大家带来用js实现下拉复选框效果(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 先看看效果: 下面我们看看代码: HTML代码: HTML CSS JavaScri ...

  8. 组态王下拉式组合框使用教程,组态王下拉式组合框

    组态王下拉式组合框 c 2021-2-27 下载地址 https://www.codedown123.com/71006.html 组态王下拉式组合框使用样例,包含了使用的说明,以及控件存放位置,可以 ...

  9. flask-wtf优雅实现下拉多选框

    flask-wtf实现下拉多选框 一般实现 一般情况下,我们用flask-wtf来实现下拉多选框的时候,大概是这样子操作的 定义Form类 forms.py from flask_wtf import ...

最新文章

  1. cad等比例缩放快捷键_「CAD」利用块对图形进行非等比例缩放
  2. 中国消费者信息指数影响因素分析
  3. python可以调试吗_调试-有什么好的方法可以使我的Python代码首次运行?
  4. 【企业管理】企业创造的要素
  5. 单机负载告警,数据库与应用分离
  6. Adaboost 算法的原理与推导(转载)
  7. PyTorch框架学习二——基本数据结构(张量)
  8. win7电脑蓝屏的解决方法
  9. python+opencv中imread函数第二个参数的含义
  10. 生产环境频繁内存溢出,原来就是因为这个“String类”
  11. MyBatis-Plus入门篇——CRUD
  12. 随便说说Silverlight
  13. ajaxSubmit
  14. 单变量微积分笔记——无穷级数,泰勒展开及欧拉公式的证明
  15. UK EU 码对照表,USA EURO SIZE码对照表 国外衣服码对照表
  16. R语言金融波动率建模|基于SGED分布的变参数ARIMA+EARCH动态预测模型的研究
  17. 1 R和RStudio的安装
  18. 免费网贷大数据_免费查网贷大数据的app
  19. E0413: 不存在从 “std::string“ 到 “const char *“ 的适当转换函数
  20. 搞砸一个产品的功能安全

热门文章

  1. u-boot分析(四)---设置异常向量表|设置SVC模式
  2. ASP.NET MVC3 控制器
  3. asp.net 能否多线程断点续传?
  4. Qt-5种布局控件详解
  5. Window捕获消息机制-C#
  6. C#中使用MD5对用户密码加密与解密
  7. MFC多文档应用程序同时显示两个视图
  8. ios15使用NSXMLParser解析XML
  9. VirtualBox虚拟机菜单选项隐藏后重现
  10. Android使用adb命令安装应用-连接usb