功能描述

对提供的一张图像进行基于人脸的活体检测,将检测结果以Json格式返回给调用者。

接口调用

对提供的一张图像进行基于人脸的活体检测,将检测结果以Json格式返回给调用者。

  • 请求方法

http://ip:Port/v1/liveness/image?code=PERSON_FACE_IMAGE_CHECKLIVE

  • Header参数
Key Value 请求或响应
Content-type application/json 存在于请求和响应中,不可为空
Abis-Request-Sequence 请求流水号 存在于请求和响应中,请求中可以为空,如为空则由服务自动生成一个流水号
Authorization 接口鉴权标识 若使用ABIS云平台的接口API,则需要去 ABIS门户控制台-基本资料-鉴权密钥 中获取 立即获取
  • Body参数
Json Path 类型 必填 含义 注意事项
$.image.content String Base64 编码的图像数据 需要传入人脸图像

对应示例:
{
"content": "SU1BR0U6IEhlbGxvIFdvcmxkCg=="
}

  • 返回参数
Json Path 类型 含义 注意事项
$.reply.result boolean 是否为活体 true:活体 false:非活体
$.reply.score double 检活分数 得分范围 0-100,得分越低表示活体可能性越大
$.reply.additional.alg.score double 检活分数
$.reply.additional.alg.errCode String 检活算法返回的错误码
$.reply.additional.alg.errMsg String 检活错误码对应的信息
$.reply.additional.alg.scores List 检活原始分数
$.reply.additional.alg.result int 检活接口调用是否成功 大于等于 0 成功
$.reply.additional.quality.checked boolean 是否进行图片质量检测 根据后台是否开启了图像质量检测
$.reply.additional.quality.passed boolean 图片质量检测通过 质量检测分数>阈值
$.reply.additional.quality.threshold double 图片质量检测阈值 后台配置文件中配置
$.reply.additional.quality.score double 图片质量检测分数 可根据阈值作为参考判断图片质量是否可用与人脸检活
$.response.status String 状态码; 2000:正常
$.response.content String 状态码描述

对应示例:
{
"reply": {
"result": true,
"score": 0,
"additional": {
"alg.score": "0.0",
"quality.passed": "true",
"quality.score": "0.0",
"alg.errCode": "0000",
"alg.result": "0",
"quality.checked": "false",
"alg.scores": "[1.6565330175828154E-14, 4.627424701528233E-17, 1.2176819653576918E-15, 0.0, 0.0]",
"quality.threshold": "50.0"
}
},
"response": {
"status": "2000"
}
}

错误码

错误码 说明 解决方案
2000 成功
-2000 未知的异常 请查看返回的content中内容
-2020 传入图片内容为空 请确定是否传入了图片
-2021 加载图片失败 传入的不是有效图片或不支持的图片格式,支持的图片格式包括:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
-2100 未检测到人脸 请确保图片是正面朝上的人脸图片,且人脸清晰,图片背景没有反光
-2101 检测人脸属性异常 详情请查看后台日志
-2106 创建文件失败 确认当前服务目录拥有文件读写权限
-2107 文件路径不存在 请确定是否创建了该路径
-2108 文件读取失败 请查看 content 字段返回的异常信息
-2213 传入的数据集合中第 i 是图片,但是图片内容为空 请确定是否传入了图片
-2214 传入的数据集合中第 i 是图片,但是图片加载失败 传入的不是有效图片或不支持的图片格式 , 支持的图片格式包括 :BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
-2208 传入的第 i 张图片提取人脸特征失败 请确保图片是正面朝上的人脸图片,且人脸清晰,图片背景没有反光
-2302 分配人脸特征到内存发生错误 请查看内存是否正常
-2303 视频解析帧数为 0 请确定传入视频是否格式正常以及视频长度是否满足配置要求
-2304 传入图片的 base64 解码失败 请确认传入的 base64 编码是否正确
-2305 接口调用异常 请查看 content 字段返回的异常信息
-2306 图像检活未返回检活分数 请查看图片是否正常

注意事项

1、对图像要求
支持的图片格式:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
对比度、亮度适中;
尽量不要有较多背景,尽量选择浅色、纯色背景;
图像尽量避免反光和黑影;
图像清晰,避免图像模糊不清; 图像分辨率不宜过高,一方面造成图片过大,不利于传输,一方面分辨率过高也会影响识别率。
人脸图片中,人脸宽度不低于60像素
2、服务需要联网调用
由于当前服务基于 http 技术实现,用户调用服务前请确保您的设备可以连通服务器,并保证一定的带宽。否则图像数据网络传输较慢,会引起较长时间等待。
3、base64编码
若接口涉及到数据需要进行base64编码,请引用commons-codec-1.13.jar对图片进行base64编码:base64.encodeBase64String(byteData);

示例代码(Java)

package cn.eyecool;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.imageio.ImageIO;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;

import lombok.Data;

/**
 * 人脸图片检活原子能力调用Demo
 * 
 * @author mawj
 * @date 2023/03/09
 */
public class CheckliveFaceImageDemo {

    // 连接超时时间
    private static int connTimeOut = 60 * 1000;
    // 请求原子能力的URL(实际开发调试中,可以换成自己部署的abis服务)
    private static final String url = "https://www.abis.cn/v1/liveness/image";
    // 待检测图片的本地路径
    private static String imgPath = System.getProperty("user.dir") + File.separator + "image";

    public static void main(String[] args) {
        // 读取本地图片
        File leftImageFile = new File(imgPath + File.separator + "face1.jpg");
        // 组装数据结构
        CheckliveFaceImageDemo demo = new CheckliveFaceImageDemo();
        CheckliveParam param = demo.new CheckliveParam();
        param.setContent(encodeImgageToBase64(leftImageFile));
        // 发送Http请求
        String response = doPostJson(url, JSON.toJSONString(param));
        System.out.println("响应数据:");
        System.out.println(response);
    }

    /**
     * 请求参数
     * 
     * @date 2022/05/25
     */
    @Data
    class CheckliveParam {
        /**
         * 图像信息base64
         */
        private String content;
    }

    /**
     * File文件转base64格式
     * 
     * @param imageFile
     * @return string
     */
    public static String encodeImgageToBase64(File imageFile) {

        ByteArrayOutputStream outputStream = null;
        try {
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "jpg", outputStream);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回Base64编码过的字节数组字符串
        return Base64.encodeBase64String(outputStream.toByteArray());
    }

    /**
     * PostJson请求
     * 
     * @param url
     * @param json
     * @return
     */
    public static String doPostJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        // TODO 此处token的值需要修改,从网页端获取,格式为:Bearer token
        String token = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImYxYzU4MGZhLTUyZjctNDE4OS04MGE4LWQ4ZjYyYWFiMmEwMCJ9.ZhWKCU0Xr7O8-cTv34FkkZUrb28WoBzPmOAnbvIrjB65kW6DUso-KB8WgAagSvYHF5McWS8Bl2_NsrikYFDxpw";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Authorization",token);
            /** 设置超时时间 */
            RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connTimeOut)
                .setSocketTimeout(connTimeOut).setConnectTimeout(connTimeOut).build();
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            httpPost.setConfig(requestConfig);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            finallyClose(httpClient, response);
        }
        return resultString;
    }

    /**
     * 关闭和释放
     * 
     * @param httpClient
     * @param response
     */
    private static void finallyClose(CloseableHttpClient httpClient, CloseableHttpResponse response) {
        try {
            if (response != null) {
                response.close();
            }
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

更多推荐