快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn) | 代碼+預(yù)訓(xùn)練模型

YOLO作為目標(biāo)檢測(cè)領(lǐng)域的創(chuàng)新技術(shù),一經(jīng)推出就受到開發(fā)者的廣泛關(guān)注。值得一提的是,基于百度自研的開源深度學(xué)習(xí)平臺(tái)PaddlePaddle的YOLO v3實(shí)現(xiàn),參考了論文【Bag of Tricks for Image Classification with Convolutional Neural Networks】,增加了mixup,label_smooth等處理,精度(mAP(0.5:0.95))相比于原作者的實(shí)現(xiàn)提高了4.7個(gè)絕對(duì)百分點(diǎn),在此基礎(chǔ)上加入synchronize batch normalization, 最終精度相比原作者提高5.9個(gè)絕對(duì)百分點(diǎn)。我們將在下文中為大家詳解實(shí)現(xiàn)的具體過(guò)程。

CV領(lǐng)域的核心問(wèn)題之一就是目標(biāo)檢測(cè)(object detection),它的任務(wù)是找出圖像當(dāng)中所有感興趣的目標(biāo)(物體),確定其位置和大小(包含目標(biāo)的矩形框)并識(shí)別出具體是哪個(gè)對(duì)象。Faster R-CNN及在其基礎(chǔ)上改進(jìn)的Mask R-CNN在實(shí)例分割、目標(biāo)檢測(cè)、人體關(guān)鍵點(diǎn)檢測(cè)等任務(wù)上都取得了很好的效果,但通常較慢。YOLO 創(chuàng)造性的提出one-stage,就是目標(biāo)定位和目標(biāo)識(shí)別在一個(gè)步驟中完成。

由于整個(gè)檢測(cè)流水線是單個(gè)網(wǎng)絡(luò),因此可以直接在檢測(cè)性能上進(jìn)行端到端優(yōu)化,使得基礎(chǔ)YOLO模型能以每秒45幀的速度實(shí)時(shí)處理圖像,較小網(wǎng)絡(luò)的Fast YOLO每秒處理圖像可達(dá)到驚人的155幀。YOLO有讓人驚艷的速度,同時(shí)也有讓人止步的缺陷:不擅長(zhǎng)小目標(biāo)檢測(cè)。而YOLO v3保持了YOLO的速度優(yōu)勢(shì),提升了模型精度,尤其加強(qiáng)了小目標(biāo)、重疊遮擋目標(biāo)的識(shí)別,補(bǔ)齊了YOLO的短板,是目前速度和精度均衡的目標(biāo)檢測(cè)網(wǎng)絡(luò)。

YOLO v3檢測(cè)原理

YOLO v3 是一階段End2End的目標(biāo)檢測(cè)器。YOLO v3將輸入圖像分成S*S個(gè)格子,每個(gè)格子預(yù)測(cè)B個(gè)bounding box,每個(gè)bounding box預(yù)測(cè)內(nèi)容包括: Location(x, y, w, h)、Confidence Score和C個(gè)類別的概率,因此YOLO v3輸出層的channel數(shù)為S*S*B*(5 + C)。YOLO v3的loss函數(shù)也有三部分組成:Location誤差,Confidence誤差和分類誤差。

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

  圖:YOLO v3檢測(cè)原理

YOLO v3網(wǎng)絡(luò)結(jié)構(gòu)

YOLO v3 的網(wǎng)絡(luò)結(jié)構(gòu)由基礎(chǔ)特征提取網(wǎng)絡(luò)、multi-scale特征融合層和輸出層組成。

1、特征提取網(wǎng)絡(luò)。YOLO v3使用 DarkNet53作為特征提取網(wǎng)絡(luò):DarkNet53 基本采用了全卷積網(wǎng)絡(luò),用步長(zhǎng)為2的卷積操作替代了池化層,同時(shí)添加了 Residual 單元,避免在網(wǎng)絡(luò)層數(shù)過(guò)深時(shí)發(fā)生梯度彌散。

