百度Paddle-Hub项目实践—AI帮你证件照换底色
前言: 详细的paddlehub项目和文档请看paddlehub安装文档和paddlehub使用文档
提示: 在本地安装时需要特别注意版本问题,严格按照推荐的版本,可以大大减小报错情况。
一.项目具体实现细节介绍
1. 导入相关的包,加载原图像并进行显示
import paddlehub as hub
import cv2
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
test_img_path = "D:/Mechine_learning_data/2girl.jpg"
img = cv2.imread(test_img_path)
cv2.imshow('org',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
显示图像为:
2. 使用Paddle-hub中的deeplabv3p_xception65_humanseg模型进行智能抠图,获取得到的轮廓,此轮廓比传统图像处理的Mask更具有鲁棒性。
注:关于deeplabv3p_xception65_humanseg模型的具体介绍可见其官网,这里主要进行利用此模型输出,进行后续图像处理,实现证件照片换底色,通过寥寥代码达到高级PS修图师的水平!
human_seg = hub.Module(name='deeplabv3p_xception65_humanseg')
result = human_seg.segmentation(images=[cv2.imread(test_img_path)],visualization=True,output_dir='./')
print(result)
# 将轮廓保存为图片
res_image = Image.fromarray(np.uint8(result[0]['data']))
path = "D:/python_code/Jupyter Notebook/paddleee/new.jpg"
res_image.save(path)
3. 加载保存的轮廓并显示,接着对其进行二值化处理,然后进行图像的腐蚀膨胀操作,得到输出结果,根据结果调整参数值。
counter_img_path = path
img_counter = cv2.imread(counter_img_path)
img_gray = cv2.cvtColor(img_counter,cv2.COLOR_BGR2GRAY)
ret,thresh1 = cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
erode = cv2.erode(thresh1,kernel,iterations=2)
dilate = cv2.dilate(erode,kernel,iterations=2)
cv2.imshow('dilate',dilate)
cv2.imshow('erode',erode)
cv2.imshow('gray_img',img_gray)
cv2.imshow('binary_img',thresh1)
cv2.imshow('counter_img',img_counter)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
这里为了做统一显示,就放到了一起,但在实际使用的过程中,需要自行调节参数值,包括二值化分割的阈值,腐蚀膨胀是否全都需要,以及核的大小,腐蚀次数的多少等。
下面给出这几种操作的原理和opencv_python的编写方法:
关于图像二值化的文章:友情提示:先变成灰度图再二值化
关于图像腐蚀膨胀操作的文章:友情提示:先腐蚀,后膨胀
4. 通过以上的轮廓图可以发现,背景的像素都为黑色,即0,此时遍历整张轮廓图片,如果像素值为0,则用红色背景色代替原图的蓝色背景色,代码实现如下:
HEIGHT = img_counter.shape[0]
WEIGHT = img_counter.shape[1]
CHANNLE = img_counter.shape[2]
for i in range(HEIGHT):
for j in range(WEIGHT):
if dilate[i,j] == 0:
img[i,j] = [0,0,255]
cv2.imshow('change_img',cv2.resize(img,dsize=None,fx=0.5,fy=0.5,interpolation = cv2.INTER_NEAREST))
# cv2.imwrite('D:/python_code/Jupyter Notebook/paddleee/red_img_zhou.jpg',img)# 保存图片的方法
cv2.waitKey(0)
cv2.destroyAllWindows()
最终换底的图片结果为:
如此便实现了证件照片换底色的功能,但是由于图片本身各有差异,因此想要得到较好的结果,还需要精细地调整上面提到的参数。
二. 模型部署
paddle-hub提供了部署服务
详细部署过程参考paddle-hub官网
三. 实践总结
paddle-hub是一个很优秀的平台,适合小白上手深度学习,不需要复杂的训练过程,另外百度大大提供的课程和算力都很强大,教师团队也很负责,强烈推荐百度深度学习的两门免费课程: