细粒度图像识别算法Mask-CNN 论文笔记

2023-11-07

细粒度图像识别算法Mask-CNN 论文笔记


原文:Mask-CNN: Localizing Parts and Selecting Descriptors for Fine-Grained Image Recognition
下载地址:https://arxiv.org/abs/1605.06878

1 简介

  • 传统的图像识别一般都是识别花、鸟、汽车等不同类别物体,而细粒度图像识别则是要识别同一类物体下的不同子类。举个例子,识别一张图片是猫、狗、汽车还是飞机就是传统的图像识别,而识别一张图片是贵宾犬、边境牧羊犬、吉娃娃还是斗牛犬,则是细粒度图像识别。不同的犬类相似性一般都很高,比如下面的哈士奇和阿拉斯加雪橇犬,如果事先不知道它们有差别的部位,很难正确识别。现在图像识别大都使用卷积神经网络CNN,卷积层会针对整个图像(不论是背景还是物体)提取特征,而细粒度图像识别重点在于物体的一些关键部分,如此一来CNN提取的有很多特征向量都是没用的。
    image.png-412.9kB
  • 前人已经提出了很多先检测物体部位后识别的方法。本文提出了Mask-CNN模型(M-CNN),它在训练时仅需要part annotations和image-level标签这两个信息。其中part annotations分成两个集合:头部和躯干,如此part localization就成了一个三类分割问题。完整的网络可见下图,M-CNN是一个四线模型(four-stream),四个输入分别为完整图像、检测到的头部、检测到的躯干和检测到的完整物体,每条线程通过卷积最后都得到了deep descriptors(应该是常说的特征图),进而得到1024-d向量,将四个向量拼接在一起,通过 l2 正则化、全连接层和softmax,最后得到类别。
    image.png-280.4kB
    image.png-651.8kB
  • 文章做出了三大贡献:

    • 在细粒度图像识别方面,M-CNN是首个端到端的,将深度卷积描述符运用到物体检测的模型;
    • M-CNN的参数最少(40.96M),向量维度最小(8192-d),CUB200-2011上准确率最高(85.4%)。如果通过SVD压缩特征向量至4096-d,准确率还能提高到85.5%。
    • part localization方面同样比其他细粒度识别方法的高,尤其是其他方法还需要额外的边界框(bounding boxes)头部定位准确率要比state-of-the-art高10%。

2 相关工作

  • 过去几年,细粒度识别方法可以分成三类。第一类单纯地增加网络深度;第二类试图消除物体姿势、相机位置等影响,在更加统一的环境下进行分类;第三类注重物体部分的细节,因为现实中不同子类的区别也正是在一些独特的细节方面。
  • part-based的细粒度识别方法也有许多区别。例如有的方法在训练时既用到了bounding boxes又用到了part annotations。有的方法在测试阶段也使用了bounding boxes以确保准确率。有的方法不使用任何额外信息,只用图像级别的标签来训练(弱监督)。还有一些方法基于分割而非基于bounding box。

3 M-CNN模型

3.1 Learning Object and Part Masks

  • 首先,整个M-CNN的设计基于全卷积网络(FCN),也就是说,前面的掩膜和特征提取只用到了卷积层。作者不仅用全卷积网络(FCN)定位细粒度图像中的目标和parts,还将预测的分割部分视为目标和parts的掩膜。
  • 在数据集CUB200-2011中,每个鸟类细粒度图像都有许多part annotations,比如左腿、右腿、喉、喙、眼睛、肚子、前额等等,它们都以key points的形式标注(见图2的第一张)。本论文将这些key points分成头、躯干两大类,简单地连接这些点来生成头和躯干两个Mask,剩下的都是背景。学习Mask的网络结构如下所示:
    image.png-111.8kB
  • 以下是部分图像学习到的Mask。红色的称作head mask,蓝色的称作torse mask,这两个合并在一起就是一个完整的物体,称作object mask。学习这三个mask就是标题说的Learning Object and Part Masks(不得不说一下,当时我愣是没看懂这标题的意思)。需要注意的是,虽然基于key points生成的ground-truth不是特别准确,但是FCN模型能够返回更加准确的Mask。
    image.png-259.6kB

