人体分析

    人体检测和属性识别

    接口描述

    对于输入的一张图片(可正常解码,且长宽比适宜),检测图像中的所有人体并返回每个人体的矩形框位置,识别人体的静态属性和行为,共支持22种属性,包括:性别、年龄阶段、上下身服饰(含类别/颜色)、是否戴帽子、是否戴口罩、是否戴眼镜、背包、是否吸烟、是否使用手机、人体朝向等。

    主要适用于监控场景的中低空斜拍视角,支持人体轻度截断、轻度遮挡、背面、侧面、动作变化等复杂场景。

    摄像头硬件选型无特殊要求,分辨率建议720p以上,更低分辨率的图片也能识别,只是效果可能有差异。夜间红外监控图片的识别效果可能欠佳

    注:接口返回的属性信息包括人体的遮挡、截断情况,在应用时可基于此过滤掉“无效人体”,比如严重遮挡、严重截断的人体。

    人体检测的效果示例如下:

    非正常人体示例:严重截断

    22种属性及其输出项如下,持续扩展更多属性,敬请期待。

    序号 属性 接口字段 输出项说明
    1 性别 gender 男性、女性
    2 年龄阶段 age 幼儿、青少年、青年、中年、老年
    3 上身服饰 upper_wear 长袖、短袖
    4 下身服饰 lower_wear 长裤、短裤、长裙、短裙、不确定
    5 上身服饰颜色 upper_color 红、橙、黄、绿、蓝、紫、粉、黑、白、灰、棕
    6 下身服饰颜色 lower_color 红、橙、黄、绿、蓝、紫、粉、黑、白、灰、棕、不确定
    7 上身服饰纹理 upper_wear_texture 纯色、图案、碎花、条纹或格子
    8 背包 bag 无背包、单肩包、双肩包、不确定
    9 上身服饰细分类 upper_wear_fg T恤、无袖、衬衫、西装、毛衣、夹克、羽绒服、风衣、外套
    10 是否戴帽子 headwear 无帽、普通帽、安全帽
    11 是否戴口罩 face_mask 无口罩、戴口罩、不确定
    12 是否戴眼镜 glasses 戴眼镜、戴墨镜、无眼镜、不确定
    13 是否打伞 umbrella 打伞、未打伞
    14 是否使用手机 cellphone 未使用手机、看手机、打电话、不确定
    15 人体朝向 orientation 正面、背面、左侧面、右侧面
    16 是否吸烟 smoke 吸烟、未吸烟、不确定
    17 是否有手提物 carrying_item 无手提物、有手提物、不确定
    18 交通工具 vehicle 无交通工具、骑摩托车、骑自行车、骑三轮车
    19 上方截断 upper_cut 无上方截断、有上方截断
    20 下方截断 lower_cut 无下方截断、有下方截断
    21 遮挡情况 occlusion 无遮挡、轻度遮挡、重度遮挡
    22 是否是正常人体 is_human 非正常人体、正常人体;用于判断说明人体的截断/遮挡情况,并非判断动物等非人类生物
    正常人体:身体露出大于二分之一的人体,一般以能看到腰部肚挤眼为标准;
    非正常人体:严重截断、或严重遮挡的人体,一般看不到肚挤眼,比如只有个脑袋、一条腿

    注意:接口默认输出所有22个属性,如只需返回某几个特定属性,请将type 参数值设定属性可选值,用逗号分隔。

    请求说明

    请求示例

    HTTP 方法:POST

    请求URL: https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr

    URL参数:

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

    Header如下:

    参数
    Content-Type application/x-www-form-urlencoded

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

    请求参数

    参数 是否必选 类型 可选值范围 说明
    image string - 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M。图片的base64编码是不包含图片头的,如(data:image/jpg;base64,),支持图片格式:jpg、bmp、png,最短边至少50px,最长边最大4096px
    type string gender,
    age,
    lower_wear,
    upper_wear,
    headwear,
    face_mask,
    glasses,
    upper_color,
    lower_color,
    cellphone,
    upper_wear_fg,
    upper_wear_texture,
    lower_wear_texture,
    orientation,
    umbrella,
    bag,
    smoke,
    vehicle,
    carrying_item,
    upper_cut,
    lower_cut,
    occlusion,
    is_human
    1)可选值说明:
    gender-性别,
    age-年龄阶段,
    lower_wear-下身服饰,
    upper_wear-上身服饰,
    headwear-是否戴帽子,
    face_mask-是否戴口罩,
    glasses-是否戴眼镜,
    upper_color-上身服饰颜色,
    lower_color-下身服饰颜色,
    cellphone-是否使用手机,
    upper_wear_fg-上身服饰细分类,
    upper_wear_texture-上身服饰纹理,
    orientation-人体朝向,
    umbrella-是否打伞;
    bag-背包,
    smoke-是否吸烟,
    vehicle-是否有交通工具,
    carrying_item-是否有手提物,
    upper_cut-上方截断,
    lower_cut-下方截断,
    occlusion-遮挡情况,
    is_human-是否是正常人体
    2)type 参数值可以是可选值的组合,用逗号分隔;如果无此参数默认输出全部22个属性

    请求代码示例

    提示一:使用示例代码前,请记得替换其中的示例Token、图片地址或Base64信息。

    提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。

    人体检测和属性识别
    curl -i -k 'https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr?access_token=【调用鉴权接口获取的token】' --data 'image=【图片Base64编码,需UrlEncode】' -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/body_attr?access_token=' . $token;
    $img = file_get_contents('[本地文件路径]');
    $img = base64_encode($img);
    $bodys = array(
        'image' => $img
    );
    $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 BodyAttr {
    
        /**
    
        * 重要提示代码中所需工具类
    
        * 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 body_attr() {
          // 请求url
          String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr";
          try {
              // 本地文件路径
              String filePath = "[本地文件路径]";
              byte[] imgData = FileUtil.readFileByBytes(filePath);
              String imgStr = Base64Util.encode(imgData);
              String imgParam = URLEncoder.encode(imgStr, "UTF-8");
    
              String param = "image=" + imgParam;
              
              // 注意这里仅为了简化编码每一次请求都去获取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) {
            BodyAttr.body_attr();
        }
      }
    # encoding:utf-8
    
    import requests
    import base64
    
    '''
    人体检测和属性识别
    '''
    
    request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr"
    
    # 二进制方式打开图片文件
    
    f = open('[本地文件]', 'rb')
    img = base64.b64encode(f.read())
    
    params = {"image":img}
    access_token = '[调用鉴权接口获取的token]'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    #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/body_attr";
    static std::string body_attr_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格式
       body_attr_result = std::string((char *) ptr, size * nmemb);
       return size * nmemb;
       }
       /**
    
     * 人体检测和属性识别
    
     * @return 调用成功返回0,发生错误返回其他错误码
       */
       int body_attr(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_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\n",
                       curl_easy_strerror(result_code));
               is_success = 1;
               return is_success;
           }
           json_result = body_attr_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 BodyAttr
        {
            // 人体检测和属性识别
            public static string body_attr()
            {
                string token = "[调用鉴权接口获取的token]";
                string host = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr?access_token=" + token;
                Encoding encoding = Encoding.Default;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
                request.Method = "post";
                request.KeepAlive = true;
                // 图片的base64编码
                string base64 = getFileBase64("[本地图片文件]");
                String str = "image=" + HttpUtility.UrlEncode(base64);
                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;
            }
    
            public static String getFileBase64(String fileName) {
                FileStream filestream = new FileStream(fileName, FileMode.Open);
                byte[] arr = new byte[filestream.Length];
                filestream.Read(arr, 0, (int)filestream.Length);
                string baser64 = Convert.ToBase64String(arr);
                filestream.Close();
                return baser64;
            }
        }
    }

    返回说明

    返回参数

    字段 是否必选 类型 说明
    log_id uint64 唯一的log id,用于问题定位
    person_num uint32 检测到的人体数目
    person_info object[] 每个人体框的信息
    +location object 人体坐标信息
    ++height float 人体区域的高度
    ++left float 人体区域离左边界的距离
    ++top float 人体区域离上边界的距离
    ++width float 人体区域的宽度
    ++score float 人体框的置信度分数,取值0-1,得分越接近1表示识别准备的概率越大
    +attributes object 人体属性内容
    ++gender object 性别
    +++name string 男性、女性
    +++score float 对应概率分数
    ++age object 年龄阶段
    +++name string 幼儿、青少年、青年、中年、老年
    +++score float 对应概率分数
    ++upper_color object 上半身衣着颜色
    +++name string 红、橙、黄、绿、蓝、紫、粉、黑、白、灰、棕
    +++score float 对应概率分数
    ++lower_color object 下半身衣着颜色
    +++name string 红、橙、黄、绿、蓝、紫、粉、黑、白、灰、棕、不确定
    +++score float 对应概率分数
    ++cellphone object 是否使用手机
    +++name string 未使用手机、看手机、打电话、不确定
    +++score float 对应概率分数
    ++lower_wear object 下半身服饰
    +++name string 长裤、短裤、长裙、短裙、不确定
    +++score float 对应概率分数
    ++upper_wear object 上半身服饰
    +++name string 长袖、短袖
    +++score float 对应概率分数
    ++headwear object 是否戴帽子
    +++name string 无帽、普通帽、安全帽
    +++score float 对应概率分数
    ++face_mask object 是否戴口罩
    +++name string 无口罩、戴口罩、不确定(背面或者头部被截断的人体,一般为不确定)
    +++score float 对应概率分数
    ++glasses object 是否戴眼镜
    +++name string 戴眼镜、戴墨镜、无眼镜、不确定
    +++score float 对应概率分数
    ++upper_wear_fg object 上身服饰细分类
    +++name string T恤、无袖、衬衫、西装、毛衣、夹克、羽绒服、风衣、外套
    +++score float 对应概率分数
    ++upper_wear_texture object 上身服饰纹理
    +++name string 纯色、图案、碎花、条纹或格子
    +++score float 对应概率分数
    ++orientation object 人体朝向
    +++name string 正面、背面、侧面
    +++score float 对应概率分数
    ++umbrella object 是否打伞
    +++name string 未打伞、打伞
    +++score float 对应概率分数
    ++bag object 背包
    +++name string 无背包、单肩包、双肩包
    +++score float 对应概率分数
    ++smoke object 是否吸烟
    +++name string 未吸烟、吸烟、不确定
    +++score float 对应概率分数
    ++vehicle object 是否有交通工具
    +++name string 无交通工具、骑摩托车、骑自行车、骑三轮车
    +++score float 对应概率分数
    ++upper_cut object 上方截断
    +++name string 无上方截断、有上方截断
    +++score float 对应概率分数
    ++lower_cut object 下方截断
    +++name string 无下方截断、有下方截断
    +++score float 对应概率分数
    ++occlusion object 遮挡情况
    +++name string 无遮挡、轻度遮挡、重度遮挡
    +++score float 对应概率分数
    ++is_human object 是否是正常人体
    +++name string 正常人体、非正常人体
    +++score float 对应概率分数

    返回示例

    {
    	"person_num": 1,
    	"person_info": [
    		{
    			"attributes": {
    				"orientation": {
    					"score": 0.99913859367371,
    					"name": "正面"
    				},
    				"is_human": {
    					"score": 0.99985098838806,
    					"name": "正常人体"
    				},
    				"headwear": {
    					"score": 0.7862206697464,
    					"name": "无帽"
    				},
    				"upper_wear_texture": {
    					"score": 0.73293226957321,
    					"name": "纯色"
    				},
    				"carrying_item": {
    					"score": 0.88011014461517,
    					"name": "无手提物"
    				},
    				"face_mask": {
    					"score": 0.99429154396057,
    					"name": "无口罩"
    				},
    				"lower_wear": {
    					"score": 0.96919763088226,
    					"name": "长裤"
    				},
    				"vehicle": {
    					"score": 0.99982362985611,
    					"name": "无交通工具"
    				},
    				"upper_wear_fg": {
    					"score": 0.40853327512741,
    					"name": "T恤"
    				},
    				"lower_color": {
    					"score": 0.77661311626434,
    					"name": "灰"
    				},
    				"umbrella": {
    					"score": 0.99996972084045,
    					"name": "未打伞"
    				},
    				"upper_cut": {
    					"score": 0.99979013204575,
    					"name": "无上方截断"
    				},
    				"lower_cut": {
    					"score": 0.99873107671738,
    					"name": "无下方截断"
    				},
    				"upper_wear": {
    					"score": 0.98250997066498,
    					"name": "短袖"
    				},
    				"cellphone": {
    					"score": 0.99923753738403,
    					"name": "未使用手机"
    				},
    				"gender": {
    					"score": 0.91399890184402,
    					"name": "女性"
    				},
    				"age": {
    					"score": 0.94620317220688,
    					"name": "青年"
    				},
    				"bag": {
    					"score": 0.88887012004852,
    					"name": "无背包"
    				},
    				"smoke": {
    					"score": 0.99988353252411,
    					"name": "未吸烟"
    				},
    				"upper_color": {
    					"score": 0.94646281003952,
    					"name": "灰"
    				},
    				"occlusion": {
    					"score": 0.99341428279877,
    					"name": "无遮挡"
    				},
    				"glasses": {
    					"score": 0.84259980916977,
    					"name": "无眼镜"
    				}
    			},
    			"location": {
    				"height": 826,
    				"width": 219,
    				"top": 176,
    				"score": 0.9693506360054,
    				"left": 754
    			}
    		}
    	],
    	"log_id": "1324248829299466129"
    }
    上一篇
    人体关键点识别
    下一篇
    人流量统计