人像分割
百度 官方文档
识别图像中的人体轮廓,与背景进行分离
基本说明:
接口地址:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg
返回格式:json
请求方式:post
请求示例:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token=test
请求参数说明:
名称 类型 必填 说明
image string 必填 图像数据,Base64编码字符串,以图片文件形式请求时必填。图片的base64编码是不包含图片头的,(支持图片格式:jpg,bmp,png),图片Base64编码后大小不超过4M。最短边至少50px,最长边最大4096px
type string 选填 可以通过设置type参数,自主设置返回哪些结果图,避免造成带宽的浪费
1)可选值说明:
labelmap - 二值图像,需二次处理方能查看分割效果
scoremap - 人像前景灰度图
foreground - 人像前景抠图,透明背景
2)type 参数值可以是可选值的组合,用逗号分隔;如果无此参数默认输出全部3类结果图
返回参数说明:
名称 类型 说明
labelmap string 分割结果图片,base64编码之后的二值图像,需二次处理方能查看分割效果
scoremap string 分割后人像前景的scoremap,归一到0-255,不用进行二次处理,直接解码保存图片即可。Base64编码后的灰度图文件,图片中每个像素点的灰度值 = 置信度 * 255,置信度为原图对应像素点位于人体轮廓内的置信度,取值范围[0, 1]
foreground string 分割后的人像前景抠图,透明背景,Base64编码后的png格式图片,不用进行二次处理,直接解码保存图片即可。将置信度大于0.5的像素抠出来,并通过image matting技术消除锯齿
JSON返回示例:
{
	"log_id": 716033439,
	"labelmap": "xxxx",
	"scoremap": "xxxx",
	"foreground": "xxxx"
}
服务级错误码参照
错误码 说明
1 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
2 服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
3 调用的API不存在,请检查请求URL后重新尝试,一般为URL中有非英文字符,如“-”,可手动输入重试
4 集群超限额,请再次请求, 如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
6 无权限访问该用户数据,创建应用时未勾选相关接口
13 获取token失败
14 IAM 鉴权失败
15 应用不存在或者创建失败
17 每天请求量超限额,可通过QQ群(860337848)联系群管、提交工单提升限额
18 QPS超限额,可通过QQ群(860337848)联系群管、提交工单提升限额
19 请求总量超限额,可通过QQ群(860337848)联系群管、提交工单提升限额
100 无效的access_token参数,请检查后重新尝试
110 access_token无效
111 access token过期
282000 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
216100 请求中包含非法参数,请检查后重新尝试
216101 缺少必须的参数,请检查参数是否有遗漏
216102 请求了不支持的服务,请检查调用的url
216103 请求中某些参数过长,请检查后重新尝试
216110 appid不存在,请重新核对信息是否为后台应用列表中的appid
216200 图片为空,请检查后重新尝试
216201 上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、BMP,请进行转码或更换图片
216202 上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096 * 4096,请重新上传图片
216203 上传的图片base64编码有误,请校验base64编码方式,并重新上传图片
216630 识别错误,请再次请求,如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
216634 检测错误,请再次请求,如果持续出现此类错误,请通过QQ群(860337848)或提交工单联系技术支持团队。
282003 请求参数缺失
282005 处理批量任务时发生部分或全部错误,请根据具体错误码排查
282006 批量任务处理数量超出限制,请将任务数量减少到10或10以下
282114 URL长度超过1024字节或为0
282808 request id xxxxx 不存在
282809 返回结果请求错误(不属于excel或json)
282810 图像识别错误
283300 入参格式有误,可检查下图片编码、代码格式是否有误
完整教学代码示例

public static BufferedImage resize(BufferedImage img, int newW, int newH) {
    Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
    BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2d = dimg.createGraphics();
    g2d.drawImage(tmp, 0, 0, null);
    g2d.dispose();

    return dimg;
}

public static void convert(String labelmapBase64, int realWidth, int realHeight) {
    try {
	
        byte[] bytes = Base64.getDecoder().decode(labelmapBase64);
        InputStream is = new ByteArrayInputStream(bytes);
        BufferedImage image = ImageIO.read(is);
        BufferedImage newImage = resize(image, realWidth, realHeight);
        BufferedImage grayImage = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_BYTE_GRAY);
        for(int i= 0 ; i < realWidth ; i++){
            for(int j = 0 ; j < realHeight; j++){
                int rgb = newImage.getRGB(i, j);
                grayImage.setRGB(i, j, rgb * 255);  //将像素存入缓冲区
            }
        }
        File newFile = new File("gray.jpg");
        ImageIO.write(grayImage, "jpg", newFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
{
    import cv2
    import numpy as np
    import base64
    labelmap = base64.b64decode(res['labelmap'])    # res为通过接口获取的返回json
    nparr = np.fromstring(labelmap, np.uint8)
    labelimg = cv2.imdecode(nparr, 1)
    # width, height为图片原始宽、高
    labelimg = cv2.resize(labelimg, (width, height), interpolation=cv2.INTER_NEAREST)
    im_new = np.where(labelimg==1, 255, labelimg)
    cv2.imwrite('path/to/your/outputfile', im_new)
}