论文阅读:PA-CNN

Learning Rich Part Hierarchies With Progressive Attention Networks for Fine-Grained Image Recognition

2020 TIP,论文主要借鉴了MA-CNN。

1 引言

细粒度分类两类解决方案:局部定位和高阶特征。

目前的定位类方法主要涉及较粗糙的部分,忽略了更细粒度的部分也提供识别的关键信息。然而,由于平滑或模糊特征图的不精确局部化,检测到这种程度是很难的。深层特征图中的每个元素对应于原始图像中的大感受野,导致区域上下文的混合,小部分受到相邻区域的影响,无法精确定位。

本文提出了渐进注意卷积神经网络(PA-CNN),可获取丰富的部分层次结构。主要思想是引入一种部分校正机制,使细粒度部分能够高精度地定位。其中,部分提议网络PPN生成多个局部注意力图,**部分校正网络(PRN)**学习每个部分的特征,并为PPN提供修正的位置。PPN和PRN相互加强。将较粗的尺度的PRN的输入和卷积参数以较细的尺度传递给PPN,可以逐渐生成更细粒度的部分和特征。

本文贡献:

  1. 提出渐进注意力卷积神经网络PA-CNN,可以学习部分的层次结构
  2. 以相互加强的方式优化部分建议子网和部分校正子网
  3. 实验性能好

3 方法

整体结构就是PPN产生多个注意力,PRN根据PPN的目标部分进行修正,再反馈回去:

image-20210523200757838

注意力模块的构成:

image-20210523201058735

详见MA-CNN。

3.1 多注意力模块及其损失

此部分完全就是MA-CNN中的channel grouping操作。

3.3 渐进式注意力CNN

两个模块的结构
  • PPN包括多注意力模块,
    • 输入:原始图片
    • 输出:从原始图片根据注意力图 M p \mathbf{M_p} Mp裁剪正方形块得到的若干新图片 X p \mathbf{X_p} Xp
  • PRN,每个建议部分都有一个全连接层生成注意力
    • 输入:建议部分 X p \mathbf{X_p} Xp
    • 输出:注意力图 M r \mathbf{M_r} Mr
两个模块之间的交互

用PRN的输出修正PPN的区域,修正损失函数:
L r e c ( M p ) = ∑ j , k = 1 ( h , w ) R e c ( m r ( j , k ) , m p ( j , k ) ) R e c ( m r ( j , k ) , m p ( j , k ) ) = ∣ ∣ m r ( j , k ) − m p ( j , k ) ) ∣ ∣ 2 L_{rec}(\mathbf{M_p})=\sum^{(h,w)}_{j,k=1}Rec(m_r(j,k),m_p(j,k))\\ Rec(m_r(j,k),m_p(j,k))=||m_r(j,k)-m_p(j,k))||^2 Lrec(Mp)=j,k=1(h,w)Rec(mr(j,k),mp(j,k))Rec(mr(j,k),mp(j,k))=mr(j,k)mp(j,k))2
R e c ( x 1 , x 2 ) Rec(x_1,x_2) Rec(x1,x2)优化 x 2 x_2 x2逼近 x 1 x_1 x1 m p ( x , y ) m_p(x,y) mp(x,y) m r ( x , y ) m_r(x,y) mr(x,y) M p \mathbf{M_p} Mp M r \mathbf{M_r} Mr在位置 ( x , y ) (x,y) (x,y)的值。

训练策略

image-20210523213243662

M p \mathbf{M_p} Mp何时才算收敛?

3.4 层次表示

首先通过微调的CNN从检测到的部分中提取局部特征,然后将局部特征与从完整图像中提取的全局特征进行深度融合以进行识别,其表示方式为:

image-20210523213754568

4 实验

4.1 消融实验

  1. 修正机制的影响

    第二级部件在提高识别精度方面起着重要作用。修正机制为第二级部件带来了比第一级零件更多的改进。级别更多很难提高,因为太小而不具有区分性。

  2. channel grouping损失的影响

  3. 联合加强表示的影响

  4. 层次表示的影响

  5. 部分数目

    几种规模,每个规模几种部件都是超参数,这种决策是数据驱动的,因为细粒度所有样本都具有相似结构。

4.2 SOTA比较

image-20210523215325377 image-20210523215348288 image-20210523215356310

5 结论

  1. 本文提出了一种渐进式注意力卷积神经网络
  2. 由于观察角度、姿势等不同,许多有区别的部分不可见,因此很难精确定位。由于每个部分都有一个CNN,整个框架很繁琐。 而且需要一种更优雅的方法来确定每个尺度的部件数量。
  3. 未来方向:
    1. 是将部分注意力学习整合到不同层次的规模之间
    2. 设计单个CNN来捕获所有部分的特征
    3. 扩展到其他视觉问题
