目标检测基本知识
计算机视觉和图像处理
- Tensorflow入门
- 深度神经网络
- 图像分类
- 目标检测
- 图像分割
目标检测
- 一、目标检测
- 二、常用的评价指标
- 2.1 IOU
- 2.2 NMS(非极大值抑制)
- 三、R-CNN网络基础
- 3.1 Overfeat模型
- 3.2 RCNN模型
- 3.3FastRCNN模型
- 四、Faster-RCNN网络
- 4.1 网络工作流程
- 五、yolo系列
- 5.1 yoloV3
- 六、SSD算法
一、目标检测
目标检测的任务是找出图像中所有感兴趣的目标,并确定它们的类别和位置。
目标检测的位置信息⼀般由两种格式(以图片左上角为原点(0,0)):
- 极坐标表示:(xmin, ymin, xmax, ymax)
- xmin,ymin:x,y坐标的最小值
- xmin,ymin:x,y坐标的最大值
- 中心点坐标:(x_center,y_center,w, h)
- x_center,y_center:目标检测框的中心点坐标
- w,h:目标检测框的宽、高
目标检测算法主要分为两类:
- Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归,two-stage的方法优势在于准确率度高;
- One-stage方法:如YOLO系列方法,主要思路就是均匀地在图片上不同位置进行密集采样,采样时使用不同尺度和长宽比box,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以优势在于速度快。
二、常用的评价指标
2.1 IOU
I
O
U
=
两个矩形框相交的面积
两个矩形框相并的面积
IOU={两个矩形框相交的面积 \over 两个矩形框相并的面积}
IOU=两个矩形框相并的面积两个矩形框相交的面积
一般可以设置当IOU的值大于0.5的时候,则可认为检测到目标物体。
实现方法:
import numpy as np
def IOU(box1,box2,wh=False):
if wh==False:
# 使用极坐标表示,直接获取两个bbox的坐标
xmin1,ymin1,xmax1,ymax1=box1
xmin2,ymin2,xmax2,ymax2=box2
else:
# 获取两个bbox的极坐标表示形式
xmin1,ymin1 = int(box1[0] - box1[2]/2.0,box1[1] - box1[3]/2.0)
xmax1,ymax1 = int(box1[0] + box1[2]/2.0,box1[1] + box1[3]/2.0)
xmin2,ymin2 = int(box2[0] - box2[2]/2.0,box2[1] - box2[3]/2.0)
xmax2,ymax2 = int(box2[0] + box2[2]/2.0,box2[1] + box2[3]/2.0)
# 获取矩形框交集对应的左上角和右下角的坐标
xx1 = np.max([xmin1,xmin2])
yy1 = np.max([ymin1,ymin2])
xx2 = np.min([xmax1,xmax2])
yy2 = np.min([ymax1,ymax2])
# 计算两个矩形框面积
area1 = (xmax1 - xmin1) * (ymax1 - ymin1)
area2 = (xmax2 - xmin2) * (ymax2 - ymin2)
# 计算交集面积
if xx2 <= xx1 or yy2 <= yy1:
inter_area = 0
else:
inter_area = (xx2-xx1)*(yy2-yy1)
# 计算两个矩形相并的面积
uion_area = area1 + area2 - inter_area
# IOU
IOU = inter_area / (uion_area+1e-6)
return IOU
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 真实框 预测框
true_box = [120,35,270,260]
pre_box = [60,70,290,240]
img = plt.imread('./dog.jpg')
fig = plt.imshow(img)
fig.axes.add_patch(plt.Rectangle((true_box[0],true_box[1]),true_box[2]-true_box[0],true_box[3]-true_box[1],edgecolor='blue',fill=False,linewidth=2))
fig.axes.add_patch(plt.Rectangle((pre_box[0],pre_box[1]),pre_box[2]-pre_box[0],pre_box[3]-pre_box[1],edgecolor='red',fill=False,linewidth=2))
IOU(true_box,pre_box)
2.2 NMS(非极大值抑制)
非极大值抑制,顾名思义就是抑制不是极大值的元素。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。 NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D重建、目标识别以及纹理分析等 。
在目标检测中,NMS的目的就是要去除冗余的检测框,保留最好的一个。
# 非极大抑制过程
# bboxes 同类别候选框坐标,confidence_score同类别候选框分数,threshold iou阈值
def nms(bboxes,confidence_score,threshold):
# 容错处理
if len(bboxes)==0:
return [],[]
# 类型转换
# bboxes是使用极坐标
bboxes = np.array(bboxes)
score = np.array(confidence_score)
# 获取左上角和右下角坐标
x1 = bboxes[:,0]
y1 = bboxes[:,1]
x2 = bboxes[:, 2]
y2 = bboxes[:, 3]
# 计算面积
areas = (x2-x1)*(y2-y1)
# NMS
picked_boxes = []
picked_score = []
# 排序,得到索引顺序
order = np.argsort(score)
while order.size>0:
# 获取score最大的索引
index = order[-1]
# 保留下来
picked_boxes.append(bboxes[index])
picked_score.append(score[index])
# 计算当前得分最高的框与剩余框的交集边界坐标
x11 = np.maximum(x1[index],x1[order[:-1]])
y11 = np.maximum(y1[index],y1[order[:-1]])
x22 = np.minimum(x2[index],x2[order[:-1]])
y22 = np.minimum(y2[index],y2[order[:-1]])
# 计算相交面积,不重叠时面积为0
w = np.maximum(0,x22-x11)
h = np.maximum(0,y22-y11)
inter_area = w*h
# 计算IOU
iou = inter_area/(areas[index]+areas[order[:-1]]-inter_area)
# 删除冗余框,找到所有IOU小于阈值的框的索引
keep_boxes = np.where(iou<threshold)
# 保留剩余的框
order = order[keep_boxes]
return picked_boxes,picked_score
bounding = [(187,82,337,317),(150,67,305,282),(246,121,368,304)]
confidence_score = [0.9,0.65,0.8]
threshold = 0.5
box,score = nms(bounding,confidence_score,threshold)
box,score
三、R-CNN网络基础
3.1 Overfeat模型
Overfeat方法使用滑动窗口进行目标检测,也就是使用滑动窗口和神经网络来检测目标。滑动窗口使用固定宽度和高度的矩形区域,在图像上"滑动",并将扫描结果送入到神经网络中进行分类和回归。
这种方法类似一种暴力穷举的方式,会消耗大量计算力,并且由于窗口大小问题可能会造成效果不准确。
3.2 RCNN模型
RCNN使用候选区域方法创建目标检测的区域来完成目标检测的任务。
步骤:
- 候选区域生成:使用选择性搜索(Selective Search)的方法找出图
片中可能存在目标的侯选区域 - CNN网络提取特征:选取预训练卷积神经网络(AlexNet或VGG)
用于进行特征提取。 - 目标分类:训练支持向量机(SVM)来辨别目标物体和背景,对每个类别,都要训练一个二元SVM。
- 目标定位:训练一个线性回归模型,为每个辨识到的物体生成更精确
的边界框。
3.3FastRCNN模型
步骤:
- 候选区域生成:使用选择性搜索(Selective Search)的方法找出图片中可能存在目标的侯选区域,只需要候选区域的位置信息
- CNN网络特征提取:将整张图像输入到CNN网络中,得到整副图的特征图,并将上一步获取的候选区域位置从原图映射到该特征图上
- ROIPooling: 对于每个特征图上候选框,RoI pooling层从特征图中提取固定长度的特征向量每个特征向量被送入一系列全连接(fc)层中。
- 目标检测:分两部分完成,一个输出各类别加上1个背景类别的Softmax概率估计,另一个为各类别的每一个类别输出四个实数值,来确定目标的位置信息。
四、Faster-RCNN网络
4.1 网络工作流程
FasterRCNN的工作流程:
- 特征提取:将整个图像缩放至固定的大小输入到CNN网络中进行特征提取,得到特征图。
- 候选区域提取:输入特征图,使用区域生成网络RPN,产生一些列的候选区域
- ROIPooling: 与Fast RCNN网络中一样,使用最大池化固定候选区域的尺寸,送入后续网络中进行处理
- 目标分类和回归:与Fast RCNN网络中一样,使用两个同级层:K+1个类别的SoftMax分类层和边框的回归层,来完成目标的分类和回归。
pass 不会Faster-RCNN网络的实现
五、yolo系列
YOLO(You Only Look Once)是一种实时目标检测系统。它将目标检测框架重新设计为一个回归问题,直接从图像像素回归到边界框及其类别概率。与其他一些目标检测方法不同,如R-CNN或Fast R-CNN,它们通过生成候选区域来工作,YOLO使用单个神经网络来预测对象的位置和类别,从而使其在处理速度方面具有显著优势。
5.1 yoloV3
- yoloV3的多尺度检测方法
在YOLOv3中采用FPN结构来提高对应多尺度目标检测的精度,当前的feature map利用“未来”层的信息,将低阶特征与高阶特征进行融合,提升检测精度。 - yoloV3模型的网络结构
以Darknet-53为基础,借鉴残差网络ResNet的思想,在网络中加入了残差模块,利于解决深层次网络的梯度问题
整个v3结构里面,没有池化层和全连接层,只有卷积层
网络的下采样是通过设置卷积中stride=2来达到的 - yoloV3模型先验框设计的方法
采用K-means聚类得到先验框的尺寸,为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。 - yoloV3模型为什么适用于多标签的目标分类
预测对象类别时不使用softmax,而是使用logistic的输出进行预测 - yoloV3模型的输入输出
对于416×416×3的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13×13×3 + 26×26×3 + 52×52×3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。
六、SSD算法
SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。
SSD的多尺度特征图的网络中SSD提取了6个不同特征图进行目标检测。
SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。