FAMI-Pose训练

news2024/11/25 10:52:47

之前写过FAMI-Pose的论文解析,最近跑了一下官方代码,链接是:FAMI-Pose,但有很多问题,感觉是不是作者上传错了。这篇博客讲一下FAMI-Pose的训练。

运行

首先,安装环境,这个根据官方requirement.txt来就行。数据集配置在DCPose训练那篇文章有讲解。主要跑的还是posetrack2017,运行命令和DCPose类似,进入tools文件夹,python run.py --cfg …/configs/Alignment/posetrack17/Alignment_V15.yaml --train --val即可。

报错与解决

一开始会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/__init__.py", line 9, in <module>
    from .PoseTrack_Alignment import PoseTrack_Alignment
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/PoseTrack_Alignment.py", line 15, in <module>
    from datasets.process import get_affine_transform, fliplr_joints, exec_affine_transform, generate_heatmaps, \
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/__init__.py", line 16, in <module>
    from .structure import *
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/structure/__init__.py", line 9, in <module>
    from .keypoints_ord import coco2posetrack_ord, coco2posetrack_ord_infer,coco2jhmdb_ord_infer
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/structure/keypoints_ord.py", line 10, in <module>
    from datasets.zoo.coco import COCO_joint, COCO_joint_paris
ModuleNotFoundError: No module named 'datasets.zoo.coco'

查看发现,在datasets下的zoo文件夹中没有coco这个东西,包括jhmdb也没有,只有posetrack,如下图所示。估计是作者忘记上传了?
在这里插入图片描述
但是keypoints_ord.py文件的函数中又用到了COCO_joint,所以我参考了DCPose的该文件,按照DCPose代码进行修改。引用posetrack中的两个东西,并注释掉其他的:

# from datasets.zoo.coco import COCO_joint, COCO_joint_paris
from datasets.zoo.posetrack import PoseTrack_Official_Keypoint_Ordering, PoseTrack_COCO_Keypoint_Ordering
# from datasets.zoo.posetrack.pose_topology import POSETRACK_joint
# from datasets.zoo.jhmdb.pose_topology import JHMDB_Keypoint_Ordering

将coco2posetrack_ord函数和coco2posetrack_ord_infer函数中的src_kps和dst_kps修改一下,并注释掉coco2jhmdb_ord_infer函数,因为跑posetrack用不到,然后把DCPose中zoo/posetrack/pose_skeleton.py粘到FAMI-Pose对应位置。

src_kps = PoseTrack_COCO_Keypoint_Ordering
dst_kps = PoseTrack_Official_Keypoint_Ordering

再次运行会发现有下面报错,无法导入

  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/__init__.py", line 9, in <module>
    from .PoseTrack_Alignment import PoseTrack_Alignment
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/PoseTrack_Alignment.py", line 15, in <module>
    from datasets.process import get_affine_transform, fliplr_joints, exec_affine_transform, generate_heatmaps, \
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/__init__.py", line 16, in <module>
    from .structure import *
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/structure/__init__.py", line 9, in <module>
    from .keypoints_ord import coco2posetrack_ord, coco2posetrack_ord_infer,coco2jhmdb_ord_infer
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/process/structure/keypoints_ord.py", line 11, in <module>
    from datasets.zoo.posetrack import PoseTrack_Official_Keypoint_Ordering, PoseTrack_COCO_Keypoint_Ordering
ImportError: cannot import name 'PoseTrack_Official_Keypoint_Ordering'

需要在zoo/posetrack/init.py文件中修改如下:

#from .PoseTrack_Alignment import PoseTrack_Alignment
from .pose_skeleton import *

因为引入PoseTrack_Alignment会造成循环引用。之后再次运行run.py,会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/__init__.py", line 12, in <module>
    from .functions import *
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/functions/__init__.py", line 7, in <module>
    from .alignment_mi_function_term6_1 import AlignmentMIFunction_Term6_V1
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/functions/alignment_mi_function_term6_1.py", line 28, in <module>
    from posetimation.loss.mse_loss import JointMSELoss
  File "/home/dsp/ljh/lab/FAMI-Pose/posetimation/loss/__init__.py", line 9, in <module>
    from .base import build_loss
  File "/home/dsp/ljh/lab/FAMI-Pose/posetimation/loss/base.py", line 11, in <module>
    from .integral_loss import IntegralMSELoss, IntegralL1Loss
