快速上手百度大脑人体关键点识别

作者:wangwei8638

人体关键点识别能够检测图像中的人体并返回人体矩形框位置,精准定位21个核心关键点,包含头顶、五官、颈部、四肢主要关节部位,支持多人检测、大动作等复杂场景。本文以瑜伽动作为例,根据人体关键点信息,分析人体姿态、动作是否标准,辅助人体塑形。

一.平台接入

此步骤比较简单,不多阐述。可参照之前文档:

https://ai.baidu.com/forum/topic/show/943162

二.分析接口文档

1.打开API文档页面,分析接口要求

https://ai.baidu.com/docs#/Body-API/b717c300

(1)接口描述

对于输入的一张图片(可正常解码,且长宽比适宜),检测图片中的所有人体,输出每个人体的21个主要关键点,包含头顶、五官、脖颈、四肢等部位,同时输出人体的坐标信息和数量。

支持多人检测、人体位置重叠、遮挡、背面、侧面、中低空俯拍、大动作等复杂场景。

21个关键点的位置:头顶、左耳、右耳、左眼、右眼、鼻子、左嘴角、右嘴角、脖子、左肩、右肩、左手肘、右手肘、左手腕、右手腕、左髋部、右髋部、左膝、右膝、左脚踝、右脚踝。

(2)请求说明

需要用到的信息有:

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

Header格式:Content-Type:application/x-www-form-urlencoded

Body中放置请求参数,参数详情如下:
在这里插入图片描述
(3)返回参数
在这里插入图片描述
2.获取access_token

# encoding:utf-8

import base64

import urllib

import urllib2



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

# 二进制方式打开视频文件

f = open('[本地文件]', 'rb')

img = base64.b64encode(f.read()) 

params = {"data": data }

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

三.识别结果

  1. 单人正面
    在这里插入图片描述
    识别结果:正确

  2. 多人正面
    在这里插入图片描述
    识别结果:正确

  3. 单人侧面
    在这里插入图片描述
    返回结果:

{ “person_num”: 2, “person_info”: [ { “body_parts”: { “left_hip”: { “y”: 595.5, “x”: 386.21875, “score”: 0.66870158910751 }, “top_head”: { “y”: 340.21875, “x”: 325.4375, “score”: 0.68663144111633 },……}

  1. 多人侧面
    在这里插入图片描述
    识别结果:正确

  2. 单人背面
    在这里插入图片描述
    返回结果:

{ “person_num”: 2, “person_info”: [ { “body_parts”: { “left_hip”: { “y”: 513.1875, “x”: 510.6875, “score”: 0.75093376636505 }, “top_head”: { “y”: 318.9375, “x”: 510.6875, “score”: 0.78111505508423 },……}

6.多人复杂情况
在这里插入图片描述
返回结果:

{ “person_num”: 5, “person_info”: [ { “body_parts”: { “left_hip”: { “y”: 715.875, “x”: 212.6875, “score”: 0.51720798015594 }, “top_head”: { “y”: 556.125, “x”: 285.90625, “score”: 0.73297417163849 },……}
在这里插入图片描述
返回结果:

{ “person_num”: 6, “person_info”: [ { “body_parts”: { “left_hip”: { “y”: 254.15625, “x”: 259.8125, “score”: 0.61026680469513 }, “top_head”: { “y”: 92.0625, “x”: 321.5625, “score”: 0.80025953054428 },……}

结论:

识别结果方面:分别从前方、侧方、后方几个角度拍摄的照片进行测试,人体关键点识别标注结果比较准确。存在问题是侧方、后方拍摄角度和多人情况下,识别返回人数有错误。

四.源码共享

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import urllib.parse
import urllib.request
import base64
import json
import time
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id = '*******************'
client_secret = '*****************************'

#获取token
def get_token():
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
    request = urllib.request.Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urllib.request.urlopen(request)
    token_content = response.read()
    if token_content:
        token_info = json.loads(token_content.decode("utf-8"))
        token_key = token_info['access_token']
    return token_key

     # 读取图片
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()


#获取人体关键点信息
def get_license_plate(path):

    request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"
    
    f = get_file_content(path)
    access_token=get_token()
    img = base64.b64encode(f)
    params = {"custom_lib": False, "image": img}
    params = urllib.parse.urlencode(params).encode('utf-8')
    request_url = request_url + "?access_token=" + access_token
    tic = time.clock()
    request = urllib.request.Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib.request.urlopen(request)
    content = response.read()
    toc = time.clock()
    print('处理时长: '+'%.2f'  %(toc - tic) +' s')
    if content:
        license_plates = json.loads(content.decode("utf-8"))
        strover = '识别结果:'

        print (license_plates)
        return content
    else:
        return ''

image_path='F:\paddle\man\s1.jpg'
get_license_plate(image_path)
发布了4 篇原创文章 · 获赞 1 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

分享到微信朋友圈

×

扫一扫,手机浏览