目錄
前言
開源專案介紹
專案結構
模型下載
測驗資料下載
訓練資料下載
依賴下載
測驗圖片的摳圖效果
測驗視頻的摳圖效果
總結
前言
本文主要介紹一個神奇有意思的開源專案: BackgroundMattingV2
該專案可以將照片或者視頻中人的背景扣掉,變成帶alpha通道的圖片,怎么樣?可以設想一下有什么其他用法,可以給個思路,如果可以拿到摳出背景后的圖片,可以貼在任意背景上,不就可以任意替換照片人物的背景了嗎?還挺有意思哦,
該專案的訓練部分,我會簡述,
開源專案介紹
我們進入專案GitHub頁面,在README部分,我們可以看到作者給出的一些效果,還是很不錯的,

專案對照片與視頻的效果不太一樣,
1)照片是通過原始照片與原始照片的背景圖,兩張圖,摳出帶透明通道的png,
2)視頻是通過原始視頻與背景圖,摳出純綠色背景的人物視頻,

專案給出的素材下載的地址很全,我下面按照專案驗證效果的順序,來把專案跑起來,
專案結構
Pycharm把Github地址專案clone下來,

顏色不一致的是我自己添加的代碼,可忽略,
我們看到作者提供了現成的inference,可以直接去使用,
模型下載
模型下載地址專案README給出了:模型地址

選擇pytorch里面pytorch_resnet50.pth,另一個也可以,看心情,


測驗資料下載
我們下載一些測驗資料:測驗資料
選擇一些圖片、視頻以及對應的背景圖,下載下來做測驗使用,

訓練資料下載
這部分資料看你的需要,如果直接使用作者提供的模型可以忽略這部分,地址:dataset地址
資料還是

依賴下載
專案中的requirements.txt提供了專案所需要的依賴,如下:
kornia==0.4.1
tensorboard==2.3.0
torch==1.7.0
torchvision==0.8.1
tqdm==4.51.0
opencv-python==4.4.0.44
onnxruntime==1.6.0
需要注意一下,本機電腦的NVIDIA顯卡驅動是否安裝正確,具體可以參考我的另一篇文章,里面有介紹:Pycharm代碼docker容器運行除錯 | 機器學習系列_阿良的博客-CSDN博客介紹常規的本地化運行機器學習代碼,安裝Anaconda+cuda顯卡驅動支持,許多文章都有介紹,不在此多做贅述了,本文主要是為了解決在作業環境中,本機電腦沒有顯卡,需要將程式運行在帶顯卡的遠程服務器上,本文會介紹如何部署使用顯卡的docker容器、如何使用pycharm連接docker容器運行機器學習代碼,版本Pycharm: 2020.1.3docker:19.03.12python: 3.6.13demo演算法: BackgroundMattingV2部署下面我會按照.https://huyi-aliang.blog.csdn.net/article/details/120556923
測驗圖片的摳圖效果
先觀察一下作者給的inferance_images.py,需要那些引數:
parser = argparse.ArgumentParser(description='Inference images')
parser.add_argument('--model-type', type=str, required=True, choices=['mattingbase', 'mattingrefine'])
parser.add_argument('--model-backbone', type=str, required=True, choices=['resnet101', 'resnet50', 'mobilenetv2'])
parser.add_argument('--model-backbone-scale', type=float, default=0.25)
parser.add_argument('--model-checkpoint', type=str, required=True)
parser.add_argument('--model-refine-mode', type=str, default='sampling', choices=['full', 'sampling', 'thresholding'])
parser.add_argument('--model-refine-sample-pixels', type=int, default=80_000)
parser.add_argument('--model-refine-threshold', type=float, default=0.7)
parser.add_argument('--model-refine-kernel-size', type=int, default=3)
parser.add_argument('--images-src', type=str, required=True)
parser.add_argument('--images-bgr', type=str, required=True)
parser.add_argument('--device', type=str, choices=['cpu', 'cuda'], default='cuda')
parser.add_argument('--num-workers', type=int, default=0,
help='number of worker threads used in DataLoader. Note that Windows need to use single thread (0).')
parser.add_argument('--preprocess-alignment', action='store_true')
parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--output-types', type=str, required=True, nargs='+', choices=['com', 'pha', 'fgr', 'err', 'ref'])
parser.add_argument('-y', action='store_true')
args = parser.parse_args()
主要看一下required為True的引數,都屬于必填引數,為了比較直觀的看到引數的使用,我們不采用直接命令執行的方式,我們通過subprocess呼叫命令,代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/13 22:43
# @Author : 至尊寶
# @Site :
# @File : main1.py
import subprocess
cmd = 'python inference_images.py \
--model-type mattingrefine \
--model-backbone resnet50 \
--model-backbone-scale 0.25 \
--model-refine-mode sampling \
--model-refine-sample-pixels 80000 \
--model-checkpoint "content/pytorch_resnet50.pth" \
--images-src "content/img/" \
--images-bgr "content/bgr/" \
--output-dir "content/output/" \
--output-type com'
print(cmd)
child = subprocess.Popen(cmd, shell=True)
child.wait()
命令說明
1、我們下載的模型是pytorch_resnet50.pth,所以model-backbone選擇resnet50,
2、注意圖片摳圖的images-src與images-bgr為圖片目錄,其中根據檔案名產生對應關系,





