多标签分类论文笔记 | (含代码复现,巨坑总结)Combining Metric Learning and Attention Heads...(MLD-TResNet-L-AAM/GAT+AAM)

个人论文精读笔记,主要是翻译+心得,欢迎旁观,如果有兴趣可以在评论区留言,我们一起探讨。
Paper: https://arxiv.org/pdf/2209.06585v2.pdf
Code: https://github.com/openvinotoolkit/deep-object-reid/tree/multilabel

一、论文翻译+理解

0. 摘要

多标签图像分类允许从给定图像中预测一组标签。与每个图像只分配一个标签的多类分类不同,这种设置适用于更广泛的应用程序。在这项工作中,我们回顾了两种流行的多标签分类方法:基于transformer的分类头和标签关系信息图处理分支。尽管基于transformer的分类头被认为比基于图的分支获得更好的结果,但我们认为,通过适当的训练策略,基于图的方法可以显示出很小的精度下降,同时在推理上花费更少的计算资源。在我们的训练策略中,我们引入了度量学习修正,而不是非对称损失(ASL),这是多标签分类的公认标准。 在每个二元分类子问题中,它使用来自主干的L2归一化特征向量进行操作,并强制正负样本的归一化表示之间的角度尽可能大。这提供了比二元交叉熵损失对非归一化特征更好的识别能力。利用所提出的损失和训练策略,我们在MS-COCO、PASCAL-VOC、NUS-Wide和Visual Genome 500等广泛的多标签分类基准上获得了单模态方法的SOTA结果。我们的方法的源代码可作为OpenVINO™培训扩展的一部分。

1. 介绍

尽管在一个图像上存在多个标签比只有一个硬标签更自然,但多标签分类的发展并不那么深入。由于缺乏专门的多标签数据集,研究人员将MS-COCO (Lin等人,2014年)和PASCAL VOC (Everingham等人,2009年)等一般目标检测数据集转变为具有挑战性的多标签分类基准,通过移除来自数据注释的边界框并只利用它们的类标签。

尽管最近在解决上述基准方面取得了进展,但最新的工作主要集中在得到的模型准确性上,而没有考虑计算复杂性(Liu et al ., 2021)或使用过时的训练技术(Chen et al ., 2019),同时引入了有前途的模型架构。

在这项工作中,我们正在重新审视最新的多标签分类方法,提出适合实时应用的轻量级解决方案,并改进现有模型的性能-准确性权衡。

本文的主要贡献如下:

  • 我们提出了对ML-GCN的修改(Chen等人,2019),增加了图注意力机制(Velickovi等人,2018),并以更传统的方式执行图和CNN特征融合,而不是在图分支中生成一组二分类器。
  • 我们证明了用合适的训练策略,可以通过图注意机制来减少基于transformer分类头和标签共现建模之间的性能差距。
  • 我们首先将度量学习范式应用于多标签分类任务,并提出了一个修改版本的角边缘二值损失(Wen et al ., 2021),其中添加了一个ASL机制 (Baruch et al ., 2021)。
  • 我们通过广泛的多标签分类基准的综合实验验证了我们的损失和整体训练策略的有效性:PASCAL VOC, MS-COCO, Visual Genome (Krishna等人,2016)和NUS-WIDE (Chua等人,2009)。

2. 相关工作

从历史上看,多标签分类受到的关注不如多类别场景,但尽管如此,该领域仍有很大进展。通过开发高级损失函数(Baruch等人,2021)、标签共现模型(Chen等人,2019;Yuan et al ., 2022),设计高级分类头(Liu et al ., 2021;Ridnik等,2021b;Zhu and Wu, 2021),并通过探索注意力区域来发现考虑物体空间分布的架构(Wang et al ., 2017;高、周,2021)。

传统的方法是将一个多标签分类任务转化为一组二值分类任务,通过优化二值交叉熵损失函数来求解。每个单类分类子任务都存在严重的正负不平衡。训练数据集包含的类越多,我们在每个单类子任务中得到的负面信息就越多,因为图像通常只包含大量类的一小部分。改进的非对称损失(Baruch等人,2021),降低了权重和硬阈值,容易获得负样本,显示了令人印象深刻的结果,在多个流行的多标签数据集上达到了最先进的结果,而无需任何复杂的架构技巧。这些结果表明,正确选择损失函数对多标签分类性能至关重要。

