前言
随着移动互联网的普及,随时随地拍照已成为人们生活中不可或缺的一部分。然而,很多时候在拍照时,我们无法掌控周围环境的光线、角度以及背景等因素,导致拍出的照片效果并不如意。其中一个常见的问题是背景杂乱,这时我们就需要用到人像背景自动去除服务。
本文将介绍如何基于 Serverless 与机器学习实现人像背景自动去除服务,这不仅可以帮助你把焦点放在重要的主体上,同时也可以让你的照片更加美观。
服务架构
上图为本文所用服务的架构图。用户上传带有人像的照片至对象存储服务,并触发事件通知函数,函数将照片交由机器学习服务进行背景去除处理,得到只有人像的照片,并将其返回给用户。
实现步骤
1. 创建对象存储服务
本文使用阿里云对象存储 OSS 作为存储照片的服务,读者可以根据自己的需求选择其他云服务商提供的对象存储服务。
创建完对象存储服务后,需要在存储桶设置中配置事件通知功能,并设置事件通知的目标为函数计算服务。
2. 创建机器学习服务
本文使用阿里云机器学习 PAI 作为处理背景去除的服务,读者可以根据自己的需求选择其他云服务商提供的机器学习服务。
在创建机器学习服务时,需要上传一定数量的有标注数据集,用于训练模型。数据集的标注可以通过图像标注工具或人工标注等方式完成。
3. 创建函数计算服务
本文使用阿里云函数计算服务作为事件通知的处理服务,读者可以根据自己的需求选择其他云服务商提供的函数计算服务。
在创建函数计算服务时,需要上传处理照片的代码包,在代码中调用机器学习服务进行背景去除处理,并将处理后的照片上传至对象存储服务。
4. 测试服务
创建完服务后,可以上传一些带有人像的照片进行测试,查看服务是否正常工作。
代码示例
函数计算代码
import logging import requests import traceback from io import BytesIO from PIL import Image logger = logging.getLogger() def handler(event, context): logger.info(event) for record in event['Records']: if 'oss' in record: oss = record['oss'] bucket_name = oss['bucket']['name'] object_key = oss['object']['key'] url = f"https://{bucket_name}.oss-cn-hangzhou.aliyuncs.com/{object_key}" response = requests.get(url) try: if response.status_code == 200: img = Image.open(BytesIO(response.content)) img = img.convert('RGB') response = requests.post("https://dtplus-cn-shanghai.data.aliyuncs.com/image/tag", headers={ "Content-Type": "application/json", "Authorization": "APPCODE YOUR_APPCODE" }, json={ "imageUrl": url }) response_json = response.json() result = response_json['tags'][0]['value'] if result == '1': logger.info('not a human image') return response = requests.post("https://dtplus-cn-shanghai.data.aliyuncs.com/face/attribute", headers={ "Content-Type": "application/json", "Authorization": "APPCODE YOUR_APPCODE" }, json={ "type": 0, "content": url }) response_json = response.json() attributes = response_json['faceList'][0]['attribute'] if attributes['maskprobability'] > 0.5: logger.info('wearing a mask') return # TODO: 使用机器学习服务进行背景去除处理,并将处理后的照片上传至对象存储服务 else: logger.info(f'response status code {response.status_code}') except Exception as e: logger.error(str(e)) logger.error(traceback.format_exc())
上述代码使用对象存储服务提供的事件通知功能,当有照片上传至存储桶时,代码将读取照片内容并发送到机器学习服务进行处理,并将处理后的结果上传至对象存储服务。
机器学习代码
本文不涉及机器学习模型的训练部分,读者可以使用已经训练好的模型来处理照片。下面是一个简单的 Python 代码示例,使用已经训练好的背景去除模型对照片进行处理。
import paddlehub as hub from PIL import Image import numpy as np model = hub.Module(name="deeplabv3p_xception65_humanseg") def remove_background(image_file): img = Image.open(image_file) img = np.array(img) results = model.segmentation(images=[img]) mask = results[0]['data'] mask = Image.fromarray(mask.astype('uint8')).resize(img.size, resample=Image.NEAREST) image = Image.new('RGBA', img.size, (0, 0, 0, 0)) image.paste(Image.fromarray(img)) image.putalpha(mask.split()[0]) return image
上述代码将照片读取为数组,然后使用 PaddleHub 的 deeplabv3p_xception65_humanseg 模型进行背景去除处理,并返回处理后的带有 alpha 通道的图片。
总结
本文介绍了如何基于 Serverless 与机器学习实现人像背景自动去除服务,并提供了代码示例。读者可以根据本文所述的方法和思路,自行搭建自己的服务,同时根据实际需求进行调整和优化。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b6b9a0add4f0e0fff60071