Hi,您好,欢迎使用百度人体分析私有化部署产品。
人体分析私有化部署包部署成功后,即可获得与在线API基本完全相同的接口,相关接口将会启动,即可参考本文档开始调用测试。
人体分析的各个接口拆分为不同的私有部署包,人体关键点识别、人流量统计、人体检测、人体属性识别(单人版)、手势识别、人像分割、手部关键点识别、驾驶行为分析对应8个不同的部署包,方便选取所需能力灵活应用。

接口能力介绍

1、人体关键点识别
检测图片中的所有人体,识别每个人体的21个主要关键点,包含四肢、脖颈、五官等部位,同时可输出人体的坐标信息。支持多人检测、人体位置重叠、遮挡、背面、侧面、中低空俯拍、大动作等复杂场景。
21个关键点的位置:头顶、左眼、右眼、左耳、右耳、左嘴角、右嘴角、鼻子、脖子、左肩、右肩、左手肘、右手肘、左手腕、右手腕、左髋部、右髋部、左膝、右膝、左脚踝、右脚踝。
注:接口会返回人体坐标框和每个关键点的置信度分数,在应用时可综合置信度score分数,过滤掉置信度低的“无效人体”,推荐的过滤阈值在下文"接口调用说明"部分展开。
2、人体检测
检测图像中的所有人体,返回每个人体的矩形框位置;支持人体重叠、遮挡、截断、背面、侧面、动作变化等复杂场景。人体像素需大于60px * 60px。
3、人体属性识别(单人版)
输入单个人体的图片,识别人体的静态属性和行为,共支持28种属性。主要适用于中低空大角度斜拍视角,支持人体轻度重叠、轻度遮挡、背面、侧面等不同拍摄角度。
可识别28种属性:性别、年龄阶段、下身服饰类别、上身服饰类别、戴帽子(可区分普通帽/安全帽)、戴口罩、上身服饰颜色、下身服饰颜色、使用手机、吸烟、身体朝向、撑伞、背包、是否有交通工具……
注:接口返回的属性信息包括人体的遮挡、截断情况,在应用时可基于此过滤掉“无效人体”,比如严重遮挡、严重截断的人体。
4、人流量统计
识别和统计图像当中的人体个数(静态统计,不支持追踪和去重);支持框定多个不规则区域统计局部人数,同时可输出渲染图片。
适用于3米以上的中远距离俯拍,5米以上为佳,以头部为主要识别目标统计人数,无需正脸、全身照,适应各类人流密集场景。支持轻度畸变的鱼眼摄像头。
5、手势识别
识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种常见手势,适用于手势特效、智能家居手势交互等场景。
支持的24类手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、Diss、我爱你、掌心向上、双手比心(3种)、数字(9种)、Rock、竖中指。
适用于3米以内的拍摄距离,1米内为佳,自拍和他人拍摄均支持,拍摄距离尽量近一些,否则手势目标太小,容易漏识别。
6、人像分割
识别人体的轮廓范围,与背景进行分离,适用于拍照背景替换、照片合成、身体特效等场景。输入正常人像图片,返回分割后的二值结果图、灰度图、透明背景的人像图(png格式)。美颜、P图等图片美化手段会影响分割效果,请使用原图进行分割。
7、手部关键点识别
检测图片中的手部,输出手部坐标框、21个骨节点的坐标信息。当前主要适用于图片中单个手部的情况,图片中同时存在多个手部时,识别效果可能欠佳。
8、驾驶行为分析
针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、未佩戴口罩、闭眼、打哈欠、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性。

接口格式说明

变量类型定义

类型定义
string普通的字符串,可能会有长度要求,具体参见接口说明中的备注
uint32整形数字,最大取值为4字节int。自然数
int64整形数字,最大取值为8字节int。允许负数
json无论是request还是response中某个字段定义为json,那么它其实是一个json格式的字符串,需要二次解析
arrayrequest的query中表示array请使用key[] 。response的json中的array即为jsonArray
double双精度,小数点后最大8位四舍五入

返回格式

error_code、error_msg即错误码和错误描述,详细含义请参考错误码表,error_code为0代表请求成功result是接口返回的详细信息, 格式为数组。log_id是请求的日志id,13位长(bigint), 用于定位请求。

接口调用说明

人体关键点识别

检测图片中的所有人体,识别每个人体的21个主要关键点,包含四肢、脖颈、五官等部位,同时可输出人体的坐标信息。
21个关键点的位置:头顶、左耳、右耳、左眼、右眼、鼻子、左嘴角、右嘴角、脖子、左肩、右肩、左手肘、右手肘、左手腕、右手腕、左髋部、右髋部、左膝、右膝、左脚踝、右脚踝。示意图如下:
调用接口的地址示例:[192.168.0.1]:8124/GeneralClassifyService/classify,其中ip需要替换为用户自己服务器的ip,端口默认为:8124
路径
/GeneralClassifyService/classify
请求参数

参数必选类型可选值范围说明
imagetruestring0-255彩色图像, size >50图像数据,base64编码,图片长宽比需介于0.1-10之间,图片尺寸长宽小于50pixel时,会提示尺寸过小

请求参数构造及python代码示例
请求参数为json格式,请求时请将Content-Type设置为application/json格式。
请求参数格式如下:
{"data": base64encode({"image": base64encode(binary image data)} ) }
python代码示例如下:
import base64 import json # 输入图片为/home/work/01.jpg image_file="/home/work/01.jpg"# 将图片内容读取至image_datawithopen(image_file,'rb')as f: image_data= f.read() data={# 将image_data进行base64编码"image": base64.b64encode(image_data)} request_body={# 将data转为json,并进行base64编码"data": base64.b64encode(json.dumps(data))}# 最终应该传入http body的内容print json.dumps(request_body)
返回参数
接口返回人体坐标框和每个关键点的置信度分数,在应用时可综合置信度score分数,过滤掉置信度低的“无效人体”,建议过滤方法:当关键点得分大于0.2的个数大于3,且人体框的得分大于0.2时,才认为是有效人体。
实际应用中,可根据对误识别、漏识别的容忍程度,调整阈值过滤方案,灵活应用,比如对误识别容忍低的应用场景,人体框的得分阈值可以提到0.3甚至更高。

字段是否必选类型说明
person_num是uint32人体数目
person_info是object数组人体姿态信息
+location是object人体坐标信息
++height是float人体区域的高度
++left是float人体区域离左边界的距离
++top是float人体区域离上边界的距离
++width是float人体区域的宽度
++score是float置信度分数,取值0-1,越接近1代表识别准确的概率越大
+body_parts是object身体部位信息,包含21个关键点
++left_ankle是object左脚踝
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_elbow是object左手肘
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_hip是object左髋部
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_knee是object左膝
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_shoulder是object左肩
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_wrist是object左手腕
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++neck是object颈
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++nose是object鼻子
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_ankle是object右脚踝
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_elbow是object右手肘
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_hip是object右髋部
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_knee是object右膝
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_shoulder是object右肩
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_wrist是object右手腕
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++top_head是object头顶
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_mouth_corner是object左嘴角
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_mouth_corner是object右嘴角
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_eye是object右眼
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_eye是object左眼
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++right_ear是object右耳朵
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数
++left_ear是object左耳朵
+++x是floatx坐标
+++y是floaty坐标
+++score是float置信度分数

