【實驗】COCO數據集上的實驗

1.MMdetection上的實驗

1.1 cascade_rcnn_x101

CUDA_VISIBLE_DEVICES=3 python ./tools/test.py ./configs/cascade_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_rcnn_x101_64x4d_fpn_2x_20181218-5add321e.pth --out RESULT_cascade_101_fpn_2.pkl --json_out RESULT_cascade_101_fpn_2.json --eval bbox

1.2 cascade_rcnn_HRnet

CUDA_VISIBLE_DEVICES=3 python ./tools/test.py ./configs/hrnet/cascade_rcnn_hrnetv2p_w48_20e.py ./checkpoints/cascade_rcnn_hrnetv2p_w48_20e_20190810-f40ed8e1.pth --out RESULT_cascade_hrnet.pkl --json_out RESULT_cascade_hrnet.json --eval bbox

1.3 cascade_mask_rcnn_x101

CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_mask_rcnn_x101_64x4d_fpn_20e_20181218-630773a7.pth --out RESULT_cascade_mask_x101.pkl --json_out RESULT_cascade_mask_x101.json --eval bbox

1.4 cascade_mask_rcnn_101

CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_mask_rcnn_hrnetv2p_w48_20e_20190810-d04a1415.pth --out RESULT_cascade_mask_x101.pkl --json_out RESULT_cascade_mask_x101.json --eval bbox

測試集爲5000個樣本的小測試集
訓練集和訓練集上的結果

序號 AP/AR 說明 訓練集 測試集 hrnet
1 Average Precision (AP) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.607 0.447 0.446
2 Average Precision (AP) @[ IoU=0.50 area= all maxDets=100 ] 0.799 0.631 0.627
3 Average Precision (AP) @[ IoU=0.75 area= all maxDets=100 ] 0.682 0.490 0.487
4 Average Precision (AP) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.424 0.258 0.263
5 Average Precision (AP) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.666 0.483 0.481
6 Average Precision (AP) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.729 0.588 0.585
7 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 1 ] 0.427 0.352 0.352
8 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 10 ] 0.673 0.544 0.553
9 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.698 0.567 0.577
10 Average Recall (AR) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.513 0.348 0.373
11 Average Recall (AR) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.756 0.605 0.553
12 Average Recall (AR) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.838 0.726 0.553(?)
  1. 總體上,訓練集的AP能夠高達0.607,而驗證集上只能達到0.447,這說明還有很大的提升空間。
  2. 觀察AP50, 對應VOC的指標,訓練集上能夠達到0.799,VOC目前見到的SOTA能達到約0.85,還有提升空間,而測試集上爲0.631,還有大量提升空間
  3. 從IOU = 0.50到IOU = 0.75,AP降低了較多,說明還存在不少定位不準的bbox,與gt的IOU沒有那麼高。
  4. 觀察4, 5, 6,訓練集上的表現都要明顯優於測試集。過擬合?兩個方法在大中小物體上的表現幾乎一致,hrnet在小物體上要略高一點點。
  5. 觀察7,8,9,recall的下降都差不多,兩個方法的recal幾乎沒有區別。兩個方法的AP也十分接近,是否說明了
  6. 觀察10,11,12,小物體的recal也較低。

1.實驗

寫了一些程序來分析檢測器的效果。
檢測器:cascade_rcnn_x101

1. 在原圖(val)上畫出GT和Det。

1’. 根據類別不同在原圖(val)上畫出GT和Det

1實現:根據test.py輸出的result.json就可以畫出來Det。GT同理,用annotation就可以。
1’實現:按照類別分門別類就行了。
在這裏插入圖片描述
在這裏插入圖片描述
相當多的圖片都標的挺準的,就像上面兩張圖片那樣。但也發現了一些現象,可能是導致指標不好的原因
在這裏插入圖片描述
000000091500.jpg
就比如說上面圖中的椅子,篩選後如下圖:在很多地方都出現了椅子,GT
1,我們可以觀察到椅子露出的部分越多,score越大。score是由卷積核(模板)和feature map做點積得到,與模板越接近則confidence越大。可以猜測:整體的feature是由部分的feature進行類似於線性相加得到的,進而整體的score是由部分的feature線性相加得到的。

2,我們觀察到右邊人的椅子有一個confidence較高的框,框出了椅子的整體,CNN具有一定的腦補能力,能夠推測出物體的全貌進而框出整個物體,而GT只標註了部分
推測原因:

  1. 判斷椅子主要用的是context信息,context信息是場景信息,在網絡的加深過程中逐漸彙集到物體的中心附近,這樣卷積核就能夠根據彙集的信息來判斷出該位置是椅子。場景信息 + 物體自身的部分信息 -> 整體bbox。

