1. 程式人生 > >YOLOv2 YOLOv3 如何選擇先驗框(priors anchor)(自用)

YOLOv2 YOLOv3 如何選擇先驗框(priors anchor)(自用)

在YOLOv2論文中,作者有對Dimension Cluster做一個介紹,這個cluster的目的就是尋找出anchor的先驗(簡稱為先驗框)。

什麼是先驗框呢,簡單來說,在YOLOv1中,作者遇到了一個問題,雖然我們通過實驗知道要選兩個boxes是最優的,但是如何這兩個boxes的尺寸如何決定呢?網路自身可以學著不斷調節box的大小,但是我們能夠提前給定一個/多個尺寸作為備選不是更好嗎?所以作者就決定利用 k-means 聚類方法在 training set bounding boxes上來尋找先驗框(框的尺寸)。

標準的k-means方法用的是歐氏距離,但是這樣會導致 larger boxes generate more error than smaller boxes. 我們想要得到的先驗框,是能夠帶領我們得到更高的IOU的,如果用歐氏距離來衡量,可能會導致“大框優勢”。所以作者使用了


來作為k-means中“距離”的判定。

我們期待距離越小越好(IOU越大越好),所以距離判定時候用 1 - IOU

討論內容見(需要翻牆):https://groups.google.com/forum/#!topic/darknet/qrcGefJ6d5g

其中,兩個po主放出了他們k-means演算法的程式碼:

PaulChongPeng的我用VOC2007+2012的training set測試了一下(4/46/2018),結果如下:

自己加了一個測avg_IOU,最後IOU還可以,但是anchor還是和作者的資料有些差距(據說作者是用VOC+COCO一起做的聚類)

還有一個po主放出了standard k-means的方法(實際是不對的),用的是歐氏距離而非“IOU距離”:

# I wrote up a couple quick scripts to help with this: gen_boxes.sh and cluster_boxes.py.
# They operate within your directory of some_image_name.txt label files.
# Usage example is shown below:

[email protected]:~/data/labels$ ls *.txt | head -5
00RaKqC3eqjWCHQMIPKaeNMsdivO83GL.txt
016rMzBciA5V4SjFsCAQ1do8klvl4CWt.txt
01dfRsndtBz67TK80LCH0NAseYwh7md6.txt
03hptnlIR8YB0dNUqZ4AC9gVkwtDb5DZ.txt
04HPP8cRl0wFL0tPEpNCmwrDW74kByKB.txt

[email protected]
:~/data/labels$ head 00RaKqC3eqjWCHQMIPKaeNMsdivO83GL.txt 0 0.502333 0.549333 0.144667 0.137333 [email protected]:~/data/labels$ cat gen_boxes.sh cat *.txt | cut -d' ' -f 4,5 | sed 's/\([^ ]*\) \(.*\)/\1,\2/g' > boxes.csv [email protected]:~/data/labels$ bash gen_boxes.sh [email protected]:~/data/labels$ cat cluster_boxes.py from sklearn.cluster import KMeans import numpy as np data = np.genfromtxt('boxes.csv', delimiter=',') print("Example of data:") print(data[0:10]) print("") kmeans = KMeans(n_clusters=5, random_state=0).fit(data) print("Cluster centers:") print(kmeans.cluster_centers_) print("") print("Scaled to [0, 13]:") print(kmeans.cluster_centers_ * 13) print("") print("In Darknet config format:") def coords(x): return "%f,%f" % (x[0], x[1]) print("anchors= %s" % " ".join([coords(center) for center in kmeans.cluster_centers_ * 13])) [email protected]:~/data/labels$ python cluster_boxes.py Example of data: [[ 0.144667 0.137333] [ 0.135333 0.240667] [ 0.145 0.146667] [ 0.547 0.306667] [ 0.4 0.241667] [ 0.137 0.145 ] [ 0.643 0.356667] [ 0.147 0.086667] [ 0.123 0.112 ] [ 0.202 0.265 ]] Cluster centers: [[ 0.1377161 0.13268718] [ 0.28492789 0.18958423] [ 0.0663724 0.05359964] [ 0.48530697 0.496173 ] [ 0.18765588 0.27052479]] Scaled to [0, 13]: [[ 1.79030931 1.72493339] [ 3.70406262 2.46459499] [ 0.86284123 0.6967953 ] [ 6.30899063 6.450249 ] [ 2.43952643 3.51682231]] # In Darknet config format: # anchors= 1.790309,1.724933 3.704063,2.464595 0.862841,0.696795 6.308991,6.450249 2.439526,3.516822 # You can then copy that "anchors= ..." line in place of the existing one in your yolo-whatever.cfg file.

YOLOv3也沿用了YOLOv2中的先驗框(anchor),求法相同。

為什麼YOLOv2和YOLOv3的anchor大小有明顯區別?

在YOLOv2中,作者用最後一層feature map的相對大小來定義anchor大小。也就是說,在YOLOv2中,最後一層feature map大小為13X13,相對的anchor大小範圍就在(0x0,13x13],如果一個anchor大小是9x9,那麼其在原圖上的實際大小是288x288.

而在YOLOv3中,作者又改用相對於原圖的大小來定義anchor,anchor的大小為(0x0,input_w x input_h]。

所以,在兩份cfg檔案中,anchor的大小有明顯的區別。如下是作者自己的解釋:

So YOLOv2 I made some design choice errors, I made the anchor box size be relative to the feature size in the last layer. Since the network was down-sampling by 32. This means it was relative to 32 pixels so an anchor of 9x9 was actually 288px x 288px.

In YOLOv3 anchor sizes are actual pixel values. this simplifies a lot of stuff and was only a little bit harder to implement