2、特征融合層。為了解決之前YOLO版本對(duì)小目標(biāo)不敏感的問(wèn)題,YOLO v3采用了3個(gè)不同尺度的特征圖來(lái)進(jìn)行目標(biāo)檢測(cè),分別為13*13,26*26,52*52,用來(lái)檢測(cè)大、中、小三種目標(biāo)。特征融合層選取 DarkNet 產(chǎn)出的三種尺度特征圖作為輸入,借鑒了FPN(feature pyramid networks)的思想,通過(guò)一系列的卷積層和上采樣對(duì)各尺度的特征圖進(jìn)行融合。

3、輸出層。同樣使用了全卷積結(jié)構(gòu),其中最后一個(gè)卷積層的卷積核個(gè)數(shù)是255:3*(80+4+1)=255,3表示一個(gè)grid cell包含3個(gè)bounding box,4表示框的4個(gè)坐標(biāo)信息,1表示Confidence Score,80表示COCO數(shù)據(jù)集中80個(gè)類別的概率。

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

  圖:YOLO v3 網(wǎng)絡(luò)結(jié)構(gòu)

PaddlePaddle簡(jiǎn)介

PaddlePaddle是百度自研的集深度學(xué)習(xí)框架、工具組件和服務(wù)平臺(tái)為一體的技術(shù)領(lǐng)先、功能完備的開源深度學(xué)習(xí)平臺(tái),有全面的官方支持的工業(yè)級(jí)應(yīng)用模型,涵蓋自然語(yǔ)言處理、計(jì)算機(jī)視覺(jué)、推薦引擎等多個(gè)領(lǐng)域,并開放多個(gè)領(lǐng)先的預(yù)訓(xùn)練中文模型。目前,已經(jīng)被中國(guó)企業(yè)廣泛使用,并擁有活躍的開發(fā)者社區(qū)。

應(yīng)用案例—AI識(shí)蟲

紅脂大小蠹是危害超過(guò) 35 種松科植物的蛀干害蟲,自 1998 年首次發(fā)現(xiàn)到 2004 年,發(fā)生面積超過(guò) 52.7 萬(wàn)平方公里 , 枯死松樹達(dá) 600 多萬(wàn)株。且在持續(xù)擴(kuò)散,給我國(guó)林業(yè)經(jīng)濟(jì)帶來(lái)巨大損失。傳統(tǒng)監(jiān)測(cè)方式依賴具有專業(yè)識(shí)別能力的工作人員進(jìn)行實(shí)地檢查,專業(yè)要求高,工作周期長(zhǎng)。北京林業(yè)大學(xué)、百度、嘉楠、軟通智慧合作面向信息素誘捕器的智能蟲情監(jiān)測(cè)系統(tǒng),通過(guò)PaddlePaddle訓(xùn)練得到目標(biāo)檢測(cè)模型YOLO v3,識(shí)別紅脂大小蠹蟲,遠(yuǎn)程監(jiān)測(cè)病蟲害情況,識(shí)別準(zhǔn)確率達(dá)到90%,與專業(yè)人士水平相當(dāng),并將原本需要兩周才能完成的檢查任務(wù),縮短至1小時(shí)就能完成。

基于PaddlePaddle實(shí)戰(zhàn)

運(yùn)行樣例代碼需要Paddle Fluid的v.1.4或以上的版本。如果你的運(yùn)行環(huán)境中的PaddlePaddle低于此版本,請(qǐng)根據(jù)安裝文檔中的說(shuō)明來(lái)更新PaddlePaddle。

數(shù)據(jù)準(zhǔn)備

在MS-COCO數(shù)據(jù)集上進(jìn)行訓(xùn)練,通過(guò)如下方式下載數(shù)據(jù)集。

cd dataset/coco

./download.sh

數(shù)據(jù)目錄結(jié)構(gòu)如下:

dataset/coco/

├── annotations

│ ├── instances_train2014.json

│ ├── instances_train2017.json

│ ├── instances_val2014.json

│ ├── instances_val2017.json

| ...

├── train2017

│ ├── 000000000009.jpg

│ ├── 000000580008.jpg

| ...

├── val2017

│ ├── 000000000139.jpg

│ ├── 000000000285.jpg

| ...

模型訓(xùn)練

安裝cocoapi:訓(xùn)練前需要首先下載cocoapi。

git clone https://github.com/cocodataset/cocoapi.git

cd cocoapi/PythonAPI

# if cython is not installed

pip install Cython

# Install into global site-packages

make install

# Alternatively, if you do not have permissions or prefer