3、output-types的型別可以支持'com', 'pha', 'fgr', 'err', 'ref',我們就取com,最終輸出的帶alpha通道的圖片,
執行看看效果



效果很不錯,頭發也比較清楚的摳出來了,
測驗視頻的摳圖效果
觀察一下作者給出的inferance_video.py給出的引數,
parser = argparse.ArgumentParser(description='Inference video')
parser.add_argument('--model-type', type=str, required=True, choices=['mattingbase', 'mattingrefine'])
parser.add_argument('--model-backbone', type=str, required=True, choices=['resnet101', 'resnet50', 'mobilenetv2'])
parser.add_argument('--model-backbone-scale', type=float, default=0.25)
parser.add_argument('--model-checkpoint', type=str, required=True)
parser.add_argument('--model-refine-mode', type=str, default='sampling', choices=['full', 'sampling', 'thresholding'])
parser.add_argument('--model-refine-sample-pixels', type=int, default=80_000)
parser.add_argument('--model-refine-threshold', type=float, default=0.7)
parser.add_argument('--model-refine-kernel-size', type=int, default=3)
parser.add_argument('--video-src', type=str, required=True)
parser.add_argument('--video-bgr', type=str, required=True)
parser.add_argument('--video-target-bgr', type=str, default=None, help="Path to video onto which to composite the output (default to flat green)")
parser.add_argument('--video-resize', type=int, default=None, nargs=2)
parser.add_argument('--device', type=str, choices=['cpu', 'cuda'], default='cuda')
parser.add_argument('--preprocess-alignment', action='store_true')
parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--output-types', type=str, required=True, nargs='+', choices=['com', 'pha', 'fgr', 'err', 'ref'])
parser.add_argument('--output-format', type=str, default='video', choices=['video', 'image_sequences'])
args = parser.parse_args()
我們通過subprocess呼叫命令,代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/14 0:28
# @Author : 至尊寶
# @Site :
# @File : main2.py
import subprocess
cmd = 'python inference_video.py \
--model-type mattingrefine \
--model-backbone resnet50 \
--model-backbone-scale 0.25 \
--model-refine-mode sampling \
--model-refine-sample-pixels 80000 \
--model-checkpoint "content/pytorch_resnet50.pth" \
--video-src "content/video/b8.mp4" \
--video-bgr "content/video/b8.png" \
--output-dir "content/output1/" \
--output-type com'
print(cmd)
child = subprocess.Popen(cmd, shell=True)
child.wait()
引數說明
1、基本和圖片處理的引數差不多,只是換了兩個引數video-src與video-bgr,
2、準備好視頻和背景圖,

驗證一下效果


效果還不錯,頭發還是可以看出來的,
總結
這個開源專案還是很優越的,之后我會把這個專案改造改造,變成可以直接用的工具,
說說專案缺點,都是小缺點,
1、圖片的處理需要使用目錄所謂引數,而不是一張圖,如果需要對單一張圖處理的話,仍然需要使用檔案夾存盤圖片,有點麻煩,
2、每次都會詢問是否需要創建output-dir,看一下代碼中的邏輯:
# Create output directory
if os.path.exists(args.output_dir):
if args.y or input(f'Directory {args.output_dir} already exists. Override? [Y/N]: ').lower() == 'y':
shutil.rmtree(args.output_dir)
else:
exit()
總的來說,該模型的摳圖效果還是很不錯的,只是需要我們二次創作,
分享:
白馬非馬不算境界,白馬是鹿才是境界,——《雪中悍刀行》
如果本文對你有用的話,請不要吝嗇你的贊,謝謝!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357120.html
標籤:python
