基於PaddlePadlle的影像分割の新手入門

qq_25692343發表於2020-10-26

課程連結:https://aistudio.baidu.com/aistudio/education/group/info/1767.

在這裡插入圖片描述

第五課 PaddleSeg快速體驗

本課提要:

  • 學習使用預訓練好的影像分割模型進行預測
  • 初步瞭解PaddleSeg語義分割庫的使用
  • 本教程以常見的人像分割任務為例

一、什麼是人像分割

人像分割任務旨在識別影像中的人體輪廓,與背景進行分離,返回分割後的二值圖、灰度圖、前景人像圖,適應多個人體、複雜背景、各類人體姿態。可應用於人像扣圖、人體特效和影視後期處理等場景。

常用資料庫
Pascal VOC的三個主要物體識別競賽是:分類,檢測和分割(classification, detection, and segmentation)。
對於分割任務, VOC2012的trainval包含2007-2011年的所有對應圖片, test只包含2008-2011。trainval有 2913張圖片共6929個物體。

模型網路
介紹: DeepLabv3+是DeepLab語義分割系列網路的最新作,其前作有 DeepLabv1,DeepLabv2, DeepLabv3, 在最新作中。
Xception是DeepLabv3+原始實現的backbone網路,兼顧了精度和效能,適用於服務端部署。
方法: DeepLab的作者通過encoder-decoder進行多尺度資訊的融合,同時保留了原來的空洞卷積和ASSP層, 其骨幹網路使用了Xception模型,提高了語義分割的健壯性和執行速率。
實驗: 在 PASCAL VOC 2012 dataset取得新的state-of-art performance,89.0mIOU。

二、在PaddleSeg上實現人像分割

第一步:PaddleSeg安裝
下載,解壓

第二步:預訓練模型下載
下載預訓練好的DeeplebV3+ xception65模型。
NOTE: ./pretrained_model為PaddleSeg預設的預訓練模型儲存目錄,因此這裡將模型放入該目錄下。

第三步:資料準備
本教程掛載了一個小型的資料集,包含少量人像分割圖片用於測試,資料集位於./data/data10908/humanseg.zip。
NOTE: ./dataset 為PaddleSeg預設的資料集儲存目錄,因此這裡將測試集放入該目錄下。

第四步:模型預測與視覺化
pdseg/vis.py是模型預測和視覺化的指令碼。
PaddleSeg中關於模型的配置記錄在configs目錄 下的 yaml檔案裡。
在這裡插入圖片描述

三、實現步驟&程式碼
實現思路
安裝PaddleSeg

程式碼


# 從PaddleSeg的github倉庫下載程式碼 
git clone https://github.com/PaddlePaddle/PaddleSeg.git
# 解壓從PaddleSeg Github倉庫下載好的壓縮包
!unzip -o PaddleSeg.zip
# 執行指令碼需在PaddleSeg目錄下
%cd
# 安裝所需依賴項
!pip install -r requirement.txt

# 下載預訓練模型並放入./pretrained_model目錄下
%cd /home/aistudio/PaddleSeg/pretrained_model/
!wget https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz
!tar -xf deeplabv3p_xception65_humanseg.tgz
%cd ..

# 將測試資料集放入./dataset目錄下
!cp ~/data/data10908/humanseg.zip dataset/
!unzip -o humanseg.zip -d dataset/

# 將配置檔案humanseg.yaml複製到configs目錄下
!cp ~/work/humanseg.yaml configs/
# 模型預測
!phthon ./pdseg/vis.py --cfg ./configs/humanseg.yaml \
					   --vis_dir ./visual \
					   --use_gpu \
					   DATASET.DATA_DIR "dataset/humanseg" \
					   DATASET.VIS_FILE_LIST "dataset/humanseg/test_list.txt"
					   TEST.TEST_MODEL "pretrained_model/deeplabv3_xception65_humanseg"

# 顯示最終的分割效果
import matplotlib.pyplot as plt
from PIL import Image
# 定義顯示函式
def display(img_dir):
	plt.figure(figsize=(15, 15))
	title = ['Input Image', 'Predicted Mask']
	for i in range(len(title)):
		plt.subplot(1, len(img_dir), i+1)
		plt.title(title[i])
		img = plt.imread(img_dir[i])
		plt.imshow(img)
		plt.axis('off')
	plt.show()
# 顯示分割效果
# 注:僅顯示其中一張圖片的效果。    
#image_dir = "dataset/humanseg/aa6b34b24414bafa7fab8393239c793587513ce6.jpg"
#mask_dir = "visual/aa6b34b24414bafa7fab8393239c793587513ce6.png"
# image_dir = "dataset/humanseg/aa6ff076c7360b8dabc30edd05ebafb65bba9343.jpg"
# mask_dir = "visual/aa6ff076c7360b8dabc30edd05ebafb65bba9343.png"
image_dir = "dataset/humanseg/56173ddd1ccb419e1efdeb5f5cb242ab160142cb.jpg"
mask_dir = "visual/56173ddd1ccb419e1efdeb5f5cb242ab160142cb.png"
imgs = [image_dir, mask_dir]
display(imgs)

im = Image.open(image_dir)#返回一個Image物件
print('image寬:%d,image高:%d'%(im.size[0],im.size[1]))

ma = Image.open(image_dir)#返回一個Image物件
print('mask寬:%d,mask高:%d'%(ma.size[0],ma.size[1]))

一些術語

  • 語義分割庫

相關文章