ModuleNotFoundError: No module named 'posetimation.loss.integral_loss'

这个就是说没有这个loss,查看会发现压根没有integral_loss这个东西,只有mse_loss,也可能是作者忘记上传了。但这里其实也没有用到这个loss,所以就把这部分注释掉即可。
在这里插入图片描述
注释掉相关部分后,base.py文件就如下所示:

import logging

# from .integral_loss import IntegralMSELoss, IntegralL1Loss
from .mse_loss import JointMSELoss

logger = logging.getLogger(__name__)


def build_loss(cfg, **kwargs):
    if "NAME" in cfg.LOSS:
        logger.warning("NAME 将会在之后被删除,请使用NAMES")
        if cfg.LOSS.NAME == "MSELOSS":
            return JointMSELoss(cfg.LOSS.USE_TARGET_WEIGHT)
        # elif cfg.LOSS.NAME == "IntegralMSELoss":
        #     return IntegralMSELoss(True)
        # elif cfg.LOSS.NAME == "IntegralL1Loss":
        #     return IntegralL1Loss(True)

再次运行run.py会有如下报错:

Traceback (most recent call last):
  File "/home/dsp/ljh/lab/FAMI-Pose/tools/run.py", line 46, in <module>
    main()
  File "/home/dsp/ljh/lab/FAMI-Pose/tools/run.py", line 42, in main
    runner.launch()
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 56, in launch
    trainer = DefaultTrainer(self.cfg, self.output_path_dict, PE_Name=self.args.PE_Name)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 33, in __init__
    self.dataloader = build_train_loader(cfg)
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/build.py", line 38, in build_train_loader
    dataset = DATASET_REGISTRY.get(dataset_name)(cfg=cfg, phase='train')
  File "/home/dsp/ljh/lab/FAMI-Pose/utils/utils_registry.py", line 71, in get
    name, self._name
KeyError: "No object named 'PoseTrack_Alignment' found in 'DATASET' registry!"

意思是PoseTrack_Alignment没有注册,我们需要修改datasets下的init.py文件,将PoseTrack_Alignment导入。将下面一行加入即可。

from .zoo.posetrack.PoseTrack_Alignment import PoseTrack_Alignment

再次运行,又会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/__init__.py", line 16, in <module>
    from .runner import DefaultRunner
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 11, in <module>
    from .trainer import DefaultTrainer
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 15, in <module>
    from datasets import build_train_loader
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/__init__.py", line 12, in <module>
    from .zoo.posetrack.PoseTrack_Alignment import PoseTrack_Alignment
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/PoseTrack_Alignment.py", line 27, in <module>
    from thirdparty.clustering import k_means
ModuleNotFoundError: No module named 'thirdparty.clustering'

可以发现,在thirdparty文件夹下只有nms,没有clustering,如下图所示。
在这里插入图片描述
所以只能注释掉PoseTrack_Alignment.py文件中k_means这一行。其实这一行也是没有用到的。
再次运行会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 56, in launch
    trainer = DefaultTrainer(self.cfg, self.output_path_dict, PE_Name=self.args.PE_Name)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 33, in __init__
    self.dataloader = build_train_loader(cfg)
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/build.py", line 38, in build_train_loader
    dataset = DATASET_REGISTRY.get(dataset_name)(cfg=cfg, phase='train')
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/PoseTrack_Alignment.py", line 78, in __init__
    osp.join(self.json_dir, 'posetrack_train.json' if self.is_train else 'posetrack_val.json'))
  File "/home/dsp/.local/lib/python3.6/site-packages/pycocotools/coco.py", line 81, in __init__
    with open(annotation_file, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/dsp/ljh/lab/FAMI-Pose/DcPose_supp_files/posetrack17_json_files/posetrack_train.json'

这个问题就比较简单了,json文件路径不对,这里就需要修改Base_PoseTrack17.yaml中的一些路径,在上一篇DCPose训练那篇文章有讲过,基本就是json、图片和预训练模型的路径。修改成你自己的PoseTrack数据路径就行了。
然后再次运行run.py,会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 56, in launch
    trainer = DefaultTrainer(self.cfg, self.output_path_dict, PE_Name=self.args.PE_Name)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 33, in __init__
    self.dataloader = build_train_loader(cfg)
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/build.py", line 38, in build_train_loader
    dataset = DATASET_REGISTRY.get(dataset_name)(cfg=cfg, phase='train')
  File "/home/dsp/ljh/lab/FAMI-Pose/datasets/zoo/posetrack/PoseTrack_Alignment.py", line 96, in __init__
    '17val.json'))
  File "/home/dsp/ljh/lab/FAMI-Pose/utils/utils_json.py", line 14, in write_json_to_file
    with open(output_path, "w") as write_file:
