內容簡介php
本項目講述了HRNet網絡結構,並嘗試使用PaddleSeg中HRNet網絡實現瓷磚缺陷檢測python
PaddleSeg GitHub:git
https://github.com/PaddlePaddle/PaddleSeggithub
本文包含如下4部份內容:算法
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
PaddleSeg介紹框架
PaddleSeg是基於PaddlePaddle開發的圖像分割開發套件,覆蓋了DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN等主流分割網絡。經過模塊化的設計,以配置化方式驅動模型組合,幫助開發者更便捷地完成從訓練到部署的全流程圖像分割應用。ide
PaddleSeg產品特色:
1. 豐富的數據加強:基於百度視覺技術部的實際業務經驗,內置10+種數據加強策略,可結合實際業務場景進行定製組合,提高模型泛化能力和魯棒性。
2. 模塊化設計:支持DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN六種主流分割網絡,結合預訓練模型和可調節的骨幹網絡,知足不一樣性能和精度的要求;選擇不一樣的損失函數如Dice Loss, Lovasz Loss等方式能夠強化小目標和不均衡樣本場景下的分割精度。
3. 高性能:PaddleSeg支持多進程I/O、多卡並行等訓練加速策略,結合飛槳核心框架的顯存優化功能,可大幅度減小分割模型的顯存開銷,讓開發者更低成本、更高效地完成圖像分割訓練。
4. 工業級部署:全面提供服務端和移動端的工業級部署能力,依託飛槳高性能推理引擎和高性能圖像處理實現,開發者能夠輕鬆完成高性能的分割模型部署和集成。經過Paddle-Lite,能夠在移動設備或者嵌入式設備上完成輕量級、高性能的人像分割模型部署。
5. 產業實踐案例:PaddleSeg提供豐富地產業實踐案例,如人像分割、工業表計檢測、遙感分割、人體解析,工業質檢等產業實踐案例,助力開發者更便捷地落地圖像分割技術。
HRNet網絡分析
論文名稱:
High-Resolution Representations for Labeling Pixels and Regions
下載地址:
https://arxiv.org/pdf/1904.04514.pdf
網絡總體結構:
如上圖所示HRNet有四個並行的分支,包含三次下采樣過程。值得注意的是,上圖中的輸入是以原始輸入的1/4開始的,即先經歷了2次步長爲2的3×3卷積。
HRNet網絡結構特色:
-
始終保持高分辨率表徵
從網絡總體結構能夠看出,每次產生低分辨率特徵圖以後,原有的高分辨特徵還會參與到後續的卷積過程,所以產生了並行的不一樣分辨率的特徵圖。
-
殘差單元
圖中的直箭頭表明殘差單元,殘差單元由4個殘差卷積(1×一、3×三、1×1)構成。
-
相似全鏈接的階段性特徵融合
每通過4個殘差單元以後會進行一次不一樣分辨率的特徵融合。低分辨率上採樣與高分辨率融合,高分辨率下采樣與低分辨率融合,最終造成相似於全鏈接形式的特徵融合過程。
-
簡單明瞭的解碼過程
以下圖所示,解碼過程顯得很輕巧,將四個階段產生的不一樣分辨率的特徵圖直接上採樣至輸入的1/4,通過1次1*1卷積整合各通道的信息,而後進行預測分類,最後上採樣至原圖大小進行損失計算。
關鍵性代碼:
如下展現了網絡搭建過程當中重要的方法及註釋。
#獲取各階段的通道數{18,36,72,144} channels_2 = cfg.MODEL.HRNET.STAGE2.NUM_CHANNELS channels_3 = cfg.MODEL.HRNET.STAGE3.NUM_CHANNELS channels_4 = cfg.MODEL.HRNET.STAGE4.NUM_CHANNELS #獲取各階段殘差單元的循環次數{1,4,3} num_modules_2 = cfg.MODEL.HRNET.STAGE2.NUM_MODULES num_modules_3 = cfg.MODEL.HRNET.STAGE3.NUM_MODULES num_modules_4 = cfg.MODEL.HRNET.STAGE4.NUM_MODULES #步長爲2的跨步卷積 f=3*3 x = conv_bn_layer(input=input,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_1') #步長爲2的跨步卷積 f=3*3 x = conv_bn_layer(input=x,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_2') #執行1個殘差單元 la1 = layer1(x, name='layer2') #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數 tr1 = transition_layer([la1], [256], channels_2, name='tr1') #執行4次殘差卷積,並在每次殘差單元結束時進行特徵融合 st2 = stage(tr1, num_modules_2, channels_2, name='st2') #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數 tr2 = transition_layer(st2, channels_2, channels_3, name='tr2') #執行3次殘差卷積,並在每次殘差單元結束時進行特徵融合 st3 = stage(tr2, num_modules_3, channels_3, name='st3') #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數 tr3 = transition_layer(st3, channels_3, channels_4, name='tr3') #執行1次殘差卷積,並在每次殘差單元結束時進行特徵融合 st4 = stage(tr3, num_modules_4, channels_4, name='st4') shape = st4[0].shape ##獲取st4[0]寬高,並進行雙線性插值 height, width = shape[-2], shape[-1] st4[1] = fluid.layers.resize_bilinear(st4[1], out_shape=[height, width]) st4[2] = fluid.layers.resize_bilinear(st4[2], out_shape=[height, width]) st4[3] = fluid.layers.resize_bilinear(st4[3], out_shape=[height, width]) #特徵通道合併 out = fluid.layers.concat(st4, axis=1) #求總通道數 last_channels = sum(channels_4) #使用1*1卷積進行跨通道的特徵融合 out = conv_bn_layer(input=out,filter_size=1,num_filters=last_channels,stride=1,if_act=True,name='conv-2') #使用1*1卷積進行最後的像素分類 out = fluid.layers.conv2d(input=out,num_filters=num_classes,filter_size=1,stride=1,padding=0,act=None, param_attr=ParamAttr(initializer=MSRA(), name='conv-1_weights'),bias_attr=False) #恢復至網絡輸入的大小 out = fluid.layers.resize_bilinear(out, input.shape[2:])
網絡的整理流程與細節以下所示:
網絡過程當中特徵的維度變化以下所示:
基於PaddleSeg使用HRNet進行瓷磚缺陷檢測
1. 數據準備
-
表面缺陷檢測是篩選不合格產品的核心過程,但該過程不多能自動完成。
-
據記載,在世界上最大的瓷磚生產基地浙江省的瓷磚廠,有近3/4的工人在檢查產品質量。
-
爲了減輕人類的勞動強度,已經提出了許多圖像處理技術來嘗試這樣的檢查任務。
-
瓷磚的自動損傷檢測存在紋理複雜、缺陷形狀多樣、瓷磚光照條件隨機性等幾個瓶頸問題。
-
目標缺陷如氣孔、裂紋、斷裂、磨損如圖所示。
2. 環境搭建
環境要求:
PaddlePaddle >= 1.7.0
Python >= 3.5+
因爲圖像分割模型計算開銷大,推薦在GPU版本的PaddlePaddle下使用PaddleSeg
pip install -U paddlepaddle-gpu
安裝過程
安裝PaddleSeg套件:
git clone https://github.com/PaddlePaddle/PaddleSeg
安裝PaddleSeg依賴:
cd PaddleSeg pip install -r requirements.txt
3. 標籤數據
PaddleSeg採用單通道的標註圖片,每一種像素值表明一種類別,像素標註類別須要從0開始遞增,例如0,1,2,3表示有4種類別。3. 標籤數據
NOTE:
-
標註圖像請使用PNG無損壓縮格式的圖片,標註類別最多爲256類。
-
PaddleSeg支持灰度標註同時也支持僞彩色標註。
4. 模型選擇參數配置
-
模型選擇:根據本身的需求選擇合適的模型進行訓練。本文選擇HRNet-W18做爲訓練模型。
-
預訓練模型:
pretrained_model/download_model.py中提供了相應的預訓練模型下載地址,能夠根據本身的需求在其中尋找相應的預訓練模型,如不存在,能夠按照一樣的格式添加對應的模型名稱與下載地址。
-
參數配置:參數由config.py和hrnet_Magnetic.yaml共同決定,.yaml文件的優先級高於config.py 。
經常使用參數配置詳細說明:
-
DATASET:關於數據集的相關配置,如類別數、訓練數據列表、測試數據列表
-
MODEL:模型配置:
-
MODEL_NAME: "hrnet" 模型名稱
-
HRNET:配置各個stage中不一樣分辨率特徵圖的通道數
-
STAGE2:
NUM_CHANNELS: [18, 36]
STAGE3:
NUM_CHANNELS: [18, 36, 72]
STAGE4:
NUM_CHANNELS: [18, 36, 72, 144]
-
MULTI_LOSS_WEIGHT:模型輸出權重配置
-
TRAIN_CROP_SIZE:訓練時輸入數據大小
-
EVAL_CROP_SIZE:測試時輸入數據大小
-
BATCH_SIZE:輸入網絡中的BATCH_SIZE,須要適配顯存
-
SNAPSHOT_EPOCH: 階段性保存EPOCH
-
NUM_EPOCHS:總的訓練輪數
-
LOSS:損失函數類別
-
LR:學習率
5. 參數校驗
在開始訓練和評估以前,對配置和數據進行一次校驗,確保數據和配置是正確的。使用下述命令啓動校驗流程:
python pdseg/check.py --cfg ./configs/hrnet_Magnetic.yaml
6. 模型訓練
本次項目中設置的是階段性模型評估,同時保存評估結果最好的模型參數在下述目錄:
PaddleSeg/saved_model/unet_optic/best_model
best_model文件夾下包含ppcls.pdmodel、ppcls.pdopt、ppcls.pdparams三個文件用來進行後續的評估推理使用。
python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval
7. 模型評估
python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval [EVAL]#image=81 acc=0.9853 IoU=0.8434 [EVAL]Category IoU: [0.9842 0.7891 0.8468 0.7010 0.9258 0.8136] [EVAL]Category Acc: [0.9927 0.8871 0.9407 0.9106 0.9597 0.8829] [EVAL]Kappa:0.9037
8. 結果可視化
python pdseg/vis.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml
獲得可視化結果以後,可使用以下代碼展現可視化結果:
import matplotlib.pyplot as plt import os import cv2 # 定義顯示函數 def display(img_name): image_dir = os.path.join("./dataset/Magnetic/images", img_name.split(".")[0]+".jpg") label_dir = os.path.join("./dataset/Magnetic/color",img_name) mask_dir = os.path.join("./visual", img_name) img_dir = [image_dir, label_dir, mask_dir] plt.figure(figsize=(15, 15)) title = ['Image', 'label', 'Predict'] for i in range(len(title)): plt.subplot(1, len(title), i+1) plt.title(title[i]) if i==0: img_rgb = cv2.imread(img_dir[i]) else: img = cv2.imread(img_dir[i]) b,g,r = cv2.split(img) img_rgb = cv2.merge([r,g,b]) plt.imshow(img_rgb) plt.axis('off') plt.show() # 注:第一次運行可能沒法顯示,再運行一次便可。 img_list=os.listdir("./visual") for img_name in img_list: display(img_name)
輸出結果以下所示:
心得體會
本項目詳細介紹了HRNet網絡關鍵性技術點,最後使用基於飛槳開源深度學習框架的圖像分割套件PaddleSeg,在AI Studio上完成了數據處理、模型訓練、模型評估等工做。PaddleSeg套件讓圖像分割技術變得更爲簡單便捷,下降了開發者的上手難度。
在此強烈安利AI Studio。AI Studio是基於百度深度學習平臺飛槳的人工智能學習與實訓社區,提供在線編程環境、免費GPU算力、海量開源算法和開放數據,幫助開發者快速建立和部署模型。對於像筆者同樣沒有硬件條件的學習者是一個很大的助力。
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu