0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于YOLOv7的关键点模型测评

3D视觉工坊 来源:GiantPandaCV 2023-04-03 09:46 次阅读

【前言】

目前人体姿态估计总体分为Top-down和Bottom-up两种,与目标检测不同,无论是基于热力图或是基于检测器处理的关键点检测算法,都较为依赖计算资源,推理耗时略长,今年出现了以YOLO为基线的关键点检测器。玩过目标检测的童鞋都知道YOLO以及各种变种目前算是工业落地较多的一类检测器,其简单的设计思想,长期活跃的社区生态,使其始终占据着较高的话题度。

【演变】

在ECCV 2022和CVPRW 2022会议上,YoLo-Pose和KaPao(下称为yolo-like-pose)都基于流行的YOLO目标检测框架提出一种新颖的无热力图的方法,类似于很久以前谷歌使用回归计算关键点的思想,yolo-like-pose一不使用检测器进行二阶处理,二部使用热力图拼接,虽然是一种暴力回归关键点的检测算法,但在处理速度上具有一定优势。

ac7f1868-d1ab-11ed-bfe3-dac502259ad0.png

kapao

去年11月,滑铁卢大学率先提出了 KaPao:Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human Pose Estimation,基于YOLOv5进行关键点检测,该文章目前已被ECCV 2022接收,该算法所取得的性能如下:

ac880d92-d1ab-11ed-bfe3-dac502259ad0.png

paper:https://arxiv.org/abs/2111.08557 code:https://github.com/wmcnally/kapao

yolov5-pose

今年4月,yolo-pose也挂在了arvix,在论文中,通过调研发现 HeatMap 的方式普遍使用L1 Loss。然而,L1损失并不一定适合获得最佳的OKS。且由于HeatMap是概率图,因此在基于纯HeatMap的方法中不可能使用OKS作为loss,只有当回归到关键点位置时,OKS才能被用作损失函数。因此,yolo-pose使用oks loss作为关键点的损失

ac9a70c2-d1ab-11ed-bfe3-dac502259ad0.png

相关代码在https://github.com/TexasInstruments/edgeai-yolov5/blob/yolo-pose/utils/loss.py也可见到:


		

ifself.kpt_label: #Directkptprediction pkpt_x=ps[:,6::3]*2.-0.5 pkpt_y=ps[:,7::3]*2.-0.5 pkpt_score=ps[:,8::3] #mask kpt_mask=(tkpt[i][:,0::2]!=0) lkptv+=self.BCEcls(pkpt_score,kpt_mask.float()) #l2distancebasedloss #lkpt+=(((pkpt-tkpt[i])*kpt_mask)**2).mean()#Trytomakethislossbasedondistanceinsteadofordinarydifference #oksbasedloss d=(pkpt_x-tkpt[i][:,0::2])**2+(pkpt_y-tkpt[i][:,1::2])**2 s=torch.prod(tbox[i][:,-2:],dim=1,keepdim=True) kpt_loss_factor=(torch.sum(kpt_mask!=0)+torch.sum(kpt_mask==0))/torch.sum(kpt_mask!=0) lkpt+=kpt_loss_factor*((1-torch.exp(-d/(s*(4*sigmas**2)+1e-9)))*kpt_mask).mean()

相关性能如下:

acb05518-d1ab-11ed-bfe3-dac502259ad0.png

yolov7-pose

上个星期,YOLOv7的作者也放出了关于人体关键点检测的模型,该模型基于YOLOv7-w6,

acc22c98-d1ab-11ed-bfe3-dac502259ad0.png

目前作者提供了.pt文件和推理测试的脚本,有兴趣的童靴可以去看看,本文的重点更偏向于对yolov7-pose.pt进行onnx文件的抽取和推理。

【yolov7-pose + onnxruntime】

首先下载好官方的预训练模型,使用提供的脚本进行推理:


		

%weigths=torch.load('weights/yolov7-w6-pose.pt') %image=cv2.imread('sample/pose.jpeg') !pythonpose.py

acd08cde-d1ab-11ed-bfe3-dac502259ad0.png

一、yolov7-w6 VS yolov7-w6-pose

  1. 首先看下yolov7-w6使用的检测头

ace8c57e-d1ab-11ed-bfe3-dac502259ad0.png

  • 表示一共有四组不同尺度的检测头,分别为15×15,30×30,60×60,120×120,对应输出的节点为114,115,116,117
  • nc对应coco的80个类别
  • no表示
  1. 再看看yolov7-w6-pose使用的检测头:
acf97266-d1ab-11ed-bfe3-dac502259ad0.png上述重复的地方不累述,讲几个点:
  • 代表person一个类别
  • nkpt表示人体的17个关键点
二、修改export脚本如果直接使用export脚本进行onnx的抽取一定报错,在上一节我们已经看到pose.pt模型使用的检测头为IKeypoint,那么脚本需要进行相应更改:在export.py的这个位置插入:

		#原代码: fork,minmodel.named_modules(): m._non_persistent_buffers_set=set()#pytorch1.6.0compatibility ifisinstance(m,models.common.Conv):#assignexport-friendlyactivations ifisinstance(m.act,nn.Hardswish): m.act=Hardswish() elifisinstance(m.act,nn.SiLU): m.act=SiLU() model.model[-1].export=notopt.grid#setDetect()layergridexport  #修改代码: fork,minmodel.named_modules(): m._non_persistent_buffers_set=set()#pytorch1.6.0compatibility ifisinstance(m,models.common.Conv):#assignexport-friendlyactivations ifisinstance(m.act,nn.Hardswish): m.act=Hardswish() elifisinstance(m.act,nn.SiLU): m.act=SiLU() elifisinstance(m,models.yolo.IKeypoint): m.forward=m.forward_keypoint#assignforward(optional) #此处切换检测头 model.model[-1].export=notopt.grid#setDetect()layergridexport forward_keypoint在原始的yolov7 repo源码中有,作者已经封装好,但估计是还没打算开放使用。使用以下命令进行抽取:

		pythonexport.py--weights'weights/yolov7-w6-pose.pt'--img-size960--simplifyTrue 抽取后的onnx检测头:ad09a2da-d1ab-11ed-bfe3-dac502259ad0.png三、onnxruntime推理onnxruntime推理代码:

		importonnxruntime importmatplotlib.pyplotasplt importtorch importcv2 fromtorchvisionimporttransforms importnumpyasnp fromutils.datasetsimportletterbox fromutils.generalimportnon_max_suppression_kpt fromutils.plotsimportoutput_to_keypoint,plot_skeleton_kpts device=torch.device("cpu") image=cv2.imread('sample/pose.jpeg') image=letterbox(image,960,stride=64,auto=True)[0] image_=image.copy() image=transforms.ToTensor()(image) image=torch.tensor(np.array([image.numpy()])) print(image.shape) sess=onnxruntime.InferenceSession('weights/yolov7-w6-pose.onnx') out=sess.run(['output'],{'images':image.numpy()})[0] out=torch.from_numpy(out) output=non_max_suppression_kpt(out,0.25,0.65,nc=1,nkpt=17,kpt_label=True) output=output_to_keypoint(output) nimg=image[0].permute(1,2,0)*255 nimg=nimg.cpu().numpy().astype(np.uint8) nimg=cv2.cvtColor(nimg,cv2.COLOR_RGB2BGR) foridxinrange(output.shape[0]): plot_skeleton_kpts(nimg,output[idx,7:].T,3) #matplotlibinline plt.figure(figsize=(8,8)) plt.axis('off') plt.imshow(nimg) plt.show() plt.savefig("tmp") ad1bc08c-d1ab-11ed-bfe3-dac502259ad0.png在这里插入图片描述推理效果几乎无损,但耗时会缩短一倍左右,另外有几个点:
  • image = letterbox(image, 960, stride=64, auto=True)[0] 中stride指的是最大步长,yolov7-w6和yolov5s下采样多了一步,导致在8,16,32的基础上多了64的下采样步长
  • output = non_max_suppression_kpt(out, 0.25, 0.65, nc=1, nkpt=17, kpt_label=True) ,nc 和 kpt_label 等信息在netron打印模型文件时可以看到
  • 所得到的onnx相比原半精度模型大了将近三倍,后续排查原因
  • yolov7-w6-pose极度吃显存,推理一张960×960的图像,需要2-4G的显存,训练更难以想象

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测器
    +关注

    关注

    1

    文章

    868

    浏览量

    47731
  • 算法
    +关注

    关注

    23

    文章

    4622

    浏览量

    93094
  • 模型
    +关注

    关注

    1

    文章

    3276

    浏览量

    48956

