快捷搜索:  汽车  科技

人工智能抠图遮罩:148.人工智能MODNet网络模型

人工智能抠图遮罩:148.人工智能MODNet网络模型-25MB大小精度modnet_photographic

MODNet是一个仅需RGB图片输入实时人像抠图模型。本文主要演示一下MODNet Python部署,使用的是飞桨FastDeploy。

预训练ONNX的MODNet模型,下载地址:

https://bj.bcebos.com/paddlehub/fastdeploy/modnet_photographic_portrait_matting.onnx

模型

大小

精度

modnet_photographic

25MB

-


实现主要过程
  • 1、加载下载的modnet模型
  • 2、读取人像图片和背景图片(背景图片高度和宽度需要大于人像图像)
  • 3、根据预测结果,返回人像抠图结果。(背景为纯色,前景为人像)
  • 4、人像与背景合成。
  • (这里使用两种方式合成,一种使用掩模进行图像位操作,一种根据背景像素值遍历)
实现代码:

import cv2 import fastdeploy as fd import numpy as np model_file="modnet-onnx/modnet_photographic_portrait_matting.onnx" model=fd.vision.matting.MODNet(model_file=model_file params_file="" runtime_option=None model_format=fd.Frontend.ONNX) img=cv2.imread("img/77.jpg") #77.jpg 386.jpg 446.jpg bg=cv2.imread("img/bg1.jpg") sbg=bg.copy() result=model.predict(img.copy()) #print(result) # 可视化结果 vis_img = fd.vision.vis_matting_alpha(img result) #print(vis_img[0 0]) #[153 255 120] #图像合成,背景图像大小不能小于前景图像 需要调整thresh def swap_background_matting1(img bg thresh=127): h0 w0=bg.shape[0] bg.shape[1] h w=img.shape[0] img.shape[1] #在背景中取合并区域,大小与前景一致 roi=bg[(h0-h)//2:(h0-h)//2 h (w0-w)//2:(w0-w)//2 w] img2gray=cv2.cvtColor(img cv2.COLOR_BGR2GRAY) ret mask=cv2.threshold(img2gray 200 255 cv2.THRESH_BINARY) kernel=np.ones((5 5) np.uint8) mask=cv2.morphologyEx(mask cv2.MORPH_OPEN kernel) mask_inv=cv2.bitwise_not(mask) roibg=cv2.bitwise_and(roi roi mask=mask) roifg=cv2.bitwise_and(img img mask=mask_inv) roibgfg=cv2.add(roibg roifg) bg[(h0-h)//2:(h0-h)//2 h (w0-w)//2:(w0-w)//2 w]=roibgfg return bg # bg=swap_background_matting1(vis_img bg 200) #根据背景像素,遍历实现背景与人像合成 def swap_background_matting2(vis_img bg): hbg wbg=bg.shape[0] bg.shape[1] #背景大小 hfg wfg=img.shape[0] img.shape[1] #原图大小 #遍历人像与背景合成, for i in range(hfg): for j in range(wfg): if vis_img[i j 0]==vis_img[0 0 0] and vis_img[i j 1]==vis_img[0 0 1] and vis_img[i j 2]==vis_img[0 0 2]: continue bg[i (hbg-hfg)//2 j (wbg-wbg)//2] = vis_img[i j] return bg bg=swap_background_matting2(vis_img bg) dst=np.hstack((img vis_img)) cv2.imshow("result" dst) bgdst=np.hstack((sbg bg)) cv2.imshow("bgdst" bgdst) cv2.waitKey(0) cv2.destroyAllWindows() 实现效果

人工智能抠图遮罩:148.人工智能MODNet网络模型(1)

人像抠图效果1

人工智能抠图遮罩:148.人工智能MODNet网络模型(2)

掩模方式合成效果

人工智能抠图遮罩:148.人工智能MODNet网络模型(3)

遍历方式合成效果


人工智能抠图遮罩:148.人工智能MODNet网络模型(4)

人像抠图效果2

人工智能抠图遮罩:148.人工智能MODNet网络模型(5)

遍历方式合成效果


人工智能抠图遮罩:148.人工智能MODNet网络模型(6)

人像抠图效果3

人工智能抠图遮罩:148.人工智能MODNet网络模型(7)

遍历方式合成效果

从背景与人像合成方式来说,掩模方式需要调整阈值大小,并做一些图像的开与闭操作。遍历方式合成背景与人像更直接方便。

从抠图效果和速度来看,效果很好,速度也非常快。

猜您喜欢: