该教程介绍了使用PaddleHub实现人物佩戴学士帽的流程:导入相关包后,展示人物图片,通过ultra_light_fast_generic_face_detector_1mb_640模型检测人脸,调整学士帽尺寸、角度和偏移量合成图片,还包含HubServing轻量级服务化部署,且可按需修改数据集类型。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

此教程展示使用了尽量少的代码实现在人物上佩戴学士帽 paddlehub模型部署服务端Serving部署
并且可以根据自己的需要修改数据集的类型实现不同类型
流程:
1、导入相关的包
2、展示需要人物图片
3、脸部检测
4、合成带学士帽图片
5、HubServing轻量级服务化部署
原图:
变换后:
原图+学士帽:
(PS:示例图片均来源于互联网,如有侵权,请联系删除)
import numpy as npimport matplotlib.image as mpimgimport matplotlib.pyplot as pltimport osfrom PIL import Imageimport paddlehub as hubimport cv2import shutil
test_img_path = ["work/test.png"]#需要戴头饰的人物照片import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(test_img_path[0])
# 展示待预测图片plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()<Figure size 720x720 with 1 Axes>
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
import paddlehub as hub
module = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_640")
input_dict = {"image": test_img_path}# execute predict and print the resultresults = module.face_detection(data=input_dict, visualization=True)for result in results: print(result)[2022-06-15 18:29:31,819] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
{'data': [{'left': 322.3936462402344, 'right': 423.6573791503906, 'top': 264.9285583496094, 'bottom': 397.74920654296875, 'confidence': 0.9989694356918335}], 'path': 'work/test.png', 'save_path': 'face_detector_640_predict_output/test.png'}可以对学士帽进行调节尺寸大小、角度
if os.path.exists('./HeCheng'): pass else:
os.mkdir('./HeCheng')#创建文件夹test_path='work/test.png'#需要合成人物的图片toushi='work/学士帽.png'#学士帽照片#后处理:调整帽子maozi = Image.open('work/学士帽.png')
maozi2copy = maozi.copy()
maozi2copy = maozi2copy.rotate(-5)#调整角度maozi2copy = maozi2copy.resize((240,130))#调整大小savepath='HeCheng'#保存合成后图片文件夹x = results[0]if x.get('data'):
for result in results: print(result) # box 为头像在图片中的位置
# box(x1, y1, x2, y2)
# x1,y1 为头像左上角的位置
# x2,y2 为头像右下角的位置
x1 = results[0]['data'][0]['left']
y1 = results[0]['data'][0]['top']
x2 = results[0]['data'][0]['right']
y2 = results[0]['data'][0]['bottom']
# 学士帽图片尺寸,和resize相同
fruit_size = (240, 130)
#调整偏移量
addx = -65 #这个可以根据实际情况调节,越大越往右(注意是负值)
addy = -50 #这个可以根据实际情况调节,越大越往下(注意是负值)
box = (int(x1)+addx,int(y1)+addy,int(x1)+fruit_size[0]+addx,int(y1)+ fruit_size[1]+addy) #print(x1)
pil_im1 = Image.open(test_path) # pil_im2 = Image.open(toushi).convert('RGBA')
region = pil_im1.crop(box)#cut from the picture
region = region.transpose(Image.ROTATE_270)#rotate the image
pil_im1.paste(maozi2copy, box, maozi2copy)
plt.imshow(pil_im1)
pil_im1.save(savepath+'/'+'合成.png')#合成后的图片else: print("没有检测到"){'data': [{'left': 322.3936462402344, 'right': 423.6573791503906, 'top': 264.9285583496094, 'bottom': 397.74920654296875, 'confidence': 0.9989694356918335}], 'path': 'work/test.png', 'save_path': 'face_detector_640_predict_output/test.png'}<Figure size 432x288 with 1 Axes>
!hub serving start -m ultra_light_fast_generic_face_detector_1mb_640
这一步请在 终端-1 执行 执行成功后会出现以下画面
# !hub serving start -m ultra_light_fast_generic_face_detector_1mb_640
然后通过客服端向服务器发送请求
发送成功后会出现以下画面
# coding: utf8%matplotlib inlineimport matplotlib.pyplot as plt # plt 用于显示图片import requestsimport jsonimport cv2import base64import numpy as npimport colorsysimport warningsimport matplotlib.image as mpimgimport osfrom PIL import Imageimport paddlehub as hubimport shutil
warnings.filterwarnings("ignore")
plt.figure(figsize=(12,8))def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1] return base64.b64encode(data.tostring()).decode('utf8')if __name__ == '__main__': # 获取图片的base64编码格式
img1 = cv2_to_base64(cv2.imread("/home/aistudio/work/test.png")) #img2 = cv2_to_base64(cv2.imread("MyDataset/images/hard_hat_workers1457.png"))
data = {'images': [img1]} # data = {'images': [img1]}
# 指定content-type
headers = {"Content-type": "application/json"} # 发送HTTP请求
url = "http://127.0.0.1:8866/predict/ultra_light_fast_generic_face_detector_1mb_640"
r = requests.post(url=url, headers=headers, data=json.dumps(data)) # 打印预测结果,注意,r.json()["results"]本身就是一个数组,要取到对应图片的人脸关键点预测结果
print(r.json()["results"])
if os.path.exists('./HeCheng'): pass
else:
os.mkdir('./HeCheng')#创建文件夹
test_path='/home/aistudio/work/test.png'#需要合成人物的图片
toushi='/home/aistudio/work/学士帽.png'#学士帽照片
#后处理:调整帽子
maozi = Image.open('work/学士帽.png')
maozi2copy = maozi.copy()
maozi2copy = maozi2copy.rotate(-5)#调整角度
maozi2copy = maozi2copy.resize((240,130))#调整大小
savepath='HeCheng'#保存合成后图片文件夹
x = results[0] if x.get('data'):
for result in results: print(result) # box 为头像在图片中的位置
# box(x1, y1, x2, y2)
# x1,y1 为头像左上角的位置
# x2,y2 为头像右下角的位置
x1 = results[0]['data'][0]['left']
y1 = results[0]['data'][0]['top']
x2 = results[0]['data'][0]['right']
y2 = results[0]['data'][0]['bottom']
# 学士帽图片尺寸,和resize相同
fruit_size = (240, 130)
#调整偏移量
addx = -65 #这个可以根据实际情况调节,越大越往右(注意是负值)
addy = -50 #这个可以根据实际情况调节,越大越往下(注意是负值)
box = (int(x1)+addx,int(y1)+addy,int(x1)+fruit_size[0]+addx,int(y1)+ fruit_size[1]+addy) #print(x1)
pil_im1 = Image.open(test_path) # pil_im2 = Image.open(toushi).convert('RGBA')
region = pil_im1.crop(box)#cut from the picture
region = region.transpose(Image.ROTATE_270)#rotate the image
pil_im1.paste(maozi2copy, box, maozi2copy)
plt.imshow(pil_im1)
pil_im1.save(savepath+'/'+'合成.png')#合成后的图片
else: print("没有检测到")[{'data': [{'bottom': 397.8898620605469, 'confidence': 0.9991759657859802, 'left': 321.9490051269531, 'right': 423.74810791015625, 'top': 265.1085510253906}]}]
{'data': [{'left': 322.3936462402344, 'right': 423.6573791503906, 'top': 264.9285583496094, 'bottom': 397.74920654296875, 'confidence': 0.9989694356918335}], 'path': 'work/test.png', 'save_path': 'face_detector_640_predict_output/test.png'}<Figure size 864x576 with 1 Axes>
以上就是毕业季--学士帽生成器(PaddleHub实现)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号