3.2 M-CNN训练

  • 经过了3.1的FCN,我们已经得到了head masktorse maskobject mask三个Mask。接下来,前面提到的four-stream model就要派上用场了。
    • (a):根据上面三个Mask,返回对应的 mallest rectangle bounding box,再加上原图本身,这四张图像就是four-stream model的输入;
    • (a)->(b)->(c):作者选用VGG-16作为基础模型,四个输入通过五个卷积层、relu层和池化层,最终得到512维的特征向量。如果输入尺寸统一为224*224,那么它们特征向量为7*7*512,其实它也对应着一张图像7*7方格的空间位置;
    • (c)->(d):对于后三条线程,把Mask用最近邻方法缩放成7*7大小地二值矩阵,并和对应的7*7*512的特征向量比较:如果某一条512-d向量对应位置的Mask值为1(表示有检测到东西),则向量的值保留,如果对应的Mask值为0,则向量的值置零。而第一条线程,也需要通过object mask的过滤
    • (d)->(e):每条线程中,对于被Mask选中的那么多条512-d特征向量,用求平均和求最大值两种方法得到两条512-d特征向量,并经过 l2 正则化处理。最后把两个向量拼接起来成为一条1024-d的向量。
    • (e)->(f):经过上一步,每条线程都有一个1024-d的向量了,将它们拼接起来,送进全连接层 + softmax,得到结果。由于CUB200-2011有200个类别,所以最终向量也是长200。
  • 训练时,所有图像都保持原有的分辨率,并且只取中间384*384的部分(应该是为了统一尺寸+去除部分背景);
  • M-CNN的四个线程都是端到端训练的,而且参数同时学习;
  • 训练M-CNN时,前面的FCN参数保持不变。

4 实验

4.1 数据集和封装细节

  • Caltech-UCSD 2011 bird dataset有200种鸟类,其中每类都有30个训练图像,每张图像还有15个标注点,用来标记鸟类的身体部位。
  • 四线程网络中每一条都有一个VGG-16模型,其参数通过在ImageNet分类上预训练得到。
  • 作者还用水平翻转的方法使训练图像翻倍。在测试时将原图和对应的翻转图像的预测求平均,并输出得分最高的那个分类。
  • 直接使用softmax的结果要比使用logistic回归差

4.2 分类准确度

4.2.1 Baseline

为了验证M-CNN的优越性,作者额外设计了两个Baseline方法:

  • 在4-stream M-CNN中,把卷积网络替换成全连接层。于是(b)到(e)变成一个最后为全连接层的CNN,输出4096-d的向量,拼接起来为16384-d的向量。此方法称作“4-stream FCs”。
  • 抛弃(d)部分的descriptor selection,把(c)的结果直接求平均和求最大值。此方法称作“4-stream Pooling”。

三种方法的结果:
image.png-29.7kB

4.2.2 与state-of-the-art对比
  • M-CNN准确率的提升之路:
    • 一开始,输入的图像是224*224,M-CNN的准确率有83.1%;
    • 将输入图像变为448*448后,准确率提升到了85.3%;
    • 提高4-stream M-CNN的输入大小到448*448后,准确率反而有些下降;
    • 如果从relu5_2层来提取deep descriptors,并且用Mask过滤一遍,提取出4096-d向量,再和pool5提取出来的拼在一起,变成一个8096-d向量,后续操作相同。该模型称作“4-stream M-CNN+”,它的准确率提升到了85.4%;
    • 用SVD whitening方法将上述的8096-d向量压缩到4096-d,准确率提升到了85.5%;
    • 如果CNN部分采用和part-stacked CNN一样的 Alex-Net模型,准确率只有78.0%,但还是比part-stacked CNN高。关键是替换后的参数只有9.74M了。
  • 为了与其他方法公平比较,所有方法在测试时都不使用part annotations。实验结果如下:
    image.png-240kB

4.3 Part定位结果

  • 为了评价定位效果,作者采用常用的PCP准则(Percentage of Correctly Localized Parts),该准则指的是与ground-truth相比,IOU大于50%的bounding box的比例;

  • 下表是和其他方法相比的分割结果。作者的方法和Deep LAC相比躯干的准确率更低,主要是因为Deep LAC在测试时有用到Bounding box,而M-CNN没有。
    image.png-79.2kB