3,對於一個椅子,有多個框與之對應
推測原因:

  1. . 一個物體會在不同尺度的特徵圖上留下特徵,所以會在多尺度上給出bbox。統一尺度相近的bbox可以通過NMS的進行篩選,但是不同尺度的bbox就不能這麼做了。因爲IOU不夠大,篩不掉。 小尺度的物體在小分辨率特徵圖上存在,大尺度物體在小分辨率特徵圖上存在,那麼出現多個框也不足爲奇了。IDEA,讓尺度更加分明,比如說SNIP的訓練方法,
  2. 由於GT中有部分椅子,也有出現整體椅子,因此網絡需要同時學習到兩種類型圖像的判斷,這就會出現混淆,一些卷積核預測了部分,而另一些預測了整體,導致多個框出現,還沒法用NMS篩選。
    在這裏插入圖片描述

4, 在COCO數據集中有一個標籤是iscrowd,如果是TRUE的話,那麼bbox標註的是一羣物體。但是檢測器並不能分辨這種情況。
5,如果觀察蘋果類別和胡蘿蔔類別的話,就可以發現這種情況,有些紅色、橘黃色的小色塊被標註爲了蘋果或者胡蘿蔔。觀察胡蘿蔔還可以發現基本上這種誤識別的色塊都是由於在餐盤上。可推測:餐盤 + 橘黃色色塊 -> 胡蘿蔔,網絡學習到的特徵還不夠魯棒。IDEA:這個咋想啊?

3. 繪製每類物體不同area的PR曲線

思路:
1.將cocoapi的cocoeval.py移到項目內,在accumulate函數中添加代碼,將image id、tps、fps存儲下來:

                  E_id = np.concatenate(
                        [np.ones(len(e['dtScores'][0:maxDet]))*e['image_id'] for e in E])
                    E_id = E_id[inds]
                    content = {}
                    content['imgid_ids'] = E_id.astype(np.float).tolist()
                    content['tps'] = tps.tolist()
                    content['fps'] = fps.tolist()
                    SAVE_TPS_IMGID[str((k, a, m))] = content

存儲在SAVE_TPS_IMGID中,SAVE_TPS_IMGID有3個索引
k:類別,category
a:area,all、small、medium、big
m:max det,1,10,100
其中,fps爲10個元素的列表,索引爲t,代表iou閾值。
2. 使用draw_PR_SMB畫出圖來,默認maxdet=100。
圖例:
在這裏插入圖片描述
在這裏插入圖片描述
大體趨勢就是這個樣子,隨着recall的增加,precision陡然下降。
假如fp和tp是均勻分佈的話,那麼precision是呈線性下降。orange的PR曲線就是這種趨勢,說明存在着很多高score的bbox沒有迴歸到位(更可能是數據集沒有GT與之對應,比方說一堆橘子,但是有iscrowd)。

但一般而言還是像person(下面那張)一樣,Precision以指數的趨勢下降。這說明fp隨着score的增加而指數級增長,離GT較遠的Det的score會顯著下降。這說明檢測器能夠將特徵集中在特定位置上。

對比小中大的PR曲線可以得知,小物體的召回率不足,而且Precision衰減的更快,這是由於小物體特徵聚集的位置更小,不像大物體那麼分散。大物體的特徵會被網絡聚集到一個特定的地方,然後卷積核進行卷積得到迴歸和分類的結果,但是這個特定的地方並不一定是物體中心。(idea,觀察是否是物體的中心點回歸,還是頭部啦,車輪子啦,椅子腿啦的Anchor迴歸。

3. 調查precision和precision數量之間的關係

實現:

  1. 使用3中的SAVE_TPS_IMGID,使用TPS_Analysis.py。對每一類,計算每張圖片的FP和TP,裝進列表裏。之後計算每張圖片的precision(TP / (FP + TP))和proposal數量(TP + FP),觀察proposal數量和precision的關係。Proposal = 10,對應有M個圖片有10個proposal,將這M個圖片的precision平均,得到該proposal數量的平均精度。
  2. 繪製平均淨度曲線
  3. 將各個類別得到的曲線進行進一步平均,得到總體的precision-proposal曲線。
    觀察:
    從每個類別上很難看出趨勢,但是平均後就能看出來了:在這裏插入圖片描述
    當一張圖片中proposal數量越多的時候,precision會越低。proposal多的情況一般發生在圖片出現多個物體的時候,比方說一盤胡蘿蔔,一堆蘋果,一羣人,這時候大多出現的是小物體,而且很可能GT沒有標註那麼多,也就是造成了precision的降低。

4. 去除部分圖片觀察ap的變化

  1. 利用3中的方法,將count > 10,ratio(某一類的precision)< (0.3, 0.2, 0.1)的圖片挑出來,形成R01C20.json等包含image_id的文件。
  2. 將coco的annotation_val2017中對應的圖片刪除掉,使用COCO_EXP的reasoning_annotations。
  3. 將result file中對應圖片的bbox去除。(之前還試過添加ignore標籤來越過檢查,後來發現直接去除圖片就行了。)
  4. 觀察ap的變化

以下爲ap的變化:
R01:某類proposal的TP / (FP + TP) < 10 且 數量 > 10,共293
R02:共524
R03:共814

序號 AP/AR 說明 org R01 R02 R03
1 Average Precision (AP) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.447 0.460 0.469 0.481
2 Average Precision (AP) @[ IoU=0.50 area= all maxDets=100 ] 0.631 0.647 0.656 0.666
3 Average Precision (AP) @[ IoU=0.75 area= all maxDets=100 ] 0.490 0.502 0.512 0.528
4 Average Precision (AP) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.258 0.273 0.281 0.295
5 Average Precision (AP) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.483 0.494 0.493 0.500
6 Average Precision (AP) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.588 0.596 0.599 0.603
7 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 1 ] 0.352 0.361 0.373 0.390
8 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 10 ] 0.544 0.556 0.570 0.586
9 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.567 0.577 0.587 0.599
10 Average Recall (AR) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.348 0.358 0.369 0.382
11 Average Recall (AR) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.605 0.611 0.606 0.609
12 Average Recall (AR) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.726 0.732 0.734 0.735

