鹽田區(qū)網(wǎng)站建設(shè)百度網(wǎng)站ip地址
前言
常規(guī)的目標(biāo)檢測往往是根據(jù)圖像的特征來捕捉出目標(biāo)信息,那么是否有辦法加入一些先驗信息來提升目標(biāo)檢測的精準(zhǔn)度?
一種可行的思路是在目標(biāo)檢測的輸出加入目標(biāo)之間的關(guān)聯(lián)信息,從而對目標(biāo)進(jìn)行干涉。
2017年8月,新加波管理大學(xué)的Yuan Fang等人發(fā)表了一篇文章《Object Detection Meets Knowledge Graphs》,就按照這個思路做了一些工作。
論文地址:https://www.ijcai.org/proceedings/2017/0230.pdf
文章寫得非常通俗易懂,因此本文進(jìn)行思路解讀和代碼復(fù)現(xiàn)。
工作架構(gòu)
這篇文章作者提出的是一個通用的知識引入架構(gòu),因此對于任何目標(biāo)檢測模型都可以適用。
知識引入的流程圖如下圖所示:
原論文作者采用的是Faster R-CNN算法進(jìn)行檢測,正常檢測輸出結(jié)果會是一個P矩陣(即圖中的Existing model output),這里的列表示總共的目標(biāo)數(shù),行表示類別。
圖中的這個矩陣意義是:第一個檢測目標(biāo)屬于類別1的置信度為0.6,屬于類別2的置信度為0.4;第二個檢測目標(biāo)屬于類別1的置信度為0.2,屬于類別2的置信度為0.8;
在這個輸出結(jié)果基礎(chǔ)上,從先驗知識(Knowledge)中提取出類別之間的語義一致性(semantic consistency),從而對輸出結(jié)果進(jìn)行干涉,得到最終的輸出結(jié)果(Knowledge-aware output)。
語義一致性提取
那么這套架構(gòu)的關(guān)鍵就是如何提取語義一致性,這一點作者給出了兩種思路。
思路一:基于頻率的知識(Frequency-based knowledge)
基于頻率應(yīng)該是最容易想到的知識關(guān)聯(lián)方式,比如兩個目標(biāo)同時出現(xiàn)的頻率高(比如鍵盤和鼠標(biāo)經(jīng)常一起出現(xiàn)),那么檢測出其中一個目標(biāo)時,自然可以考慮增加另一個目標(biāo)的置信度。
因此,作者提出了一個對陣矩陣S,作為目標(biāo)類別之間的語義一致性矩陣,計算公式如下:
- n(l,l’):類別l和類別l‘一起出現(xiàn)的次數(shù)
- n(l):類別l出現(xiàn)的次數(shù)
- n(l’):類別l’出現(xiàn)的次數(shù)
- N:所有類別出現(xiàn)的總次數(shù)
思路二:基于知識圖譜的知識(Graph-based knowledge)
思路一的方式比較直觀,不過存在的缺陷是無法表征兩個沒有同時出現(xiàn)過的類別之間的關(guān)系。比如,車和游艇沒有在一個場景中同時出現(xiàn),但不能“粗暴”的認(rèn)為這兩者毫無關(guān)聯(lián)吧,肯定需要一個微弱的權(quán)值來表示兩者之間的關(guān)系。
因此,作者想到了用知識圖譜的方式來提取語義一致性。
首先,通過對一些公開的大型知識圖譜進(jìn)行過濾,提取出需要檢測的類別信息和關(guān)系。
之后,通過重啟隨機(jī)游走算法(random walk with restart)來得到該關(guān)系圖的收斂狀態(tài)。重啟隨機(jī)游走算法是經(jīng)典的隨機(jī)游走算法的一個變種,相當(dāng)于在隨機(jī)游走算法的基礎(chǔ)上,添加了一個重啟概率,觸發(fā)重啟后會回到原點。
收斂之后,會得到一個R矩陣,這個矩陣表征了當(dāng)算子處于某個狀態(tài)類別時,向另一狀態(tài)類別轉(zhuǎn)移的概率。由于語義一致性矩陣是對稱矩陣,因此作者采用了一個狀態(tài)相乘再開方的操作。
干涉檢測輸出
有了語義一致性矩陣S之后,就可以對輸出結(jié)果進(jìn)行干涉。論文中,對于如何進(jìn)行干涉并沒有說明。
通過后面閱讀源碼可知,干涉的思路主要是選取某目標(biāo)類別最鄰近的5個類別,然后對其一致性矩陣數(shù)值求和得到關(guān)聯(lián)性特征向量。再將該向量和原始檢測結(jié)果進(jìn)行加權(quán)相加。
核心代碼:
num = torch.sum(torch.mm(S_highest, torch.transpose(p_hat_temp[box_nearest[b]], 0, 1)), 1)
denom = torch.sum(S_highest, dim=1) * bk
p_hat[b] = (1 - epsilon) * torch.squeeze(torch.div(num, denom)) + epsilon * p
這里的epsilon
代表權(quán)重,復(fù)現(xiàn)時取0.75,表示75%保留原始結(jié)果,25%進(jìn)行知識干涉。
后面一部分就是損失函數(shù)以及網(wǎng)絡(luò)更新部分了。
下面是損失函數(shù)的計算公式,相當(dāng)于將知識嵌入的結(jié)果納入到網(wǎng)絡(luò)的更新之中。
實驗結(jié)果
作者在Coco和VOC數(shù)據(jù)集上進(jìn)行了實驗,下表是coco的實驗結(jié)果:
- FRCNN:原始檢測網(wǎng)絡(luò)輸出結(jié)果
- KF-500:通過思路一來獲得一致性矩陣,選擇500張訓(xùn)練集圖片
- KF-All:通過思路一來獲得一致性矩陣,選擇所有訓(xùn)練集圖片
- KG-CNet:通過思路二來獲得一致性矩陣
從表中數(shù)據(jù)可知,該思路的改進(jìn)對檢測輸出的mAP并沒有起到提升作用,不過有效提升了召回率。相當(dāng)于降低了網(wǎng)絡(luò)的誤檢率。
結(jié)果可視化
最后是結(jié)果的可視化,作者選取了一幅圖來演示:左圖是直接檢測結(jié)果,右圖是添加知識圖譜之后的檢測結(jié)果。
紫框表示模型的檢測輸出,紅框表示實際的標(biāo)簽。
由圖可知,原始的FRCNN沒有檢測出鍵盤(keyboard),添加知識圖譜后,通過鼠標(biāo)、筆記本等目標(biāo)的關(guān)聯(lián)信息,成功將鍵盤檢測出來。
實驗復(fù)現(xiàn)
原論文發(fā)布時間較早,使用Caffe框架進(jìn)行實驗,目前已無法找到。
后面有人使用Pytorch對其進(jìn)行復(fù)現(xiàn)。
代碼地址:https://github.com/tue-mps/rescience-ijcai2017-230
復(fù)現(xiàn)結(jié)論
復(fù)現(xiàn)作者提到:
對于所描述的任何一種方法,作者的主張都無法得到證實。結(jié)果要么顯示以 mAP 降低為代價的召回率增加,要么顯示 mAP 保持不變,召回率沒有改善。三種不同的骨干模型在重新優(yōu)化后表現(xiàn)出相似的行為,結(jié)論是知識感知的重新優(yōu)化對目標(biāo)檢測算法沒有好處。
不清楚是否是超參數(shù)的影響,總之論文的效果無法實現(xiàn)。
代碼運行
該代碼寫得比較清晰,并且作者提供了處理好的數(shù)據(jù)集和語義一致性矩陣。
下載好之后,放置路徑如下即可:
之后修改Utils/testing.py
里面這三行內(nèi)容,我測試的時候遇到的小bug:
# 原始
# boxes_temp = prediction[1][0]['boxes']
# labels_temp = prediction[1][0]['labels']
# scores_temp = prediction[1][0]['scores']
# 修改為
boxes_temp = prediction[0]['boxes']
labels_temp = prediction[0]['labels']
scores_temp = prediction[0]['scores']
最后運行Results/results_coco.py
即可進(jìn)行單輪測試。
實驗結(jié)果
由于原論文作者使用的是VGG16作為backbone,因此這里model_type
我設(shè)置為coco-FRCNN-vgg16
,下面是在我RTX2060下用Coco數(shù)據(jù)集的實驗結(jié)果:
模型 | mAP @ 100 | Recall @ 100 all classes |
---|---|---|
FRCNN | 0.247 | 0.477 |
KF-All-COCO | 0.245 | 0.432 |
KG-CNet-55-COCO | 0.243 | 0.436 |
KG-CNet-57-COCO | 0.243 | 0.437 |
- FRCNN:Fast-RCNN直接檢測
- KF-ALL-COCO:思路一獲取語義一致性矩陣
- KG-CNet-55-COCO:思路二通過大型常識知識庫
ConceptNet-assertions55
提取一致性矩陣 - KG-CNet-57-COCO:思路二通過大型常識知識庫
ConceptNet-assertions57
提取一致性矩陣
從結(jié)果來看,的確沒什么卵用,mAP和Recall均下降了。。