基于PaddlePaddle搭建工業(yè)級ICNET應(yīng)用 預(yù)測速度超TensorFlow 20%
引言
提起ICNET,就不得不說說ICNET構(gòu)建的初衷-解決圖像語義分割在實時應(yīng)用中的挑戰(zhàn)。圖像語義分割(semantic segmentation)是結(jié)合了圖像分類和對象檢測,對圖像中的每個像素實現(xiàn)細(xì)粒度的分類,就像下面的圖中看到的那樣,可以對封閉形狀區(qū)域進(jìn)行類別標(biāo)記!得益于深度學(xué)習(xí)技術(shù)的爆發(fā)式發(fā)展,圖像語義分割也進(jìn)入高速的發(fā)展階段。
Figure 1 圖像語義分割示例
技術(shù)現(xiàn)狀
Fully convolutional network(FCN)
J. Long et al. (2015) 首先將全卷積網(wǎng)絡(luò)(FCN)應(yīng)用于圖像分割的端到端訓(xùn)練。FCN修改了VGG6等網(wǎng)絡(luò)使其具有非固定大小的輸入生成具有相同大小的分割圖像,同時通過卷積層替換所有完全連接的層。由于網(wǎng)絡(luò)生成具有小尺寸和密集表示的多個特征映射,因此需要進(jìn)行上采樣以創(chuàng)建相同大小的特征?;旧?,它包含于一個步幅不小于1的卷積層。它通常稱為反卷積,因為它創(chuàng)建的輸出尺寸大于輸入。這樣的話,整個網(wǎng)絡(luò)是基于像素點的損失函數(shù)進(jìn)行訓(xùn)練的。此外,J. Long在網(wǎng)絡(luò)中添加了跳過連接,以將高層級特征映射表示與網(wǎng)絡(luò)頂層更具體和密集的特征表示相結(jié)合。FCN把CNN***的全連接層換成卷積層,這也是其名字的由來。
Figure 2 FCN網(wǎng)絡(luò)結(jié)構(gòu)
ParseNet
W. Liu et al. (2015) 針對J. Long的FCN模型進(jìn)行了兩步改進(jìn),***步使用模型生成要素圖,這些要素圖被縮減為具有池化層的單個全局特征向量。使用L2歐幾里德范式對該上下文向量進(jìn)行歸一化,并且將其取出(輸出是輸入的擴(kuò)展版本)以生成具有與初始值相同的大小的新特征映射。第二步再使用L2 歐幾里德范式對整個初始特征映射進(jìn)行歸一化。***一步連接前兩個步驟生成的要素圖。規(guī)范化有助于縮放連接的要素圖值,從而獲得更好的性能。
Figure 3 ParseNet網(wǎng)絡(luò)結(jié)構(gòu)
Pyramid Scene Parsing Network (PSPNet)
H. Zhao et al. (2016) 開發(fā)了金字塔場景解析網(wǎng)絡(luò)(PSPNet),以更好地學(xué)習(xí)場景的全局內(nèi)容表示。PSPNET使用具有擴(kuò)張網(wǎng)絡(luò)策略的特征提取器從輸入圖像中提取模式。特征提供給金字塔池化模塊以區(qū)分具有不同比例的模式。它們與四個不同的尺度合并,每個尺度對應(yīng)于金字塔等級,并由1x1卷積層處理以減小它們的尺寸。這樣,每個金字塔等級分析具有不同位置的圖像的子區(qū)域。金字塔等級的輸出被上采樣并連接到初始特征圖以最終包含局部和全局的上下文信息。然后,它們由卷積層處理以生成逐像素的預(yù)測。
Figure 4 PSPNet網(wǎng)絡(luò)結(jié)構(gòu)
ICNET
H. Zhao et al. (2018)針對高清圖像的實時語義分割,提出了一個基于PSPNet的圖像級聯(lián)網(wǎng)絡(luò)(ICNET),它解決了現(xiàn)實應(yīng)用中的基于像素標(biāo)簽推斷需要大量計算的難題。ICNET可以在單塊GPU卡上實現(xiàn)實時推斷并在Cityscapes,CamVid等數(shù)據(jù)驗證有相對不錯的效果。
當(dāng)今基于深度學(xué)習(xí)的各種網(wǎng)絡(luò)架構(gòu)不斷提升圖像語義分割的性能,但是都距離工業(yè)界的實際應(yīng)用有一定距離,像在Cityscapes數(shù)據(jù)集取得不錯效果的ResNet和PSPNet針對1024*1024的圖像至少需要1秒鐘做出推斷,遠(yuǎn)遠(yuǎn)不能滿足自動駕駛,在線視頻處理,甚至移動計算等領(lǐng)域?qū)崟r的要求,ICNET即是在這樣的背景下,在不過多降低預(yù)測效果的基礎(chǔ)上實現(xiàn)毫秒級相應(yīng)以滿足實時處理的要求。在Cityscapes數(shù)據(jù)集上,ICNET的響應(yīng)時間可以達(dá)到33ms,處理能力達(dá)到30.3fps,準(zhǔn)確率達(dá)到70.6%的mIoU分?jǐn)?shù)。
Figure 5 在Cityscapes數(shù)據(jù)集上的結(jié)果表
ICNET的主要貢獻(xiàn)在于開發(fā)了一種新穎獨特的圖像級聯(lián)網(wǎng)絡(luò)用于實時語義分割,它高效的利用了低分辨率的語義信息和高分辨率圖像的細(xì)節(jié)信息;其中級聯(lián)特征融合模塊與級聯(lián)標(biāo)簽引導(dǎo)模塊能夠以較小的計算代價完成語義推斷,可以取得5倍的推斷加速和5倍的內(nèi)存縮減。
ICNET需要級聯(lián)圖像輸入(即低,中和高)分辨率圖像,采用級聯(lián)特征融合單元(CFF)并基于級聯(lián)標(biāo)簽指導(dǎo)進(jìn)行訓(xùn)練。具有全分辨率的輸入圖像通過1/2和1/4比例進(jìn)行下采樣,形成特征輸入到中分辨率和高分辨率的分支,逐級提高精度。
Figure 6 ICNET架構(gòu)
我們使用低分辨率輸入得到語義提取,如上圖頂部分支所示使用下采樣率為8的比例將1/4大小的圖像輸入PSPNet,得到1/32分辨率的特征。獲得高質(zhì)量的分割,中高分辨率分支有助于恢復(fù)并重新處理粗糙的推斷;CFF的作用就是引入中分辨率和高分辨率圖像的特征,從而逐步提高精度,CFF的結(jié)構(gòu)如下所示。
Figure 7 CFF結(jié)構(gòu)
這樣只有低分辨率的圖像經(jīng)過了最深的網(wǎng)絡(luò)結(jié)構(gòu),而其他兩個分支經(jīng)過的層數(shù)都逐漸減少,從而提高了網(wǎng)絡(luò)的速度。
為了降低網(wǎng)絡(luò)的復(fù)雜度,ICNET采用了修剪網(wǎng)絡(luò)每層中的內(nèi)核來實現(xiàn)模型壓縮。對于每個過濾器,首先計算內(nèi)核L1范式的求和,然后降序排列僅保留部分排名靠前的內(nèi)核。
ICNET的實現(xiàn)及應(yīng)用
自ICNET問世以來,各家深度學(xué)習(xí)架構(gòu)都快速的推出了相應(yīng)的模型實現(xiàn),包括PaddlePaddle,tensorflow和pytorch。以下將主要基于精密零件智能分揀場景對比PaddlePaddle和tensorflow中ICNET網(wǎng)絡(luò)的應(yīng)用性能。
PaddlePaddle介紹
PaddlePaddle (PArallel Distributed Deep LEarning) 最初由百度深度學(xué)習(xí)實驗室于 2013 年創(chuàng)建,一直被百度內(nèi)部的研發(fā)工程師們所使用。在2016年百度世界大會上對外開放,它是國內(nèi)***個開源的機(jī)器學(xué)習(xí)平臺。它從一開始就專注于充分利用 GPU 集群的性能,為分布式環(huán)境的并行計算進(jìn)行加速,所以在對大規(guī)模數(shù)據(jù)進(jìn)行AI訓(xùn)練和應(yīng)用上要比TensorFlow要快得多。同時,它對國內(nèi)用戶尤其友好,有完善的中文文檔支持,它在開發(fā)效率和易用性方面有較明顯的優(yōu)勢,它可以使用一兩行代碼實現(xiàn)TensorFlow需要數(shù)行代碼才能實現(xiàn)的功能,從而使開發(fā)者將工作的重點放在構(gòu)建深度學(xué)習(xí)模型的高層部分。
PaddlePaddle中ICNET在工業(yè)界的應(yīng)用
截至目前, PaddlePaddle已在互聯(lián)網(wǎng)行業(yè)CTR預(yù)測、搜索排序、大規(guī)模圖像分類等數(shù)億級用戶量的產(chǎn)品和服務(wù)上成功部署使用。當(dāng)下,傳統(tǒng)行業(yè)正在進(jìn)行深度變革,利用AI技術(shù)賦能,實現(xiàn)傳統(tǒng)行業(yè)工作的自動化,智能化,使其工作人員的工作內(nèi)容技術(shù)含量更高、更人性化,從而促進(jìn)傳統(tǒng)行業(yè)的現(xiàn)代化轉(zhuǎn)型和產(chǎn)業(yè)升級,對工廠經(jīng)營效率和效益的提高有很大的幫助和意義。
就在最近,領(lǐng)邦智能聯(lián)合百度PaddlePaddle團(tuán)隊對公司的精密零件質(zhì)檢工作進(jìn)行了AI賦能升級。在精密零件的人工質(zhì)檢工作中,工人每天需要8~12小時在注意力高度集中亮光的條件下目視檢查直徑45mm以內(nèi)零件的質(zhì)量,工作的強(qiáng)度非常大,對工人視力也有很大的傷害。目前基于PaddlePaddle平臺實現(xiàn)的ICNET模型在機(jī)器質(zhì)檢的應(yīng)用上已經(jīng)達(dá)到了人工質(zhì)檢的準(zhǔn)確度,從機(jī)器代人這個角度進(jìn)行經(jīng)濟(jì)測算,可使工廠生產(chǎn)成本平均降低15%,效益提升15%;由于機(jī)器檢驗水平穩(wěn)定,大大提高了產(chǎn)品的交付質(zhì)量,交付投訴率平均降低了30%。由于精密零件質(zhì)檢數(shù)據(jù)的是保密非公開的,所以我們用公開數(shù)據(jù)集cityscape來介紹一下如何在PaddlePaddle上訓(xùn)練和應(yīng)用ICNET實現(xiàn)圖像語義分割,整個流程可以僅在幾天內(nèi)完成。
開發(fā)環(huán)境
操作系統(tǒng):Linux x86_64
CPU版本:Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
GPU版本:Nvidia-P40(運行狀況如下圖所示)
Figure 8 gpu運行狀況
數(shù)據(jù)準(zhǔn)備-Cityscapes
Cityscapes( https://www.cityscapes-dataset.com/ )包含從50個城市收集的不同季節(jié)的5,000個高質(zhì)量像素級精細(xì)注釋圖像(定義了19個類別)。各有2975/500/1525張圖用于訓(xùn)練/驗證/測試。
下載后得到cityscape數(shù)據(jù)集,下載后的文件結(jié)構(gòu)如下:
Figure 9 cityscapes數(shù)據(jù)集結(jié)構(gòu)
安裝PaddlePaddle
PaddlePaddle支持Ubuntu 14.04/16.04/18.04;CentOS 7/6;MacOS;Windows7/8/10。具體請參考官方教程,非常詳細(xì)(http://staging.PaddlePaddle.org/documentation/docs/zh/0.14.0/new_docs/beginners_guide/install/install_doc.html )
因為PaddlePaddle已經(jīng)在pip封裝了自己的安裝包,我這里選擇構(gòu)建虛擬環(huán)境,并直接從pip傻瓜式安裝。
- 如果不使用gpu,直接通過pip安裝
- pip install PaddlePaddle
- 如果是使用gpu,需要先查看系統(tǒng)的cuda和cudnn版本
查看cuda版本
- cat /usr/local/cuda/version.txt
查看cudnn 版本
- cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
按照系統(tǒng)的cuda和cudnn版本選擇需要安裝的PaddlePaddle-gpu版本
- pip install PaddlePaddle-gpu==1.3.0.post97
構(gòu)建模型
根據(jù)ICNET網(wǎng)絡(luò)結(jié)構(gòu)構(gòu)建模型,創(chuàng)建不同比例采樣的低分辨率圖像,再通過CCF融合逐步提高精度:
模型訓(xùn)練
利用已經(jīng)寫好的model構(gòu)建trainer:
執(zhí)行以下命令進(jìn)行訓(xùn)練,同時指定checkpoint保存路徑:
- python train.py --batch_size=16 --checkpoint_path="./chkpnt/" --use_gpu=True --random_mirror=True --random_scaling=True
加載提供的預(yù)訓(xùn)練模型可以加快訓(xùn)練進(jìn)度。(不過這里官方的預(yù)訓(xùn)練模型缺少部分參數(shù)文件,會導(dǎo)致最終的效果降低)
執(zhí)行以下命令加載預(yù)訓(xùn)練模型進(jìn)行訓(xùn)練,同時指定checkpoint保存路徑:
- python train.py --batch_size=16 –-init_model=”./model_1000/” --checkpoint_path="./chkpnt/" --use_gpu=True --random_mirror=True --random_scaling=True
Figure 10 訓(xùn)練損失下降圖
測試
完成模型的訓(xùn)練后, 進(jìn)行效果測試:
執(zhí)行以下命令在cityscape測試數(shù)據(jù)集上進(jìn)行測試:
- python eval.py --model_path="./chkpnt/30000/" --use_gpu=True
在進(jìn)行30000次迭代后得到的模型在驗證數(shù)據(jù)集上驗證的結(jié)果為:mean_IoU=67.25%。符合論文中~67%的效果預(yù)期,本次實驗在p40上完成,完成30000次迭代共耗時近20個小時。
框架對比
下表展示了PaddlePaddle1.3和TensorFlow1.12的性能對比,以下對比實驗使用的輸入數(shù)據(jù)是1024x2048分辨率的圖片,batch size為16:
對比 |
PaddlePaddle1.3 |
Tensorflow1.12 |
推斷速度 |
45ms/image |
65ms/image |
小結(jié)
本文介紹了圖像語義分割實現(xiàn)的主流技術(shù),并在PaddlePaddle上應(yīng)用ICNET實現(xiàn)cityscape數(shù)據(jù)集的語義分析實踐。另外,我們已經(jīng)將PaddlePaddle的ICNET應(yīng)用于領(lǐng)邦精密零件智能分揀機(jī)項目,實現(xiàn)了AI技術(shù)在產(chǎn)業(yè)落地。即基于PaddlePaddle實現(xiàn)了ICNET模型訓(xùn)練、部署,建立了客戶自主數(shù)據(jù)標(biāo)注->云端訓(xùn)練模型->下載模型->本地部署的全部流程。對比TensorFlow,在相同精度下我們的預(yù)測速度要快20%以上(25ms:33ms)。PaddlePaddle框架,不僅是一個性能優(yōu)秀的深度學(xué)習(xí)框架,更能夠基于對中國本土企業(yè)的深度學(xué)習(xí)需求的深入發(fā)掘,從而能夠更好的滿足國內(nèi)企業(yè)用戶的需求。希望PaddlePaddle在傳統(tǒng)行業(yè)的AI賦能和現(xiàn)代化轉(zhuǎn)型中貢獻(xiàn)更多的力量。
參考
- https://github.com/PaddlePaddle/Paddle
- https://github.com/tensorflow/tensorflow
- https://github.com/hszhao/ICNet
- https://arxiv.org/abs/1704.08545
- https://arxiv.org/abs/1411.4038
- https://arxiv.org/abs/1506.04579
- https://arxiv.org/abs/1612.01105