<think>嗯,用户遇到了FileNotFoundError,说找不到'000001.xml'这个文件,是在训练faster-rcnn-pytorch的时候出现的。首先,我应该考虑文件路径配置的问题。因为VOC2007数据集通常有固定的目录结构,比如Annotations、JPEGImages这些文件夹。用户可能没有正确设置这些路径,或者在生成train.txt的时候路径不对。 接下来,我要回忆一下处理这类错误的常见步骤。首先检查数据集路径是否正确,确认Annotations里确实有那个XML文件。然后看看train.txt里面的内容,里面的文件名是不是正确,有没有路径前缀或者后缀的问题。比如,可能train.txt里写的是000001,但实际上路径需要加上VOC2007/Annotations/000001.xml,这时候就要调整路径的拼接方式。 另外,代码里的配置部分也可能有问题,比如在读取文件时是否正确地组合了基础路径和文件名。比如用户可能在代码里用了os.path.join的时候,如果基础路径后面没有加斜杠,可能会导致路径拼接错误。比如base_path是'VOC2007',而文件名是'Annotations/000001.xml',这样拼接可能变成'VOC2007Annotations/000001.xml',显然不对,应该分开处理。 还有,可能需要检查当前工作目录是否正确。有时候脚本执行的位置不是项目根目录,导致相对路径出错。这时候可以用绝对路径或者调整工作目录。 用户提到是使用faster-rcnn-pytorch的代码,可能需要检查代码中关于VOC数据集处理的部分,比如data/voc0712.py中的路径配置是否正确,或者是否有硬编码的路径需要修改。 另外,文件权限和是否存在也是要考虑的,虽然用户已经遇到了FileNotFoundError,但还是要确认文件确实存在,并且没有被误删或移动位置。 总结一下,可能的解决步骤包括:检查数据集目录结构是否正确,检查train.txt的内容,确认路径拼接方式正确,检查代码中的路径配置,使用绝对路径或正确相对路径,验证当前工作目录,以及检查文件是否存在。这样一步步排查,应该能找到问题所在。</think>### 解决 FileNotFoundError (Errno 2) 路径配置问题 #### 1. 检查数据集目录结构 确保 VOC2007 数据集目录结构符合规范: ``` VOCdevkit └── VOC2007 ├── Annotations # 存放 XML 标注文件 ├── JPEGImages # 存放训练图片 ├── ImageSets │ └── Main # 存放 train.txt/val.txt 等 └── ... # 其他目录 ``` 如果 `000001.xml` 不在 `Annotations` 目录下,需重新整理数据集[^1]。 #### 2. 验证 `train.txt` 格式 检查 `train.txt` 内容是否为纯文件名(无扩展名),例如: ``` 000001 000002 ... ``` 错误示例(含路径或扩展名): ``` VOC2007/Annotations/000001.xml # 错误 000001.jpg # 错误 ``` #### 3. 路径拼接逻辑验证 在数据加载代码中,确认 XML 路径的生成方式。正确示例: ```python # 正确拼接方式 annotations_path = os.path.join("VOCdevkit/VOC2007/Annotations", f"{image_id}.xml") ``` 常见错误代码: ```python # 错误示例:路径层级混乱 os.path.join("VOC2007", "Annotations/000001.xml") # 可能生成错误路径 ``` #### 4. 检查配置文件 在 Faster R-CNN 的配置文件(如 `voc0712.py`)中验证以下参数: ```python # 正确配置示例 DATA_DIR = 'VOCdevkit' VOC_ROOT = os.path.join(DATA_DIR, 'VOC2007') ``` #### 5. 使用绝对路径调试 临时改用绝对路径验证问题根源: ```python xml_path = "/absolute/path/to/VOCdevkit/VOC2007/Annotations/000001.xml" if not os.path.exists(xml_path): print(f"路径错误:{xml_path}") ``` #### 6. 工作目录验证 添加调试代码检查当前工作目录: ```python print("当前工作目录:", os.getcwd()) # 应与项目根目录一致 ``` ### 常见错误场景及解决方案 | 错误类型 | 现象 | 修复方案 | |---------|------|----------| | 相对路径基准错误 | 代码从 `ImageSets` 目录启动 | 使用 `os.chdir()` 调整工作目录 | | 路径大小写问题 | Linux 系统区分大小写 | 统一改为小写路径 | | 符号链接问题 | 数据集通过软链接访问 | 改用物理路径或重建链接 | ### 路径检查脚本 ```python import os def validate_paths(dataset_root): train_txt = os.path.join(dataset_root, "ImageSets/Main/train.txt") with open(train_txt, 'r') as f: for line in f: img_id = line.strip() xml_path = os.path.join(dataset_root, "Annotations", f"{img_id}.xml") if not os.path.exists(xml_path): print(f"缺失文件: {xml_path}") # 调用示例 validate_paths("VOCdevkit/VOC2007") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值