一文看懂目标检测之RCNN(NMS和Soft-NMS算法)
目标检测之RCNN
1. RCNN:Regions with CNN features[2014 Ross]
- 图片输入
- 区域建议(region proposal)
- 特征提取(feature extraction)
- 分类+2次定位(classification(SVM) + detection(线性模型Linear 正则化项))
2. 区域建议
- 算法:selective search前景分割,将纹理、形状、颜色相似的合在一起,目前比较少人用,数学公式复杂,难用,效果还不太好,不建议看
- 大概2K多个候选框,包括很多感兴趣尽可能囊括到候选框,粗筛
- 2k个候选框的图片,每个做resize到固定大小,固定大小里有无物体,进入分类网络判断
3. 特征提取
- a.在数据集ILSVRC2012 dataset上预训练好的分类网络(AlexNet)直接拿来用,将大约2k个图片一个个送到分类网络(backbone),只拿了特征提取层,扔掉了最后的1*1000的分类层。
- b.在真实数据集上finetune微调,主要更新后两层全连接dense层
- c.训练样本正样本和负样本比例为1:3
- c.IOU小于0.5,给定比较宽松的限制条件,对应较为复杂的网络,样本才不会显得过于少
- 提取CNN特征前必须resize到统一大小,因为后面有FC层,参数是固定的
- 问题:resize后改变了图片本身信息——长方形的旗杆resize压缩成成正方形后,他还是旗杆吗?这个仍然需要改善
4. SVM分类器分类 + NMS算法筛选 + 边界框回归(BBox Regression)
4.1. SVM分类(少样本模型)
- 给每个样本做分类
- 正样本:Groud True
- 负样本:IOU < 0.3[others ignored]
- Q:和AlexNet网络训练相比,svm分类时IOU的阈值threshould为什么不一样?A:训练CNN需要更多数据样本,更多数据样本不一定质量高,svm分类时需要质量高数据样本
- Q:为什么用SVM,为什么不直接用AlexNet最后的softmax?A:AlexNet专注于分类, 不好用少数样本来做定位。数据多,质量差;数据少,质量高,数据少时用SVM相对好一些
4.2. NMS(Non-Maximum Suppression)非极大值抑制算法(很重要)
NMS广泛应用于目标检测算法中。其目的是为了消除多余的候选框,找到最佳的物体检测位置。
import numpy as npdef NMS(lists, thre):if len(lists) == 0:return {}lists = np.array(lists)res = []#取得第i列,第0列为x1,第1列为y1...x1, y1, x2, y2, score = [lists[:, i] for i in range(5)]area = (x2 - x1 + 1) * (y2 - y1 + 1)# get sorted index in ascending orderidxs = np.argsort(score)while len(idxs) > 0:last = len(idxs) - 1i = idxs[last]res.append(i)xmin = np.maximum(x1[i], x1[idxs[:last]])ymin = np.maximum(y1[i], y1[idxs[:last]])xmax = np.minimum(x2[i], x2[idxs[:last]])ymax = np.minimum(y2[i], y2[idxs[:last]])w = xmax - xmin + 1h = ymax - ymin + 1inner_area = w * h# 其他所有边界框bbox和得分score最高的bbox做iou计算iou = inner_area / (area[i] + area[idxs[:last]] - inner_area)# 去除iou计算阈值大于指定值的bboxidxs = np.delete(idxs,np.concatenate(([last],np.where(iou > thre)[0])))# here "where" will return us a tuple idxs==>[0 3]# [0] means to extract array from a tuplereturn lists[res]if __name__ == '__main__':boxes = np.array([[1, 2, 3, 4], [1, 3, 3, 4], [1, 3, 4, 4], [1, 1, 4, 4], [1, 1, 4, 4]], dtype=np.float32)scores = np.array([0.4, 0.5, 0.72, 0.90, 45], dtype=np.float32)thre = 0.5scores1 = scores[:, np.newaxis]lists = np.hstack((boxes, scores1))result_boxes_scores = NMS(lists, thre)print(result_boxes_scores)
4.3. NMS发展历史/种类
1.Soft-NMS[2017]
- B表示原始没有经过过滤的BBox边界框,S表示每个边界框的分数score,Nt表示NMS的阈值
- 设置一个空集D={}表示我们要用NMS筛选后输出的检测框
- 取分数S最高的对应的边界框M,加入到集合D中,同时B集合中把边界框M去除(循环)
- NMS:做一个遍历,所有B中的边界框和M做IOU计算,当计算结果大于某一阈值时,把B集合中对应的边界框B和分数S都删除
- 其数学语言可以表达为:
- 如上图,相比于下图的Soft-NMS,NMS硬的地方体现在阈值高于某设定值时,score值简单粗暴地设置为0
IoU-Net[2018]
soft-NMS[2019]
NMS总结
- 算法复杂,用cpu计算,不能用gpu加速,影响运行速度
- 阈值的确认依赖经验,较难确认
- soft-NMS不需要设定IOU阈值,训练时不用,测试时用提升较为明显
4.4. Bbox Regression(Bbox回归)
- 回归的目标,偏移量(dx,dy,dw,dh)
- 坐标需要归一化
5. RCNN总结
- 慢:做了2k个区域建议,resize到固定尺寸,将固定尺寸的图输入到CNN网络中,在做分类和位置回归,每个区域建议的图都要做卷积
- SVM和回归方法不太合适,SVM和CNN混合较为奇怪,训练较为复杂,过程较为臃肿
最后
原文链接
一文看懂目标检测之RCNN(NMS和Soft-NMS算法)相关推荐
- Yolo 一文看懂目标检测
Yolo 一文看懂目标检测 概述 one-stage two-stage Yolo 原理 分割图片 预选框 计算参数 预测物体 得到结果 网络架构 (v1) 概述 Yolo (You Only Loo ...
- [转]一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/kwame211/article/details/88016151 一.目标检测常见算法 object ...
- 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
前言 之前我所在的公司七月在线开设的深度学习等一系列课程经常会讲目标检测,包括R-CNN.Fast R-CNN.Faster R-CNN,但一直没有比较好的机会深入(但当你对目标检测有个基本的了解之后 ...
- 【CV】一文看懂目标检测神器YOLO5
磐创AI出品 该库代表Ultralytics对未来对象检测方法的开源研究,并结合了以前的YOLO库https://github.com/ultralytics/yolov3在自定义数据集上训练 ...
- 一文读懂目标检测模型(附论文资源)
来源: 大数据文摘 本文共1443字,建议阅读5分钟. 本文为你详细介绍目标检测,并分享资源大礼包,为你的目标检测入门打下基础. 这是一份详细介绍了目标检测的相关经典论文.学习笔记.和代码示例的清单, ...
- 一文看尽目标检测:从YOLO v1到v3的进化之路
本文转载自: http://www.mamicode.com/info-detail-2314392.html 导语:如今基于深度学习的目标检测已经逐渐成为自动驾驶.视频监控.机械加工.智能机器人等领 ...
- 一文看尽目标检测:从 YOLO v1 到 v3 的进化之路
点击"小詹学Python",选择"星标"公众号 重磅干货,第一时间送达 源自: http://www.mamicode.com/info-detail-2314 ...
- 【个人整理】一文看尽目标检测算法SSD的核心架构与设计思想
前言:SSD(Single Shot MultiBox Detector)是大神Wei Liu在 ECCV 2016上发表的一种的目标检测算法.对于输入图像大小300x300的版本在VOC2007数据 ...
- 【深度学习】卷积神经网络应用之双阶段目标检测|R-CNN、SPP-Net、Fast-RCNN、Faster-RCNN
文章目录 基本概念 一.R-CNN 1. 网络结构 2. 训练流程 3. 测试阶段 4. RNN存在的问题 二.SPP-Net 1. 网络结构 2. 基础知识 共享卷积计算 金字塔池化 Spatial ...
最新文章
- shiro整合oauth
- extern “C“
- 预训练后性能反而变差,自训练要取代预训练了吗?
- routeros v6.43.2_routeros软路由负载均衡,充分利用带宽,提高效率降低成本
- Dalvik分析(二)
- SAP ABAP SICF事务码和SAP Hybris的链式过滤器filter chain
- 名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...
- 正则表达式:日期格式的校验(日期+时间)
- 迭代子模式(Iterator)
- 【百度地图API】如何给自定义覆盖物添加事件
- 特征选择的工程方法?
- Codeforces Round #573 (Div. 2) C. Tokitsukaze and Discard Items
- Tomcat的Document base ……does not exist or is not a readable directory错误
- 不同维度、元素的容器vector初始化自定义(C++)
- matlab 水箱fuzzy,matlab中使用fuzzy工具箱
- 三星临时取消Galaxy Fold中国发布会;视觉中国网站部分恢复上线?官方回应:并未恢复;特斯拉周一发布完全自动驾驶将网络直播 | 雷锋早报...
- Map Set,带你进入Java最常用到的两个接口 - 细节狂魔
- 数字金额转换为大写人民币汉字
- windows10拦截广告设置
- 广告传媒实际税负怎么计算_文化传媒 广告行业企业怎么来合法节税,税收案例展示...