目标检测发展路程(一)——Two stage

目标检测是计算机视觉领域中非常重要的一个研究方向,它是将图像或者视频中目标与其他不感兴趣的部分进行区分,判断是否存在目标,确定目标位置,识别目标种类的任务,即定位+分类。传统的目标检测模型有VJ.Det[1,2],HOG.Det[3],DPM[4,5,6],直到2012年,CNN模型日益成熟化,以深度学习为基础的目标检测模型开始发展,主要分为单阶段模型(One stage)和两阶段模型(Two stage),发展路径如下:

目标检测也面临许多挑战:

  • 环境影响
  • 密集
  • 遮挡
  • 重叠
  • 多尺度:大目标、小目标
  • 小样本
  • 旋转框

目标检测也细分了很多领域

  • 通用检测:
  • 行人检测:行人违规检测
  • 车辆检测:车辆违规检测、车辆牌照识别等
  • 人脸检测:人脸口罩检测,人脸识别打卡等
  • 文字检测:OCR(光学字符识别)的文本检测,常见算法:DBNet

1、常见术语介绍

(1)BBox(边界框)

BBox:Bounding Box,边界框,边界框分为两种:Groud-truth(真实框,也简称gt_box)和prediction box(预测框,也简称pred_box),使用边界框(bounding box)来表示物体的位置,边界框是正好能包含物体的矩形框,通常有两个格式

  • (x1,y1,x2,y2)

        (x1,y1)是矩形框的左上角的坐标,(x2,y2)是矩形框的右上角的坐标。

  •  (x ,y ,w ,h )

          (x,y)是矩形框中心点的坐标,w ww是矩形框的宽度,h hh是矩形框的高度。

(2)Anchor(锚框)

锚框与物体边界框不同,是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框, 将这些锚框当成可能的候选区域。

(3)RoI(Region of Interest):特定的感兴趣区域

(4)Region Proposal :候选区域

(5)RPN(Pegion Proposal Network):区域生成网络,用于生成候选区域的网络。

(6)IoU(Intersaction over Union)

在检测任务中,使用交并比(Intersection of Union,IoU)作为衡量指标。这一概念来源于数学中的集合,用来描述两个集合A AA和B BB之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:

我们将用这个概念来描述两个框之间的重合度。两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。

(7)mAP

AP(Average Precision)是某一类以Precision、Recall为纵、横坐标的曲线下的面积,mAP(mean Average Precision)是所有类别AP平均。

(8)NMS

搜索局部最大值,抑制极大值。

2、深度学习的目标检测方案

在Ross Girshick等人提出DPM方法后,目标检测进入瓶颈期,图像特征提取成为难点,随着CNN的发展,也开始尝试将神经网络加入到目标检测任务中。该图是几个模型的差异对比:

 (1)R-CNN

R-CNN的全称是Region-CNN,是第一个成功将深度学习应用到目标检测中的算法,传统的目标检测方法是在图片上穷举出所有物体可能出现的区域框,对这些区域提取特征并进行分类,得到所有分类成功的区域,通过非极大值抑制(Non-maximum suppression)输出结果。R-CNN的实现步骤是

  • 采用提取框(Selective Search):搜索候选区域,并对候选区域提取特征,并将提取到的特征存储起来。

  • 对每个框提取特征(CNN):在数据集上训练CNN,R-CNN论文中使用的网络是AlexNet,数据集是ImageNet,在目标检测的数据集上,对训练好的CNN做微调。

  • 图像分类(SVM):使用分类模型SVM进行训练

  • 边框回归:通过非最大抑制策略对同一类别的ROI(region of interest)进行合并得到最终的检测结果,即得到每个矩形框的置信度。

不足:

  • 每个候选区域都需要通过CNN计算特征,计算量大
  • Selective Search提取的区域质量不够好
  • 特征提取、SVM分类器是分模块独立训练的,没有联合起来系统性优化,训练耗时长

(2)Fast R-CNN

在改进Fast R-CNN之前,有一个版本是SPPNet(Spatial Pyramind Pooling Convolutional 

Networks),将CNN的输入从固定尺寸改进为任意尺寸,加入ROI池化层(即对ROI的区域进行池化),使得网络的输入图像可以是任意尺寸,输出则不变,是固定维数的向量。

Fast R-CNN在SPPNet的基础上,将 SVM分类改成了神经网络进行分类,全连接层有两个输出,一个输出负责分类(softmax),另一个输出负责框回归(bbox regressor)。

最终得到两个结果:softmax分类以及L2回归,损失函数是分类和回归的加权和。

不足:

  • 仍用Selective Search提取候选区域

ROI Pooling的不足:

  • 在候选框的位置和提取特征时两次取整,会导致检测信息和提取出的特征不匹配

