实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation

这篇具有很好参考价值的文章主要介绍了实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



前言

YOLO8的集成度比较高,如何在简洁的代码中加入Head Pose的东西,不是一件简单的事情.这里介绍如何插入PnP算法实现头部姿态估计的代码?


一、步骤

修改predict中的模型,改为我们自己训练的YOLOLandmark模型.
实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation,Computer Vision,算法,YOLO
修改cfg入口,由于我们修改来config中不少超参数,因此我们干脆修改来为finetune.yaml,替换默认的cfg即可.
实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation,Computer Vision,算法,YOLO
funetune.yaml主要修改的点如下:

model: path to model
name: results saved directory.
conf: object confidence threshold
source: source video path
show: True # to show the live demo.

注意这些点需要根据工程去调整.

二、PnP估计Head Pose,并显示

1.引入库

参考github VHead的项目,我们将head pose进行模块化,传入图片和keypoints即可通过PnP算法估计出Head Pose

代码如下(示例):


def draw_headpose(im0, kpts):
    landmarks = kpts.view(-1).tolist()
    POINTS_NUM_LANDMARK = 68
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) # CLAHE Object (for Adaptive histogram equalization)

    boxPoints3D = np.array(([500., 500., 500.],
                            [-500., 500., 500.],
                            [-500., -500., 500.],
                            [500., -500., 500.],
                            [500., 500., -500.],
                            [-500., 500., -500.],
                            [-500., -500., -500.],
                            [500., -500., -500.]))
    boxPoints2D = np.zeros((1,1,8,2))
    # parameters for mean filter
    windowlen_1 = 5
    queue3D_points = np.zeros((windowlen_1,POINTS_NUM_LANDMARK,2))

    windowlen_2 =5
    queue1D = np.zeros(windowlen_2)

    # pamameters for kalman filter
    XX = 0
    PP = 0.01

    lms_x = landmarks[0::3]
    lms_y = landmarks[1::3]
    lms = [lms_x, lms_y] # [[x,y] for x,y in zip(lms_x, lms_y)]
    lms = [ ([x,y]) for x,y in zip(lms_x, lms_y)]


    test_data = [0]
    test_time = [0]
    
    # # Socket Connect
    # try:
    #     client = socket(AF_INET, SOCK_STREAM)  # 创建Socket的客户端
    #     # client.connect(('127.0.0.1',1755))
    #     client.connect(('10.8.220.128',1755))
    # except:
    #     print("\nERROR: No socket connection.\n")
    #     sys.exit(0)


    # initialize kalman object
    KalmanX = KalmanObject(POINTS_NUM_LANDMARK, 1,10) # Tune Q, R to change landmarks_x sensitivity
    KalmanY = KalmanObject(POINTS_NUM_LANDMARK, 1,10) # Tune Q, R to change landmarks_y sensitivity
    uu_ = np.zeros((POINTS_NUM_LANDMARK))
    # initialize PARAMETERS
    temp_landmarks = np.zeros((POINTS_NUM_LANDMARK,2))



    # Apply kalman filter to landmarks FOR POSE ESTIMATION
    KalmanX.kalman_update(uu_, lms_x) 
    KalmanY.kalman_update(uu_, lms_y) 
    temp_landmarks[:,0] = KalmanX.xx.astype(np.int32)
    temp_landmarks[:,1] = KalmanY.xx.astype(np.int32)


    temp_landmarks = mean_filter_for_landmarks(temp_landmarks) # Apply smooth filter to landmarks FOR POSE ESTIMATION
    leftEyeWid, rightEyewid, mouthWid,mouthLen = get_feature_parameters(lms) #landmarks_orig)
    parameters_str = 'leftEyeWid:{}, rightEyewid:{}, mouthWid:{}, mouthLen:{}'.format(leftEyeWid, rightEyewid, mouthWid, mouthLen)
    print(parameters_str)


    # Five feature points for pose estimation
    # image_points = np.vstack((landmarks[30],landmarks[8],landmarks[36],landmarks[45],landmarks[48],landmarks[54]))
    image_points = np.vstack((temp_landmarks[30],temp_landmarks[8],temp_landmarks[36],temp_landmarks[45],temp_landmarks[1],temp_landmarks[15]))
    
    ret, rotation_vector, translation_vector, camera_matrix, dist_coeffs = get_pose_estimation(im0.shape, image_points)
    if ret != True:
        print('ERROR: get_pose_estimation failed')
        # continue
    # used_time = time.time() - start_time
    # print("used_time:{} sec".format(round(used_time, 3)))
    
    # Convert rotation_vector to quaternion
    w,x,y,z = get_quaternion(rotation_vector)
    quaternion_str = 'w:{}, x:{}, y:{}, z:{}'.format(w, x, y, z)
    print(quaternion_str)
    
    # Packing data and transmit to server through Socket
    data = str(translation_vector[0,0])+':'+str(translation_vector[1,0])+':'+str(translation_vector[2,0])+':'+str(w)+':'+str(x)+':'+str(y)+':'+str(z)+':'+str(leftEyeWid)+':'+str(rightEyewid)+':'+str(mouthWid)+':'+str(mouthLen)

    # Project a 3D point set onto the image plane
    # We use this to draw a bounding box
    (nose_end_point2D, jacobian) = cv2.projectPoints(np.array([(0.0, 0.0, 1000)]), rotation_vector, translation_vector, camera_matrix, dist_coeffs)
    
        # global  boxPoints2D 

    for i in range(8):
        (boxPoints2D[:,:,i,:], jacobian) = cv2.projectPoints(np.array([boxPoints3D[i]]), rotation_vector, translation_vector, camera_matrix, dist_coeffs)        
    boxPoints2D =  boxPoints2D.astype(int)

    for p in image_points:
        cv2.circle(im0, (int(p[0]), int(p[1])), 3, (0,0,255), -1)

    boxset_1 = boxPoints2D[0,0,0:4,:]
    boxset_2 = boxPoints2D[0,0,4:8,:]
    boxset_3 = np.vstack((boxPoints2D[0,0,0,:],boxPoints2D[0,0,4,:]))
    boxset_4 = np.vstack((boxPoints2D[0,0,1,:],boxPoints2D[0,0,5,:]))
    boxset_5 = np.vstack((boxPoints2D[0,0,2,:],boxPoints2D[0,0,6,:]))
    boxset_6 = np.vstack((boxPoints2D[0,0,3,:],boxPoints2D[0,0,7,:]))
    cv2.polylines(im0, [boxset_1], True, (255,0,0), 3)
    cv2.polylines(im0, [boxset_2], True, (255,0,0), 3)
    cv2.polylines(im0, [boxset_3], True, (255,0,0), 3)
    cv2.polylines(im0, [boxset_4], True, (255,0,0), 3)
    cv2.polylines(im0, [boxset_5], True, (255,0,0), 3)
    cv2.polylines(im0, [boxset_6], True, (255,0,0), 3)
    
    p1 = ( int(image_points[0][0]), int(image_points[0][1]))
    p2 = ( int(nose_end_point2D[0][0][0]), int(nose_end_point2D[0][0][1]))
    
    cv2.line(im0, p1, p2, (0,255,0), 2)
    ##########################################################################

