一、目标检测概述
1.目标检测
-
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别 (分类任务)和位置(回归任务)
-
目标检测中能检测出来的物体取决于当前任务(数据集)需要检测的物体有哪些
-
目标检测的位置信息一般有两种格式(以图片左上角为原点(0,0))
-
极坐标表示:xmin, ymin, xmax, ymax分别代表x, y坐标的最小值,最大值(左上角坐标<右下角坐标)
图像坐标系原点在左上角,把图像看作ndarray,行对应着y,列对应着x
-
中心点坐标:x_center, y_center, w, h分别表示目标检测框的中心点坐标和目标检测框的宽,高
-
2.开源数据集
经典的目标检测数据集有两种,PASCAL VOC数据集 和MS COCO数据集
(1)PASCAL VOC数据集
PASCAL VOC是目标检测领域的经典数据集。PASCAL VOC包含约10000张带有边界框的图片用于训练和验证。PASCAL VOC数据集是目标检测问题的一个基准数据集,很多模型都是在此数据集上得到的,常用的是VOC2007和VOC2012两个版本的数据集,共20个类别,分别是:
- Person:person
- Animal:bird,cat,cow,horse,sheep
- Vehicle:aeroplane,bicycle,boat,bus,car,motorbike,train
- Indoor:bottle,chair,dining table,potted plant,soft,tv/monitor
下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/
目标位置信息 解释:
- 0 不可用于分割
- Frontal 物体在图片中的位置是 前面
- Unspecified 正常拍摄 Right 物体位于右侧
- 1 物体是截断的
- 0 不是 难以识别的物体(若为1,则是人难以识别的物体)
(2)MS COCO数据集
- 全称是Microsoft Common Objects in Context。COCO数据集是一个大型的丰富的物体检测,分割和字幕数据集。这个数据集以场景理解为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的分割进行位置的标定,图像包括91类目标,328000影像和2500000个label。目前为止目标检测的最大数据集,提供的类别有80类,超过33万张图片,其中20万张有标注,整个数据集中个体的数目超过150万个。
- COCO数据集的标签文件标记了每个segmentation+bounding box的精确坐标。其精度均为小数点后两位,一个目标的标签示意如下:
- COCO数据集的目标个数相对VOC数据集来说 要小一点
- COCO数据集使用json文件标注目标
- COCO数据集精细标注,即先 分割,然后再进行框选标注,总共标注了80个类别的目标
3.常用的评价指标
(1)IOU
在目标检测算法中,IOU(intersection over union,交并比)是目标检测算法中用来评价2个矩形框之间相似度的指标
I O U = 两个矩形框相交的面积 两个矩形框相并的面积 IOU = \frac{两个矩形框相交的面积}{两个矩形框相并的面积} IOU=两个矩形框相并的面积两个矩形框相交的面积
- IOU--->1,两个矩形框越相似;IOU--->0,两个矩形框越不相似。
- 当IOU达到0.5,则检测效果还可以;当IOU达到0.7,则检测效果还不错。
实现方法:
python
def Iou(box1, box2, wh = False):
if wh = False: # 使用极坐标表示
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
else: # 使用中心点表示
# 第一个框左上角坐标
xmin1, ymin1 = int(box1[0] - box1[2]/2.0), int(box1[1] - box1[3]/2.0)
# 第一个框右下角坐标
xmax1, ymax1 = int(box1[0] + box1[2]/2.0), int(box1[1] + box1[3]/2.0)
# 第二个框左上角坐标
xmin2, ymin2 = int(box2[0] - box2[2]/2.0), int(box2[1] - box2[3]/2.0)
# 第二个框右下角坐标
xmax2, ymax2 = int(box2[0] + box2[2]/2.0), int(box2[1] + box2[3]/2.0)
# 获取矩形框交集对应的左上角和右下角的坐标(intersection)
xx1 = np.max([xmin1, xmin2])
yy1 = np.max([ymin1, ymax2])
xx2 = np.min([xmax1, xmax2])
yy2 = np.min([ymax1, ymax2])
# 计算两个矩形框的面积
area1 = (xmax1 - xmin1)*(ymax1 - ymin1)
area2 = (xmax2 - xmin2)*(ymax2 - ymin2)
# 计算交集面积
inter_area = (np.max([0, xx2 - xx1]))*(np.max([0, yy2 - yy1])) # 若xx2 - xx1小于0,则使最终结果等于0
# 计算交并比
iou = inter_area / (area1 + area2 - inter_area + 1e-6)
return iou
示例:
python
import matplotlib.pyplot as plt
import matplotlib.patches as patches # 绘制矩形框
# 真实框和预测框
True_bbox, predict_bbox = [100, 35, 398, 400], [40, 150, 355, 398]
# bbox是bounding box的缩写
img = plt.imread('dog.jepg')
fig = plt.imshow(img)
# 将边界框(左上x,左上y,右下x,右下y)格式转换成为matplotlib格式:((左上x,左上y),宽,高)
# 真实框绘制
fig.axes.add_patch(
plt.Rectangle(
xy = (True_bbox[0], True_bbox[1]), width = True_bbox[2] - True_bbox[0],
height = True_bbox[3] - True_bbox[1], fill = False, edgecolor = 'blue',linewidth = 2
)
)
# 预测框绘制
fig.axes.add_patch(
plt.Rectangle(
xy = (predict_bbox[0], predict_bbox[1]), width = predict_bbox[2] - predict_bbox[0],
height = predict_bbox[3] - predict_bbox[1], fill = False, edgecolor = 'red',linewidth = 2
)
)
# 计算iou
Iou(True_bbox, predict_bbox)
(2)mAP(Mean Average Precision)
目标检测问题中的每个图片都可能包含一些不同类别的物体,需要评估模型的物体分类和定位性能(只有物体分类:准确率;只有定位性能:IOU)。因此,用于图像分类问题的标准指标precision不能直接应用于此
A、mAP计算方法
TP,FP,FN,TN
- True Positive(TP): I O U IOU IOU( I O U t h r e s h o l d IOU_{threshold} IOUthreshold一般取0.5)的检测框数量(同一Ground Truth 只计算一次)
- False Positive(FP): I O U ≤ I O U t h r e s h o l d IOU \le IOU_{threshold} IOU≤IOUthreshold的检测框的数量,或者检测到同一个GT的多余检测框的数量
- False Negative(FN):没有检测到的GT数量
- True Negative(TN):在MAP评价指标中不会使用到
查准率,查全率
- 查准率(
Precision
): T P T P + F P \frac{TP}{TP+FP} TP+FPTP - 查全率(
Recall
): T P T P + F N \frac{TP}{TP+FN} TP+FNTP
P-R曲线
查准率和查全率两者绘制的曲线即为P-R曲线