另一个有希望的方向是设计特定于类别的分类器,而不是在主干网产生的单个特征向量上使用完全连接的层。这种方法也不会引入额外的训练步骤,只会略微增加模型的复杂性。(Zhu和Wu, 2021)的作者提出了一种替代全局平均池化层的方法,该层对于每个类别生成特定类特征。利用紧凑的Transformer分类头来产生这些特征(Liu et al ., 2021;Ridnik et al ., 2021b)被证明更有效。这种方法通过使用可学习的嵌入查询来假定池化特定于类的特性。

考虑对象位置的分布,或统计标签关系需要数据预处理和额外的假设(Chen等人,2019;Yuan et al, 2022)或复杂的模型架构(Wang et al, 2017;高、周,2021)。例如,(Chen et al ., 2019;Yuan et al ., 2022)通过词嵌入表示标签;然后在这些标签表示上构建一个有向图,其中每个节点表示一个标签。然后在此图上学习堆叠GCNs以获得一组对象分类器。该方法依赖于将标签表示为单词的能力,这并不总是可能的。空间分布建模需要在模型中放置一个类似rcnn的模块(Girshick et al, 2014) (Wang et al, 2017;Gao和Zhou, 2021),这大大增加了训练链条的复杂性。

3. 方法

在本节中,我们将描述整个训练链条和我们的方法的细节。我们的目标不仅是获得有竞争力的结果,而且要使训练对最终用户更友好,更适应数据。因此,遵循(Prokofiev和Sovrasov, 2022)中描述的原则,我们使用轻量级模型架构、超参数优化和早期停止

3.1 模型架构

我们选择了EfficientNetV2 (Tan and Le, 2021)和TResNet (Ridnik et al, 2021a)作为执行多标签图像分类的基础架构。也就是说,我们在TResNet-L、EfficientNetV2、小型和大型上进行了所有的实验。在这些主干之上,我们使用了两种不同的特征聚合方法,并比较了它们的有效性和性能。

3.2 Transformer多标签分类头

作为基于transformer的特征聚合方法的代表,我们使用ML-Decoder (Ridnik et al, 2021b)分类头。它提供多达K个特征向量(其中K是类的数量)作为模型输出, 而不是在使用标准全局平均池化(GAP)分类头时使用单个类无关向量。我们将x(维度为C × H × W)作为模型输入,那么带参数W的模型F产生一个降尺度多通道特征图F = FW (x) (维度为S x H/d × W/d),其中S为输出通道数,d为空间降尺度因子。然后将该特征映射传递给ML-Decoder头部:v = MLD(f) (维度为M × L),其中M为嵌入维数,L≤K为解码器中的组数。最后,向量v通过(Ridnik et al, 2021b)中描述的全连通投影(如果L = K)或组全连通投影(如果L < K)投影到K类对数。在我们的实验中,我们设置L = min(100,K)。此外,我们L2规范化了投影中所有点积的参数,以防我们需要将度量学习损失附加到MLDecoder分类头。
在这里插入图片描述

3.3 图注意力多标签分支(GAT)

(Chen et al ., 2019)的图处理分支的原始结构假设在该分支中生成分类器,然后将其直接应用于由主干生成的特征。这种方法与基于transformer的分类头或任何其他原始空间特征的处理不兼容,如CSRA (Zhu和Wu, 2021)。为了减轻这种限制,我们建议采用图1所示的体系结构。
在这里插入图片描述图1:提出的基于GAT(graph attention)的特征重加权方法的总体示意图。使用GAT从标签关系图中获得的特征对CNN空间特征中的通道进行重加权。然后,对重新加权的特征进行池化操作以获得向量表示。最后,将得到的向量输入到二元分类器Wj中,并使用本文介绍的AAM损失进行优化。

我们使用条件概率的估计来构建Z(标签相关性矩阵),而不是完全依赖于GLOVE和计算余弦相似度。

我们用图注意层处理输入,得到输出h(维度为S×K)。然后,我们通过最大池化操作得到最具影响力的特征,并得到权重R的S次方,用于CNN空间特征的进一步加权得到 f ~ \widetilde{f} f 。接下来,我们将全局平均池化和最大池化操作并行应用于 f ~ \widetilde{f} f ,并将结果求和,得到最终的潜在嵌入 v ~ \widetilde{v} v 。嵌入的 v ~ \widetilde{v} v 最后被传递给二值分类器。我们可以将加权特征传递给ML-Decoder或任何其他特征处理模块,而不是应用简单的空间池