实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation,Computer Vision,算法,YOLO
这里需要判断ktps是否为空,再进行画图操作.

2.结果展示

实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation,Computer Vision,算法,YOLO
可以看到左上角,head box的角度基本上与真实的头部姿态相吻合.

总结

这里,我们使用了Kalman 滤波来消除跳跃的情况,让pose变得更加平滑.但是Kalman 滤波的学习暂时没有具体取探索.在评估学习中.文章来源地址https://www.toymoban.com/news/detail-560808.html

到了这里,关于实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 裂缝检测,只依赖OPENCV,基于YOLO8S

    裂缝检测,只依赖OPENCV,YOLOV8S 现在YOLOV8S训练目标非常方便,可以直接转换成ONNX让OPENCV调用,支持C++/PYTHON,原理很简单,自己找博客,有兴趣相互交流

    2024年02月11日
    浏览(28)
  • SynergyNet(头部姿态估计 Head Pose Estimation)复现 demo测试

    SynergyNet(github):https://github.com/choyingw/SynergyNet b站:https://www.bilibili.com/video/BV1Ph4y1k7LK/ 我用的AutoDL平台搭建 选择镜像 PyTorch 1.9.0 Python 3.8(ubuntu18.04) Cuda 11.1 安装其它包: 备注:如果无法下载,就到github中下载压缩包,然后上传解压安装 或者使用码云下载: 需要下载如下文件

    2024年02月14日
    浏览(34)
  • 论文解读《EPro-PnP: Generalized End-to-End Probabilistic Perspective-n-Points for Monocular Object Pose 》

    论文:《EPro-PnP: Generalized End-to-End Probabilistic Perspective-n-Points for Monocular Object Pose Estimation》 Code:https://github.com/tjiiv-cprg/epro-pnp (909 star) 作者的视频简单介绍:https://www.bilibili.com/video/BV13T411E7kb 摘要: 解决问题: 对于6D位姿估计,基于几何(PnP)的方法性能要好一些,但以前

    2024年02月03日
    浏览(44)
  • YOLO Air:YOLO科研改进论文推荐 | 改进组合上千种搭配,包括Backbone,Neck,Head,注意力机制,适用于YOLOv5、YOLOv7、YOLOX等算法

    🔥🔥🔥YOLOAir开源算法库!!! 💡统一使用 YOLOv5、YOLOv7 代码框架, 结合不同模块来构建不同的YOLO目标检测模型。 🌟本项目包含大量的改进方式,降低改进难度,改进点包含 【Backbone特征主干】 、 【Neck特征融合】 、 【Head检测头】 、 【注意力机制】 、 【IoU损失函数】

    2024年02月01日
    浏览(39)
  • YOLO-pose复现流程

    以下为用yolov5训练人体姿态估计复现流程 下载得到的原coco-kpts数据集格式如下 是由Annotations和Images和labels三个子文件夹组成。 ①然后将Images文件夹名称改为images,两者区别为首字母一个大写,一个小写,需要改为小写。 ②将改为images的文件夹剪切进labels文件夹下,现在的

    2024年02月01日
    浏览(26)
  • 汇总利用YOLO8训练遇到的报错和解决方案(包含训练过程中验证阶段报错、精度报错、损失为Nan、不打印GFLOPs)

    本文为专栏内读者和我个人在训练 YOLOv8时遇到的各种错误解决方案 ,你遇到的问题本文基本上都能够解决,同时本文的内容为持续更新,定期汇总大家遇到的问题已经一些常见的问题答案,目前包含的问题已经解决方法汇总如下图所示。 专栏目录: YOLOv8改进有效系列目录

    2024年02月22日
    浏览(46)
  • YOLO算法改进5【中阶改进篇】:添加SENet注意力机制

    SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。 我们可以看到,已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是

    2024年02月06日
    浏览(29)
  • YOLO算法改进4【中阶改进篇】:添加DeformableConvolution v2可变形卷积模块

    论文地址: https://arxiv.org/abs/1811.11168 源码地址:https://github.com/msracver/Deformable-ConvNets 传统的卷积操作是将特征图分成一个个与卷积核大小相同的部分,然后进行卷积操作,每部分在特征图上的位置都是固定的。这样,对于形变比较复杂的物体,使用这种卷积的效果就可能不太

    2024年02月06日
    浏览(25)
  • YOLO算法改进指南【中阶改进篇】:1.添加SE-Net注意力机制

    SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。 已经有很多工作在空间维度上来提升网络的性能,如 Inception 等,而 SENet 将关注点放在了特

    2023年04月24日
    浏览(44)
  • YOLO算法改进指南【中阶改进篇】:3.添加SA-Net注意力机制

    论文地址 :SA-Net: Shuffle Attention for Deep Convolutional Neural Networks 开源代码 :https://github.com/wofmanaf/SA-Net 当前的 CNN 中的 attention 机制主要包括:channel attention 和 spatial attention,当前一些方法(GCNet 、CBAM 等)通常将二者集成,容易产生 converging difficulty 和 heavy computation burden 的问题

    2023年04月26日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包