吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2161|回复: 18
收起左侧

[Python 原创] Python免费调用腾讯云API实现人脸年龄变化

  [复制链接]
lianxiang1122 发表于 2024-4-3 12:26
上次分享了腾讯云的图片文本识别,教你如何白嫖腾讯云证件,卡片识别:
https://www.52pojie.cn/thread-1895474-1-1.html
(出处: 吾爱破解论坛)
今天再分享一个免费调用腾讯云API实现人脸年龄变化,效果如下,这个女神是谁呢?
output3.gif

先登录腾讯云:
[HTML] 纯文本查看 复制代码
https://cloud.tencent.com/document/product/1202/42921


找到购买指南,查看免费额度,依然是1000次每月。
屏幕截图 2024-04-03 113152.png

再找到操作指南,先进控制台开通该功能。再进入调试界面。
屏幕截图 2024-04-03 113526.png

开通就不说了,很简单,按照提示点击开通就行。

说一说怎么用Python调用。点击人像变换API后,找到左侧的API文档-调用方式-人脸年龄变化想过接口,再点击“点击调试”,如下图。
屏幕截图 2024-04-03 113755.png

我们就会进入调试界面,详细操作就不多说了,可以看看之前那篇文章怎么装库,怎么获取密钥。

屏幕截图 2024-04-03 114324.png

重点再说说中间那3个参数,输入这3个就可以了。
第一个,必选,选择地区
第二个,“Image”和“Url”,图片的 Url、Image必须提供一个,如果都提供,只使用 Url。
第三个,就是变换后的年龄。

详细信息,可以点那个带圈的i,也可以回到刚刚那个API文档页面,查看“2.输入参数”,里面也有详细介绍。

此时,我们就获得了python代码,将其复制到IDE中。

[Python] 纯文本查看 复制代码
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ft.v20200304 import ft_client, models
try:
    # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
    # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
    # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
    cred = credential.Credential("SecretId", "SecretKey")
    # 实例化一个http选项,可选的,没有特殊需求可以跳过
    httpProfile = HttpProfile()
    # 推荐使用北极星,相关指引可访问如下链接
    # https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-python#%E5%8C%97%E6%9E%81%E6%98%9F%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B
    httpProfile.endpoint = "ft.tencentcloudapi.com"

    # 实例化一个client选项,可选的,没有特殊需求可以跳过
    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    # 实例化要请求产品的client对象,clientProfile是可选的
    client = ft_client.FtClient(cred, "ap-beijing", clientProfile)

    # 实例化一个请求对象,每个接口都会对应一个request对象
    req = models.ChangeAgePicRequest()
    params = {
        "Image": "图片的64base数据",
        "AgeInfos": [
            {
                "Age": 60
            }
        ]
    }
    req.from_json_string(json.dumps(params))

    # 返回的resp是一个ChangeAgePicResponse的实例,与请求对象对应
    resp = client.ChangeAgePic(req)
    # 输出json格式的字符串回包
    print(resp.to_json_string())

except TencentCloudSDKException as err:
    print(err)


现在还不能用,首先将你自己的SecretID和SecretKey复制到cred = credential.Credential("SecretId", "SecretKey")里面。
"SecretId", "SecretKey"换成你的ID和Key。


然后就是params里的“Image”,这里面我们要放一个图片的base64数据。
分享一个方法,如下:


[Python] 纯文本查看 复制代码
from PIL import Image
import io
import base64

def to_base64_data(pic_path):
    # 打开并读取图像文件
    image = Image.open(pic_path)
    # 转换图像到RGB格式
    rgb_image = image.convert("RGB")
    # 创建字节流对象
    byte_stream = io.BytesIO()
    # 保存图像到字节流中
    rgb_image.save(byte_stream, format='JPEG')
    # 从字节流中获取图像的base64编码
    base64_data = base64.b64encode(byte_stream.getvalue()).decode('utf-8')
    return (base64_data)

base64_data = to_base64_data('1.png') #换成你的图片地址



base64_data就是图片的base64数据了,将其传给params里的“Image”就可以了。

最后,就是返回的数据,官方示例是用resp.to_json_string(),转换成了一个json数据,而我们是想要其中的base64,放在了“ResultImage”里面。
屏幕截图 2024-04-03 115859.png
那么我么就用resp.ResultImage获取,获取到了base64,就可以转换为图片了。
[Python] 纯文本查看 复制代码
import base64

# 假设你的Base64编码字符串为'encoded_string'
encoded_string = resp.ResultImage

# 从Base64编码字符串中提取图片数据
# 确保已删除了'data:image/png;base64,'前缀
image_data = base64.b64decode(encoded_string)