4.4 object分割结果

  • 下图是一个分割的结果。第一行是原图像,第二行是ground-truth,第三行是M-CNN的分割结果。M-CNN在分割鸟的细微部分(例如爪子)存在一些困难,但M-CNN的任务不是细致地分割出物体,因此可以不用做微调。
    image.png-201.7kB
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

细粒度图像识别算法Mask-CNN 论文笔记 的相关文章

  • typeScript基础类型

    ts基础类型包括 布尔值 数字 字符串 数组 元组 枚举 Any Void Null Undefined Never Object等 1 布尔值 boolean let isDone boolean false 2 数字 number le
  • [深度学习入门]Numpy基础(上)

    目录 一 前言 二 Numpy概述 三 生成Numpy数组 3 1 从已有数据中创建数组 3 2 利用random模块生成数组 3 3 创建特定形状的多维数组 3 4 利用arange和linspace函数生成数组 四 获取元素 五 Num
  • 爱普生EPSON实时时钟芯片-RX8900SA

    爱普生EPSON实时时钟芯片 RX8900SA 一 引脚连接 二 使用方法 寄存器配置 1 实时时间读取 设置 2 闹钟时间读取 设置 三 代码 Rx8900sa c文件 Rx8900sa h文件 一 引脚连接 近期由于项目需求 被指定使用
  • Java区块链代码

    Java是一种流行的编程语言 它可以用来开发区块链应用程序 区块链是一种分布式数据存储技术 其中的数据存储在许多节点之间 并使用密码学算法进行加密 要使用Java来开发区块链应用程序 需要了解区块链的基本原理以及Java编程语言的基础知识
  • linux驱动笔试题总结

    linux驱动笔试题总结 试题取之于网络 用之于民 最近在学习linux驱动 驱动开发在笔试的时候考的知识点是有规律可循的 并且这些面点也是平时驱动工作中的理论指导 深刻的理解这些面点还是很有必要的 所以在此总结记录 相信会用到的 ps 以
  • Qt - Windows系统DWM缩放

    欢迎转载 请注明出处 https blog csdn net qq 39453936 spm 1010 2135 3001 5343 原文链接 https blog csdn net qq 39453936 article details
  • chatgpt赋能python:超出Python用什么?前端开发和数据科学领域的其他编程语言

    超出Python用什么 前端开发和数据科学领域的其他编程语言 Python是一种强大的编程语言 广泛应用于各种领域 例如Web开发 数据分析 机器学习和人工智能等 然而 Python并不是唯一的选择 在某些情况下 其他编程语言可能更适合特定
  • 谷粒学院-项目后端总结

    项目总结 项目层次划分 controller Autowired注解 spring可以自动帮你把Bean里面引用的对象的setter getter方法省略 它会自动帮你set get Autowired注释进行自动注入时 spring容器中

