快到沒朋友的YOLO v3有了PaddlePaddle 預訓練模型

機器之心發表於2019-05-16

YOLO作為目標檢測領域的創新技術,一經推出就受到開發者的廣泛關注。值得一提的是,基於百度自研的開源深度學習平臺PaddlePaddle的YOLO v3實現,參考了論文【Bag of Tricks for Image Classification with Convolutional NeuralNetworks】,增加了mixup,label_smooth等處理,精度(mAP(0.5:0.95))相比於原作者的實現提高了4.7個絕對百分點,在此基礎上加入synchronize batchnormalization, 最終精度相比原作者提高5.9個絕對百分點。我們將在下文中為大家詳解實現的具體過程。

CV領域的核心問題之一就是目標檢測(object detection),它的任務是找出影像當中所有感興趣的目標(物體),確定其位置和大小(包含目標的矩形框)並識別出具體是哪個物件。Faster R-CNN及在其基礎上改進的Mask R-CNN在例項分割、目標檢測、人體關鍵點檢測等任務上都取得了很好的效果,但通常較慢。YOLO 創造性的提出one-stage,就是目標定位和目標識別在一個步驟中完成。

由於整個檢測流水線是單個網路,因此可以直接在檢測效能上進行端到端優化,使得基礎YOLO模型能以每秒45幀的速度實時處理影像,較小網路的Fast YOLO每秒處理影像可達到驚人的155幀。YOLO有讓人驚豔的速度,同時也有讓人止步的缺陷:不擅長小目標檢測。而YOLO v3保持了YOLO的速度優勢,提升了模型精度,尤其加強了小目標、重疊遮擋目標的識別,補齊了YOLO的短板,是目前速度和精度均衡的目標檢測網路。

專案地址:https://github.com/PaddlePaddle/models/blob/v1.4/PaddleCV/yolov3/README_cn.md

YOLO v3檢測原理

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

快到沒朋友的YOLO v3有了PaddlePaddle 預訓練模型

圖:YOLO v3檢測原理

YOLO v3網路結構

YOLO v3 的網路結構由基礎特徵提取網路、multi-scale特徵融合層和輸出層組成。

  1. 特徵提取網路。YOLO v3使用 DarkNet53作為特徵提取網路:DarkNet53 基本採用了全卷積網路,用步長為2的卷積操作替代了池化層,同時新增了 Residual 單元,避免在網路層數過深時發生梯度彌散。

  2. 特徵融合層。為了解決之前YOLO版本對小目標不敏感的問題,YOLO v3採用了3個不同尺度的特徵圖來進行目標檢測,分別為13*13,26*26,52*52,用來檢測大、中、小三種目標。特徵融合層選取 DarkNet產出的三種尺度特徵圖作為輸入,借鑑了FPN(feature pyramid networks)的思想,通過一系列的卷積層和上取樣對各尺度的特徵圖進行融合。

  3. 輸出層。同樣使用了全卷積結構,其中最後一個卷積層的卷積核個數是255:3*(80+4+1)=255,3表示一個grid cell包含3個boundingbox,4表示框的4個座標資訊,1表示Confidence Score,80表示COCO資料集中80個類別的概率。

快到沒朋友的YOLO v3有了PaddlePaddle 預訓練模型

圖:YOLO v3 網路結構

PaddlePaddle簡介

PaddlePaddle是百度自研的集深度學習框架、工具元件和服務平臺為一體的技術領先、功能完備的開源深度學習平臺,有全面的官方支援的工業級應用模型,涵蓋自然語言處理計算機視覺、推薦引擎等多個領域,並開放多個領先的預訓練中文模型。目前,已經被中國企業廣泛使用,並擁有活躍的開發者社群。


詳情可檢視PaddlePaddle官網:http://www.paddlepaddle.org/

應用案例—AI識蟲

紅脂大小蠹是危害超過 35 種松科植物的蛀幹害蟲,自 1998 年首次發現到 2004 年,發生面積超過 52.7 萬平方公里 , 枯死松樹達600 多萬株。且在持續擴散,給我國林業經濟帶來巨大損失。傳統監測方式依賴具有專業識別能力的工作人員進行實地檢查,專業要求高,工作週期長。

