openpose人体姿态估计

参考博客:Openpose驾驶员危险驾驶检测(抽烟打电话)

人体姿态识别模型—openpose

OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用。
参考:Github开源人体姿态识别项目OpenPose中文文档
OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

openpose模型有:手,脸,人体姿态。如图: 在这里插入图片描述

CoCo人体18点检测-图片

import cv2
import matplotlib.pyplot as plt
#配置文件
protoFile = './models/pose/coco/pose_deploy_linevec.prototxt'  
weightsfile = './models/pose/coco/pose_iter_440000.caffemodel' 
npoints = 18
POSE_PAIRS = [[1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]]
#加载网络
net = cv2.dnn.readNetFromCaffe(protoFile,weightsfile)
#读取图片
im = cv2.imread('kai.jpg')
#(1440*1080)
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
inHeight = im.shape[0]  #1440
inWidth = im.shape[1]   #1080
netInputsize = (368,368)
#转为inpBlob格式
inpBlob = cv2.dnn.blobFromImage(im,1.0/255,netInputsize,(0,0,0),swapRB=True,crop=False)
#归一化后的图片最为输入传入net网络,然后输出
net.setInput(inpBlob)
output = net.forward()  #1*57*46*46


# plt.figure(figsize=(20,10))
# for i in range(npoints):
#     probMap = output[0,i,:,:]  #把18个output[2][3]输出出来  probMap.shape(46*46)
#     displayMap = cv2.resize(probMap,(inWidth,inHeight),cv2.INTER_LINEAR) #1440*1080
#     plt.subplot(3,6,i+1);plt.axis('on');
#     plt.imshow(displayMap,cmap='jet')
# plt.show()


scaleX = float(inWidth) / output.shape[3]    #float(1080)/64 = 23.47826086956522
scaleY = float(inHeight)/ output.shape[2]    #float(1440)/64 = 31.304347826086957
points = []
threshold = 0.1
for i in range(npoints):
    probMap = output[0,i,:,:]  #shape(46*46)
    minVal,prob,minLoc,point =cv2.minMaxLoc(probMap)
    x = scaleX * point[0]
    y = scaleY * point[1]
    if prob > threshold:
        points.append((int(x),int(y)))
    else:
        points.append(None)
    #points[]最后为18个关键点的坐标
    #[(516, 313), (516, 438), (399, 438), (375, 626), (352, 751), (610, 438), (633, 594), (657, 751), (446, 751),
    # (446, 970), (446, 1158), (563, 782), (540, 1001), (540, 1064), (493, 281), (540, 281), (446, 313), (563, 313)]


imPoints = im.copy()
imSkeleton = im.copy()
for i,p in enumerate(points):
    #enumerate把points的值前面带上索引i
    cv2.circle(imPoints,p,8,(255,255,0),thickness=1,lineType=cv2.FILLED)
    cv2.putText(imPoints,'{}'.format(i),p,cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2,lineType=cv2.LINE_AA)
for pair in POSE_PAIRS:
    partA = pair[0]
    partB = pair[1]
    #if points[partA] and points[partB]:
    cv2.line(imSkeleton,points[partA],points[partB],(255, 255,0),2)
    cv2.circle(imSkeleton, points[partA],8,(255,0,0),thickness=-1, lineType=cv2.FILLED)

plt.figure(figsize=(20,10))
plt.subplot(121)
plt.axis('off');plt.imshow(imPoints)
plt.subplot(122)
plt.axis('off');plt.imshow(imSkeleton)
plt.show()

检测结果:
18点姿态检测

CoCo人体18点检测-视频

把上述代码改为由opencv捕获摄像头,实时进行人体姿态检测

import cv2
def detect(img):
    protoFile = './models/pose/coco/pose_deploy_linevec.prototxt'
    weightsfile = './models/pose/coco/pose_iter_440000.caffemodel'
    npoints = 18
    POSE_PAIRS = [[1, 0], [1, 2], [1, 5], [2, 3], [3, 4], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12],
                  [12, 13], [0, 14], [0, 15], [14, 16], [15, 17]]
    net = cv2.dnn.readNetFromCaffe(protoFile, weightsfile)
    inHeight = img.shape[0]  # 1440
    inWidth = img.shape[1]  # 1080
    netInputsize = (368, 368)
    inpBlob = cv2.dnn.blobFromImage(img, 1.0 / 255, netInputsize, (0, 0, 0), swapRB=True, crop=False)
    net.setInput(inpBlob)
    output = net.forward()

    scaleX = float(inWidth) / output.shape[3]
    scaleY = float(inHeight) / output.shape[2]
    points = []
    threshold = 0.1
    for i in range(npoints):
        probMap = output[0, i, :, :]  # shape(46*46)
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
        x = scaleX * point[0]
        y = scaleY * point[1]
        if prob > threshold:
            points.append((int(x), int(y)))
        else:
            points.append(None)

    for i, p in enumerate(points):
        # enumerate把points的值前面带上索引i
        cv2.circle(img, p, 8, (255, 255, 0), thickness=1, lineType=cv2.FILLED)
        cv2.putText(img, '{}'.format(i), p, cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, lineType=cv2.LINE_AA)


cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    detect(frame)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按‘q’退出
        break

检测结果:
在这里插入图片描述

距离计算

为了检测驾驶员是否存在吸烟和打电话等危险行为,可以计算人体特定关键点之间的距离。
吸烟:右手到鼻子的距离或者左手到鼻子的距离。
打电话:右手到右耳的距离或者左手到左耳的距离。

import math
def __distance(A,B):
    if A is None or B is None:
        return 0
    else:
        return math.sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2)

distance0 =  __distance(points[0],points[4]) #右手到鼻子距离
distance1 =  __distance(points[0],points[7]) #左手到鼻子距离
distance2 =  __distance(points[4],points[16]) #右手到右耳距离
distance3 =  __distance(points[7],points[17]) #左手到左耳距离
print('右手到鼻子距离:',distance0,'左手到鼻子距离:',distance1)
print('右手到右耳距离:',distance2,'左手到左耳距离:',distance3

计算结果

右手到鼻子距离: 467.6964827748868 左手到鼻子距离: 460.135849505339
右手到右耳距离: 447.97321348491363 左手到左耳距离: 447.97321348491363
基于openpose人体姿态估计代码是一种利用计算机视觉技术来检测人体姿态的方法。openpose是一种开源的深度学习框架,可以通过分析图像或视频中的人体关节位置来实现人体姿态估计。 该代码基于卷积神经网络和目标检测算法,首先对输入的图像进行预处理,如将其转换为灰度图像或进行归一化处理。然后,使用卷积神经网络提取图像特征,并通过目标检测算法定位人体关节点。 在代码中,需要通过训练数据集来训练模型。训练数据集中包含了大量的标注数据,即图像中人体关节点的位置。通过多次迭代训练,模型可以学习到关节点的特征和位置信息。 在测试阶段,将输入图像传入已经训练好的模型中,模型会输出预测的人体姿态结果。这些结果包括人体的骨骼结构和每个关节点的位置信息。通过对关节点的位置进行分析和处理,可以实现多种应用,比如动作识别、人体跟踪和手势识别等。 基于openpose人体姿态估计代码可以应用于各种领域,如体育训练、医学研究和虚拟现实等。它可以帮助教练监控运动员的动作,帮助医生诊断疾病,也可以用于虚拟现实游戏和应用中,提供更加真实的人机交互体验。 总之,基于openpose人体姿态估计代码是一种先进的计算机视觉技术,可以准确、快速地识别人体姿态。它在多个领域都有广泛的应用前景,为我们带来了更多的可能性。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值