说明:body_parts,一共21个part,每个part包含x,y两个坐标,如果part被截断,则x、y坐标为part被截断的图片边界位置,part顺序以实际返回顺序为准。
返回示例
{"err_no":0,"err_msg":"fg_human_service[status:succeed]","result":{"person_num":1,"person_info":[{"body_parts":{"left_ankle":{"score":0.868368387222290,"x":643.8750,"y":649.6250},"left_ear":{"score":0.8685630559921265,"x":643.8750,"y":303.68750},"left_elbow":{"score":0.8781360983848572,"x":677.6250,"y":413.3750},"left_eye":{"score":0.9187903404235840,"x":635.43750,"y":303.68750},"left_hip":{"score":0.8074261546134949,"x":652.31250,"y":480.8750},"left_knee":{"score":0.7978388071060181,"x":652.31250,"y":565.250},"left_mouth_corner":{"score":0.8915061950683594,"x":635.43750,"y":320.56250},"left_shoulder":{"score":0.8677763342857361,"x":660.750,"y":354.31250},"left_wrist":{"score":0.8828375339508057,"x":702.93750,"y":464.0},"neck":{"score":0.8687257170677185,"x":627.0,"y":337.43750},"nose":{"score":0.9034447669982910,"x":627.0,"y":312.1250},"right_ankle":{"score":0.8528900742530823,"x":610.1250,"y":649.6250},"right_ear":{"score":0.8603078126907349,"x":610.1250,"y":303.68750},"right_elbow":{"score":0.8440912961959839,"x":559.50,"y":413.3750},"right_eye":{"score":0.8926745653152466,"x":618.56250,"y":303.68750},"right_hip":{"score":0.7821152210235596,"x":601.68750,"y":480.8750},"right_knee":{"score":0.7996079921722412,"x":610.1250,"y":573.68750},"right_mouth_corner":{"score":0.8937355875968933,"x":618.56250,"y":320.56250},"right_shoulder":{"score":0.8571984171867371,"x":584.81250,"y":354.31250},"right_wrist":{"score":0.8279093503952026,"x":542.6250,"y":455.56250},"top_head":{"score":0.8723988533020020,"x":627.0,"y":278.3750}},"location":{"height":449.7995910644531,"left":514.0347900390625,"score":0.9874296784400940,"top":256.1484069824219,"width":226.6530609130859}}]},"format":"json","img":"./data/img/normal_109.jpg"//这个字段为测试端新加,为方便核对图片结果,与服务端无关。}
错误返回值

参数类型必选说明
err_msgstring是错误信息,只在异常中出现(参考错误码)
err_codeunit32是错误码,只在异常中出现(参考错误码)

错误码表

err_codeerr_msg解释
0Succeed!请求成功
216100Failed to parse input jsonjson读取错误
216201Failed to load the image图片加载出错
216200Image empty图像数据为空
216202Image size error图片尺寸错误
216202Image size is too small图片太小,比如小于10像素
216202Invalid image ratio图片长宽比超出范围,比如超过10
216203Image detection error图片检测错误

人体检测

检测图像中的所有人体,返回每个人体的矩形框位置和置信度分数。人体目标需大于30px * 30px,否则模型会直接丢弃,无法检测到有效人体。
调用接口的地址示例:[192.168.0.1]:8125/GeneralClassifyService/classify,其中ip需要替换为用户自己服务器的ip,端口默认为:8125
路径
/GeneralClassifyService/classify
请求参数

参数必选类型说明
imagetruestring图像数据,base64编码。若图片尺寸长或宽小于50pixel,会提示尺寸过小。
return_cropfalseint0或1,0表示false,1表示true,表示是否将检测到的人体框裁剪下来。
异常:若该参数存在无法识别的单词,则忽略不进行处理,默认为false,不裁剪人体框

请求参数构造及python代码示例
请求参数为json格式,请求时请将Content-Type设置为application/json格式。
请求参数格式如下:
{"data": base64encode({"image": base64encode(binary image data),"return_crop":"0,1",} ) }
python代码示例如下:
import base64 import json # 输入图片为/home/work/01.jpg image_file="/home/work/01.jpg"# 将图片内容读取至image_datawithopen(image_file,'rb')as f: image_data= f.read() data={# 将image_data进行base64编码"image": base64.b64encode(image_data),"return_crop":0,} request_body={# 将data转为json,并进行base64编码"data": base64.b64encode(json.dumps(data))}# 最终应该传入http body的内容print json.dumps(request_body)
返回参数

字段必选类型说明
err_msgtruestring错误信息,只在异常中出现(参考错误码表)
err_notrueuint32错误码,只在异常中出现(参考错误码表)
formattruestring返回格式说明,默认添加,值为“json”
resulttruestring人体检测结果,服务对返回结果做了base64编码

正确返回值说明(返回参数为base64编码格式,将result字段base64解码后可得到以下内容):

字段类型说明
person_numint检测到的人体框数目
det_resobject数组每个人体框的具体信息
+classnamestring类型名称,默认为person
+leftint检测框左坐标
+topint检测框顶坐标
+widthint检测框宽度
+heightint检测框高度
+probabilityfloat对应人体框的概率分数,取值0-1,越接近1代表识别准确的概率越大
+labelint下标,默认为1,无实际含义
+cropstring如果打开return_crop的请求参数为true,这里会返回该人体的patch图像,base64编码

返回示例
错误码表

err_novalueerr_msg解释
GENERAL_CLASSIFY
_SUCCEED0GeneralClassify
[status: human detect succeed]人体检测成功(即整体流程成功)
GENERAL_CLASSIFY
_CONF_FILE_ERR216401GeneralClassifyProcessorFactory
[status:reading conf file error]读取conf文件出错
GENERAL_CLASSIFY
_BBOX_PREDICT_ERR216401GeneralClassify
[status: bbox predict error!]boudingbox检测过程出错
GENERAL_CLASSIFY
_INPUT_FORMAT_ERR216101GeneralClassify
[status:parse input format error]输入数据中不存在“image”字段
GENERAL_CLASSIFY
_INPUT_PARSING_ERR216401pedestrian-detection-service
[status:input parsing failed]读取base64输入图片出错
GENERAL_CLASSIFY
_IMAGE_EMPTY_ERR216200pedestrian-detection-service
[status:image empty]输入数据图片读取结果为空
GENERAL_CLASSIFY
_IMAGE_SIZE_ERR216202pedestrian-detection-service
[status:image size not
between 50 and 4096]输入图片尺寸不在允许范围之内
GENERAL_CLASSIFY
_AUTH_ERR216401pedestrian-detection-service
[auth verify error]权限问题
GENERAL_CLASSIFY
_ENCODE_ERR216401pedestrian-detection-service
[status: encode error]人像patch编码成base64字符串

人体属性识别(单人版)

输入单个人体的图片,识别人体的静态属性和行为,共支持28种属性。
注:模型默认将输入的整张图片当作“1个人体”直接识别属性,需提前使用人体检测模型,将原图中的每个人体检测、裁剪出来,再调用本服务识别属性信息。
接口返回每个属性的置信度分数,在应用时可综合置信度score分数,过滤掉置信度低的属性。实际应用中,可根据对误识别、漏识别的容忍程度,调整阈值过滤方案,灵活应用。
调用接口的地址示例:[192.168.0.1]:8126/GeneralClassifyService/classify,其中ip需要替换为用户自己服务器的ip,端口默认为:8126
路径
/GeneralClassifyService/classify
请求参数

参数必选类型说明
imagetruestring图像数据,base64编码。若图片尺寸长或宽小于50pixel,会提示尺寸过小。
typefalsestring如只需返回某几个特定属性,请将type 参数值设定属性可选值,用逗号分隔,无空格。(如"gender,headwear,carrying_item,cellphone")。不提供该字段则输出默认的17个属性,若需获取其余属性,请将type参数值设定为需要返回的全部属性。
异常情况:
①若该参数存在无法识别的单词,则忽略不进行处理,返回17个默认输出的属性;
②若提供了该参数,但不含任何可识别的合法值,则按err_no=8返回

请求参数构造及python代码示例
请求参数为json格式,请求时请将Content-Type设置为application/json格式。
请求参数格式如下:
{"data": base64encode({"image": base64encode(binary image data),"type":"gender,headwear,carrying_item,cellphone"} ) }
python代码示例如下:
import base64 import json # 输入图片为/home/work/01.jpg image_file="/home/work/01.jpg"# 将图片内容读取至image_datawithopen(image_file,'rb')as f: image_data= f.read() data={# 将image_data进行base64编码"image": base64.b64encode(image_data),"type":"gender,headwear,carrying_item,cellphone"} request_body={# 将data转为json,并进行base64编码"data": base64.b64encode(json.dumps(data))}# 最终应该传入http body的内容print json.dumps(request_body)