FileNotFoundError: [Errno 2] No such file or directory: '/media/Z/frunyang/FAMI-Pose/thirdparty/clustering/pose_analysis/17val.json'

会发现在PoseTrack_Alignment.py文件中有下面的代码,是写的绝对路径:
在这里插入图片描述
这段代码意义不明,大概是跟聚类相关,但是应该是没用到的,所以将self.clustering改为False就行了。所以我感觉作者是不是传错了代码、、、
再次运行,会有如下报错:

  File "/home/dsp/ljh/lab/FAMI-Pose/tools/run.py", line 42, in main
    runner.launch()
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 56, in launch
    trainer = DefaultTrainer(self.cfg, self.output_path_dict, PE_Name=self.args.PE_Name)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 49, in __init__
    self.core_function = build_core_function(cfg, criterion=self.loss_criterion, **kwargs)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/base.py", line 65, in build_core_function
    core_function = CORE_FUNCTION_REGISTRY.get(cfg.CORE_FUNCTION)(cfg, **kwargs)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/functions/alignment_mi_function_term6_1.py", line 61, in __init__
    self.IntegralL1Loss_criterion = IntegralL1Loss()
NameError: name 'IntegralL1Loss' is not defined

这里是因为前面删掉了Integral这个Loss,将alignment_mi_function_term6_1.py中IntegralL1Loss和StructureCosineSimilarity这两行注释掉即可。其实就是有个定义,压根也没用到。

# self.IntegralL1Loss_criterion = IntegralL1Loss()
# self.StructureCosineSimilarityLoss_criterion = StructureCosineSimilarity()

再次运行,会有如下报错(已经说烦了,但这是最后一个了)

  File "/home/dsp/ljh/lab/FAMI-Pose/tools/run.py", line 42, in main
    runner.launch()
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/runner.py", line 57, in launch
    trainer.exec()
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 27, in exec
    self.train()
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/defaults/trainer.py", line 71, in train
    tb_writer_dict=self.tb_writer_dict)
  File "/home/dsp/ljh/lab/FAMI-Pose/engine/core/functions/alignment_mi_function_term6_1.py", line 104, in train
    pred_heatmaps, local_warped_sup_hm_list, kf_bb_heatmaps, mi_loss_list = model(input_x.cuda(), sup_x.cuda())
ValueError: not enough values to unpack (expected 4, got 3)

意思是只能解析出3个变量,但希望的是4个,查看相关代码发现forward函数在训练时返回的变量是3个:
在这里插入图片描述
因此将local_warped_sup_hm_list删掉,在下面加一行 local_warped_sup_hm_list=[] 即可。、
再次运行,出现以下情况就代表运行成功了:
在这里插入图片描述

互信息损失问题

在运行中会发现loss_MI损失函数都是负的,这个是互信息的损失函数,官方代码中计算kl散度时没有取对数,如下所示。

def feat_feat_mi_estimation(self, F1, F2):
    """
    F1: [B,48,96,72]
        F2: [B,48,96,72]
        F1 -> F2
    """
    batch_size = F1.shape[0]
    temperature = 0.05
    F1 = F1.reshape(batch_size, 48, -1).reshape(batch_size * 48, -1)
    F2 = F2.reshape(batch_size, 48, -1).reshape(batch_size * 48, -1)
    mi = kl_div(input=self.softmax(F1.detach() / temperature), target=self.softmax(F2 / temperature))

    return mi

