paddlehub 使用体验-视频抠图_乘风破浪的姐姐_人美路子野 2020-08-13
paddlehub 使用體驗-視頻摳圖_乘風(fēng)破浪的姐姐_人美路子野
PaddleHub就是為了解決對深度學(xué)習(xí)模型的需求而開發(fā)的工具。 基于飛槳領(lǐng)先的核心框架, 精選效果優(yōu)秀的算法, 提供了百億級大數(shù)據(jù)訓(xùn)練的預(yù)訓(xùn)練模型, 方便用戶不用花費(fèi)大量精力從頭開始訓(xùn)練一個模型。
PaddleHub的github地址: https://github.com/PaddlePaddle/PaddleHub
首先介紹paddlehub的主要優(yōu)勢:
- 模型一鍵下載、 管理、 預(yù)測
- 遷移學(xué)習(xí)
Fine-tune API: 十行代碼完成遷移學(xué)習(xí)
AutoDL Finetuner: 一鍵自動超參搜索 - 端到端部署
Hub Serving: 一鍵模型服務(wù)化部署
接下來實踐部分:
實踐介紹:主要對乘風(fēng)破浪的姐姐中人美路子野mv進(jìn)行人像摳圖,然后更換背景后,合并成新的一個視頻。采用該mv是因為該視頻中人物鮮明,為順序出場安排,更加方便的查看模型摳圖后的效果。
點擊查看: 素材視頻傳送門
1.[ 模型即軟件 ] 是paddlehub的使用原則,因此,使用paddlehub中的模型,重點應(yīng)偏向于應(yīng)用,拿來就用就OK了。
- PaddleHub的官網(wǎng): https://www.paddlepaddle.org.cn/hub
- PaddleHub的課程地址: https://aistudio.baidu.com/aistudio/course/introduce/1070
- PaddleHub的官方教程地址: https://aistudio.baidu.com/aistudio/personalcenter/thirdview/79927
- 直接在AiStudio上對paddlehub進(jìn)行一個安裝。
2. 主要流程是:視頻分幀–>進(jìn)行摳圖–>添加背景圖片–>將每個圖片合并成視頻
首先看下文件目錄結(jié)構(gòu):
然后加載預(yù)訓(xùn)練模型:加載模型時候是要輸入模型名稱即可,此處使用的模型是 “deeplabv3p_xception65_humanseg”
預(yù)測結(jié)果(即摳圖的效果)進(jìn)行展示:
# 預(yù)測結(jié)果展示 out_img_path = 'humanseg_output/' + os.path.basename(test_img_path[0]).split('.')[0] + '.png' img = mpimg.imread(out_img_path) plt.figure(figsize=(10,10)) plt.imshow(img) plt.axis('off') plt.show()
將扣出的人物圖片與選擇的背景圖片進(jìn)行融合主要函數(shù):
效果展示:
3. GIF函數(shù)處理
def create_gif(gif_name, path, duration=0.3):'''生成gif文件,原始圖片僅支持png格式gif_name : 字符串,所生成的 gif 文件名,帶 .gif 后綴path : 需要合成為 gif 的圖片所在路徑duration : gif 圖像時間間隔'''frames = []pngFiles = os.listdir(path)image_list = [os.path.join(path, f) for f in pngFiles]for image_name in image_list:frames.append(imageio.imread(image_name))# 保存為 gifimageio.mimsave(gif_name, frames, 'GIF', duration=duration)returndef split_gif(gif_name, output_path, resize=False):'''拆分gif文件,生成png格式,便于生成gif_name : gif 文件路徑,帶 .gif 后綴path : 拆分圖片所在路徑'''gif_file = Image.open(gif_name)name = gif_name.split('/')[-1].split('.')[0]if not os.path.exists(output_path): # 判斷該文件夾是否存在,如果存在再創(chuàng)建則會報錯os.mkdir(output_path)for i, frame in enumerate(ImageSequence.Iterator(gif_file), 1):if resize:frame = frame.resize((300, 168), Image.ANTIALIAS)frame.save('%s/%s_%d.png' % (output_path, name, i)) # 保存在等目錄的output文件夾下def plot_sequence_images(image_array):''' Display images sequence as an animation in jupyter notebookArgs:image_array(numpy.ndarray): image_array.shape equal to (num_images, height, width, num_channels)'''dpi = 72.0xpixels, ypixels = image_array[0].shape[:2]fig = plt.figure(figsize=(ypixels/dpi, xpixels/dpi), dpi=dpi)im = plt.figimage(image_array[0])def animate(i):im.set_array(image_array[i])return (im,)anim = animation.FuncAnimation(fig, animate, frames=len(image_array), interval=500, repeat_delay=1, repeat=True)display(HTML(anim.to_html5_video()))# 合成GIF create_gif('image/blend_out/blend_res_wushu.gif', './wushu_frame', duration=0.5)imgs = [] for i, fname in enumerate(os.listdir('image/blend_out/wushu/')): img = cv2.imread('image/blend_out/wushu/' + fname)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) imgs.append(img_rgb) plot_sequence_images(imgs)效果展示:
4. 將分割后的圖片與背景圖進(jìn)行合并
# 合成圖片 humanseg_wushu = [filename for filename in os.listdir('./humanseg_output/') if filename.startswith("wushu")] # print(humanseg_wushu)for i, img in enumerate(humanseg_wushu):# print(i)# if i > 50: continue img_path = os.path.join('./wushu_frame/wushu_%d.png' % (i+1))# print(img_path)output_path_img = output_path + 'wushu/%d.png' % i# print(output_path_img)blend_images(img_path, './image/test/12.png', output_path_img)5. 輸出視頻,成avi格式
# 合并輸出視頻 humanseg_wushu = [filename for filename in os.listdir('image/video/frame_seg/')] for i, img in enumerate(humanseg_wushu):if i <= 145 or (i >= 250 and i <= 427) or (i >= 552 and i <= 601) or (i >= 729 and i <= 761):img_path = os.path.join('image/video/frame_seg/%d.png' % (i+1))output_path_img = output_path + 'video/%d.png' % iimg = blend_images(img_path, 'image/test/bg2.jpg', output_path_img)if (i >= 146 and i <= 249) or (i >= 428 and i<= 551) or (i >= 602 and i<= 728):img_path = os.path.join('image/video/frame_seg/%d.png' % (i+1))output_path_img = output_path + 'video/%d.png' % iimg = blend_images(img_path, 'image/test/bg3.jpg', output_path_img)效果展示:
后期處理:
為視頻添加音頻文件。
點擊查看: 處理后的完整視頻傳送門 因音頻是后期加上去的,所以未免會出現(xiàn)口型對不上的情況。
總結(jié):
1、paddlehub為想要直接使用框架處理具體問題的用戶提供了便捷。
2、paddlehub也可以快速驗證一些你的想法。
3、有時間可以通過閱讀paddlehub在github上面的源碼來獲得對模型以及訓(xùn)練過程更加深刻的認(rèn)識。
最后: 圖文并茂的使用指南
總結(jié)
以上是生活随笔為你收集整理的paddlehub 使用体验-视频抠图_乘风破浪的姐姐_人美路子野 2020-08-13的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode 1220】 Coun
- 下一篇: E. Vowels(SOSdp的简单转化