148.人工智能-MODNet网络模型:实现人像抠图

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

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

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

模型

大小

精度

modnet_photographic

25MB

-


实现主要过程


实现代码:

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()

实现效果

人像抠图效果1

掩模方式合成效果

遍历方式合成效果


人像抠图效果2

遍历方式合成效果


人像抠图效果3

遍历方式合成效果

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

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

展开阅读全文

页面更新:2024-03-20

标签:人像   模型   遍历   人工智能   像素   前景   图像   大小   背景   效果   方式   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top