使用图注意力(GAT)分支对transformer头的特征重新加权的主要优点是在推理阶段的计算和模型复杂性开销很小。由于GAT分支对任何图像都具有相同的输入,因此在开始对结果模型进行推理之前,我们可以只计算一次其执行的结果。同时,GAT需要标签的向量表示。如果我们对所有标签(甚至单个单词)都有有意义的描述,则可以通过文本到向量模型生成这种表示。这个条件并不总是成立:一些数据集可能有未命名的标签。在这种情况下,如何为标签生成表示仍然是一个悬而未决的问题。

这里作者描述了他的GAT方法以及端到端的解决方案,至于后面的GAP结构,作者提出也可以换成ML-Decoder检测头,而不是说一定要换,这里我开始看的时候还以为换成MLD才是最终形态,但从后面的实验看来应该不是,这篇重磅的创新点还是图1的GAT结构以及后面的AAM。

3.4 角边缘二值分类(AAM,结合了ASL和度量学习的一种loss)

最近,非对称损失(Baruch等人,2021)已成为执行多标签分类的标准损失选项。根据设计,它会用改进的二值交叉熵损失惩罚每个logit。正负样本的不对称处理允许ASL减少负样本的损失权重,以解决正负不平衡问题。但从模型的辨别能力角度来看,这种方法还有改进的余地。

角边缘损失比交叉熵损失产生更多的判别分类特征,这是识别任务必须具备的特性(Deng等人,2018;Wen等,2021;Sovrasov and Sidnev, 2021)。

我们建议将(Baruch等人,2021)和(Wen等人,2021)的范例结合起来,为多标签分类构建更强的损失。表示ML-Decoder生成的归一化类嵌入vj的点积结果(用骨干或接GAT-based分类头),第j个二值分类器Wj为cos。然后,对于训练样本x和相应的嵌入集v,我们将不对称角边缘损失(AAM)表示为:
在这里插入图片描述
公式中,s为尺度参数,m为角余量,k为正负加权系数,r+、r−为来自ASL的加权参数。尽管有大量的超参数,但其中一些可以安全地固定(如来自ASL的r+和r−)。变化s的影响在增加s时达到饱和(见图2b),如果这个参数的合适值足够大,我们不需要精确地调整它。另外,m的值应该接近于0,因为它在一定程度上复制了s和r的效果,甚至会带来AAM负部分的不希望的增加(见图2a)。第4.5节提供了对超参数的详细分析。
在这里插入图片描述

这里主要就是讲这个loss–AAM,结合了ASL和度量学习,这两者我之前都没学过所以看的云里雾里的,这个需要先验知识,看后面有时间补上,先看个大概。

3.5 训练策略的细节

与我们之前的工作一样(Prokofiev和Sovrasov, 2022),我们的目标是使多标签分类的训练链路可靠、快速和自适应数据集,因此我们使用以下组件:

  • SAM (forest et al ., 2020)无偏置衰减的优化器(He et al ., 2019b)是默认优化器;
  • EMA加权平均,防止过度拟合;
  • 来自(Prokofiev和Sovrasov, 2022)的初始学习率估计过程;
  • OneCycle (Smith, 2018)学习率调度器;
  • 提前停止启发式:如果验证子集上的最佳结果在5个epoch内没有得到改善,并且评估结果低于之前最佳结果的EMA平均序列,则训练过程停止;
  • 随机翻转,预定义的Randaugment (Cubuk等人,2020)策略和Cutout (Devries和Taylor, 2017)数据增强。

4. 实验

  • 评判标准
    我们采用常用的指标来评价多标签分类模型:所有类别的平均精度(mAP),总体精度(OP),召回率(OR),F1-measure(OF1)和每个类别的精度(CP),召回率(CR),F1-measure(CF1)。我们使用mAP作为主要度量标准;在对各种方法进行高级比较时提供其他方法。在每个需要置信度阈值的操作中,阈值0.5被替换。上述指标的确切公式可以在(Liu et al ., 2021)中找到。

  • 各个数据集的特点
    在这里插入图片描述

  • MS-COCO数据集上的测试
    在这里插入图片描述表2给出了MS-COCO的结果。对于这个数据集,我们设置s = 23, lr = 0:007, r−= 1,r+=0。在AAM损失的情况下,我们可以使用TResNet-L作为主干来获得最先进的结果。同时,结合ML-Decoder和AAM损耗的efficientnetv2优于带ASL的TResNet-L,同时消耗的FLOPS减少3.5倍。GCN/GAT分支的性能比ML-Decoder稍差,但在推理的边际计算成本上仍然优于EfficientNetV2-s + ASL。

  • Pascal-VOC数据集上的测试
    在这里插入图片描述