(3)Faster R-CNN

为了解决Selective Search带来的耗时问题,Faster R-CNN引用了RPN来进行候选区域的提取,RPN是一个全卷积神经网络(Fully Convolutional Network),输入是前一层任意大小的特征图,输出是一系列的矩形目标候选区,在卷积神经网络的最后一个特征层上滑动。

 为了适应多种形状的物体,RPN定义了k种不同尺度的滑窗,并将这些滑窗成为anchor,在Faster R-CNN论文中,用了9种anchor。

在分类任务中,需计算每个anchor和真实标记矩形框gt_box的IOU

  • 当IOU>0.7时,认为该anchor包含目标物体,为正样本
  • 当IOU在0.3-0.7之间时,不参与网络训练的迭代过程
  • 当IOU<0.3时,认为该anchor不包含目标物体,为负样本

在回归任务中,需计算anchor和gt_box的横、纵坐标及宽高的偏移量,Loss函数的是通过smooth L1进行计算的,公式为

smooth_{L1}(x)= \left\{\begin{matrix} 0.5x^{2} , if \left | x \right |<1 \\ \left | x \right |-0.5 ,otherwise \end{matrix}\right.

ROI Align:消除ROI Padding的误差

 在区域内均匀的取N个点,找到特征图上离每个点最近的四个点,再通过双线性插值的方式,得到点的输出值,最后对N个点取平均得到区域的输出。

(4)进阶模型

  • FPN(解决多尺度问题)

方案可以构造多尺度金字塔,期望模型能够具备检测不同大小尺度物体的能力,具体方案如下图:

  • a是将特征缩放到不同尺度,使用多个模型进行预测
  • b是仅使用最后一层的特征作为检测模型后续部分的输入
  • c是每个层级分别预测
  • d是使用不同层级特征进行融合,在分级预测(FPN)

FPN是以骨干网络的输出为输入,将特征进行上采样并与上一层特征相加得到FPN结构每一层的输出,网络结构图如下

在FPN结构中,会存在多个ROI Align,将FPN的特征金字塔类比为图像金字塔,可以通过面积来对候选框进行分配。

  • Cascade R-CNN(IoU)

Cascade R-CNN主要是对IoU指标的改进,IoU是计算两个框之间的重叠区域,在模型中涉及到的细节有:一、计算基于Anchor和GT框的IoU值,二是基于预测框和真实框的IoU值。通过调整IoU的阈值并未对模型有较大提升,单一阈值训练的模型有限,因此,对模型进行多Head改进。

  • Libra R-CNN

Libra R-CNN进行三方面的改进,分别是特征融合、采样策略、损失函数。

 增强FPN的特征融合:

  1. Rescale(重新调节):将不同层级的特征图(C层)通过差值或者下采样的方法进行统一到C4层
  2. Integrate(合并):将汇集的特征进行融合
  3. refine(重新定义):使用non-local结构对融合特征进行加强
  4. strengthen(增强):将优化的特征与不同层级上的原始特征加和

采样策略:

  1. 正样本采样(正样本类别不平衡):对正样本里边的类别进行随机采样,保证类别均衡
  2. 负样本采样(负样本IoU分配不平衡):根据阈值划分,高于阈值的进行分桶,计算应该落在每个桶中的样本数量,最后得到IoU均匀分布的负样本;低于阈值的样本随机采样

Loss(Smooth L1 loss--->Balanced L1 loss):

还有Mask R-CNN、RFCN、Light-Head R-CNN等模型的改进

3、深度学习的目标检测实现

3.1. PaddleDetection的安装和使用

(1)安装

#下载PaddleDetection
! git clone https://github.com/PaddlePaddle/PaddleDetection
#解压
! unzip -o PaddleDetection.zip
#安装cocoapi
! pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI"
#安装需求包,在PaddleDetection路径下
!pip install -r requirements.txt#配置环境变量
%env PYTHONPATH=.:$PYTHONPATH
%env CUDA_VISIBLE_DEVICES=0#验证
! python ppdet/modeling/tests/test_architectures.py

(2)介绍

在PaddleDetection中实现目标检测、关键点检测、实例分割等算法,具体模型如下:

 (3)模型包内容拆解

核心文件有四个configs、dataset、demo、tools, 包含了数据集、测试、模型、训练整个过程,可以按需调整实现。

教程参考:飞桨AI Studio - 人工智能学习与实训社区

(4)实现

#运行代码---训练操作,并进行验证集验证
! python -u tools/train.py -c ../faster_rcnn_r34_1x.yml --eval

其中,faster_rcnn_r34_1x.yml为配置文件,内容如下

  • 超参数配置

DataReader配置:

  • image_dir: images 图片路径
  • anno_path: Annotations/train_cpu.json 标注文件
  • dataset_dir: /home/aistudio/work/PCB_DATASET 数据路径
#预测,并可视化
! python -u tools/infer.py -c ../faster_rcnn_r34_1x.yml \--infer_img=../PCB_DATASET/images/04_missing_hole_10.jpg \-o weights=output/faster_rcnn_r34_1x/best_model

其他模型实现步骤跟faster R-CNN相似!

2、torchvision实现(基于pytorch)

(1)安装

直接用pip就能完成安装操作,故忽略。

(2)实现(参考pytorch教程文档)

import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from torchvision.models.detection.mask_rcnn import MaskRCNNPredictordef get_model_instance_segmentation(num_classes):# load an instance segmentation model pre-trained on COCOmodel = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)# get number of input features for the classifierin_features = model.roi_heads.box_predictor.cls_score.in_features# replace the pre-trained head with a new onemodel.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)# now get the number of input features for the mask classifierin_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channelshidden_layer = 256# and replace the mask predictor with a new onemodel.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask,hidden_layer,num_classes)return model

(3)实现细节

  • backbone:骨干网络(提取图片特征,基本是卷积神经网络),需要知道Module的out_channels
  • rpn:区域预测网络
rpn = RegionProposalNetwork(rpn_anchor_generator, rpn_head,rpn_fg_iou_thresh, rpn_bg_iou_thresh,rpn_batch_size_per_image, rpn_positive_fraction,rpn_pre_nms_top_n, rpn_post_nms_top_n, rpn_nms_thresh,score_thresh=rpn_score_thresh)#rpn_anchor_generator:AnchorGenerator-生成锚框
#rpn_head:RPNHead(包含classification and regression 的RPN head,参数:输入特征的通道数,被预测的anchors数量)
  • roi_heads:里边的方法有RoI Pooling 转成RoI Align。
roi_heads = RoIHeads(# Boxbox_roi_pool, box_head, box_predictor,box_fg_iou_thresh, box_bg_iou_thresh,box_batch_size_per_image, box_positive_fraction,bbox_reg_weights,box_score_thresh, box_nms_thresh, box_detections_per_img)
box_head: TwoMLPHead:两个linear
box_roi_pool:MultiScaleRoIAlign
box_predictor: FastRCNNPredictor 两个linear,一个做classifer,一个做box regression
  • transform

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

都2021年了,c/c++开发竟然还能继续吃香??

年后就迎来了金三银四&#xff0c;你准备好2021年的跳槽涨薪计划了吗&#xff1f;今天我就来给大家分享&#xff0c;c/c作为老牌开发常青树&#xff0c;还能与java/python/go较较劲的岗位和技术在哪里&#xff01;同时&#xff0c;给大家整理了2021年系统全面技术学习资料。文末…

String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围

String.getBytes(charsetName),这个方法很多人都用过&#xff0c;可是有没有试过temp.getBytes("Unicode");这样的用法&#xff0c;它的返回值很奇怪&#xff0c;第1和第2个字节是-1或-2,比如下面的代码&#xff0c;你能想象出它的结果吗&#xff1f; String t…

Linux Crontab 安装使用详细说明

yum -y install vixie-cron yum -y install crontabs 说明&#xff1a;vixie-cron 软件包是 cron 的主程序&#xff1b;crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。 二、配置 cron 是 linux 的内置服务&#xff0c;但它不自动起来&#xff0…

STM32——流水灯

STM32——流水灯 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 stm32f10x_conf.h&#xff1a;打开stm32f10x_gpio.h和stm32f10x_rcc.h&#xff1b; stm32f10x_gpio.c 和 stm32f10x_rcc.c加入工程模板中&#xff0c;只说重点。 【stm32f10x_rcc.c用…

目标检测模型——One stage(YOLO v5的模型解析及应用)

1. 简介 目标检测分为Two stage和One stage,只使用一个网络同时产生候选区域并预测出物体的类别和位置&#xff0c;所以它们通常被叫做单阶段检测算法&#xff08;One stage&#xff09;。本篇文章只讲One stage模型&#xff0c;常见的模型有YOLO&#xff0c;SSD。 目标检测发…

腾讯回应QQ读取用户浏览器历史记录

腾讯QQ官方认证账号在知乎回应“QQ扫描读取所有浏览器的历史记录”表示&#xff0c;PC QQ存在读取浏览器历史用以判断用户登录安全风险的情况&#xff0c;读取的数据用于在PC QQ的本地客户端中判断是否恶意登录。所有相关数据不会上传至云端&#xff0c;不会储存&#xff0c;也…

【NOIP 模拟赛】 道路

题目描述在二维坐标平面里有 N 个整数点,信息班某一巨佬要访问这 N 个点。刚开始巨佬在点(0,0)处。 每一步,巨佬可以走到上、下、左、右四个点。即假设巨佬当前所在点的坐标是(x,y),那么它下一步可以移动到(x,y1), (x,y-1), (x1,y),(x-1,y)之一。巨佬目标是找到一个移动序列,满…

MySQL实用命令

windows 启动和关闭Myql服务 “net start mysql”就启动mysql服务了&#xff0c;停止mysql服务“net stop mysql”&#xff08;注意&#xff0c;这里是输入的MySQL服务的名字。如果你的MySQL服务的名字是DB或其它名字&#xff0c;你应该输入“net start DB”或其它名&#xff0…

OCR系列——总体概述

最近参加了百度Paddle的动手学OCR课程&#xff0c;特此做一个学习总结。 1. 简介 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是计算机视觉重要方向&#xff0c;传统的OCR一般面向扫描文档类对象&#xff0c;现在的OCR是指场景文字识…

STM32——系统滴答定时器

STM32——系统滴答定时器 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、SysTick【内核中】 【风格&#xff1a;先描述一下库对寄存器的封装&#xff0c;再举例实现某些功能】 SysTick定时器被捆绑在NVIC中&#xff0c;用于产生SysTick异常&#…

就算是蜗牛,也有爬到树顶的那一天!~

我知道&#xff0c;现在的我很菜&#xff0c;与年龄及其不相符的菜。 因为之前一直做销售&#xff0c;对于计算机&#xff0c;自己真可算得上是白痴。 是的&#xff0c;我毫不讳言选择计算机是一条退路&#xff0c;也毫不讳言之前的自己是一个懦弱无能的男人。 借口太多了&…

你会用while(1)还是for(;;)写循环代码?

看代码看到for(;;)&#xff0c;然后觉得为什么不写成while(1)呢&#xff0c;所以就做了下面的测试。网上有解释&#xff0c;因为while需要做一次判断&#xff0c;理论上执行会花费的时间更久&#xff0c;for(;;)只是执行了两次空语句&#xff0c;执行会更快for.c#include <s…

树链剖分小结

这里没有水表 树链剖分是一个通过轻重链剖分、dfs序和线段树的使用,在有根树上维护路径和子树信息的有效算法 其预处理时间复杂度为\(O(nlog^2n)\),单次操作时间复杂度为\(O(log^2n)\),常数优秀 主要是防止自己忘记,所以只作简要说明,要学习的可以参考友链里大佬的博客 预处理 …

OCR系列——文本检测任务

1. 简介 文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务&#xff0c;目标检测不仅要解决定位问题&#xff0c;还要解决目标分类问题。 目标检测和文本检测同属于“定位”问题。但是文本检测无需对目标分类&#xff0c;并且文本形状复杂多样。 当前所说的文本…

关于ORACLE 语句中,IN 超过1000个的解决方法

在ORACLE SELECT 语句中 IN 的数据如果超过 1000&#xff0c;就会出错&#xff0c;解决方法也很简单&#xff0c;以C#代码为例&#xff1a; 1、先写一个方法&#xff0c;接收2个参数 参数1&#xff1a;接收 IN里面的数据&#xff0c;如&#xff1a;a1,a2,...a2000 &#xff1b;…

9个提高代码运行效率的小技巧你知道几个?

我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中&#xff0c;我们必须考虑代码使用的方式&#xff0c;以及影响它的关键因素。通常&#xff0c;我们必须在程序的简洁性与它的运行速度之间做出…

STM32——按键

STM32——按键 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、GPIO工作模式 1、当I/O端口配置为输入时&#xff1a; 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉&#xff0c;下拉或浮动)的不同&#xff0c;弱上拉和下拉电阻被连接 …

【Flask模板】include标签

# include标签&#xff1a;1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。2. include标签&#xff0c;如果想要使用父模版中的变量&#xff0c;直接用就可以了&#xff0c;不需要使用with context。3. include的路径&#xff0c;也是跟import一样&#xff0…

深度学习——模型的压缩和加速

1. 简介 随着深度学习发展&#xff0c;越来越多的模型被发现和应用&#xff0c;模型的体量也越来越大&#xff0c;出现了模型过于庞大和参数冗余的问题。同时&#xff0c;移动端对模型的需求也是越轻量越好&#xff0c;因此&#xff0c;模型压缩和加速技术应运而生。 模型压缩…

干货,记一次解决录音杂音问题

最近在项目上遇到一个问题&#xff0c;也不能说是最近项目上的问题了&#xff0c;是之前一直存在的问题&#xff0c;但是对项目没什么影响&#xff0c;所以我就不怎么理会&#xff0c;直到最近&#xff0c;同事说这个杂音已经影响到了项目的开发&#xff0c;所以今天花了一天时…