一、目標檢測概述
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個矩形框之間相似度的指標
IOU=兩個矩形框相交的面積兩個矩形框相并的面積IOU = \frac{兩個矩形框相交的面積}{兩個矩形框相并的面積}IOU=兩個矩形框相并的面積兩個矩形框相交的面積?
- IOU—>1,兩個矩形框越相似;IOU—>0,兩個矩形框越不相似。
- 當IOU達到0.5,則檢測效果還可以;當IOU達到0.7,則檢測效果還不錯。
實現方法:
def Iou(box1, box2, wh = False):if wh = False: # 使用極坐標表示xmin1, ymin1, xmax1, ymax1 = box1xmin2, ymin2, xmax2, ymax2 = box2else: # 使用中心點表示# 第一個框左上角坐標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
示例:
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):IOUIOUIOU(IOUthresholdIOU_{threshold}IOUthreshold?一般取0.5)的檢測框數量(同一Ground Truth 只計算一次)
- False Positive(FP):IOU≤IOUthresholdIOU \le IOU_{threshold}IOU≤IOUthreshold?的檢測框的數量,或者檢測到同一個GT的多余檢測框的數量
- False Negative(FN):沒有檢測到的GT數量
- True Negative(TN):在MAP評價指標中不會使用到
查準率,查全率
- 查準率(
Precision
):TPTP+FP\frac{TP}{TP+FP}TP+FPTP? - 查全率(
Recall
):TPTP+FN\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的數量
Precision=TPTP+FP=TPalldetectionsPrecision = \frac{TP}{TP+FP}=\frac{TP}{all\,detections}Precision=TP+FPTP?=alldetectionsTP?
Recall=TPTP+FN=TPallgroundtruthsRecall = \frac{TP}{TP+FN} = \frac{TP}{all\,ground\,truths}Recall=TP+FNTP?=allgroundtruthsTP?
AP
是計算某一類P-R
曲線下的面積,mAP
則是計算所有類別P-R
曲線下面積的平均值
解釋:
- 當一個GT有多個預測邊框時,則認為其中IOU最大的并且IOU≥0.3IOU \ge 0.3IOU≥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以前,只需要選取當Recall≥0,0.1,0.2,…,1Recall \ge 0, 0.1, 0.2,\dots,1Recall≥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結果如下:
AP=111∑r∈0,0.1,0.2,?,1ρinterp(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)
AP=111(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)
AP=26.84%AP = 26.84\%AP=26.84%
要計算mAP,就把所有類別的mAP計算出來,然后取平均即可
- 在VOC2010及以后,需要針對每一個不同的Recall值(包括0和1),選取大于等于這些Recall值時對應的Precision最大值,如下圖所示:
然后就可以計算PR曲線下面積作為AP值:
AP=A1+A2+A3+A4AP = A_1+A_2+A_3+A_4AP=A1?+A2?+A3?+A4?
A1=(0.0666?0)×1=0.0666A_1 = (0.0666-0)\times1= 0.0666A1?=(0.0666?0)×1=0.0666
A2=(0.1333?0.0666)×0.6666=0.04446222A_2 =(0.1333-0.0666)\times0.6666 = 0.04446222A2?=(0.1333?0.0666)×0.6666=0.04446222
A3=(0.4?0.1333)×0.4285=0.11428095A_3 = (0.4-0.1333)\times0.4285 = 0.11428095A3?=(0.4?0.1333)×0.4285=0.11428095
A4=(0.4666?0.4)×0.3043=0.02026638A_4 = (0.4666-0.4)\times0.3043=0.02026638A4?=(0.4666?0.4)×0.3043=0.02026638
AP=0.0666+0.04446222+0.11428095+0.02026638AP = 0.0666+0.04446222+0.11428095+0.02026638AP=0.0666+0.04446222+0.11428095+0.02026638
AP=0.24560955AP = 0.24560955AP=0.24560955
AP=24.56%AP = 24.56\%AP=24.56%