kl_div的input参数需要使用log_softmax函数,这里只使用了softmax函数,所以才会有负数的loss。
但是奇怪的是,经过几个互信息损失函数的计算之后,最后的损失还是正的,但加上log_softmax就变成了负数了所以,我还是直接用这个代码跑了一个结果,当做参考吧。最后的结果如下:
在这里插入图片描述
结果是83.3,和论文的84.8差距有点大,我觉得可能是loss这儿有点问题,不过也不好说。

总结

这篇文章思路挺不错的,但是开源的代码问题真挺多的,不知道是不是作者传错了代码,我改完后与官方结果还是有较大差距,也不知道是啥问题,希望原作者或者有大佬能解释一下吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NTT入门 开拓者的卓识

link 大意&#xff1a; 给定一个长度为n的数组a&#xff0c;求[1,n]的k阶子段和 我们定义k阶子段和如下&#xff1a; 思路&#xff1a; 这个k阶字段和&#xff0c;就是在k-1阶的基础上&#xff0c;再讲所有k-1阶的子段和都相加得到k阶子段和 k是很大的&#xff0c;所以我…

【C++学习】unordered_map和unordered_set的使用和封装

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; unordered_map和unordered_set &#x1f9e2;unordered_map/set&#x1f52e;性能比较&#x1f52e;成…

Python采集二手车数据信息实现数据可视化展示

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用&#xff1a; Python 3.8 Pycharm 专业版是付费的 <文章下方名片可获取魔法永久用~> 社区版是免费的 模块使用&#xff1a; 第三方模块 需要安装的 requests >>> pip install requests p…

分享5款让生活和工作变得更加高效的软件

随着科技的发展,我们的生活和工作变得越来越数字化和自动化。许多实用软件应运而生,它们不仅简化了我们的生活,也使工作变得更加高效。这里我们来介绍5款非常实用的软件工具。 1.安全擦除工具——Secure Eraser Secure Eraser是一款可以安全删除数据的工具&#xff0c;它使用…

基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…

京东T7架构师用470页就把微服务架构原理与开发实战文档讲完了

前言 最近几年软件开发方法层出不穷&#xff0c;微服务作为一种主流的架构模式一直热度不减。 为了帮助广大程序员们更好更快地理解微服务的概念&#xff0c;学习微服务在项目中的实践&#xff0c;本文全面阐述了微服务架构模式的特点、架构思路、设计理念、技术框架及具体的…

根据cadence设计图学习硬件知识day07 了解一些芯片

1.LC0502N &#xff08;ESD静电保护元件&#xff09; 1.1 LC0502N 介绍 应用 ● USB 2.0电源和数据线 ● 机顶盒和数字电视 ● 数字视频接口&#xff08;DVI&#xff09; ● 笔记型电脑 ● SIM端口 ● 10/100以太网 1.2 LC0502N 引脚介绍 &#xff08;无语&#xff0…

1。C语言基础知识回顾

学习嵌入式的C基础知识&#xff0c;主要包括几个核心知识点&#xff1a;三大语法结构、常用的数据类型、函数、结构体、指针、文件操作。 一、顺序结构 程序自上而下依次执行、没有分支、代码简单。 常见顺序结构有&#xff1a;四则运算&#xff1a;&#xff0c;-&#xff0…

通达信顾比倒数线指标公式,信号不漂移

顾比倒数线是由技术派大师戴若顾比发明的&#xff0c;该指标利用三个重要的价格来判断入场或离场时机&#xff0c;可用于盘后制定下一个交易日的操作计划。此外&#xff0c;顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前&#xff0c;需要先了解顾比倒…

vue3之vite创建h5项目之2 (sass公共样式、声明组件、路由配置和layout组件 )

