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