所有文档

          人体分析

          人体检测和属性识别

          接口描述

          对于输入的一张图片(可正常解码,且长宽比适宜),检测图像中的所有人体并返回每个人体的矩形框位置,识别人体的静态属性和行为,共支持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"
          }
          上一篇
          人体关键点识别
          下一篇
          人流量统计