PythonはBaiduAPIを呼び出して、顔の融合を実現します

1.作者について

Liu Shuaibo、男性、西安工科大学電子情報学部、2021年大学院生、Zhang Hongwei人工知能研究グループ
研究の方向性:マシンビジョンと人工知能
Eメール:[email protected]

2.フェイスフュージョン入門

簡単に言えば、生成された面が同時に2つの面の外観の特徴を持つように、2つの面を融合することです。これは、Baidu Smart Cloudの公式ウェブサイトプラットフォームによって提供されるオンラインテストページです。4つの画像形式をサポートし、画像サイズは2M以下である必要があります。
ここに画像の説明を挿入

3. Baidu SmartCloudAPIを呼び出します

アプリケーションインターフェイスを作成する手順は次のとおりです。矢印のプロンプトを順番にクリックします
。ステップ1:

ステップ2:
ここに画像の説明を挿入
ステップ3:
ここに画像の説明を挿入

4.コード分析

4.1ライブラリをインポートする

import requests         # 可以用来生成一个网络请求,抓取网络信息即用来调用百度云的接口
import base64           # 将图片信息采用Base64编码
import json             # 是一种轻量级的数据交换格式

4.2トークンを取得する

# token获取
def get_token(client_id, client_secret):
    # client_id为官网获取的API Key,client_secret为官网获取的Secret Key.下行client_id=后的马赛克为你的API Key,client_secret=后的马赛克为你的Secret Key
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=********&client_secret=*********"
    response = requests.get(url)
    resultJson = response.json()
    return resultJson['access_token']

ここでは、Baidu Smart Cloudで自分で取得したAPIキーとシークレットキーを使用する必要があります。トークンは、BaiduCloudフェイスフュージョンインターフェイスにアクセスするときにサーバーから発行される「アクセスライセンス」に相当します。

4.3画像を読み、エンコーディングを変換する

# 根据图片名读取图片,并转换成base64
def read_photo(name):
    with open('%s' % name, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        bd = base64_data.decode()
        return bd

これは固定機能モデルです

4.4イメージフュージョンを実現するためのBaiduスマートクラウドインターフェースの呼び出し

# 调用百度的接口,实现融合图片
def face_fusion(token, template, target):
    url = 'https://aip.baidubce.com/rest/2.0/face/v1/merge'
    request_url = url + '?access_token=' + token
    params = {
    
    
        "image_template": {
    
                   # 将其中一张图片设置为模板(相当于底层图片)
            "image": template,
            "image_type": "BASE64",
            "quality_control": "NORMAL"
        },
        "image_target": {
    
                     # 将其中一张图片设置为目标(相当于人脸信息“叠加”到模板上)
            "image": target,
            "image_type": "BASE64",
            "quality_control": "NORMAL"
        },
        "merge_degree": "HIGH"            # 融合程度
    }
    params = json.dumps(params)
    headers = {
    
    'content-type': 'application/json'}
    result = requests.post(request_url, data=params, headers=headers).json()  # 经过调用百度云接口服务器返回的内容(融合结果)
    if result['error_code'] == 0:
        res = result["result"]["merge_image"]
        down_photo(res)
    else:
        print(str(result['error_code']) + result['error_msg'])

これがコア部分であり、BaiduAPIを呼び出して顔画像の融合を実現します

4.5FusionImageをダウンロードする

# 下载融合后图片
def down_photo(data):
    imagedata = base64.b64decode(data)
    file = open('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\result.jpg', "wb")
    # 融合图片保存路径,'wb':以二进制格式打开一个文件只用于写入,文件存在则覆盖,若不存在创建新文件
    file.write(imagedata)

ここで保存パスの名前に注意して、「\ n」、「\ r」などの形式を使用しないようにします。これにより、パスが読み取れなくなります。

4.6メインプログラムの実行

# 主程序
if __name__ == '__main__':
    # 路径为自己的图片存储路径
    胡歌 = read_photo('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\1.jpg')                # 模板图片
    赵丽颖 = read_photo('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\2.jpg')              # 目标图片
    token = get_token('*********', '**********')  # 前者为API Key,后者改为Secret Key
    face_fusion(token, 胡歌, 赵丽颖)

ここでは、Baidu Smart Cloudによって取得されたAPIキーとシークレットキーを使用し、メインプログラムを実行して、顔の融合画像の結果を取得する必要があります(注:前面にオクルージョンのないクリアな顔写真を選択する必要があります。顔を検出できないというプロンプトが表示されます。)

4.7融合結果の表示

ここに画像の説明を挿入

5.完全なコード

'''
Author:LSB / 207
Date:2022年03月03日
'''

import requests         # 可以用来生成一个网络请求,抓取网络信息即用来调用百度云的接口
import base64           # 将图片信息采用Base64编码
import json             # 是一种轻量级的数据交换格式


# token获取
def get_token(client_id, client_secret):
    # client_id为官网获取的API Key,client_secret为官网获取的Secret Key.下行client_id=后的马赛克为你的API Key,client_secret=后的马赛克为你的Secret Key
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=***********&client_secret=************"  # 注意此处的&符号
    response = requests.get(url)
    resultJson = response.json()
    return resultJson['access_token']


# 根据图片名读取图片,并转换成base64
def read_photo(name):
    with open('%s' % name, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        bd = base64_data.decode()
        return bd


# 调用百度的接口,实现融合图片
def face_fusion(token, template, target):
    url = 'https://aip.baidubce.com/rest/2.0/face/v1/merge'
    request_url = url + '?access_token=' + token
    params = {
    
    
        "image_template": {
    
                   # 将其中一张图片设置为模板(相当于底层图片)
            "image": template,
            "image_type": "BASE64",
            "quality_control": "NORMAL"
        },
        "image_target": {
    
                     # 将其中一张图片设置为目标(相当于人脸信息“叠加”到模板上)
            "image": target,
            "image_type": "BASE64",
            "quality_control": "NORMAL"
        },
        "merge_degree": "HIGH"            # 融合程度
    }
    params = json.dumps(params)
    headers = {
    
    'content-type': 'application/json'}
    result = requests.post(request_url, data=params, headers=headers).json()  # 经过调用百度云接口服务器返回的内容(融合结果)
    if result['error_code'] == 0:
        res = result["result"]["merge_image"]
        down_photo(res)
    else:
        print(str(result['error_code']) + result['error_msg'])


# 下载融合后图片
def down_photo(data):
    imagedata = base64.b64decode(data)
    file = open('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\result.jpg', "wb")
    # 融合图片保存路径,'wb':以二进制格式打开一个文件只用于写入,文件存在则覆盖,若不存在创建新文件
    file.write(imagedata)


# 主程序
if __name__ == '__main__':
    # 路径为自己的图片存储路径
    胡歌 = read_photo('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\1.jpg')                # 模板图片
    赵丽颖 = read_photo('D:\\研一任务\\课程作业\\人工智能高级语言程序设计\\2.jpg')              # 目标图片
    token = get_token('*********', '**********')  # 前者为API Key,后者改为Secret Key
    face_fusion(token, 胡歌, 赵丽颖)

おすすめ

転載: blog.csdn.net/m0_37758063/article/details/123643567