【计算机视觉40例】案例26:姿势识别

导读】本文是专栏《计算机视觉40例简介》的第26个案例《姿势识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例26】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第24章《深度学习应用实践》以获取更详细信息。

姿势识别是指能够识别出图像中人体的姿势,它在人机交互、体育、健身、动作采集、自动驾驶等领域具有广阔的应用前景。

OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以caffe为框架开发的开源库,是首个基于深度学习的实时多人二维姿态估计应用。它可以实现人体动作、面部表情、手指运动等姿态估计。它不仅适用于单人,同时还能针对多人进行姿势识别。

OpenPose的总览图如图1所示,其中:

  1. 图(a)Input Image是原始输入图像。
  2. 图(b) Part confidence maps,简称PCMs,是关键点热力图,它用来表征关键的位置信息。假设需要输出人体的18个关键点信息,那么PCM会增加一个背景信息,输出共计19个信息。输出背景一方面增加了一个监督信息,有利于网络的学习;另一方面背景输出可以作为下一个阶段的输入,有利于下一个阶段获得更好的语义信息。
  3. 图(c) Part Affinity Fields,简称PAFs,通常翻译为关键点的亲和力场,它用来描述不同关键点之间的亲和力。同一个人的不同关节之间,具有较强的亲和力;而不同人之间的关节,亲和力就较弱。OpenPose中,采用bottom-up的姿态估计网络,在检测关节时,直接检测出所有的关节,而并不会对关节属于哪个人进行区分。接下来,根据关节之间的亲和力,对关节进行划分。简单来说,将亲和力强的关节划分为同一个人。
  4. 图(d) Bipartite Matching,二分匹配。通过PAF输出,推断出身体部位的位置,通过一组没有其他信息的身体部位把它们解析成不同的人。
  5. 图(e) Parsing Results是解析结果。将检测到的同一个人的关节进行拼接,得到解析结果。

 

图1 流程图

其结构如图2所示,它第1个阶段预测PAFs(Lt),第2个阶段预测PCMs(St)。它们的终端使用的是3层3×3大小的卷积核。

 

图2  网络结构

核心编写代码如下:

while cv2.waitKey(1) < 0:
    hasFrame, frame = cap.read()
    H, W =frame.shape[:2]    
    blob = cv2.dnn.blobFromImage(frame, 1.0, (368, 368), (127.5, 127.5, 127.5), swapRB=True, crop=False)
    net.setInput(blob)
    out = net.forward()
    print(out.shape)
    # out[0]:图像索引。
    # out[1]: 关键点的索引。关键点热力图和部件亲和力图的置信度
    # out[2]: 第3维是输出图的高度。
    # out[3]: 第4个维度是输出图的宽度。
    #========核心步骤1:确定关键部位(关键点)=============
    out = out[:, :19, :, :]  #仅仅需要前19个(0~18)
    outH = out.shape[2]    #out的高度height
    outW = out.shape[3]    #out的宽度width
    points = []              #关键点
    print(points)
    for i in range(len(BODY_PARTS)):
        #身体对应部位的热图切片
        heatMap = out[0, i, :, :]
        # 取最值 
        _, confidence, _, point = cv2.minMaxLoc(heatMap)
        # 将out中关键点映射到原始图像image上
        px , py = point[:2]    
        x = ( px / outW ) * W
        y = ( py / outH ) * H
        # 仅将置信度大于0.2的关键点保留,其余的值为“None”。
        # 这里需要额外注意,不是仅仅保留置信度大于0.2的,同时将小于0.2的值设置为None
        # 后续判断需要借助None完成
        points.append((int(x), int(y)) if confidence > 0.2 else None)
    # print(points)   #观察一下points的情况,包含点和None两种值    
    # ========核心步骤2:绘制可能的姿势对================
    for posePair in POSE_PAIRS:   #逐个判断姿势对是否存在
        print("=============")
        partStart,partEnd = posePair[:2]        #取出姿势对中的两个关键点(关键部位)
        idStart = BODY_PARTS[partStart]         #取出姿势对中第1个关键部位的索引值
        idEnd = BODY_PARTS[partEnd]             #取出姿势对中第2个关键部位的索引值
        print(partStart,partEnd,idStart,idEnd,points[idStart] , points[idEnd])
        # 判断当前姿势对中的两个部位是否被检测到,如果检测到,将其绘制出来
        # 通过判断当前姿势对中的两个关键部位是否在points中实现
        if points[idStart] and points[idEnd]:    
            cv2.line(frame, points[idStart], points[idEnd], (0, 255, 0), 3)
            cv2.ellipse(frame, points[idStart], (3, 3), 0, 0, 360, (0, 0, 255), cv2.FILLED)
            cv2.ellipse(frame, points[idEnd], (3, 3), 0, 0, 360, (0, 0, 255), cv2.FILLED)
    # ==========显示最终结果===================
    cv2.imshow('result', frame)

运行程序,如图3会实时显示当前摄像头采集到的视频的姿势识别结果。

图3  识别结果

欢迎大家阅读《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书中第24章《深度学习应用实践》获取详细内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值