idea:按照場景數目不同進行訓練

4. 兩個模型的比較

序號 AP/AR 說明 Cascade HTC
1 Average Precision (AP) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.447 0.506
2 Average Precision (AP) @[ IoU=0.50 area= all maxDets=100 ] 0.631 0.701
3 Average Precision (AP) @[ IoU=0.75 area= all maxDets=100 ] 0.490 0.551
4 Average Precision (AP) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.258 0.328
5 Average Precision (AP) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.483 0.547
6 Average Precision (AP) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.588 0.664
7 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 1 ] 0.352 0.384
8 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 10 ] 0.544 0.620
9 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.567 0.654
10 Average Recall (AR) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.348 0.480
11 Average Recall (AR) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.605 0.699
12 Average Recall (AR) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.726 0.810

4. 繪製出沒有匹配到的gt

目的:查看小物體recall低的原因。
網絡使用的是map=0.506的HTC檢測網絡。首先是小物體
紅色的是GT。粉色(洋紅)的是DT(area)
apple
在這裏插入圖片描述
000000030213.jpg、74209、139099
有大量的proposa,但是沒有匹配上。
還有一種情況,就是蘋果堆:303566
總體上來看,網絡能夠具有較高的recall,但是對於密集小目標仍然難以處理,coco數據集中也存在着很多圖片,標註的物體很難識別。
backpack
很多標註本來就很難。
banana
主要還是有很多物體(香蕉堆、香蕉塊),也能識別和定位,但是有GT的物體沒有匹配上。
bird:令人驚訝的效果好,但是依然有沒有被檢測出來的。
在這裏插入圖片描述
主要是因爲鳥之間的間距足夠開吧。
也出現過檢測框只框住鳥頭的情況。可能是因爲鳥的特徵最後集中在了鳥頭

5. RetinaNet

CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/retinanet_x101_64x4d_fpn_1x.py ./checkpoints/RetinaNet/retinanet_x101_64x4d_fpn_2x_20181218-5e88d045.pth --out ./results/RESULT_retinanet_x101.pkl --json_out RESULT_retinanet_x101.json --eval bbox

序號 AP/AR 說明 Cascade RetinaNet
1 Average Precision (AP) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.447 0.396
2 Average Precision (AP) @[ IoU=0.50 area= all maxDets=100 ] 0.631 0.603
3 Average Precision (AP) @[ IoU=0.75 area= all maxDets=100 ] 0.490 0.423
4 Average Precision (AP) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.258 0.216
5 Average Precision (AP) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.483 0.435
6 Average Precision (AP) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.588 0.535
7 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 1 ] 0.352 0.329
8 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets= 10 ] 0.544 0.516
9 Average Recall (AR) @[ IoU=0.50:0.95 area= all maxDets=100 ] 0.567 0.545
10 Average Recall (AR) @[ IoU=0.50:0.95 area= small maxDets=100 ] 0.348 0.350
11 Average Recall (AR) @[ IoU=0.50:0.95 area=medium maxDets=100 ] 0.605 0.587
12 Average Recall (AR) @[ IoU=0.50:0.95 area= large maxDets=100 ] 0.726 0.706