Pascal-VOC测试结果见表3。我们设置s = 17, lr = 0:005, r−= 2,r+ = 1在这个数据集上训练我们的模型。我们对GAT分支的修改在使用EfficientNet-V2-s时优于ML-Decoder,而AAM损耗则提供了一个小的性能提升,并允许使用TResNet-L实现SOTA。此外,在Pascal-VOC上,使用所有考虑的附加图分支或头部的EfficientNet-V2-s显示了比使用ASL的TResNet-L更好的速度/准确性权衡。

这里的GAT re-weighting,我理解就是作者图1的端到端的解决方案,然后ML-Decoder + AAM是来验证AAM的有效性,这里code我初步看作者开源的也是基于EfficientNet-V2-s的backbone的GAT re-weighting的代码。

  • 消融实验

这里就直接截屏了,就是控制变量做实验,验证模块的有效性

在这里插入图片描述
在这里插入图片描述
为了演示每个组件对整个管道的影响,我们将它们逐一添加到基线中。

作为基准(baseline),我们采用了使用SGD优化器的EfficientNetV2-s骨干网和ASL损耗。我们将ASL损失和学习率的所有超参数设置为(Baruch et al ., 2021)。我们在所有的实验中使用3.5节中描述的训练策略。

在表6中,我们可以看到除了添加GAT分支之外,每个组件都带来了改进。ML-Decoder有足够的能力来学习标签相关信息,因此提供GAT分支的进一步线索不会改善结果。此外,我们可以看到r参数的调整对AAM损失是有益的,但是度量学习方法本身即使没有它也会带来改进。最后,将GAT分支添加到ML-Decoder并没有提高准确性,这表明来自GAT的附加信息没有给MLDecoder提供新的线索。

5. 结论

在这项工作中,我们重新审视了两种流行的多标签分类方法:基于变压器的头和标签图分支。我们通过应用我们的训练策略和现代技巧包来改进这些方法的性能,并引入一种新的多标签分类损失,称为AAM。该损失结合了ASL损失和度量学习方法的特性,并允许在流行的多标签基准上获得有竞争力的结果。尽管我们证明了图分支的执行非常接近基于变压器的头,但基于图的方法有一个主要缺点:它依赖于语言模型提供的标签表示。未来工作的方向可能是开发一种方法,该方法将建立一个依赖于直接从图像中提取的表示的标签关系图,而不涉及潜在无意义的标签名称。

二、代码复现

以下都看一遍,再上手,有点乱,有时间再整理,巨多坑,我先总结一下:

  1. 官方给的代码,python的module包没有给版本,万恶之源;
  2. 然后pytorch给的版本也不对,用的代码都有2.0的功能了,还有numpy的版本也不对;
  3. 最后就是module包的版本要更新,代码中有些内容也要调整;
  4. 再者代码用了链接要去下载,但关键又要科学上网,我linux没有啊,就只能本地下载,然后找到对应的地方去放,***!

0. 写在前面

我这里先把版本列一下,conda的版本我是用conda update conda用的最新的,然后cuda,我是11.8,cudnn就配套就好,python是3.8,我都列一下。

pip freeze > requirements.txt

收集!

google-auth==2.23.3
google-auth-oauthlib==1.0.0
greenlet==3.0.0
grpcio==1.59.0
huggingface-hub==0.18.0
idna==3.4
importlib-metadata==6.8.0
importlib-resources==6.1.0
inplace-abn==1.1.0
Jinja2==3.1.2
joblib==1.3.2
kiwisolver==1.4.5
Mako==1.2.4
Markdown==3.5
MarkupSafe==2.1.1
matplotlib==3.7.3
mkl-fft==1.3.8
mkl-random==1.2.4
mkl-service==2.4.0
mpmath==1.3.0
networkx==3.1
numpy==1.24.4
oauthlib==3.2.2
onnx==1.14.1
opencv-python==4.8.1.78
optuna==3.4.0
packaging==23.2
Pillow==10.0.1
protobuf==4.24.4
ptflops==0.7.1.1
pyasn1==0.5.0
pyasn1-modules==0.3.0
pycparser==2.21
pyOpenSSL==23.2.0
pyparsing==3.1.1
PySocks==1.7.1
python-dateutil==2.8.2
pytorchcv==0.0.67
PyYAML==6.0.1
randaugment==1.0.2
requests==2.31.0
requests-oauthlib==1.3.1
rsa==4.9
safetensors==0.4.0
scikit-learn==1.3.1
scipy==1.10.1
six==1.16.0
sklearn==0.0.post10
soupsieve==2.5
SQLAlchemy==2.0.22
sympy==1.11.1
tb-nightly==2.14.0a20230808
tensorboard-data-server==0.7.1
terminaltables==3.1.10
threadpoolctl==3.2.0
timm==0.9.7
torch==2.0.1
torch-lr-finder==0.2.1
torchaudio==2.0.2
-e git+https://github.com/openvinotoolkit/deep-object-reid.git@c92f63d802a03a873f2706462bdd2d5cf8a22de4#egg=torchreid
torchvision==0.15.2
tqdm==4.66.1
triton==2.0.0
typing-extensions==4.7.1
urllib3==1.26.16
werkzeug==3.0.0
yacs==0.1.8
zipp==3.17.0

