一樣的青春,每一個人有着不一樣的經歷。python
但在被譽爲技術界「奧斯卡」之稱的百度之星大賽上,有一羣年輕人卻有着一樣的故事,不論是身在象牙塔,仍是已位於科研前線,在開發賽道上表現出的技術實力,讓他們閃耀四方。git
今年百度之星的賽題是打造一款輕量級的目標檢測模型。這也是計算機視覺技術中最基本的任務之一,好比在關鍵點檢測、實例分割等方面都會在此基礎上進行,應用前景十分普遍。github
「這次比賽不只須要考慮mAP,同時考慮了Madds,兼顧精度與速度的要求。」剛剛結束的2019百度之星開發者大賽中得到第一名的Litchll隊長張鵬鬆這樣看待本次的賽題。因爲兼顧速度與精度,因此模型會很是適合嵌入式設備和手機,在此類設備中達到實時處理。在生活中也有很大的應用前景,好比能夠在手機中部署實現圖片識別、檢測、甚至美顏等;航拍無人機的圖像進行自動跟隨、障礙物識別等。json
張鵬鬆已經參加過兩次飛槳的比賽,飛槳也是越用越順手。網絡
他的團隊分工明確:文獻查閱與賽題分析、基礎模型復現和模型總體架構構建及訓練三個部分。在文獻查閱與賽題分析方面,主要的目的是分析賽題,根據評測指標去查閱最新的模型,而且統計下來各論文模型的數據,按照賽題的評分標準去計算論文級別的理論成績,最後從中選取比較好的模型。模型選取以後就要將基礎模型復現,這部分須要從選中的模型裏,按照論文數據或者開放出來的其它框架的代碼,利用飛槳去復現backbone或者總體模型,對於爲backbone的在imagenet上進行預訓練或者從其它框架裏轉換預訓練模型;模型總體架構的構建和訓練是最爲費時的一個,由於其須要負責整個代碼的框架制定訓練策略、數據增廣策略以及各類訓練調參。架構
「本次比賽主很是考驗目標檢測相關知識,好比常見的單階段目標檢測方法:SSD、Yolov三、Centernet等,雙階段目標檢測方法:Faster RCNN、ThunderNet等。」張鵬鬆提及比賽仍很激動,他爲了提升模型的泛化能力還作一些數據增廣,例如旋轉、鏡像、對比度、亮度等。爲了與更多飛槳開發者分享本次百度之星比賽的收穫,他將比賽代碼進行了開源並上傳至AI Studio中。框架
項目地址:優化
https://aistudio.baidu.com/aistudio/projectDetail/189267spa
01.net
簡介
Single Shot MultiBox Detector (SSD) 是一種單階段的目標檢測器。與兩階段的檢測方法不一樣,單階段目標檢測並不進行區域推薦,而是直接從特徵圖迴歸出目標的邊界框和分類機率。SSD 運用了這種單階段檢測的思想,而且對其進行改進:在不一樣尺度的特徵圖上檢測對應尺度的目標。以下圖所示,SSD 在六個尺度的特徵圖上進行了不一樣層級的預測。每一個層級由兩個3x3卷積分別對目標類別和邊界框偏移進行迴歸。所以對於每一個類別,SSD 的六個層級一共會產生 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 個檢測結果。
SSD 能夠方便地插入到任何一種標準卷積網絡中,好比 VGG、ResNet 或者 MobileNet,這些網絡被稱做檢測器的基網絡。在這個示例中咱們使用 shufflenet。
在訓練時還會對圖片進行數據加強,包括隨機擾動、擴張、翻轉和裁剪:
擾動: 擾動圖片亮度、對比度、飽和度和色相。
擴張: 將原始圖片放進一張使用像素均值填充(隨後會在減均值操做中減掉)的擴張圖中,再對此圖進行裁剪、縮放和翻轉。
翻轉: 水平翻轉。
裁剪: 根據縮放比例、長寬比例兩個參數生成若干候選框,再依據這些候選框和標註框的面積交併比(IoU)挑選出符合要求的裁剪結果。
也能夠採用一些其餘數據增廣方法:
InstaBoost:
論文:https://arxiv.org/abs/1908.07801
代碼:https://github.com/GothicAi/InstaBoost
RandAugment:
https://arxiv.org/pdf/1909.13719.pdf
https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py
目錄:
| work |-- astar2019 |-- score.py |-- ... |-- ssd |-- train.py |-- mobilenet_ssd.py |-- ... |-- coco |-- train2017 |-- val2017 |-- test2017 |-- ...
02
解壓數據集
get_ipython().system('unzip -qo -d work/coco/ data/data7122/train2017.zip')get_ipython().system('unzip -qo -d work/coco/ data/data7122/val2017.zip')get_ipython().system('unzip -qo -d work/coco/ data/data7122/test2017.zip')get_ipython().system('unzip -qo -d work/coco/ data/data7122/annotations_trainval2017.zip')get_ipython().system('unzip -qo -d work/coco/ data/data7122/image_info_test2017.zip')
03
安裝相關依賴庫
get_ipython().system('pip install pycocotools')get_ipython().system('pip install ujson')
飛槳已發佈了圖像分類模型庫:
https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification
用戶能夠參照work/ssd/中的mobilenet_ssd、shufflenetv2_ssd.py、mobilenetv2_ssd.py等添加本身的backbone。
04
開始訓練
訓練策略採用了warmup,優化器採用的Momentum,用戶也能夠本身更改優化器,保存的預測模型會以圖片的height_width_xxx來命名:
get_ipython().system('python3 work/ssd/train.py --learning_rate 0.00001 --data_dir work/coco --epoc_num 220 --batch_size 32')
執行score
score模型的名字須要是height_width_xxx,默認300x300,--model_dir 爲預測模型地址:
get_ipython().system('python3 work/astar2019/score.py --model_dir model_snet/300_300_inference')
05
量化訓練
此部分用的是main_quant.py裏的量化方法,也能夠用PaddleSlim裏的方法,詳見work/paddleslim,同時PaddleSlim也能夠進行剪枝等操做:
get_ipython().system('python work/ssd/main_quant.py --init_model model_snet/best_model --model_save_dir model_snet/snet_int8 --mode train')
執行量化後的評測:
get_ipython().system('python3 work/astar2019/score.py --model_dir model_snet/snet_int8/300_300_int8_inference')
賽以至用,將比賽代碼開源,將比賽成果逐步落地,是飛槳參賽者的心願。
殺入決賽的Seigato隊長顧竟瀟認爲,這次的比賽做品能夠快速落地並移植到特定嵌入式終端。並且因爲計算量小,採用了8比特量化,也能夠應用到車輛行車記錄儀、安防監控等低功耗產品中。wildkid1024隊長劉澍波則更看重數據,這次賽題中須要對小目標進行數據加強,經過調整圖片的色調、隨機裁剪放縮都是很好的方式。在比賽開始前,他對飛槳框架的上手難度有過懷疑,可是經過比賽他發現,徹底是多慮了。飛槳的設計理念有點相似於C++,須要先定義好參數和運算,而後經過編譯的方式生成計算圖,最後實際運行的時候再把數據提供出來,這種設計會很是方便於部署。
自2005年到如今,百度之星已經走過了15年。一批批的參賽選手,他們或身居校園,憧憬着自身的發展;或已經投身一線,在業務領域有了一番做爲。但不管是哪種,他們是年輕的,就像年輕的飛槳同樣,開放、兼容、自主、創新。一場比賽或許不能讓世界有所改變,但孜孜不倦、矢志不渝的堅持,必定可以讓更多的人可以享受到AI發展的紅利,也能讓中國的AI技術人才找到本身的舞臺。
這樣的將來,必然會更加精彩。
>> 訪問 PaddlePaddle 官網,瞭解更多相關內容。