原文标题:YOLOv7-Pose尝鲜 | 基于YOLOv7的关键点模型测评

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    YOLOV7网络架构解读

    继美团发布YOLOV6之后,YOLO系列原作者也发布了YOLOV7
    的头像 发表于 11-29 10:00 1888次阅读
    <b class='flag-5'>YOLOV7</b>网络架构解读

    在英特尔AI开发板上用OpenVINO NNCF优化YOLOv7

    提高了性能和效率。YOLO算法作为one-stage目标检测算法最典型的代表,其基于深度神经网络进行对象的识别和定位,运行速度很快,可以用于实时系统。YOLOv7 是 YOLO 模型系列的下一个演进阶段,在不增加推理成本的情况下,大大提高了实时目标检测精度。
    的头像 发表于 01-05 09:29 792次阅读
    在英特尔AI开发板上用OpenVINO NNCF优化<b class='flag-5'>YOLOv7</b>

    yolov7 onnx模型在NPU上太慢了怎么解决?

    我将 yolov7tiny.pt(yolov7-tiny 模型)转换为具有 uint8 权重的 yolov7tiny.onnx,然后在 i.MX 8M Plus NPU 上运行
    发表于 04-04 06:13

    无法使用MYRIAD在OpenVINO trade中运行YOLOv7自定义模型怎么解决?

    无法确定如何将 YOLOv7 模型的重量(.pt 文件)转换为OpenVINO™中间表示 (IR) 并推断有 MYRIAD 的 IR。 分辨率 转换使用此 GitHub* 存储库
    发表于 08-15 08:29

    关于YOLOU中模型的测试

    整个算法完全是以YOLOv5的框架进行,主要包括的目标检测算法有:YOLOv3、YOLOv4、YOLOv5、YOLOv5-Lite、
    的头像 发表于 08-16 10:24 835次阅读

    深度解析YOLOv7的网络结构

    最近,Scaled-YOLOv4的作者(也是后来的YOLOR的作者)和YOLOv4的作者AB大佬再次联手推出了YOLOv7,目前来看,这一版的YOLOv7是一个比较正统的YOLO续作,
    的头像 发表于 09-14 11:16 7648次阅读

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的分类
    的头像 发表于 05-12 09:08 1349次阅读
    在AI爱克斯开发板上用OpenVINO™加速<b class='flag-5'>YOLOv</b>8目标检测<b class='flag-5'>模型</b>

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用OpenVINO 开发套件部署并测评YOLOv8的分类
    的头像 发表于 05-26 11:03 1272次阅读
    AI爱克斯开发板上使用OpenVINO加速<b class='flag-5'>YOLOv</b>8目标检测<b class='flag-5'>模型</b>

    YOLOv7训练自己的数据集包括哪些

      YOLOv7训练自己的数据集整个过程主要包括:环境安装—制作数据集—模型训练—模型测试—模型推理 一、准备深度学习环境 本人的笔记本电脑系统是:Windows10 首先下载
    的头像 发表于 05-29 15:18 1104次阅读
    <b class='flag-5'>YOLOv7</b>训练自己的数据集包括哪些

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的目标检测
    的头像 发表于 06-05 11:52 1034次阅读
    在AI爱克斯开发板上用OpenVINO™加速<b class='flag-5'>YOLOv</b>8-seg实例分割<b class='flag-5'>模型</b>

    一文彻底搞懂YOLOv8【网络结构+代码+实操】

    从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新不多,偏向工程实践,主推的还是 ult
    的头像 发表于 06-15 17:15 1.2w次阅读
    一文彻底搞懂<b class='flag-5'>YOLOv</b>8【网络结构+代码+实操】

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的目标检测
    的头像 发表于 06-30 10:43 966次阅读
    在AI爱克斯开发板上用OpenVINO™加速<b class='flag-5'>YOLOv</b>8-seg实例分割<b class='flag-5'>模型</b>

    yolov5和YOLOX正负样本分配策略

    整体上在正负样本分配中,yolov7的策略算是yolov5和YOLOX的结合。因此本文先从yolov5和YOLOX正负样本分配策略分析入手,后引入到YOLOv7的解析中。
    发表于 08-14 11:45 2323次阅读
    <b class='flag-5'>yolov</b>5和YOLOX正负样本分配策略

    使用OpenVINO优化并部署训练好的YOLOv7模型

    在《英特尔锐炫 显卡+ oneAPI 和 OpenVINO 实现英特尔 视频 AI 计算盒训推一体-上篇》一文中,我们详细介绍基于英特尔 独立显卡搭建 YOLOv7 模型的训练环境,并完成了 YOLOv7
    的头像 发表于 08-25 11:08 1552次阅读
    使用OpenVINO优化并部署训练好的<b class='flag-5'>YOLOv7</b><b class='flag-5'>模型</b>

    详细解读YOLOV7网络架构设计

    YOLOV7提出了辅助头的一个训练方法,主要目的是通过增加训练成本,提升精度,同时不影响推理的时间,因为辅助头只会出现在训练过程中。
    发表于 11-27 10:45 783次阅读
    详细解读<b class='flag-5'>YOLOV7</b>网络架构设计