北京林業大學、百度、嘉楠、軟通智慧合作面向資訊素誘捕器的智慧蟲情監測系統,通過PaddlePaddle訓練得到目標檢測模型YOLO v3,識別紅脂大小蠹蟲,遠端監測病蟲害情況,識別準確率達到90%,與專業人士水平相當,並將原本需要兩週才能完成的檢查任務,縮短至1小時就能完成。

基於PaddlePaddle實戰

執行樣例程式碼需要Paddle Fluid的v 1.4或以上的版本。如果你的執行環境中的PaddlePaddle低於此版本,請根據安裝文件中的說明來更新PaddlePaddle:

http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/install/index_cn.html

資料準備

在MS-COCO資料集上進行訓練,通過如下方式下載資料集。

cd dataset/coco

./download.sh

資料目錄結構如下:

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

|   ...

模型訓練

安裝cocoapi:訓練前需要首先下載cocoapi。

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

cdcocoapi/PythonAPI

#if cython is not installed

pipinstall Cython

#Install into global site-packages

makeinstall

#Alternatively, if you do not have permissions or prefer

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

python2setup.py install --user

下載預訓練模型: 本示例提供darknet53預訓練模型,該模型轉換自作者提供的darknet53在ImageNet上預訓練的權重,採用如下命令下載預訓練模型。

sh./weights/download.sh

通過初始化 --pretrain載入預訓練模型。同時在引數微調時也採用該設定載入已訓練模型。請在訓練前確認預訓練模型下載與載入正確,否則訓練過程中損失可能會出現NAN。

開始訓練: 資料準備完畢後,可以通過如下的方式啟動訓練。

python train.py \

   --model_save_dir=output/ \

   --pretrain=${path_to_pretrain_model}

   --data_dir=${path_to_data}

通過設定export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7指定8卡GPU訓練。

可選引數見:python train.py --help

資料讀取器說明

  • 資料讀取器定義在reader.py中。

模型設定:

  • 模型使用了基於COCO資料集生成的9個先驗框:10x13,16x30,33x23,30x61,62x45,59x119,116x90,156x198,373x326

  • 檢測過程中,nms_topk=400, nms_posk=100,nms_thresh=0.45

訓練策略:

  • 採用momentum優化演算法訓練YOLO v3,momentum=0.9。

  • 學習率採用warmup演算法,前4000輪學習率從0.0線性增加至0.001。在400000,450000輪時使用0.1,0.01乘子進行學習率衰減,最大訓練500000輪。

下圖為模型訓練結果Train Loss。

快到沒朋友的YOLO v3有了PaddlePaddle 預訓練模型

圖:Train Loss

模型評估

模型評估是指對訓練完畢的模型評估各類效能指標。本示例採用COCO官方評估。

eval.py是評估模組的主要執行程式,呼叫示例如下:

pythoneval.py \

    --dataset=coco2017 \

    --weights=${path_to_weights} \

通過設定export CUDA_VISIBLE_DEVICES=0指定單卡GPU評估。

若訓練時指定--syncbn=False, 模型評估精度如下。

input size

mAP(IoU=0.50:0.95)

mAP(IoU=0.50)

mAP(IoU=0.75)

608x608

37.7

59.8

40.8

416x416

36.5

58.2

39.1

320x320

34.1

55.4

36.3

若訓練時指定--syncbn=True, 模型評估精度如下。

input size

mAP(IoU=0.50:0.95)

mAP(IoU=0.50)

mAP(IoU=0.75)

608x608

38.9

61.1

42.0

416x416

37.5

59.6

40.2

320x320

34.8

56.4

36.9

注意: 評估結果基於pycocotools評估器,沒有濾除score < 0.05的預測框,其他框架有此濾除操作會導致精度下降。

模型推斷

模型推斷可以獲取影像中的物體及其對應的類別,infer.py是主要執行程式,呼叫示例如下。

pythoninfer.py \

   --dataset=coco2017 \

    --weights=${path_to_weights}  \

    --image_path=data/COCO17/val2017/  \

    --image_name=000000000139.jpg \

    --draw_thresh=0.5

通過設定export CUDA_VISIBLE_DEVICES=0指定單卡GPU預測。

模型預測速度(Tesla P40)

input size

608x608

416x416

320x320

infer speed

48 ms/frame

29 ms/frame

24 ms/frame


快到沒朋友的YOLO v3有了PaddlePaddle 預訓練模型

圖:YOLO v3 預測視覺化

相關文章