圖像分割技術,現如今已經有非常廣泛的應用,比如視頻監控場景的車輛人體分析、無人駕駛場景的車道線分割等;還有一些專業領域的應用,比如醫療影像分析場景的腫瘤分割、遙感影像分析場景的地塊分割、工業商業質檢場景中的受損部位分析應用。
另外在現在非常火的短視頻領域,對圖像分割,尤其是人像分割技術,有着非常廣泛的需求,比如可用於背景風格替換、影視特效等。將人像分割出來後和背景疊加產生新的效果,比如這個彈幕人像分離的應用。
在將人像分割技術應用到實際業務場景時,經常會面臨一些挑戰,很難達到理想的效果和商用級別的要求,比如下面這些問題:
由於拍攝情況複雜多樣,圖像數據組成往往很複雜,比如存在多尺度、圖像疊加、多姿態等情況,這對訓練模型前的數據處理環節帶來很大的挑戰。
人像分割技術在很多場景有實時分析需求,比如手機APP上的實時特效需求,這對模型大小和推理速度有更高的要求。
視頻級人像分割場景下,還會遇到幀間過度不夠穩定,邊緣部分閃爍的問題,影響最終的分割效果。
針對上面這些應用問題,飛槳圖像分割套件PaddleSeg再度重磅出擊,隨最新發布的飛槳開源框架1.8版本,推出了更強大的功能以支持人像分割技術的產業應用,讓開發者更順暢地完成人像分割任務,包括三大亮點特性:
全面提升對人像分割場景的全流程支持。針對人像分割場景提供了從數據增強處理、模型訓練、在線離線量化、視頻分割推理部署、替換背景等全流程配套工具。
最新發布HumanSeglite模型超輕量級人像分割模型,可支持移動端場景的實時分割,最小隻有187K。
發佈基於光流算法的視頻級別的分割後處理方案,針對移動端小模型分割效果不理想的問題,有顯著效果。
全面提升對人像分割場景
的全流程支持
新版PaddleSeg提供針對人像分割場景從數據增強處理、模型訓練、在線離線量化、視頻分割推理部署、替換背景等全流程應用指南。
提供豐富的圖像增強策略
針對目標圖像多樣性問題,提供了10+種數據增強策略,可結合實際業務場景進行定製組合,提升模型泛化能力和魯棒性。
提供簡潔的模型訓練、量化和預測API
(1)通過train.py實現模型訓練:
python train.py --model_type HumanSegMobile \
--save_dir output/ \
--data_dir data/mini_supervisely \
--train_list data/mini_supervisely/train.txt \
--val_list data/mini_supervisely/val.txt \
--pretrained_weights pretrained_weights/humanseg_mobile_ckpt \
--batch_size 8 \
--learning_rate 0.001 \
--num_epochs 10 \
--image_shape 192 192
其中參數含義如下:
--model_type: 模型類型,可選項爲:HumanSegServer、HumanSegMobile和HumanSegLite
--save_dir: 模型保存路徑
--data_dir: 數據集路徑
--train_list: 訓練集列表路徑
--val_list: 驗證集列表路徑
--pretrained_weights: 預訓練模型路徑
--batch_size: 批大小
--learning_rate: 初始學習率
--num_epochs: 訓練輪數
--image_shape: 網絡輸入圖像大小(w, h)
(2)通過quant_offline.py實現離線量化(quant_online.py可實現在線量化):
python quant_offline.py --model_dir output/best_model \
--data_dir data/mini_supervisely \
--quant_list data/mini_supervisely/val.txt \
--save_dir output/quant_offline \
--image_shape 192 192
其中參數含義如下:
--model_dir: 待量化模型路徑
--data_dir: 數據集路徑
--quant_list: 量化數據集列表路徑,一般直接選擇訓練集或驗證集
--save_dir: 量化模型保存路徑
--image_shape: 網絡輸入圖像大小(w, h)
(3)通過export.py實現模型導出:
python export.py --model_dir output/best_model \
--save_dir output/export
其中參數含義如下:
--model_dir: 模型路徑
--save_dir: 導出模型保存路徑
(4)通過infer.py實現模型預測
python infer.py --model_dir output/best_model \
--data_dir data/mini_supervisely \
--test_list data/mini_supervisely/test.txt \
--image_shape 192 192
其中參數含義如下:
--model_dir: 模型路徑
--data_dir: 數據集路徑
--test_list: 測試集列表路徑
--image_shape: 網絡輸入圖像大小(w, h)
人像分割和背景替換快速體驗
PaddleSeg可實現對圖像、視頻的人像分割和背景替換。這裏以視頻爲例,代碼已經內置在video_infer.py(視頻分割),bg_replace.py(背景替換)中,簡單兩行命令即可快速體驗人像分割和背景替換效果。
# 對人像視頻進行分割處理
python video_infer.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4
# 對人像視頻進行背景替換處理, 可通過'--background_video_path'傳入背景視頻
python bg_replace.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4 --background_image_path data/background.jpg
效果如下:
視頻 背景 背景替換效果
PaddleSeg新版本同步發佈了人像分割教程,方便在線體驗。
https://aistudio.baidu.com/aistudio/projectdetail/475345
超輕量級人像分割模型Human
-Seglite,最小隻有187k!
PaddleSeg開源了在大規模人像數據上訓練過的5個預訓練模型,滿足多種使用場景的需求,這些模型簡單經過Fine-tune即可訓練出自己的人像分割模型。
計算耗時運行環境:cpu:驍龍855, 內存:6GB, 圖片大小:192*192。
從上表可以看到,PaddleSeg不僅推出了服務端應用的預訓練模型,還提供了專門針對移動端實時分割場景的模型,例如手機自拍人像的實時處理。
該場景下由於移動設備算力、內存受限,所以需要更輕量級的模型,而且通常要求處理效率是30FPS,對應的預測時間需要在33ms以下。
本次PaddleSeg提供的HumanSegLite模型,採用更輕量的網絡結構- 優化後的ShuffleNetV2,並採用飛槳模型壓縮工具PaddleSlim的量化技術進一步壓縮模型的體積,達到速度和精度的平衡,最終生成的預訓練模型大小僅187K!預測時間11.8ms,爲開發者實現移動端實時分割任務提供有利武器。
執行以下腳本即可下載HumanSeg預訓練模型:
python pretrained_weights/download_pretrained_weights.py
視頻光流後處理方案,視頻
級別實時分割處理的利器!
針對移動端視頻的圖像分割效果往往不太理想的問題,可利用時序信息結合光流法,對分割結果進行優化,即視頻光流後處理方案。
什麼是光流後處理?
下面先簡單看一下光流(optical flow)的概念:運動物體在觀察成像平面上的像素運動的瞬時速度。包括稀疏光流和稠密光流。
稀疏光流: 計算部分像素的光流,速度快,效果差。
稠密光流:計算每個像素的光流,速度慢,效果好。
(圖片來源:https://zhuanlan.zhihu.com/p/74460341)
如何平衡光流效果與速度?
可採用DIS光流算法(Dense Inverse Search-basedmethod),屬於快速稠密光流,是一種在光流質量和計算時間中取得平衡的算法。優點是運算速度快的稠密光流,可達到實時要求。
DIS光流算法示意圖(速度越慢,效果越精細)
如何用光流算法改善視頻分割結果?
將分割的結果和DIS光流算法的預測結果融合,即可得到改善後的結果。
具體方案:
根據時序圖像,計算相鄰兩幀的DIS光流(對應像素的位置關係)
根據DIS光流找到前一幀融合結果Flast的運動預測結果P
根據光流大小判斷融合權重W
融合結果 F = S*W + P*(1-W),其中S爲當前幀分割結果,P爲上一幀的運動預測結果
對比光流後處理的視頻分割效果
光流後處理的代碼已內置在video_infer.py中,可快速體驗效果。
# 人像視頻分割,自帶光流後處理效果
python video_infer.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4
左(原圖)、中(無光流後處理的分割效果)、右(含光流後處理的分割效果)
對比上圖可以看出,進行光流後處理後,消除了人像邊緣閃爍的問題,在人物頭頂處尤爲明顯,另外減輕了人像邊緣的鋸齒效應,使得邊緣更平滑。
PaddleSeg更多升級動態
除了人像分割場景的升級支持以外,PaddleSeg本次還帶來一項利器,針對圖像分割任務中,經常出現類別分佈不均勻的情況,例如:工業產品的瑕疵檢測、道路提取及病變區域提取等,提供了損失函數Lovasz Loss的支持,解決類別不均衡問題。
lovasz loss損失函數簡介
Lovasz loss基於子模損失(submodular losses)的凸Lovasz擴展,對神經網絡的mean IoU損失進行優化。Lovasz loss根據分割目標的類別數量可分爲兩種:lovasz hinge loss和lovasz softmax loss. 其中lovasz hinge loss適用於二分類問題。在僅有兩個像素預測的情形下,lovasz hinge loss的函數曲面圖如下所示:
lovasz softmax loss適用於多分類問題。同樣在僅有兩個像素預測的情形下,lovasz softmax loss的函數曲面圖如下所示:
該內容發表在CVPR 2018上,可參考如下文獻了解具體原理。
http://openaccess.thecvf.com/content_cvpr_2018/html/Berman_The_LovaSz-Softmax_Loss_CVPR_2018_paper.html
一堆數學概念沒看懂?沒關係,不妨礙我們使用lovasz loss來解決類別不平衡問題,提升分割效果。
lovasz loss損失函數使用指南
接下來介紹如何在PaddleSeg中使用lovasz loss進行訓練。需要注意的是,通常的直接訓練方式並一定管用,我們推薦另外2種訓練方式:
(1)與softmax loss或bce loss(binary cross-entropy loss)加權結合使用。
(2)先使用softmax loss或bec loss進行訓練,再使用lovasz softmax loss或lovasz hinge loss進行finetuning.
配置lovasz loss僅需要設定2個參數:
首先通過cfg.SOLVER.LOSS參數選擇訓練時的損失函數, 例如cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']將指定訓練loss爲lovasz hinge loss與bce loss的組合。cfg.SOLVER.LOSS=['lovasz_softmax_loss','softmax_loss']將指定訓練loss爲lovasz softmax loss與softmax loss的組合。
其次,也可以通過cfg.SOLVER.LOSS_WEIGHT參數對不同loss進行權重配比,從而靈活地進行訓練調參(方便小夥伴們進行“煉丹”)。Lovasz hinge loss配置位於PaddleSeg/configs/lovasz_hinge_deeplabv3p_mobilenet_road.yaml,如下所示:
SOLVER:
LOSS: ["lovasz_hinge_loss","bce_loss"]
LOSS_WEIGHT:
LOVASZ_HINGE_LOSS: 0.5
BCE_LOSS: 0.5
Lovasz softmax loss配置位於PaddleSeg/configs/lovasz_softmax_deeplabv3p_mobilenet_pascal.yaml,如下所示:
SOLVER:
LOSS: ["lovasz_softmax_loss","softmax_loss"]
LOSS_WEIGHT:
LOVASZ_SOFTMAX_LOSS: 0.2
SOFTMAX_LOSS: 0.8
實際效果
來看看lovasz loss的實際效果。在道路提取任務中,道路在圖片中所佔比例往往很小,是典型的類別不均衡場景。
我們使用lovasz loss和softmax loss分別進行訓練,分割效果如下:
可以看出,softmax loss訓練的結果中道路並不連續,主幹道部分缺失尤爲嚴重。而lovasz loss訓練的結果提升顯著,主幹道並無缺失,連小路也基本連續。
Lovasz loss具體使用教程請參見:
https://github.com/PaddlePaddle/PaddleSeg/blob/develop/docs/lovasz_loss.md
如在使用過程中有問題,可加入飛槳官方QQ羣進行交流:703252161。
如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文檔。
更多PaddleSeg的應用方法,歡迎訪問項目地址:
GitHub:
https://github.com/PaddlePaddle/PaddleSeg
Gitee:
https://gitee.com/paddlepaddle/PaddleSeg
官網地址:
https://www.paddlepaddle.org.cn
飛槳開源框架項目地址:
GitHub:
https://github.com/PaddlePaddle/Paddle
Gitee:
https://gitee.com/paddlepaddle/Paddle
END