注意:也可以参考官方的包,把这里的版本带上。

cuda对应的版本,注意conda中的cudatoolkit也要跟/us/local下的cuda版本一致:

cudatoolkit               11.8.0               h6a678d5_0
cudnn                     8.9.2.26               cuda11_0

1. 创建conda环境(以下均在conda中进行)

conda create --name torchreid python=3.8.18
  • 进入conda
conda activate torchreid

或者

source activate torchreid

2. 拉取代码

  • 拉取
git clone https://github.com/openvinotoolkit/deep-object-reid.git
  • 切换分支
git checkout multilabel

3. 安装环境

  • 安装cudatoolkit(一定要先安装cuda)
conda install cudatoolkit=11.8
  • 安装cudnn(这里直接安装即可,会安装配套cuda的cudnn)
conda install cudnn
  • 配置环境
pip install -r requirements.txt
  • 遇到问题1
Collecting inplace_abn
  Using cached inplace-abn-1.1.0.tar.gz (137 kB)
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [6 lines of output]
      Traceback (most recent call last):
        File "<string>", line 36, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "/tmp/pip-install-div2jd3n/inplace-abn_810be5ed00194c44a5bcc754bf5501e0/setup.py", line 4, in <module>
          import torch
      ModuleNotFoundError: No module named 'torch'
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
  • 解决方案
pip install --upgrade setuptools
python -m pip install --upgrade pip
  • 遇到问题2
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
  • 解决方案
apt install libgl1-mesa-glx

4. 训练命令

python tools/main.py --config-file configs/EfficientNetV2_small_gcn.yml --gpu-num 1 custom_datasets.roots "['datasets/COCO/train.json', 'datasets/COCO/val.json']" data.save_dir ./out/
  • 遇到问题3

网络问题,两个文件无法下载,分别是model.safetensors和pytorch_model.bin。(需要科学上网)

  • 解决方案

在本地下好:

https://huggingface.co/timm/tf_efficientnetv2_s.in21k/resolve/main/model.safetensors
https://cdn-lfs.huggingface.co/repos/1a/54/1a5499191575630110693f1105f43e325ae7f696b9f8d34db19ab1309ce0aa15/09dc7ef3e90ec4570d22ae1af1c12cbc1aff590b2c68dec1cbd781340e5a8ccc?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27pytorch_model.bin%3B+filename%3D%22pytorch_model.bin%22%3B&response-content-type=application%2Foctet-stream&Expires=1697800394&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY5NzgwMDM5NH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8xYS81NC8xYTU0OTkxOTE1NzU2MzAxMTA2OTNmMTEwNWY0M2UzMjVhZTdmNjk2YjlmOGQzNGRiMTlhYjEzMDljZTBhYTE1LzA5ZGM3ZWYzZTkwZWM0NTcwZDIyYWUxYWYxYzEyY2JjMWFmZjU5MGIyYzY4ZGVjMWNiZDc4MTM0MGU1YThjY2M%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qJnJlc3BvbnNlLWNvbnRlbnQtdHlwZT0qIn1dfQ__&Signature=rdjIofPONLg5roVfXki%7EycLUzpfL0VQWI4RaT6-1mTyh5gJoXxHZna1Z97YbSuU9t-KFi2Q5iGguyjKsHhZzSlRv-zVd0lPhPGmuMGcE7npRrZnPNFB2V5XFYtho8fWzKVwreGujYmaFE7Ge-zkTivnO7YkqmNs%7EeH69FRmbp5xAqW0LbsEspr0aOkaxqCCVoFXgPyJBra4dVaITeremwJSD0OcW2F2zNCdbo0nGcCDzrYsRijiUIAXweXpESL10uLt776efgzGhrDtuKKdVD68Q-3voq5PdTWTQaVP2VCDjkb66QECoAoUDtRjGJtK41zNfBs-1N6RGMDUWMNRM4A__&Key-Pair-Id=KVTP0A1DKRTAX