随机推荐

  • anaconda创建、激活(打开)、关闭、删除虚拟环境

    点击开始菜单 然后找anaconda文件夹 里面的anaconda prompt 打开 输入下面的命令 conda create n 环境名 python 3 6 这句话的意思就是创建一个python虚拟环境 开启虚拟环境 source b
  • LoRa无线数传终端的功能特点

    LoRa 无线数传终端是一种基于 LoRa 扩频技术的无线数据传输终端 利用 LoRa 网络为用户提供无线数据传输功能 该产品采用高性能工业级 LoRa 芯片 同时提供 RS232 和 RS485 接口 产品功耗低 传输距离远 环境适应性高
  • StarGLM:天文大模型

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 2023年9月22日 19 00 20 00 李瑀旸 中国科学院国家天文台博士在读 集思谱 北京 科技有限公司首席信息官 CIO 主要方向为人工智能在科研领域的开发与应用 目前正
  • C++类的静态成员和this指针

    静态成员 概述 C 类中的静态成员一共有两种 静态成员变量和静态成员函数 被关键字 static 声明为静态的 称为静态成员 不管这个类创建了多少个对象 静态成员只 有一个拷贝 这个拷贝被所有属于这个类的对象共享 静态成员变量 在一个类中
  • Java编程到底是用idea好还是eclipse好?

    IDEA 全称 IntelliJ IDEA 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 尤其在智能代码助手 代码自动提示 重构 JavaEE支持 各类版本工具 git svn等 JUnit CVS
  • QT学习笔记(五)

    第6章 布局管理 放置在窗体中的每一个窗口部件都必须给定一个合适的大小和位置 Qt提供了多个用于在窗体中摆放窗口部件的布局类 使用Qt布局类的另一个原因是 他们可以确保窗体能够自动适应于不同的字体和系统平台 在窗体中摆放窗口部件 共有三种方
  • 每日一题:01序列

    01序列 题目 Daimayuan Online Judge 大致题意是字符串中只有0和1 找出有多少个子串含有k个1 依次记录每个1的下标 枚举每个1 运用乘法原理 比如01010100 找含有2个1的子串 先枚举第一个橙色的1 然后如果
  • 大數據環境搭建,數據採集,數倉環境準備(hive on spark) 01

    服務器搭建 更改時區 改爲cst sarah hadoop104 ha sudo vi etc sysconfig clock zone Asia Shshanghai sarah hadoop104 ha sudo rm rf etc l
  • OpenGL 纹理数组

    参考 glTexStorage3D glTexStorage3D glTexImage3D glTexSubImage3D glTexStorage3D code example
  • 完美解决,Lightroom CC关闭嵌入式预览

    https www google com search q lr embedded preview turn off sxsrf ALeKk02iHFAT8ggQpkYCHhCRhi67nlPSOQ 3A1627959107736 ei Q
  • 数据结构学习系列之单向链表的两种创建方式

    方式1 通过返回值返回所申请的头结点所在的内存空间首地址 即创建单向链表的头结点 代码如下 示例代码 node t create link node 1 node t phead node t malloc sizeof node t if
  • 软件发展史

    尘埃落定海上花原帖地址 计算机硬件发展 底层应用逐渐完善 软件系统趋向工程化 理论化 程序设计趋向自动化 这使得软件开发工作变得越来越容易 同时 计算机网络和通信技术发展 软件面向的用户越来越多 应用领域越来越广泛 因此软件越来越复杂 软件
  • Arduino:数码管显示原理详解和Proteus仿真实验

    Arduino 数码管显示原理详解和Proteus仿真实验 Proteus仿真 数码管介绍 数码管是半导体发光元件 其基本单元是发光二极管 根据段数 数码管分为七段管和八段管 八段管比七段管还多一个发光二极管单元 小数点多一个 我们将在这个
  • C0232 [2016普及组-A]买铅笔-C语言写

    题目描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物 她发现商店一共有3种包装的铅笔 不同包装内的铅笔数量有可能不同 价格也有可能不同 为了公平起见 P老师决定只买同一种包装的铅笔 商店不允许将铅笔的包装拆开 因此P老师可能需
  • ctfshw (萌新赛)

    目录 萌新记忆 签到题 web 假赛生 0x2f666c6167是 flag得hex编码 用于更改cookie的值 萌新记忆 发现页面都没什么可利用的 尝试访问别的页面 用dirsearch可以扫描出 admin 目录 没错 是扫出目录而不
  • yolov5如何开启和关闭mosaic(马赛克)增强

    总结 将 hyp scratch yaml中的mosaic设置为0 表示关闭马赛克增强
  • 目标检测中的一些评价标准(ACC,Precision,recall,AP,MAP,F1Score,ROC,AUC)

    目标检测中的一些评价标准 ACC Precision recall AP MAP F1Score ROC AUC 介绍这些之前 应该了解一下最基本的TP TN FP FN 先看一下下面这些解释 True positives 简称为TP 即正
  • Qt线程池waitForDone+等待框

    QThreadPool waitForDone 可阻塞线程 采用std function方式将其置于其它线程执行 避免阻塞线程同时可设置等待框 其它线程 生存期 单纯不阻塞线程可以直接不使用waitForDone 一 调用 DlgProce
  • Git技能树(5):分支管理

    Git技能树 5 分支管理 git 分支 几乎所有的版本控制系统都以某种形式支持分支 使用分支意味着你可以把你的工作从开发主线上分离开来 以免影响开发主线 在很多版本控制系统中 这是一个略微低效的过程 常常需要完全创建一个源代码目录的副本
  • 细粒度图像识别算法Mask-CNN 论文笔记

    细粒度图像识别算法Mask CNN 论文笔记 原文 Mask CNN Localizing Parts and Selecting Descriptors for Fine Grained Image Recognition 下载地址 ht