目标检测入门

什么是目标检测

目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框,标示出每个目标的位置。
为了解决这个问题,结合图片分类任务取得的成功经验,我们可以将目标检测任务进行拆分。假设我们现在有某种方式可以在输入图片上生成一系列可能包含物体的区域,这些区域称为候选区域,在一张图上可以生成很多个候选区域。然后对每个候选区域,可以把它单独当成一幅图像来看待,使用图像分类模型对它进行分类,看它属于哪个类别或者背景(即不包含任何物体的类别)。
在这里插入图片描述
如图,我们可以使用穷举法来产生候选区域。当A遍历图像上所有像素点,B则遍历它右下方所有的像素点,最终生成的矩形框集合{AiBj}将会包含图像上所有可以选择的区域。

目标检测基础概念

边界框(bounding box)

检测任务需要同时预测物体的类别和位置,因此需要引入一些跟位置相关的概念。通常使用边界框(bounding box,bbox)来表示物体的位置,边界框是正好能包含物体的矩形框,如图所示,图中3个人分别对应3个边界框。

通常有两种格式来表示边界框的位置:

  1. xyxy,即(x1,y1,x2,y2),其中(x1,y1)是矩形框左上角的坐标,(x2,y2)是矩形框右下角的坐标。上图中3个红色矩形框用xyxy格式表示如下:
    左:(40.93,141.1,226.99,515.73)
    中:(214.29,325.03,399.82,631.37)
    右:(247.2,131.62,480.0,639.32)
  2. xywh,即(x,y,w,h)其中(x,y)是矩形框中心点的坐标,w是矩形框的宽度,h是矩形框的高度。
    在检测任务中,训练数据集的标签里会给出目标物体真实边界框所对应的(x1,y1,x2,y2)这样的边界框也被称为真实框(ground truth box),如上图所示,图中画出了3个人像所对应的真实框。模型会对目标物体可能出现的位置进行预测,由模型预测出的边界框则称为预测框(prediction box)。

锚框(Anchor box)

锚框与物体边界框不同,是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。在下图中,以像素点[300, 500]为中心可以使用下面的程序生成3个框,如图中蓝色框所示,其中锚框A1跟人像区域非常接近。

交并比

上面我们画出了以点(300,500)(300, 500)(300,500)为中心,生成的三个锚框,我们可以看到锚框A1 与真实框 G1的重合度比较好。那么如何衡量这三个锚框跟真实框之间的关系呢,在检测任务中是使用交并比(Intersection of Union,IoU)作为衡量指标。这一概念来源于数学中的集合,用来描述两个集合A和B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式为:在这里插入图片描述
我们将用这个概念来描述两个框之间的重合度。两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。下图“交集”中青色区域是两个框的重合面积,图“并集”中蓝色区域是两个框的相并面积。用这两个面积相除即可得到它们之间的交并比,如下图所示:

假设两个矩形框A和B的位置分别为:在这里插入图片描述
假如位置关系如图所示:

如果二者有相交部分,则相交部分左上角坐标为:在这里插入图片描述
相交部分右下角坐标为:在这里插入图片描述
计算相交部分面积:在这里插入图片描述
矩形框A和B的面积分别是:在这里插入图片描述
计算相并部分面积:在这里插入图片描述
计算交并比:在这里插入图片描述

目标检测算法分类

在这里插入图片描述
两步走的目标检测:先进行区域推荐,而后进行目标分类,例如:R-CNN、SPP-net、Fast R-CNN、Faster R-CNN
端到端的目标检测:采用一个网络一步到位 例如:YOLO、SSD

R-CNN网络

R-CNN是以深度神经网络为基础的物体检测的模型 ,也是第一个将卷积用于目标检测的模型,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。
在这里插入图片描述
在这里插入图片描述

R-CNN过程(以AlexNet网络为基准)

1.找出图片中可能存在目标的侯选区域region proposal。
2.进行图片大小调整。为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成2000×4096维矩阵。
3.将2000×4096维特征与21个SVM组成的权值矩阵4096×20相乘(20种分类+1个背景类,SVM是二分类器,则有21个SVM),获得2000×20维矩阵。
4.分别对2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
5.修正bbox,对bbox做回归微调。

Crop+Warp

传统的CNN限制了输入必须固定大小,所以在实际使用中往往需要对原图片进行crop或者warp的操作
无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。

CNN网络提取特征

在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。
在这里插入图片描述

特征向量训练分类器SVM

假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。那么最后需要对这些特征进行分类,R-CNN选用SVM进行二分类。假设检测19个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,每个SVM分类器做的事情就是判断2000个候选区域是某类别,还是背景。

非极大值抑制(Non-Maximum Suppression,NMS)

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

修正候选区域

那么通过NMS筛选出来的候选框不一定非常准确怎么办?R-CNN提供了这样的方法,建立一个bbox regression,回归用于修正筛选后的候选区域,使之回归于ground-truth,默认认为这两个框之间是线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python目标检测入门可以通过使用ImageAI库来实现。首先,你需要创建一个Python文件,并导入ObjectDetection类。你可以使用以下代码来导入ObjectDetection类:`from imageai.Detection import ObjectDetection`。接下来,你需要定义模型路径、输入图像路径和输出图像路径。你可以使用以下代码来完成这些定义:`model_path = "./models/yolo-tiny.h5",input_path = "./input/test_car.png",output_path = "./output/pre_car.png"`。然后,你需要实例化ObjectDetection类,并设置模型类型为TinyYOLOv3,加载模型。使用以下代码来完成这些步骤:`detector = ObjectDetection(),detector.setModelTypeAsTinyYOLOv3(),detector.setModelPath(model_path),detector.loadModel()`。接下来,你可以使用`detectObjectsFromImage`方法来检测图像中的对象,并将结果保存在列表中。最后,你可以遍历列表并打印每个检测到的对象的名称和概率。下面是完整的示例代码: ```python from imageai.Detection import ObjectDetection # 实例化 detector = ObjectDetection() # 路径定义 model_path = "./models/yolo-tiny.h5" input_path = "./input/test_car.png" output_path = "./output/pre_car.png" # 设置预训练模型路径 detector.setModelTypeAsTinyYOLOv3() detector.setModelPath(model_path) # 加载模型 detector.loadModel() # 检测对象并保存结果图像 detections = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path) # 打印检测结果 for eachObject in detections: print(eachObject["name"], " : ", eachObject["percentage_probability"]) ``` 希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)](https://blog.csdn.net/Eastmount/article/details/119107913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值