目录 vue3之vite创建h5项目之2 &#xff08; &#xff09;1&#xff1a;安装sass1-1 使用sass引入公共样式11-1-1 main.ts 引入公共样式方式 1-2 vite.config.ts 引入公共样式方式21-3样式文件1-3-1 src / style / index.scss ( 适配iphonex等还有引入其他公共的样式 )1-3-2 sr…

CRM部署Always on 后 CRM报无法更新数据库,数据库只读,且读写分离不正常

CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读&#xff0c;读写分离不正常 问题描述背景信息问题原因解决方案 问题描述 CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读 读写分离不正常,出现错乱链接。 背景信息 1.2个节点配置SQL serve…

从安全气囊到标配EDR,TOP10控制器供应商领跑市场

2022年1月1日开始&#xff0c;国内新生产新乘用车都必须标配EDR&#xff08;Event Data Recorder&#xff09;&#xff0c;也就是俗称的汽车“黑匣子”&#xff0c;也称为汽车事件数据记录系统&#xff0c;记录的数据可重现事故过程&#xff0c;用于汽车事故分析。 在此之前&am…

【常用算法】进制转换

目录 1. 二进制数、八进制数、十六进制数转换为十进制数 2. 十进制数转换为二进制数、八进制数、十六进制数 3. 二进制数和十六进制数的相互转换 4. 使用电脑计算器进行进制转换 1. 二进制数、八进制数、十六进制数转换为十进制数 十进制数的每一位都是10的指数幂。如&…

基于趋动云的 Stable Diffusion Webui 环境搭建

Stable Diffusion Webui 环境搭建&#xff0c;首先新建一个项目&#xff1a; 然后&#xff0c;选择镜像。注意点公开的&#xff0c;已近做好的这个镜像&#xff0c;superx创建&#xff0c;集成了miniconda3的镜像。 然后选择添加数据源&#xff0c;一样&#xff0c;还是点公开&…

Epinio:Kubernetes 的应用程序开发引擎

王海龙&#xff0c;Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层操作系统 Linux&#x…

A100单机多卡大模型训练踩坑记录(CUDA环境、多GPU卡住且显存100%)

踩坑1&#xff1a;服务器只装了 CUDA Driver 没装 CUDA Toolkit 系统&#xff1a;Ubuntu-18.04 用 deepspeed 跑百亿模型训练时&#xff0c;报关于 CUDA_HOME 的错误。 AssertionError: CUDA_HOME does not exist, unable to compile CUDA op(s)执行 echo $CUDA_HOME 和 nvcc…

HTB-Nineveh

HTB-Nineveh 信息收集80端口443端口80端口-新443端口-新 立足www-data -> amroisamrois -> root其他有意思的地方knock knock - Whos there?socket type 信息收集 80端口 目录扫描 /info.php目录 443端口 目录扫描 这完全没头绪&#xff0c;估计是信息收集漏了东西…

NCR被攻击后服务中断!原是BlackCat勒索软件作祟

近日&#xff0c;在遭到BlackCat勒索软件攻击后&#xff0c;NCR 的 Aloha 销售点平台出现中断。 NCR公司是全球关系管理技术解决方案领导供应商&#xff0c;为全球零售、金融、传讯、制造、旅游、交通及保安等客户提供服务。凭著累积多年的业界知识、专业顾问经验、专业增值应用…

手把手教你本地CPU环境部署清华大模型ChatGLM-6B,利用量化模型,本地即可开始智能聊天,达到ChatGPT的80%

大家好&#xff0c;我是微学AI&#xff0c;今天教你们本地CPU环境部署清华大ChatGLM-6B模型&#xff0c;利用量化模型&#xff0c;每个人都能跑动大模型。ChatGLM-6B是一款出色的中英双语对话模型&#xff0c;拥有超过62亿个参数&#xff0c;可高效地处理日常对话场景。与GLM-1…

数据备份系列:Rsync 备份详解(一)

一、Rsync 简介 1.1 Rsync 是一个远程增量文件备份软件工具 1.2 Rsync 的特性 支持拷贝特殊文件&#xff0c;如连接文件、设备等。可以有排除指定文件或目录同步的功能&#xff0c;相当于打包命令 tar 的排除功能。可以做到保持原文件或目录的权限、时间、软硬链接、属主、组…