【论文阅读笔记】Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer

本文探讨了在训练和测试类别完全不相交的情况下,如何通过属性层进行对象分类。介绍了一种基于属性的迁移学习方法,包括直接属性预测(DAP)和间接属性预测(IAP),并展示了实验结果。

摘要:

本文主要研究训练和测试类别不相交时(即没有目标类别的训练示例)的对象分类问题。在此之前并没有对于毫无关联的训练集和测试集进行对象检测的工作,只是对训练集所包含的样本进行分类。实验表明,通过使用属性层,确实可以构建不需要目标类的任何训练图像的学习对象检测系统。

算法流程:

假设:

\left ( x_1,l_1{} \right ),...\left ( x_1,l_1{} \right )为训练样本x和相应类别标签l的成对数据,数量为n,总共有k个类别,用Y=\left \{ y_1,...,y_k \right \}表示。

目的:

学习一个分类器:f:X\rightarrow Z,其中Z=\left \{ z_1,...,z_L \right \}给测试分为L类。Y为训练集中所包含的类别,Z为 测试集中所包含的类别,两者无交集。

流程:

为实现上述目标,需要建立YZ的关系。因为训练时没有任何关于Z的信息,文章提出建立一个人工定义的属性层A。该属性层应良好的表现样本的类别信息,且定义起来不能太过复杂。引用一位博主的话:

其实整个算法的精髓也就在于这个属性层A,通过这个属性层,将原本基于图片低维特征的分类器,转变为基于高维语义特征(属性层)的分类器,使得训练出来的分类器,分类能力更广,有突破类别边界的能力。可以类比人的思维方式,当人遇到没见过的东西的时候,虽然不会知道它的名字和所属类别,但是能够抽象出它的高维特征。


为实现迁移学习,构造属性层,文章提出了两种模型:

直接属性预测(Direct attribute prediction DAP):

在样本和训练类标之间加入一个属性层A,利用监督学习方式,可以学习到从x生成A的属性参数\beta。在测试阶段,可以利用属性层A来表示测试数据产生的类别Z,从而实现迁移学习。

  

                                              

 

间接属性预测(Indirect attribute prediction IAP):

在训练阶段和传统的监督训练一样,只是在其标签Y上学习一层属性表示层A。在测试阶段,利用标签层Y和属性层A就可以推出测试数据的类别Z

 

                                                                 

 

上述的两种模型,可以用概率图模型的知识进行建模。为简单起见,我们假定所有属性都具有二进制值,使得任何训练类y的属性表示a_y=\left \{ a_1,...a_m \right \},是固定长度的二进制向量。 原则上,可以通过使用回归而不是分类来以相同方式处理连续属性。

 

对于DAP:可以通过监督学习,得到image-attribute层的概率表示P\left ( a\mid x\right ),它是样本x对于所有a_m的后验概率的乘积。在测试时,每一个类别z可以用一个属性向量a_z表示。利用贝叶斯公式得到概率公式

                                                    p\left ( z|x \right )= \sum_{a\epsilon \left \{ 0,1 \right \}}^{}Mp\left ( z|a \right )p\left ( a|x \right )=\frac{p(z)}{p(a^{z})}\prod_{m=1}^{M}p(a_{m}^{z}|x)

由于测试类别Z是未知的,所以可以假设其先验概率相同,即每个p(z)的值是相同的,因此可以去除公式中的p(z)。同时,借助经验函数  p\left ( a_m \right )= \frac{1}{K}\sum_{k=1}^{K}a_{m}^{y_k} ,表示先验概率p(a)。最终由f:X\rightarrow Z的推测,可以使用MAP prediction:

                                                                          f(x)=\underset{l=1,...,L}{argmax}\prod_{m=1}^{M}\frac{p(a_{m}^{z_l}|x)}{p(a_{m}^{z_l})}

对于IAP,仅仅调整了属性表示层。在训练阶段和传统的监督训练一样,在其标签上学习属性表示层A。在测试阶段,同样可根据MAP prediction,得到最终的结果

 

关于DAP和IAP的整体过程,借鉴一位博主的话:

中间属性层A是事先人工定义好的,也就是说,对于训练类别Y可以表示成属性向量ay的形式,同样测试类别Z也可以表示为属性向量az的形式。这个属性层的定义要求不太繁琐,而且能够较好地反映出类别的性质。对于DAP来说,先训练一个分类器X->A,利用训练集Y对应的属性向量进行训练。测试时,即可得到测试样本对应的属性向量A,对比测试集Z类别的属性向量,即可得到对于unseen数据的预测类别。
 

实验结果:

 

最终的实验结果:DAP的准确率为40.5%,IAP的准确率为27.8%

This results in a multi-class accuracy of 40.5% for DAP, as measured by the mean of the diagonal of the confusion matrix,and a multi-class accuracy of 27.8% for IAP.

 

此外,作者使用了一个传统的监督训练。有监督的训练所得出的多类准确性达到65.9%,确实比基于属性的学习取得的40.5%更好。但是,考虑到两者使用数据量的差异,在没有或只有很少的训练集可用的领域,本文提出了一种新的解决方法。

 

