目标检测阅读总结(一)之RCNN以及NMS

2024-01-08 12:38

本文主要是介绍目标检测阅读总结(一)之RCNN以及NMS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开始看目标检测方面论文,里面有很多经典,会在这儿记录下论文中的优点和代码中的问题,也会把别人blog比较好的观点总结。

阅读顺序差不多按照: https://github.com/amusi/awesome-object-detection

R-CNN

参考:https://blog.csdn.net/shenxiaolu1984/article/details/51066975

https://blog.csdn.net/briblue/article/details/82012575

 

pipeline:

1. 使用selective search生成1k-2k个候选框;

2. 对于候选区域,提取cnn特征(4096-dim),这里是裁剪出来然后做一个16的padding,然后resize到227*227。(为了让bounding box拥有上下文内容context。)

3. 对于正负样本的分类,对于4096-dim feature接一个svm进行分类。

4. 为了减少识别的错误,在用一个线性回归模型对框进行微调。

4.1. 一个scale变换,对于中心点以及长宽;

4.2 这里的L2正则化很关键;

4.3 组的pair对很重要,不然会导致a hopeless learning problem。这里使用的iou阈值为0.6。

 

3.1. 由于负样本很多,所以会对于负样本使用hard negative mining。

hard negative mining 

R-CNN引用了这篇文章 “Object Detection with Discriminatively Trained Part Based Models.”

由于训练的阶段负样本过多,超过1w个,对于模型来说使用全部的负样本是不可行的,所以需要构建一个既有负样本又有hard negative的样本集合。

Bootstrapping methods:先用负样本组成集合训练,然后收集那些被错误分类的例子,去训练新的模型,这样重复几次。

proposed data-mining methods:为了找到一个属于训练集的小子集,初始的时候用原始的作为一个cache,每一次迭代会移除一些比较简单的样本,增加一些新的比较难的样本。

具体流程如下

1. 先初始一个$C_{t}$ \subseteq $D$, 这里的 D是原来的训练集。

2. 训练,直到参数稳定分出两个集合,一个是错误分类的,一个是正确分类的。

3. 缩小C_{t}, 去除那些被正确分类的,得到集合C_{t^{'}}

4. 增大C_{t+1},把 C_{t^{'}}和一些属于 D的样本形成并集,得到新一轮的子集C_{t+1}

Non-Maximum-Suppression

非极大值抑制,在目标检测,回归了很多bounding boxes出来之后,要最终确定哪一个是最终使用的时候,需要用nms进行bounding boxes的剔除。

具体过程:对于图片每一个类别,先找到置信度(网络predict的概率)最大的值,先对于这一类别的其他框做iou的操作,然后有一个nms的iou超参,高于设定iou的就被剔除。

如此对于每一个类别进行重复操作,这样排除了很多置信度低的框。

下面贴一下自己写的nms代码,并简单分析一下。

#include <iostream>
#include <string>
#include <set>
#include <cmath>
#include <vector>
#include <tuple>
using namespace std;
float iou_cal(vector<float> box1, vector<float> box2){float right_x = min(box1[2],box2[2]);float right_y = min(box1[3],box2[3]);float left_x = max(box1[2],box2[2]);float left_y = max(box1[3],box2[3]);float overlap = fmax(0.,left_x-right_x) * fmax(0.,left_y-right_y);float area_sum = (box1[2]-box1[0])*(box1[3]-box1[1])+(box2[2]-box2[0])*(box2[3]-box2[1]);return overlap/(area_sum-overlap);
}
tuple<vector<float>,int> find_base(vector<vector<float> > boxes){vector<float> boxes_max{-1,-1,-1,-1};float max_pb = 0.;int index;for(int i = 0; i<boxes.size();i++){if(boxes[i][0]>max_pb){max_pb = boxes[i][0];boxes_max[0] = boxes[i][1];boxes_max[1] = boxes[i][2];boxes_max[2] = boxes[i][3];boxes_max[3] = boxes[i][4];index = i;}}return make_tuple(boxes_max,index);}
void nms(vector<vector<float> > &boxes,float iou_value){ // single classtuple<vector<float>,int> box_value;vector<float> boxes_base;float iou = 0.0;int index;box_value = find_base(boxes);boxes_base = get<0>(box_value);index = get<1>(box_value);for(int i=0;i<boxes.size();i++){if(i!=index){iou = iou_cal(boxes_base,boxes[i]);if(iou>iou_value){boxes.erase(boxes.begin()+i);}}}
}
void print_boxes(vector<vector<float> > boxes){for(int i=0;i<boxes.size();i++){for(int j=0;j<boxes[0].size();j++){cout << boxes[i][j] << " " ;}cout << endl;}
}int main(int argc, const char * argv[]) {vector<float> box1{0.6,100,98,300,400};vector<float> box2{0.7,85,60,250,500};vector<float> box3{0.8,70,49,200,350};vector<vector<float> > boxes;boxes.push_back(box1);boxes.push_back(box2);boxes.push_back(box3);print_boxes(boxes);nms(boxes,0.5);print_boxes(boxes);return 0;
}

上面代码考虑单一类别的情况,多类别加一个for循环即可,首先是要找到置信度最大的候选框,通过find_base函数。之后进行for循环,对于其他候选框进行判断,计算iou占比,如果小于设定的阈值(这里设定的为0.5)那么就剔除这个框。

tip:c++语法要注意nms的输入应为引用。

这篇关于目标检测阅读总结(一)之RCNN以及NMS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583486

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听