图像主体检测
百度 官方文档
检测图片中关键主体位置,接口支持检测单张图片内多个主体
基本说明:
接口地址:https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect
返回格式:json
请求方式:post
请求示例:https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect?access_token=test
请求参数说明:
名称 类型 必填 说明
image string 必填 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 。注意:图片需要base64编码、去掉编码头后再进行urlencode。
with_face number 选填 如果检测主体是人,主体区域是否带上人脸部分,0-不带人脸区域,其他-带人脸区域,裁剪类需求推荐带人脸,检索/识别类需求推荐不带人脸。默认取1,带人脸。
返回参数说明:
名称 类型 说明
log_id uint64 唯一的log id,用于问题定位
result watermark-location 裁剪结果
+left uint32 表示定位位置的长方形左上顶点的水平坐标
+top uint32 表示定位位置的长方形左上顶点的垂直坐标
+width uint32 表示定位位置的长方形的宽度
+height uint32 表示定位位置的长方形的高度
JSON返回示例:
{
	"log_id": 895582300,
	"result": {
		"width": 486,
		"top": 76,
		"left": 134,
		"height": 394
	}
}
服务级错误码参照
错误码 说明
1 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队。
2 服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队。
3 调用的API不存在,请检查后重新尝试
4 集群超限额
6 无权限访问该用户数据
13 获取token失败
14 IAM鉴权失败
15 应用不存在或者创建失败
17 每天请求量超限额,已上线计费的接口,请直接在控制台开通计费,调用量不受限制,按调用量阶梯计费;未上线计费的接口,请通过QQ群(659268104)联系群管手动提额
18 QPS超限额,已上线计费的接口,请直接在控制台开通计费,调用量不受限制,按调用量阶梯计费;未上线计费的接口,请通过QQ群(659268104)联系群管手动提额
19 请求总量超限额,已上线计费的接口,请直接在控制台开通计费,调用量不受限制,按调用量阶梯计费;未上线计费的接口,请通过QQ群(659268104)联系群管手动提额
100 无效的access_token参数,请检查后重新尝试
110 access_token无效
111 access token过期
282000 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队。
216100 请求中包含非法参数,请检查后重新尝试
216101 缺少必须的参数,请检查参数是否有遗漏
216102 请求了不支持的服务,请检查调用的url
216103 请求中某些参数过长,请检查后重新尝试
216110 appid不存在,请重新核对信息是否为后台应用列表中的appid
216200 图片为空,请检查后重新尝试
216201 上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP,请进行转码或更换图片
216202 上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096,请重新上传图片
216203 上传的图片base64编码有误,请校验base64编码方式,并重新上传图片
216630 识别错误,请再次请求,如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队。
216631 识别银行卡错误,出现此问题的原因一般为:您上传的图片非银行卡正面,上传了异形卡的图片或上传的银行卡正品图片不完整
216633 识别身份证错误,出现此问题的原因一般为:您上传了非身份证图片或您上传的身份证图片不完整
216634 检测错误,请再次请求,如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队。
282003 请求参数缺失
282005 处理批量任务时发生部分或全部错误,请根据具体错误码排查
282006 批量任务处理数量超出限制,请将任务数量减少到10或10以下
282100 图片压缩转码错误
282101 长图片切分数量超限
282102 未检测到图片中识别目标
282103 图片目标识别错误
282114 URL长度超过1024字节或为0
282808 request id xxxxx 不存在
282809 返回结果请求错误(不属于excel或json)
282810 图像识别错误
283300 入参格式有误,可检查下图片编码、代码格式是否有误
336000 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(659268104)或工单联系技术支持团队
336001 入参格式有误,比如缺少必要参数、图片base64编码错误等等,可检查下图片编码、代码格式是否有误。有疑问请通过QQ群(659268104)或工单联系技术支持团队
完整教学代码示例
图像主体检测
curl -i -k 'https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect?access_token=【调用鉴权接口获取的token】' --data 'image=【图片Base64编码,需UrlEncode】&with_face=1' -H 'Content-Type:application/x-www-form-urlencoded'
<?php
/**
 * 发起http post请求(REST API), 并获取REST请求的结果
 * @param string $url
 * @param string $param
 * @return - http response body if succeeds, else false.
 */
function request_post($url = '', $param = '')
{
    if (empty($url) || empty($param)) {
        return false;
    }

    $postUrl = $url;
    $curlPost = $param;
    // 初始化curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求结果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运行curl
    $data = curl_exec($curl);
    curl_close($curl);

    return $data;
}

$token = '[调用鉴权接口获取的token]';
$url = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect?access_token=' . $token;
$img = file_get_contents('[本地文件路径]');
$img = base64_encode($img);
$bodys = array(
    'image' => $img,
    'with_face' => 1
);
$res = request_post($url, $bodys);
var_dump($res);
package com.baidu.ai.aip;

import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;

import java.net.URLEncoder;

/**
* 图像主体检测
*/
public class ObjectDetect {

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String detect() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect";
        try {
            // 本地文件路径
            String filePath = "[本地文件路径]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam + "&with_face=" + 1;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "[调用鉴权接口获取的token]";

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        ObjectDetect.detect();
    }
}
# encoding:utf-8
import base64
import urllib
import urllib2

'''
图像主体检测
'''

request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect"

# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())

params = {"image":img,"with_face":1}
params = urllib.urlencode(params)

access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
request = urllib2.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
    print content
#include <iostream>
#include <curl/curl.h>

// libcurl库下载链接:https://curl.haxx.se/download.html
// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
const static std::string request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect";
static std::string detect_result;
/**
 * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
 * @param 参数定义见libcurl文档
 * @return 返回值定义见libcurl文档
 */
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    // 获取到的body存放在ptr中,先将其转换为string格式
    detect_result = std::string((char *) ptr, size * nmemb);
    return size * nmemb;
}
/**
 * 图像主体检测
 * @return 调用成功返回0,发生错误返回其他错误码
 */
int detect(std::string &json_result, const std::string &access_token) {
    std::string url = request_url + "?access_token=" + access_token;
    CURL *curl = NULL;
    CURLcode result_code;
    int is_success;
    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.data());
        curl_easy_setopt(curl, CURLOPT_POST, 1);
        curl_httppost *post = NULL;
        curl_httppost *last = NULL;
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, "【base64_img】", CURLFORM_END);
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "with_face", CURLFORM_COPYCONTENTS, "1", CURLFORM_END);

        curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
        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
",
                    curl_easy_strerror(result_code));
            is_success = 1;
            return is_success;
        }
        json_result = detect_result;
        curl_easy_cleanup(curl);
        is_success = 0;
    } else {
        fprintf(stderr, "curl_easy_init() failed.");
        is_success = 1;
    }
    return is_success;
}
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace com.baidu.ai
{
    public class ObjectDetect
    {
        // 图像主体检测
        public static string detect()
        {
            string token = "[调用鉴权接口获取的token]";
            string host = "https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            // 图片的base64编码
            string base64 = FileUtils.getFileBase64("[本地图片文件]");
            String str = "image=" + HttpUtility.UrlEncode(base64) + "&with_face=" + 1;
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            Console.WriteLine("图像主体检测:");
            Console.WriteLine(result);
            return result;
        }
    }
}