文章目录
前言
在之前的文章中实践了阿里云的文字转语音大模型,感觉还是挺有意思的,效果也挺不错的,感兴趣的可以看下阿里云 CosyVoice 语音合成大模型 API 实践,今天我们来尝试下通义万像的人像写真功能,先看下我生成的效果图,上边一行是我自拍照片,下边是我使用官方预设模板生成的写真图:
阿里云 API 实践流程
- 开通灵积服务,获得API-KEY;
- 通过“申请体验”申请FaceChain人物写真生成体验权限,并获得通过;
- 开发调用人物图像检测API,进行用户上传图像的质量校验,非必选链路,可以用于产品中进行前置校验,及时提醒用户更换质量不合格的图像。详情参考人物图像检测API详情;
- 图像文件打包,上传并管理文件,详情参考模型定制文件管理服务;
- 开发调用人物形象训练API,进行自定义人物的模型定制,并获得定制模型ID。详情参考人物形象训练API详情;
- 基于已经训练完成的定制模型ID,开发调用人物写真生成API,选择目标风格模板,发起请求并获得写真结果。详情参考人物写真生成API详情;
这里不对阿里云的通义万像进行赘述,感兴趣的可以查看官方文档说明,本文重在说明实战步骤,和中间需要注意的一些地方。
开通模型定制文件管理服务
如果我们没有开通阿里云的 OSS ,我们可以使用这个官方提供的免费的模型定制文件管理服务,将我们需要训练的图片上传上去,在后边的 API 中需要用到这些图片的路径。
上传文件
为了简单,我使用了 Postman 来上传训练文件,对应的 curl 请求如下,读者需要将其中的 key 替换为自己开通的 API-KEY.
curl --location 'https://dashscope.aliyuncs.com/api/v1/files' \
--header 'Content-type: multipart/form-data' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=d7b5f687-f2ad-97a8-af18-28e1768ebf51d8779708fdadc47b647bffc5851da154' \
--form 'files=@"/C:/Users/14170/Pictures/1.jpg"' \
--form 'descriptions="我的证件照"'
上传成功后会返回文件 id.
查询文件列表
postman 对应 curl 请求如下:
curl --location 'https://dashscope.aliyuncs.com/api/v1/files?page_no=1&page_size=10' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=d7b5f687-f2ad-97a8-af18-28e1768ebf51d8779708fdadc47b647bffc5851da154'
查询成功会返回上传文件的信息,这里的 url 比较重要,后边我们在训练图像和生成写真的时候都会用到。
还有获取指定文件信息和删除文件的接口,因为我们暂时用不到就不在这里赘述了,感兴趣的同学可以查看下官网:模型定制文件管理服务接口说明。
人物图像检测(非必须)
对用户上传的人物图像进行检测,判断其中所包含的人脸是否符合facechain微调所需的标准,检测维度包括人脸数量、大小、角度、光照、清晰度等多维度,支持图像组输入,并返回每张图像对应的检测结果。
该步骤不是必须的,但是在生成写真前,建议检测下,这样可以保证我们生成的图片更加符合我们的预期。
为了简单点,这里直接使用 Postman 调用检测,在实际的项目中,一般是使用代码请求检测。
Postman 对应 curl 请求:
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/vision/facedetection/detect' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=bf7b1f86-a4e8-98d0-9747-b4c36b64b013c98e2ba3e95bd8c2ef49422d9b383e00' \
--data '{
"model": "facechain-facedetect",
"input": {
"images": ["http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1730896533425448/131337/51791846-324a-4e1a-9b12-f9e37847d897/1.jpg?Expires=1719733342&OSSAccessKeyId=LTAI5tHvsJDXf7ndvNyYzVYD&Signature=mxa3PUF83okXvOZ8H977kPz9nSg%3D"]
}
}'
- 请求参数中的 images 路径就是我们前边上传的文件路径
- 当图片检测通过后,会返回 true, 不通过 false
人物形象训练
对上传的图像压缩包进行模型训练,从而获得该图像中对应人物的resource,基于该resource可以实现人物的写真生成。
人物形象训练是人物写真生成的前置环节,只有在针对某人物进行形象训练并成功获得形象resource后,才可基于此进行生成。
这里调用训练 API 算法比较耗时,接口是异步提交的,提交成功后会返回一个 JOB id, 并且显示状态为 pending 状态,curl 请求如下:
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=bf7b1f86-a4e8-98d0-9747-b4c36b64b013c98e2ba3e95bd8c2ef49422d9b383e00' \
--data '{
"model": "facechain-finetune",
"training_file_ids": [
"http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1730896533425448/131337/51791846-324a-4e1a-9b12-f9e37847d897/1.jpg?Expires=1719733342&OSSAccessKeyId=LTAI5tHvsJDXf7ndvNyYzVYD&Signature=mxa3PUF83okXvOZ8H977kPz9nSg%3D"
]
}'
解下来我们通过 job_id 查询训练任务状态, curl 请求如下:
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=66b92c11-fe4e-98e8-9c82-7f46c3fd0e1272d64a17883e374b93f3f92000930ed8' \
--data ''
看到任务状态为成功后,我们就可以执行下一步操作了,否则记得要轮训查询任务状态,知道任务成功或者失败。
人物写真生成
当我们的图像训练完成后,我们就可以执行任务写真生成的接口了,这里官方提供了两种生成方式:
-
预设模版,就是官方提供了一些模板风格,目前已有的风格模板如下:
-
用户自定义模板,如果使用自定义模板,我们在生成写真的时候就得多提供一个模板图片的信息。
用户输入图像:
自定义模板图像:
生成结果:
预设模板生成
生成写真
curl 请求:
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/album/gen_potrait' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <PI-KEY>' \
--header 'X-DashScope-Async: enable' \
--header 'Cookie: acw_tc=66b92c11-fe4e-98e8-9c82-7f46c3fd0e1272d64a17883e374b93f3f92000930ed8' \
--data '{
"model": "facechain-generation",
"resources": [
{
"resource_id": "facechain-finetune-ft-202406291705-a5cb",
"resource_type": "facelora"
}
],
"style": "f_business_male",
"parameters": {
"size": "512*512",
"n": 4
}
}'
- 请求参数 headers 中加了一个参数
'X-DashScope-Async: enable'
表明该接口是异步提交的,因为生成任务比较耗时,建议异步提交 - Body 参数说明:
- model: 人物生成大模型名称,默认就填 facechain-generation
- resources:生成人物所需资源信息,就是我们前边训练人物图像成功后,查询状态返回的
finetuned_output
内容。 - style: 官方预设模板风格名称:
- f_idcard_male(证件照男)
- f_business_male(商务写真男)
- f_idcard_female(证件照女)
- f_business_female(商务写真女)
- m_springflower_female(春日花园)
- f_summersport_female(夏日运动)
- f_autumnleaf_female(秋日印象)
- m_winterchinese_female(冬日国风)
- f_hongkongvintage_female(港风复古)
- f_lightportray_female(轻写真)
- parameters:生成图像像素大小和数量信息。
查询任务状态
curl 请求:
curl --location 'https://dashscope.aliyuncs.com/api/v1/tasks/f90e4f68-62a1-4f31-94a5-bf2fb322568a' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=072c1394-8a2e-985c-9d43-9d59e010bf5485059e275f65ef49e7f3c45f5bb2e6e2'
可以看到我们的任务执行失败了,失败原因是我选择的官方模板:证件照男,不符合默认尺寸要求,接下来我重新选择一个新的官方模板:f_business_male 商务写真男,并且重新执行下生成写真请求,curl 请求如下:
curl --location 'https://dashscope.aliyuncs.com/api/v1/tasks/f90e4f68-62a1-4f31-94a5-bf2fb322568a' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Cookie: acw_tc=072c1394-8a2e-985c-9d43-9d59e010bf5485059e275f65ef49e7f3c45f5bb2e6e2'
我们看下生成的效果:
上边是我以前的一张证件照,下边是AI 帮我生成的两张简单写真,可以发现还是有几分相似的,我如果训练的时候多加几张照片,效果可能会更好。
下边是我使用三张照片训练后使用官方模板生成的照片,基本上和我本人已经很像了:
自定义模板生成
可惜官方没有彭于晏的8块腹肌的模板,我在网上找了下8块腹肌的照片,下边我们使用这张照片来当模板看下效果如何。
首先调用前边的文件管理服务将我们的模板照片上传上去。
自定义模板生成和预设模板生成用的都是同一个接口,参数不同,curl 请求如下, 我们只需要将 style 改为 portrait_url_template
然后再将模板 URL 写入 input 参数即可:
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/album/gen_potrait' \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'X-DashScope-Async: enable' \
--header 'Cookie: acw_tc=a044e7aa-b3a5-9a80-a6d4-c731acda9490973cf5437b00fae8372365086ecce321' \
--data '{
"model": "facechain-generation",
"resources": [
{
"resource_id": "facechain-finetune-ft-202406291821-638c",
"resource_type": "facelora"
}
],
"input": {
"template_url": "http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1730896533425448/131337/0ea35648-7b88-4cee-9b76-081ded04edd8/9.png?Expires=1719745944&OSSAccessKeyId=LTAI5tHvsJDXf7ndvNyYzVYD&Signature=cXQC8u5cwQq%2B5iaLcOKXErBClU0%3D"
},
"parameters": {
"style": "portrait_url_template",
"size": "768*1024",
"n": 4
}
}'
查看效果,哈哈哈虽然和我不太像,但是还是很爽的:
总结
因为我训练使用我的照片太少了,导致和我不能特别像,但是根据区区几张照片有这个相似度已经很厉害了,同学们可以尝试多上传点照片至文件服务里,然后在训练的时候多用几张照片训练下,效果应该会比我这个更好。
上边我为了简单,直接使用 Postman 调用的 API 接口,我们可以将它做成接口封装成小程序,给身边的亲朋好友show 一把,让他们也体验 AI 带来的乐趣,学会分享才会快乐。
我可以将其整个逻辑封装为 Python 脚本,给大家使用,这里我就偷下懒,就不写了,有需要的小伙伴可以在评论告诉我,我把脚本写好发给你。