然后放在/root/.cache/huggingface/hub/models--timm--tf_efficientnetv2_s.in21k下。

  • 遇到问题4
Couldn't apply path mapping to the remote file.
  • 解决方案
    我碰到是因为远程没同步,等待一会儿就好了。

(其中还有网络不佳的问题, 我手动下载,强行改了路径,先跑着)
在这里插入图片描述

在这里插入图片描述

  • 遇到问题5
AttributeError: module 'torch' has no attribute 'frombuffer'
  • 解决方案
    frombuffer是torch2.0里的方法
    参考:https://pytorch.org/get-started/previous-versions/
    装torch2.0
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.8 -c pytorch -c nvidia

然后docker中的cuda也要换成11.8,cudnn要换成相应的;conda中的cudatoolkit也要换成11.8

然后还要修改:

vim /path/to/deep-object-reid-multilabel/torchreid/models/gcn.py在这里插入图片描述
vim /root/anaconda3/envs/torchreid/lib/python3.8/site-packages/randaugment/randaugment.py
在这里插入图片描述

  • 遇到问题6

pth要下载,网络不佳报错了。(需要科学上网)

  • 解决方案:

手动下载:https://drive.google.com/uc?export=download&id=1N0t0eShJS3L1cDiY8HTweKfPKJ55h141
然后放入并改名:/root/.cache/torch/checkpoints/uc?export=download&id=1N0t0eShJS3L1cDiY8HTweKfPKJ55h141.pth

  • 遇到问题7
<class 'TypeError'> : _matmul_tensor_flops_hook() missing 1 required positional argument: 'other'
Traceback (most recent call last):
  File "/root/anaconda3/envs/torchreid/lib/python3.8/site-packages/ptflops/pytorch_engine.py", line 60, in get_flops_pytorch
    _ = flops_model(batch)
  File "/root/anaconda3/envs/torchreid/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1538, in _call_impl
    result = forward_call(*args, **kwargs)
  File "/home/thomascai/code/deep-object-reid-multilabel/torchreid/models/gcn.py", line 157, in forward
    logits = self.head(glob_features.view(glob_features.size(0), -1))
  File "/root/anaconda3/envs/torchreid/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/thomascai/code/deep-object-reid-multilabel/torchreid/losses/am_softmax.py", line 37, in forward
    cos_theta = F.normalize(x.view(x.shape[0], -1), dim=1).mm(F.normalize(self.weight, p=2, dim=0))
  File "/root/anaconda3/envs/torchreid/lib/python3.8/site-packages/ptflops/pytorch_engine.py", line 333, in __call__
    flops = self.handler(*args, **kwds)
TypeError: _matmul_tensor_flops_hook() missing 1 required positional argument: 'other'
Traceback (most recent call last):
  File "/root/.pycharm_helpers/pydev/pydevd.py", line 1496, in _exec
python-BaseException
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/root/.pycharm_helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/home/thomascai/code/deep-object-reid-multilabel/tools/main.py", line 143, in <module>
    main()
  File "/home/thomascai/code/deep-object-reid-multilabel/tools/main.py", line 80, in main
    print(f'Main model complexity: params={num_params:,} flops={macs * 2:,}')
TypeError: unsupported format string passed to NoneType.__format__
  • 解决方案

全网都找不到,发现注释点没事,先注释掉。
在这里插入图片描述

  • 遇到问题8
RuntimeError: DataLoader worker (pid 3273) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.
  • 解决方案

shared memory不够,把环境打包,重启docker,设置shm=2G

  • 遇到问题9

然后报cuda内存不够

  • 解决方案:

调整batch size:

vim configs/EfficientNetV2_small_gcn.yml

在这里插入图片描述
终于跑起来了,脑壳嗡嗡的在这里插入图片描述

注意

我这边跑的是COCO数据集,要把coco2014的训练和验证数据集里的图片,放到项目目录/datasets/COCO/images中

然后还有配置文件configs/EfficientNetV2_small_gcn.yml的voc都改成coco,注意对应的大小写。

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Thomas_Cai

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

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

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

打赏作者

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

抵扣说明:

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

余额充值