6. 對比RetinaNet和HTC的AP、AR-IOUthr曲線

  1. 隨着IOUthr升高。AP、AR的下降趨勢與倒數函數接近。IOU=0.5相當於兩個bbox的重疊面積至少達到了2/3。設IOUthr=pIOUthr=p,兩個bbox中較大一個BbB_b的面積爲kk倍另一個(BsB_s)的面積。則重合面積至少要佔到BsB_s1+k1+1p\frac{1+k}{1+\frac{1}{p}},是倒數函數。可以猜想,檢測器的DT在不同重合率(重合面積/DT的面積)上的分佈基本上是均勻的。IOU的要求比較嚴苛,當IOU=0.75時,需要最少0.86的重合面積。
  2. 對比大中小的AR和AP,顯然,隨着物體的尺寸減小AR,PR均減小,與IOUthr無關
  3. 對比兩個網絡的AP-IOUthr曲線, RetinaNet的曲線整體低於HTC的曲線
  4. 對比兩個網絡的AR-IOUthr曲線, 和2中一致,RetinaNet整體低於HTC,與尺寸無關。小物體的Recall在IOUthr=0.5時分別爲0.4和0.52,從recall上可以提升。
  5. 如果從比率上來看的話,那麼小物體的Recall和Precision下降的最快。但是事實上從圖中可以看出小物體的PR,Recall下降是呈線性的,至少沒有出現預料的指數下降。

所以,最好的HTC和較差的RetinaNet在Precision,AR上的規律基本是一致的。只要能夠在源頭上提高AR和AP就可以了。小物體的AR、AP更低,這說明小物體的定位能力還是不準。

6. 對比RetinaNet和HTC的AP、AR-IOUthr曲線(IOUthr\in[0.05, 0.95])

將IOUthr的範圍改變,查看AR,PR曲線,結論與之前基本相似。在這裏插入圖片描述
上面這個是小物體的AR曲線。召回率可以有一定的提升,Retina的可以從0.6提升到大約0.73,0.73對應IOUthr=0.05,只有1/10的重合面積,即使如此,平均上依然有1/4的物體沒有被檢測器識別到。這說明很可能不是檢測器檢測到了物體而沒有給出好的bbox,而是檢測器根本沒有檢測到物體。從另一方面,對比IOUthr=0.35時候的RetinaNet(最少重疊0.5)和HTC在IOUthr=0.65(最少重疊0.79)的Recall,可以發現差不多,所以的確存在着定位不準的問題,而且在小物體上更爲明顯,如果我們能夠讓定位更準,至少能夠讓RetinaNet達到HTC的水準。
大中物體的AR沒有很大的差別,如下兩張圖:
在這裏插入圖片描述
在這裏插入圖片描述
如果觀察IOUthr=0.5基本上差不多,但可以看出來,當IOUthr增加的時候,RetinaNet的AR下降的更快,這說明RetinaNet在定位的準確度上有所欠缺,而大 中 物體是能夠檢測到的。
篩選出RetinaNet、HTC的含有unmatched物體的圖片。並進行統計,有下表:
UNM代表沒有匹配,M代表匹配,數字表示包含未匹配物體的圖片的數量。一張圖片中可能出現多個未匹配物體,圖片會出現重複計數。

序號 說明 Small Medium Big Total
1 Retina UNM 2428 889 187 3504
2 Dense Retina UNM 1409 333 63 1805
3 HTC UNM 1874 614 177 2665
4 Retina UNM, HTC M 769 450 102 1323
5 HTC UNM, Retina M 215 175 94 484
6 Dense Retina UNM, HTC M 351 147 33 531
7 HTC UNM, Dense Retina M 816 428 147 1391
8 HTC UNM, Retina UNM 1659 439 83 2181
9 HTC UNM, Dense Retina UNM 1058 186 30 1272

Dense Retina爲將IOU閾值設置爲0.05的ReainNet,如果該閾值還沒有匹配的話,就說明根本沒有匹配上了。

  1. 在大物體上,兩個網絡都有一定數量沒有匹配上,對比4, 5可知,兩個網絡沒有匹配的種類也不太相同。
  2. 觀察 4, 5,可以知道有大量的小物體是兩個網絡都沒有匹配上的,7更證明了這個事實,並且中小物體也是如此,可以認爲這些兩個網絡都沒匹配到的物體是極難匹配的物體,是不可避免的,或者是由於COCO本身的標註,或者是出現crowd的情況。
  3. 觀察與Dense Retina有關的項。對比2,3,Dense Retina在小物體上可以做的更好,只要將Precision提升,就很好了,中、大型物體由於IOU過小不具有先考價值。

總之:RetinaNet依然存在定位不準的情況,另一方面還存在着檢測不到的情況。改進前者
用faster rcnn的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章