参考文献:

[1] C. H. Lampert, H. Nickisch and S. Harmeling, "Learning to detect unseen object classes by between-class attribute transfer," 2009 IEEE Conference on Computer Vision and Pattern Recognition, Miami, FL, 2009, pp. 951-958.

[2] 不会讲段子的正能量小栗子,"Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer(阅读报告)"

https://blog.youkuaiyun.com/u011070272/article/details/73250102

[3]  Ace Cheney,"Zero-Shot Learning论文阅读笔记(第一周)", 

https://blog.youkuaiyun.com/Accelerato/article/details/101309339

 

 

<think>嗯,用户遇到了Python中的AttributeError,具体是'Detect'对象没有'nm'属性。我之前处理过类似的问题,比如YOLOv5中的'Upsample'没有'recompute_scale_factor',还有'Detect'没有'm'属性。这些通常都是版本不兼容或代码与权重文件不匹配的问题。 首先,我需要确认用户使用的YOLOv5版本。因为不同版本的代码结构可能不同,尤其是模型定义部分。如果用户从旧版本升级到新版本,或者反过来,可能会出现属性名称的变化。例如,在某个版本中,'m'可能被重命名为'nm',或者相反。 接下来,用户提到错误是'Detect'对象没有'nm'属性。根据之前的经验,这可能是因为用户使用的模型定义文件(比如models/yolo.py中的Detect类)中的属性名称与加载的权重文件不匹配。比如,新版本的代码可能将'm'改成了'nm',而旧权重文件仍使用旧的属性名,或者相反。 解决方法可能包括:更新代码库到最新版本,确保代码和权重文件都是同一版本。用户需要检查官方GitHub仓库的release notes,看看是否有相关的改动。另外,重新下载最新的权重文件也可能有效,因为旧权重可能不兼容新代码。 此外,用户可能需要检查他们是否修改了模型结构,比如自定义了Detect层,导致属性名称不一致。这时候需要对照官方代码进行调整。 还有可能,PyTorch版本不兼容,用户需要确认他们的PyTorch版本是否符合YOLOv5的要求。例如,某些版本可能需要PyTorch 1.6以上,而旧版本可能会有不同的依赖。 最后,建议用户彻底清理缓存文件,比如__pycache__,有时候旧的编译文件可能导致问题。重新安装依赖项也是一个好步骤,确保所有库都是最新的兼容版本。 总之,用户需要确保代码、权重文件和依赖库版本一致,检查模型定义中的属性名称,必要时更新或回滚版本,并清理可能干扰的缓存文件。</think>关于Python中出现的`AttributeError: 'Detect' object has no attribute 'nm'`错误,这一问题通常与YOLOv5代码版本和模型权重文件不兼容相关。以下是逐步解决方案: --- ### **问题原因分析** 1. **版本冲突**:YOLOv5的代码库更新后,模型定义文件(如`models/yolo.py`中的`Detect`类)可能修改了属性名称(例如从`m`改为`nm`,或反之)[^2]。 2. **权重文件不匹配**:使用了旧版本的预训练权重文件(如`yolov5s.pt`)与新版本代码不兼容[^2]。 3. **代码自定义修改**:若用户自行修改了模型结构但未同步调整权重加载逻辑。 --- ### **解决方案** #### **1. 同步代码与权重版本** - 更新YOLOv5代码库至最新版本: ```bash git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt ``` - 从官方仓库下载**对应版本**的权重文件(如`v6.0`或更高版本)[^2]: https://github.com/ultralytics/yolov5/releases #### **2. 检查模型定义文件** 定位到`models/yolo.py`中的`Detect`类,确认属性命名是否与错误提示一致。例如: ```python class Detect(nn.Module): def __init__(self, nm=80, ...): # 确认属性名是否为nm self.nm = nm # 或可能是self.m ``` #### **3. 回退版本(可选)** 若问题由新版本代码引入,可回退到旧版本: ```bash git checkout v5.0 # 切换到v5.0分支 ``` #### **4. 清理缓存文件** 删除PyTorch和Python的缓存文件(如`__pycache__`文件夹),避免旧代码残留。 #### **5. 验证PyTorch环境** 确保PyTorch版本符合要求(>=1.6): ```bash pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html ``` --- ### **相关问题** 1. **如何避免YOLOv5版本更新导致的兼容性问题?** 建议固定代码库和权重文件的版本,或使用Docker环境隔离依赖[^2]。 2. **YOLOv5训练时出现类似的属性错误应如何处理?** 检查`--weights`参数指向的权重文件是否与代码版本匹配,并确保数据集配置正确[^1]。 3. **自定义模型后如何解决属性不匹配问题?** 需同步修改模型定义文件中的属性名称,或使用`state_dict()`手动调整权重加载逻辑。 --- 通过上述步骤,可系统性解决`'Detect' object has no attribute 'nm'`错误。若问题仍未解决,建议提供完整的错误堆栈信息以进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值