AP(average precision)
AP是PR曲线下的面积
mAP
mAP是多个分类任务的AP的平均值
B、mAP计算示例
其中all detections
代表所有预测框的数量,all ground truths
代表所有GT的数量
P r e c i s i o n = T P T P + F P = T P a l l d e t e c t i o n s Precision = \frac{TP}{TP+FP}=\frac{TP}{all\,detections} Precision=TP+FPTP=alldetectionsTP
R e c a l l = T P T P + F N = T P a l l g r o u n d t r u t h s Recall = \frac{TP}{TP+FN} = \frac{TP}{all\,ground\,truths} Recall=TP+FNTP=allgroundtruthsTP
AP
是计算某一类P-R
曲线下的面积,mAP
则是计算所有类别P-R
曲线下面积的平均值
解释:
- 当一个GT有多个预测边框时,则认为其中IOU最大的并且 I O U ≥ 0.3 IOU \ge 0.3 IOU≥0.3的标记为TP,其余的均标记为FP
- IOU--->1,则预测边框与GT越相似;反之,则越不相似
先计算出P-R曲线上各个点的坐标 (注意:需要根据置信度从大到小排序所有的预测框)
- ACC TP:从第一个检测结果到当前行的所有 TP 的总和,用于计算累积的精确率(Precision)和召回率(Recall)
- ACC FP:从第一个检测结果到当前行的所有 FP 的总和,同样用于计算累积的精确率和召回率
然后就可以绘制出P-R曲线

得到P-R曲线之后就可以计算AP(P-R曲线下的面积),有两种方法:
- 在VOC2010以前,只需要选取当 R e c a l l ≥ 0 , 0.1 , 0.2 , ... , 1 Recall \ge 0, 0.1, 0.2,\dots,1 Recall≥0,0.1,0.2,...,1共11个点时的Precision最大值 ,然后AP就是这11个Precision的平均值,取11个点 [ 0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 ] [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]的插值所得

得到一个类别的AP结果如下:
A P = 1 11 ∑ r ∈ 0 , 0.1 , 0.2 , ⋯ , 1 ρ i n t e r p ( r ) AP = \frac{1}{11}\sum_{r \in 0, 0.1,0.2, \cdots, 1} \rho_{interp}(r) AP=111∑r∈0,0.1,0.2,⋯,1ρinterp(r)
A P = 1 11 ( 1 + 0.6666 + 0.4285 + 0.4285 + 0.4285 + 0 + 0 + 0 + 0 + 0 + 0 ) AP = \frac{1}{11}(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0) AP=111(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0)
A P = 26.84 % AP = 26.84\% AP=26.84%
要计算mAP,就把所有类别的mAP计算出来,然后取平均即可
- 在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取大于等于这些Recall值时对应的Precision最大值,如下图所示:

然后就可以计算PR曲线下面积作为AP值:

A P = A 1 + A 2 + A 3 + A 4 AP = A_1+A_2+A_3+A_4 AP=A1+A2+A3+A4
A 1 = ( 0.0666 − 0 ) × 1 = 0.0666 A_1 = (0.0666-0)\times1= 0.0666 A1=(0.0666−0)×1=0.0666
A 2 = ( 0.1333 − 0.0666 ) × 0.6666 = 0.04446222 A_2 =(0.1333-0.0666)\times0.6666 = 0.04446222 A2=(0.1333−0.0666)×0.6666=0.04446222
A 3 = ( 0.4 − 0.1333 ) × 0.4285 = 0.11428095 A_3 = (0.4-0.1333)\times0.4285 = 0.11428095 A3=(0.4−0.1333)×0.4285=0.11428095
A 4 = ( 0.4666 − 0.4 ) × 0.3043 = 0.02026638 A_4 = (0.4666-0.4)\times0.3043=0.02026638 A4=(0.4666−0.4)×0.3043=0.02026638
A P = 0.0666 + 0.04446222 + 0.11428095 + 0.02026638 AP = 0.0666+0.04446222+0.11428095+0.02026638 AP=0.0666+0.04446222+0.11428095+0.02026638
A P = 0.24560955 AP = 0.24560955 AP=0.24560955
A P = 24.56 % AP = 24.56\% AP=24.56%