# 将解码后的数据保存为PNG文件
with open('output.png', 'wb') as f:
    f.write(image_data)

print('转换完成!')


这是一个年龄的结果,如果我们想要30到90岁,每3年获取一张呢,那就用for循环。参考代码如下:

[Python] 纯文本查看 复制代码
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ft.v20200304 import ft_client, models

from PIL import Image
import io
import base64

def to_base64_data(pic_path):
    # 打开并读取图像文件
    image = Image.open(pic_path)
    # 转换图像到RGB格式
    rgb_image = image.convert("RGB")
    # 创建字节流对象
    byte_stream = io.BytesIO()
    # 保存图像到字节流中
    rgb_image.save(byte_stream, format='JPEG')
    # 从字节流中获取图像的base64编码
    base64_data = base64.b64encode(byte_stream.getvalue()).decode('utf-8')
    return (base64_data)
    
#需要换成你的ID和Key
SecretId = "AKIDaC********************"
SecretKey = "lYOB************************"
#换成你的图片地址
pic_path = '1.png'

cred = credential.Credential(SecretId, SecretKey) 
    # 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
    # 推荐使用北极星,相关指引可访问如下链接
    # https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-python#%E5%8C%97%E6%9E%81%E6%98%9F%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B
httpProfile.endpoint = "ft.tencentcloudapi.com"

    # 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
    # 实例化要请求产品的client对象,clientProfile是可选的
client = ft_client.FtClient(cred, "ap-beijing", clientProfile)

    # 实例化一个请求对象,每个接口都会对应一个request对象
req = models.ChangeAgePicRequest()

for i in range (60,90,3):
    params = {
        "Image": to_base64_data(pic_path),
        "AgeInfos": [
                {
                    "Age": i
                }
            ]
        }
    req.from_json_string(json.dumps(params))
    # 返回的resp是一个ChangeAgePicResponse的实例,与请求对象对应
    resp = client.ChangeAgePic(req)
    
    # 从Base64编码字符串中提取图片数据
    image_data = base64.b64decode(resp.ResultImage)
    
    # 将解码后的数据保存为PNG文件
    with open('output{}.png'.format(i), 'wb') as f:
        f.write(image_data)


生成了很多张图片,我们在用imageio库合并成gif格式。

[Python] 纯文本查看 复制代码
#pip install imageio
import imageio
import os

pic_path = r'D:\python\pic'
pix_list = os.listdir(pic_path)
# 定义图片列表,将图片的路径添加到列表中
image_list = os.listdir(pic_path)

# 定义输出的GIF文件名
gif_name = 'output.gif'

# 定义每张图片在GIF中的显示时间(单位为秒),这里设置为0.1秒
duration = 0.1

# 创建一个空列表来存储所有图片帧
frames = []

# 遍历图片列表,将每张图片读取并添加到帧列表中
for image_path in image_list:

    image_path1 = os.path.join(pic_path,image_path)
    image = imageio.imread(image_path1)
    frames.append(image)

# 使用imageio的mimsave函数将帧列表保存为GIF文件
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)

print("GIF文件生成完成!")

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
wanfon + 1 + 1 热心回复!
侃遍天下无二人 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Seven七夜 发表于 2024-8-19 14:41
腾讯云上测试过了,感觉还是个半成品,动漫、性别转换、年龄,都是固定的样子,特别是动漫,就是把一张图P在了脸上,测试的时候有1/4的脸还没盖住
redhat1019 发表于 2024-4-3 16:50
按照楼主方法,我试了 人像动漫化SDK ,确实可以用,填个id 密钥 和 图片入参就行,就是那个转换有点不太好看。。。。
 楼主| lianxiang1122 发表于 2024-4-3 12:29
第一张gif咋不动呢???再上次一次试一试。。。
output3.gif
 楼主| lianxiang1122 发表于 2024-4-3 12:30
lianxiang1122 发表于 2024-4-3 12:29
第一张gif咋不动呢???再上次一次试一试。。。

还是不行,上传完了变成一张图片了。。。。。。不知道咋弄。。。。
Tsirius 发表于 2024-4-3 12:51
感谢楼主分享
nirenwendao 发表于 2024-4-3 14:04
mark,感谢分享
RabbitBearLove 发表于 2024-4-3 14:29
先插个眼,慢慢研究
谢谢分享
shc036 发表于 2024-4-3 15:11
感谢分享
beihanwang 发表于 2024-4-3 15:36
感谢分享
RoyPenn 发表于 2024-4-3 15:42
谢谢分享,很实用的教程
xiguapidaxia 发表于 2024-4-3 15:44
很详细,感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 22:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表