开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
人脸识别

    人脸属性编辑

    如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

    • 在百度云控制台内提交工单,咨询问题类型请选择人工智能服务
    • 如有需要讨论的疑问,欢迎进入AI社区 与其他开发者们一同交流
    • 特效用户交流QQ群:583486416

    能力介绍

    对人脸属性特征进行编辑,实现性别互换、年龄改变等特效,为用户生成多种特效照片,此服务具有如下三个业务功能:

    • 性别转换:基于高密度的人脸关键点,改变男女性别面部特征,实现人物性别转换
    • 变老人:对人脸年龄改变过程进行预测,将人脸变为老人面孔
    • 变小孩:对人脸年龄改变过程进行推演,将人脸变为小孩面孔

    调用方式

    请求URL数据格式

    向API服务地址使用POST发送请求,必须在URL中带上参数access_token,可通过后台的API Key和Secret Key生成,具体方式请参考“Access Token获取”。

    示例代码

    #!/bin/bash
    curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】'
    <?php
    function request_post($url = '', $param = '') {
            if (empty($url) || empty($param)) {
                return false;
            }
            
            $postUrl = $url;
            $curlPost = $param;
            $curl = curl_init();//初始化curl
            curl_setopt($curl, CURLOPT_URL,$postUrl);//抓取指定网页
            curl_setopt($curl, CURLOPT_HEADER, 0);//设置header
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
            curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
            curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
            $data = curl_exec($curl);//运行curl
            curl_close($curl);
            
            return $data;
        }
    
        $url = 'https://aip.baidubce.com/oauth/2.0/token';
        $post_data['grant_type']       = 'client_credentials';
        $post_data['client_id']      = '你的 Api Key';
        $post_data['client_secret'] = '你的 Secret Key';
        $o = "";
        foreach ( $post_data as $k => $v ) 
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $post_data = substr($o,0,-1);
        
        $res = request_post($url, $post_data);
    
        var_dump($res);
    
    ?>
    package com.baidu.ai.aip.auth;
    
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 获取token类
     */
    public class AuthService {
    
        /**
         * 获取权限token
         * @return 返回示例:
         * {
         * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
         * "expires_in": 2592000
         * }
         */
        public static String getAuth() {
            // 官网获取的 API Key 更新为你注册的
            String clientId = "百度云应用的AK";
            // 官网获取的 Secret Key 更新为你注册的
            String clientSecret = "百度云应用的SK";
            return getAuth(clientId, clientSecret);
        }
    
        /**
         * 获取API访问token
         * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
         * @param ak - 百度云官网获取的 API Key
         * @param sk - 百度云官网获取的 Securet Key
         * @return assess_token 示例:
         * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
         */
        public static String getAuth(String ak, String sk) {
            // 获取token地址
            String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
            String getAccessTokenUrl = authHost
                    // 1. grant_type为固定参数
                    + "grant_type=client_credentials"
                    // 2. 官网获取的 API Key
                    + "&client_id=" + ak
                    // 3. 官网获取的 Secret Key
                    + "&client_secret=" + sk;
            try {
                URL realUrl = new URL(getAccessTokenUrl);
                // 打开和URL之间的连接
                HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                // 获取所有响应头字段
                Map<String, List<String>> map = connection.getHeaderFields();
                // 遍历所有的响应头字段
                for (String key : map.keySet()) {
                    System.err.println(key + "--->" + map.get(key));
                }
                // 定义 BufferedReader输入流来读取URL的响应
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String result = "";
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                /**
                 * 返回结果示例
                 */
                System.err.println("result:" + result);
                JSONObject jsonObject = new JSONObject(result);
                String access_token = jsonObject.getString("access_token");
                return access_token;
            } catch (Exception e) {
                System.err.printf("获取token失败!");
                e.printStackTrace(System.err);
            }
            return null;
        }
    
    }
     # encoding:utf-8
    import requests 
    
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
    response = requests.get(host)
    if response:
        print(response.json())
    #include <iostream>
    #include <curl/curl.h>
    #include <json/json.h>
    #include "access_token.h"
    // libcurl库下载链接:https://curl.haxx.se/download.html
    // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
    // 获取access_token所需要的url
    const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
    // 回调函数获取到的access_token存放变量
    // static std::string access_token_result;
    /**
     * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
     * @param 参数定义见libcurl库文档
     * @return 返回值定义见libcurl库文档
     */
    static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
        // 获取到的body存放在ptr中,先将其转换为string格式
        std::string s((char *) ptr, size * nmemb);
        // 开始获取json中的access token项目
        Json::Reader reader;
        Json::Value root;
        // 使用boost库解析json
        reader.parse(s,root);
        std::string* access_token_result = static_cast<std::string*>(stream);
        *access_token_result = root["access_token"].asString();
        return size * nmemb;
    }
    
    /**
     * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
     * @param access_token 获取得到的access token,调用函数时需传入该参数
     * @param AK 应用的API key
     * @param SK 应用的Secret key
     * @return 返回0代表获取access token成功,其他返回值代表获取失败
     */
    int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
        CURL *curl;
        CURLcode result_code;
        int error_code = 0;
        curl = curl_easy_init();
        if (curl) {
            std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
            curl_easy_setopt(curl, CURLOPT_URL, url.data());
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
            std::string access_token_result;
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
            result_code = curl_easy_perform(curl);
            if (result_code != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(result_code));
                return 1;
            }
            access_token = access_token_result;
            curl_easy_cleanup(curl);
            error_code = 0;
        } else {
            fprintf(stderr, "curl_easy_init() failed.");
            error_code = 1;
        }
        return error_code;
    }
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    
    namespace com.baidu.ai
    {
        public static class AccessToken
    
        {
            // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
            // 返回token示例
            public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";
    
            // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
            private static String clientId = "百度云应用的AK";
            // 百度云中开通对应服务应用的 Secret Key
            private static String clientSecret = "百度云应用的SK";
    
            public static String getAccessToken() {
                String authHost = "https://aip.baidubce.com/oauth/2.0/token";
                HttpClient client = new HttpClient();
                List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
                paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
                paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));
    
                HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
                String result = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(result);
                return result;
            }
        }
    }
    var https = require('https');
    var qs = require('querystring');
    
    const param = qs.stringify({
        'grant_type': 'client_credentials',
        'client_id': '您的 Api Key',
        'client_secret': '您的 Secret Key'
    });
    
    https.get(
        {
            hostname: 'aip.baidubce.com',
            path: '/oauth/2.0/token?' + param,
            agent: false
        },
        function (res) {
            // 在标准输出中查看运行结果
            res.pipe(process.stdout);
        }
    );

    注意access_token的有效期为30天,切记需要每30天进行定期更换,或者每次请求都拉取新token

    例如此接口,使用HTTPS POST发送:

    https://aip.baidubce.com/rest/2.0/face/v1/editattr?access_token=24.f9ba9c5341b67688ab4added8bc91dec.2592000.1485570332.282335-8574074

    POST中Body的参数,按照下方请求参数说明选择即可。

    提示:如果您为百度云老用户,正在使用其他非AI的服务,可以参考百度云AKSK鉴权方式发送请求,虽然请求方式鉴权方法和本文所介绍的不同,但请求参数和返回结果一致。

    请求说明

    注意事项

    • 请求体格式化:Content-Type为application/json,通过json格式化请求体。
    • Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
    • 图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片

    请求示例

    HTTP方法:POST

    请求URL:https://aip.baidubce.com/rest/2.0/face/v1/editattr

    URL参数:

    参数
    access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

    Header:

    参数
    Content-Type application/json

    Body中放置请求参数,参数详情如下:

    请求参数

    参数 必选 类型 说明
    image string 原始图片信息 图片的分辨率要求在256*256以上、在4096*4096以下 大小在4M下 人脸区域要求在64*64以上
    image_type string 图片类型
    BASE64:图片的base64值;
    URL:图片的 URL( 下载图片时可能由于网络等原因导致下载图片时间过长)
    FACE_TOKEN: 人脸标识
    action_type string 人脸编辑方式
    TO_KID: 变小孩
    TO_OLD: 变老人
    TO_FEMALE: 变女生
    TO_MALE: 变男生
    TO_FEMALE_V2: V2版变女生(效果与TO_FEMALE不同)
    quality_control string 质量控制
    NONE: 不进行控制
    LOW:较低的质量要求
    NORMAL: 一般的质量要求
    HIGH: 较高的质量要求
    默认NONE
    face_location string 当图片中检测到多张人脸时,使用此参数来指定图片中需要编辑的人脸位置, 不指定时则默认使用图中最大的人脸 格式形如: {"left": 111.4,"top": 96.56,"width": 98,"height": 98,"rotation": 3} 当image_type为FACE_TOKEN时, 此参数无效, 会使用FACE_TOKEN对应的人脸

    示例代码

    {
       "image": "sfasq35sadvsvqwr5q...",
       "image_type": "BASE64",
       "quality_control": "NORMAL",
       "action_type": "TO_KID",
       "face_location": "{\"left\": 111.4,\"top\": 96.56,\"width\": 98,\"height\": 98,\"rotation\": 3}"
    }

    返回说明

    返回参数

    • 返回结果
    字段 类型 说明
    image string 编辑后图片的BASE64值
    • 返回示例
    {
        "error_code": 0,
        "error_msg": "SUCCESS",
        "log_id": 1234567890123,
        "timestamp": 1533094576,
        "cached": 0,
        "result": {
            "image": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAHqCAYAAADLb..."
        }
    }
    • 质量控制参数说明

    不同的控制度下所对应的质量控制阈值 如果检测出来的质量信息某一项不符合控制阈值的要求,则会返回错误。

    控制度 left_eye right_eye nose mouth left_cheek right_cheek chin_contour illumination blurdegree completeness yaw pitch roll
    LOW 0.8 0.8 0.8 0.8 0.8 0.8 0.8 20 0.8 0 45 45 45
    NORMAL 0.6 0.6 0.6 0.6 0.6 0.6 0.6 40 0.6 0 30 30 30
    HIGH 0.2 0.2 0.2 0.2 0.2 0.2 0.2 100 0.2 1 20 20 20

    参数说明

    参数 说明
    left_eye 左眼被遮挡的比例 [0-1] 1表示完全遮挡
    right_eye 右眼被遮挡的比例 [0-1] 1表示完全遮挡
    nose 鼻子被遮挡的比例 [0-1] 1表示完全遮挡
    mouth 嘴巴被遮挡的比例 [0-1] 1表示完全遮挡
    left_cheek 左脸颊被遮挡的比例 [0-1] 1表示完全遮挡
    right_cheek 右脸颊被遮挡的比例 [0-1] 1表示完全遮挡
    chin_contour 下巴被遮挡比例 [0-1] 1表示完全遮挡
    illumination 光照 [0-255] 0表示光照不好
    blurdegree 图片模糊度 [0-1] 1表示完全模糊
    completeness 人脸完整度(0或1) 0为人脸溢出图像边界,1为人脸都在图像边界内
    yaw 三维旋转之左右旋转角,范围:[-90(左), 90(右)] 30阈值代表角度绝对值要求在30内
    roll 平面内旋转角,范围:[-180(逆时针), 180(顺时针)] 30阈值代表角度绝对值要求在30内
    pitch 三维旋转之俯仰角度,范围:[-90(上), 90(下)] 30阈值代表角度绝对值要求在30内

    错误码

    错误码 错误信息 说明 处理建议
    222309 image size is too small 图片尺寸过小,请使用清晰的图片 更换符合尺寸要求的图片
    222213 face size is too small 人脸尺寸过小,请保证人脸区域在64*64以上 更换符合人脸区域尺寸要求的图片
    222214 face are cartoon images 请使用非卡通的人脸图像 更换符合要求的图片
    222215 face quality is not acceptable 人脸属性编辑处理该图像失败,请使用其他图片 请更换图片再进行尝试
    222216 face edit attr fail 人脸属性编辑服务不可用,请重试 请重试,多次失败请提交工单
    上一篇
    人脸融合
    下一篇
    人像渐变(邀测)