anchor box聚類


fast rcnn和rfcn中使用的都是默認的anchor box設置,都是9種,比例為0.5 、1、 2,大小為128、256、512。但我的數據集的gt框更小,需要找到適合我的數據集的anchor box尺寸。

yolo9000提出了用kmeans聚類算法來找到合適的anchor box尺寸。

這篇博客介紹了yolo9000是怎么實現的:http://blog.csdn.net/hrsstudy/article/details/71173305?utm_source=itdadao&utm_medium=referral。

源代碼:https://github.com/PaulChongPeng/darknet/blob/master/tools/k_means_yolo.py,這個代碼庫里還有整個yolo9000的代碼中文解釋,很好,可以拿來學習。

label_path = "/raid/pengchong_data/Data/Lists/paul_train.txt"將這個改成你自己數據的地址,就可以跑這個腳本。

跑這個腳本,需要把gt框從左上右下坐標轉換成中心點、寬度、高度的格式,實際上也只用到了寬度和高度。

我使用的是將原始寬度高度除以了圖片的寬度高度,因為我覺得這樣可以保證他們在同一個分布

如果寬度高度直接是原始的寬度高度,grid_size就設置為1;如果是相對於原圖像的大小,grid_size就設置為相應比例,兩個比例:960、600。

實際上,跑的過程中發現,loss只在前幾個迭代期減小,后面loss就一直增大了。無論是用原始的寬高度,還是用的相對於原圖像的寬高度,都出現了這種現象。最后我選擇了讓loss降最低的那幾個坐標為最后的結果。

跑的過程中還發現,隨着k值的增加,loss是在減少的,但對於單個k值,loss還是先降低后升高。

最終我選擇了k為9,這與rfcn中9個anchor是對應的。

得到9個坐標分別是:(18,17)、(26,25)、(42,27)、(49,40)、(67,66)、(86,39)、(119,80)、(182,155)、(323,281)

這9個坐標表示的是9種長寬,不是中心點。因為scale,ratio最終求的就是w和h

 

采用了兩種方式進行anchor box的改變:

1.將scals從(8,16,32)改成(1,2,4,8,16),這種得到的ap為0.8435

2.

anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
                         for i in xrange(ratio_anchors.shape[0])])

直接在這段代碼后面添加anchors = 得到的那9個坐標,當然需要將9個坐標相應變換

比如(18,17)就改成(-1.5,-1,16.5,16)

這種得到的ap為0.8442

 

 

當然,修改anchor box還要改一些代碼,需要修改哪些文件,直接搜索整個工程文件哪些引用了generate_anchors這個函數的就可以了

除此之外,還需要修改train、test的porotxt

可以參考這個博客:http://www.cnblogs.com/whu-zeng/p/7517480.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM