YOLO是一個端到端的目標檢測算法,不須要預先提取region proposal(RCNN目標檢測系列),經過一個網絡就能夠輸出:類別,置信度,座標位置,檢測速度很快,不過,定位精度相對低些,特別是密集型小目標。算法
YOLO將圖像resize到448x448做爲輸入,輸出7x7x30,即:將圖片劃分爲7x7,每一個單元格獨立檢測。這裏須要注意,不是那種滑動窗口將每一個單元格都輸入到網絡中進行預測,這裏的劃分只是物體中心點位置的劃分之用(劃分越多越準確),物體的中心落在哪一個單元格,就由那個單元格負責預測。說完7x7咱們再說下另外一個維度30,30=(2*5=20),其中「2:每一個單元格預測數量(box數量)」,「5:(x,y,w,h,score)」,「20:模型能夠預測20個種類」。後端
模型首先會將ImageNet做爲訓練集預訓練模型,最終達到88%精度,而後使用遷移學習將預訓練的模型應用到當前標註的訓練集進行訓練。模型輸出5維信息(x,y,w,h,score),使用Leaky Relu做爲激活函數,全鏈接層後添加Dropout層防止過擬合。在獲得輸出值以後,咱們須要計算每一個box與ground true的Iou值,而後經過非極大值抑制篩選box。網絡
損失函數包含三部分分別是:座標損失,置信度損失(7x7x2),類別損失(7x7x20)。
座標損失:函數
咱們使用SSE損失函數(就是MSE損失函數的累加版本),如圖所示咱們在「w,h」中加了根號,加根號的緣由是,「w,h」的損失在大框和小框之間「權重」應該不一樣。由於,對應圖像中較大的物體而言,box有些偏移通常並不會影響預測結果。可是對應小物體而言,一樣的偏移可能會脫離預測目標。
置信度損失:學習
如圖所示,損失函數分爲兩部分:有物體,沒有物體,其中沒有物體損失部分還增長了權重係數。添加權重係數的緣由是,對於一幅圖像,通常而言大部份內容是不包含待檢測物體的,這樣會致使沒有物體的計算部分貢獻會大於有物體的計算部分,這會致使網絡傾向於預測單元格不含有物體。所以,咱們要減小沒有物體計算部分的貢獻權重,好比取值爲:0.5。
類別損失:spa
當有物體的中心點落在單元格中,此單元格就負責預測該物體。.net
YOLO-v3結構圖以來自木盞,表示感謝,也歡迎關注他的博客。對象
DBL:指Darknetconv2d_BN_Leaky。
resn:指:n表明數字,有res1,res2, … ,res8等等,表示這個res_block裏含有多少個res_unit,使用殘差結構可讓網絡更深。
concat:張量拼接。將darknet中間層和後面的某一層的上採樣進行拼接。拼接的操做和殘差層add的操做是不同的,拼接會擴充張量的維度,而add只是直接相加不會致使張量維度的改變。blog
後端網絡使用darknet-53:圖片
咱們發現,在YOLO-v3網絡中沒有池化層和全鏈接層,那麼張量尺寸的變化是經過改變卷積核步長來實現。同YOLO-v2同樣,輸出尺寸爲輸入尺寸的1/32,即:通常要求輸入圖像尺寸是32的倍數。
類別預測由softmax改成logistic(使用sigmoid):用於處理預測物體之間存在包含關係問題,解決多標籤對象支持。好比woman和person,softmax輸出:person,logistic輸出二者。
使用多尺度特徵預測物體:
上圖是YOLO-v3在COCO數據集上使用聚類獲得的9種先驗框,一個表明寬度一個表明高度。在不一樣的感覺野中使用不一樣的先驗框。若是先驗框不是最佳的,即便超過預設定的閾值,也不會進行預測。logistic迴歸用來從9個先驗框中找到最佳的那個。
YOLO好很差,咱們就以一張圖做爲總結吧:
祝你們2018年聖誕節快樂!