# not to install the COCO API into global site-packages

python2 setup.py install --user

下載預(yù)訓(xùn)練模型: 本示例提供darknet53預(yù)訓(xùn)練模型,該模型轉(zhuǎn)換自作者提供的darknet53在ImageNet上預(yù)訓(xùn)練的權(quán)重,采用如下命令下載預(yù)訓(xùn)練模型。

sh ./weights/download.sh

通過(guò)初始化 --pretrain 加載預(yù)訓(xùn)練模型。同時(shí)在參數(shù)微調(diào)時(shí)也采用該設(shè)置加載已訓(xùn)練模型。 請(qǐng)?jiān)谟?xùn)練前確認(rèn)預(yù)訓(xùn)練模型下載與加載正確,否則訓(xùn)練過(guò)程中損失可能會(huì)出現(xiàn)NAN。

開始訓(xùn)練: 數(shù)據(jù)準(zhǔn)備完畢后,可以通過(guò)如下的方式啟動(dòng)訓(xùn)練。

python train.py \

--model_save_dir=output/ \

--pretrain=${path_to_pretrain_model}

--data_dir=${path_to_data}

• 通過(guò)設(shè)置export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7指定8卡GPU訓(xùn)練。

• 可選參數(shù)見:?python train.py --help

數(shù)據(jù)讀取器說(shuō)明:

• 數(shù)據(jù)讀取器定義在reader.py中。

模型設(shè)置:

• 模型使用了基于COCO數(shù)據(jù)集生成的9個(gè)先驗(yàn)框:10x13,16x30,33x23,30x61,62x45,59x119,116x90,156x198,373x326

• 檢測(cè)過(guò)程中,nms_topk=400, nms_posk=100,nms_thresh=0.45

訓(xùn)練策略:

• 采用momentum優(yōu)化算法訓(xùn)練YOLO v3,momentum=0.9。

• 學(xué)習(xí)率采用warmup算法,前4000輪學(xué)習(xí)率從0.0線性增加至0.001。在400000,450000輪時(shí)使用0.1,0.01乘子進(jìn)行學(xué)習(xí)率衰減,最大訓(xùn)練500000輪。

下圖為模型訓(xùn)練結(jié)果Train Loss。

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

  圖:Train Loss

模型評(píng)估

模型評(píng)估是指對(duì)訓(xùn)練完畢的模型評(píng)估各類性能指標(biāo)。本示例采用COCO官方評(píng)估。

eval.py是評(píng)估模塊的主要執(zhí)行程序,調(diào)用示例如下:

python eval.py \

--dataset=coco2017 \

--weights=${path_to_weights} \

• 通過(guò)設(shè)置export CUDA_VISIBLE_DEVICES=0指定單卡GPU評(píng)估。

若訓(xùn)練時(shí)指定--syncbn=False, 模型評(píng)估精度如下。

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

若訓(xùn)練時(shí)指定--syncbn=True, 模型評(píng)估精度如下。

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

• 注意: 評(píng)估結(jié)果基于pycocotools評(píng)估器,沒(méi)有濾除score < 0.05的預(yù)測(cè)框,其他框架有此濾除操作會(huì)導(dǎo)致精度下降。

模型推斷

模型推斷可以獲取圖像中的物體及其對(duì)應(yīng)的類別,infer.py是主要執(zhí)行程序,調(diào)用示例如下。

python infer.py \

--dataset=coco2017 \

--weights=${path_to_weights} \

--image_path=data/COCO17/val2017/ \

--image_name=000000000139.jpg \

--draw_thresh=0.5

• 通過(guò)設(shè)置export CUDA_VISIBLE_DEVICES=0指定單卡GPU預(yù)測(cè)。

模型預(yù)測(cè)速度(Tesla P40)

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn)

  圖:YOLO v3 預(yù)測(cè)可視化

極客網(wǎng)企業(yè)會(huì)員

免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。

2019-05-17
快到?jīng)]朋友的YOLO v3有了PaddlePaddle實(shí)現(xiàn) | 代碼+預(yù)訓(xùn)練模型
YOLO作為目標(biāo)檢測(cè)領(lǐng)域的創(chuàng)新技術(shù),一經(jīng)推出就受到開發(fā)者的廣泛關(guān)注。

長(zhǎng)按掃碼 閱讀全文