相關推薦

YOLOv2 YOLOv3 如何選擇先驗priors anchor自用

在YOLOv2論文中,作者有對Dimension Cluster做一個介紹,這個cluster的目的就是尋找出anchor的先驗(簡稱為先驗框)。什麼是先驗框呢,簡單來說,在YOLOv1中,作者遇到了一個問題,雖然我們通過實驗知道要選兩個boxes是最優的,但是如何這兩個bo

java 彈出選擇目錄選擇資料夾,獲取選擇的資料夾路徑

JFileChooser fileChooser = new JFileChooser("D:\\");   fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);   int returnVal =

learn opencv-如何在OpenCV中選擇邊界ROI

轉:https://blog.csdn.net/wc781708249/article/details/78518447 參考:https://github.com/spmallick/learnopencv 在本教程中,我們將學習如何在OpenCV中的影象中選擇邊界框或感興趣區域(ROI)

ASP.NET實現彈出真分頁將複選選擇的資料存到資料庫中

上一篇完成了彈出框介面的取值下面是第二步將彈出框儲存的資料傳到父頁面上。 需要在父頁面JS加上: function openDia() { returned = windo

ASP.NET實現彈出真分頁將複選選擇的資料存到資料庫中

這是第三步將資料在父頁面上顯示。程式碼如下: AddDD.aspx程式碼: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AddDJLJDD.aspx.cs" Inherits="WEB.DDGL.

JAVA-三大語句選擇語句、條件語句、循環語句

== goto true bsp 語句 for循環 logs light log 跳出指定的for循環體,和goto很像 1 K:for(int i=0;i<3;i++){//給這個for循環體取一個名字為K 2 for(int j=0;j<3;j++

選擇問題選擇數組中第K小的數

++i bsp 裝逼 mes tof quick 復雜度 names 返回 由排序問題可以引申出選擇問題,選擇問題就是選擇並返回數組中第k小的數,如果把數組全部排好序,在返回第k小的數,也能正確返回,但是這無疑做了很多無用功,由上篇博客中提到的快速排序,稍稍修改下就

2.7.1 元素定位:selenium消息處理 alert、confirm、prompt

ttext def 總結篇 必須 tro -s 按鈕 默認 答案 來源:http://blog.csdn.net/cui_angel/article/details/7784211 http://www.cnblogs.com/tobecrazy/p/45

Delphi XE5 Android Dialogs 對話模擬做了一套

系統 cto str and 圖片 download iss top mar 最近要在Android中使用對話框, 但發現無現成的, TOpenDialog等已經不支持移動設備,還好系統提供了一些文件目錄函數可用,於是簡單的模擬了一個,支持OpenDialog ,SaveD

qt自己定義搜索超簡單,帶效果圖

clu blog button jsb 搜索 代碼 source fix color 1. 什麽也不要說。先上效果圖: 2. 代碼 頭文件: #ifndef APPSEARCHLINE_H #define APPSEARCHLINE_H #inc

【轉】python qt(pyqt)的文件打開、文件保存、文件夾選擇對話

utf spl 文件對話框 出現 tin ans none 轉換 選擇文件夾 import PyQt4.QtCore,PyQt4.QtGui # 獲取文件路徑對話框 file_name = QFileDialog.getOpenFileName(self,"open

MFC通過button控制編輯是否顯示系統時間動態顯示

box style public ack span ren item upd 函數 1.在dlg.h中public bool flag; static UINT time(void *param); 2.在構造函數中 flag=fal

Mcrouter-基於Memcached協議的緩存層流量管理工具Memcached集群的另一個選擇

cache 代碼 自動 open 句柄 不同 github tex key Mcrouter 是一個基於Memcached協議的路由器,它是 Facebook緩存架構的核心組件,在峰值的時候,它能夠處理每秒50億次的請求。近日,Facebook開放了Mcrouter的源代碼

在文本輸入字段調用文件選擇對話

調用 function spa val bat sel req call 選擇 SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } .L0S31

元素定位:selenium消息處理 alert、confirm、prompt

響應 miss 是否 sse 一個 prompt exceptio pro 字符串 基礎普及 alert對話框 。細分三種,Alert,prompt,confirm1. alert() 彈出個提示框 (確定) 警告消息框 alert 方法有一個參數,即希望對用戶顯示的文本字

QT 選擇對話簡單示例

控制臺輸出 this images deb spa geb on() sage 效果 QT 選擇對話框簡單示例 部分代碼: pDialog->addSeparator(); QAction *pmb2 = pDialog->addAction(

Android音視頻通話過程中最小化成懸浮的實現類似Android8.0畫中畫效果

apk 添加 touch null cas 如果 動態添加 int sta 關於音視頻通話過程中最小化成懸浮框這個功能的實現,網絡上類似的文章很多,但是好像還沒看到解釋的較為清晰的,這裏因為項目需要實現了這樣的一個功能,今天我把它記錄下來,一方面為了以後用到便於自己查閱,一

開關設置及選擇列表的使用

選擇 alt png src inf image 配置 列表框 nbsp 1.開關設置要先讀配置項 2.選擇列表框.選擇()可傳遞文本 3.項內傳遞 4.加入命令容易導致內存紊亂 開關設置及選擇列表框的使用

禁止長按微信頁面出現默認選擇

light fun blog menu info alt 右擊 con src 長按微信中打開的h5頁面默認會有彈框,如圖: 如果我們不想出現這個,可以加: document.oncontextmenu=function(e){ e.preventDefault

關於選擇很早之前寫的

log class rip not 常用 接下來 一個 query 選擇器 <div class="kaishi" id="aa">1</div> <a href="" id="ab">2</a> <div id=