细粒度图像分类模型(含实战代码)

news2024/11/18 7:47:25

来源:投稿 作者:lsc 
编辑:学姐

理论部分

01细粒度图片分类问题

1.1细粒度图片分类特点

可判别区域往往只是在图像中很小的一块区域内。

1.2细粒度图像分类数据集

1.3细粒度图像分类竞赛

1.4细粒度图像分类模型分类:

(1)强监督模型: 需要类别以外的标签进行监督

(2)弱监督模型: 不需要类别以外的标签

02强监督模型

Part-based R-CNN标签,引入bounding box和key point等额外的标注信息

Part-based R-CNN的基本流程:

(1)基于R-CNN算法和空间的分布约束条件对局部区域进行检测,得到整体、头部和躯干部件。

(2)对不同区域使用对应的分类器提取卷积特征。

(3)将3个分类网络的全连接层特征进行连接,得到最后的特征表示。

(4)通过SVM分类器进行分类训练,该算法在CUB-200数据集上取得了73.9%的精度。

Part-based RCNN的缺陷:

(1)需要多个检测模型和多个分类网络,就算量大

(2)对不同数据集需要不同的部件划分,甚至难以划分(如植物),很难通用

03弱监督模型

3.1MA-CNN模型,不需要额外的标签

不显式地定义各个部件,不需要引入目标检测模型,而是对通道进行聚类(相加),得到不同部件的注意力图,将其看作 ’虚拟的部件’。

第2步: 聚类初始化,使用K-means等聚类方法对特征进行聚类,得到N个部件。

第3步: 得到初始的N个部件,为每一个部件引入全连接层,预测c维向量,对应每一个通道有多大的概率属于该部件,初始化标签为第1步聚类结果。

第4步: 得到N个c维向量,对特征图进行加权求和,得到N个部件的注意力。

MA-CNN模型特点:

(1)不需要多个网络,通过通道实现了注意力机制

(2)模型学习流程比较复杂

3.2双线性模型

3.2.1双线性卷积神经网络结构(Bilinear CNN)

B-CNN根据大脑工作时同认知类别和关注显著特征的方式,构建了两个线性网络,协调完成局部特征提取和分类的任务,该算法在CUB-200数据集上取得了84.1%的精度,不过该方法在合并阶段会产生较高的维度,使得整个计算开销非常大。

3.2.2双线性卷积神经网络结构(Bilinear CNN)特征外积计算

3.2.3双线性卷积神经网络结构(Bilinear CNN)

3.2.4 3钟双线性模型

(a)无共享

(b)部分共享

(c)完全共享(参数量最少,且没有明显的精度损失)

3.2.5双线性模型的输出维度太大

3.2.6 紧凑的双线性模型,通过使用低维的kernel近似来实现紧凑的双线性方法

近似方法: Random Maclaurin(RM), Tensor Sketch(TS)

compact bilinear feature,维度可以指定,如将512 * 512 = 262144降维到2048

3.2.7投影降维

sketch表示单个空间位置的内积。

RM与TS投影方法与完整双线性模型对比

随着投影维度增加,逐步逼近完整双线性模型的性能

CUB鸟类识别数据集,VGG基准模型: 2000到800维度比较合适

3.2.8双线性模型的特点:

(1)模型结构比较简单,不需要特殊设计

(2)学习特征之间的注意力,有一定训练难度

代码部分

1、细粒度分类实战简介

数据集: CUB-200,共200种不同种类的鸟

使用网络: bilinear cnn

2、数据集读取

使用torch.utils.data里的data函数实现编写过程,分为__init__、__len__、__getitem__三个模块,

init: 完成某些参数的初始定义

len: 获取数据集的总数

getitem: 读取每幅图像和标签

class cub_dataset(Dataset):
    def __init__(self, txt_path = "lists/lists/train.txt", file_path = "images/images/",
                transforms = None):
        self.txt_path = txt_path
        self.file_path = file_path
        fh = open(txt_path, 'r')
        imgs = []
        lals = []
        for line in fh:
            line = line.strip('\n')
            line = line.strip()
            words = line.split('.')
            imgs.append(line)
            lbls.append(int(words[0]) - 1)
        self.imgs = imgs
        self.lbls = lbls
        self.transform = transform
        
    def __getitem__(self, index):
        img = self.imgs[index]
        lbl = self.lbls[index]
        img = cv.imread(self.file_path + img)
        img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
        if self.transform is not None:
            img = self.transform(img)
        return torch.Tensor(img).float(), int(lbl)
    
    def __len__(self):
        return len(self.imgs)

3.模型搭建

(1)理解网络的设计思想

(2)利用torch.nn指令完成模型的基本搭建

(3)主要包括nn.Conv2d、nn.BatchNorm2d、nn.AvgPool2d等

class BCNN(nn.Module):
    def __init__(self):
        nn.Module.__init__(self)
        self.features = torchvision.models.vgg16(pretrained = True).features
        self.features = nn.Sequential(*list(self.features.children())[:-1])
        self.fc = nn.Linear(512 ** 2, 200)
        for param in self.feature.parameters():
            param.requires_grad = True
        nn.init.kaiming_normal_(self.fc.weight.data)
        if self.fc.bias is not None:
            nn.init.constant_(self.fc.bias.data, val = 0)
    
    def forward(self, x):
        N = x.size()[0]
        assert x.size() == (N, 3, 448, 448)
        x = self.features(x)
        assert x.size() == (N, 512, 28, 28)
        x = x.view(N, 512, 28 ** 2)
        x = torch.bmm(x, torch.transpose(x, 1, 2)) / (28 ** 2)
        assert x.size() ==(N, 512, 512)
        x = x.view(N, 512 ** 2)
        x = torch.sqrt(x + 1e-5)
        x = nn.functional.normalize(x)
        x = self.fc(x)
        assert x.size() == (N, 200)
        return x

图像分类论文已整理👇点击卡片关注

回复“CVPR”领取

 

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

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

相关文章

Java之AQS

AQS是什么 是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,整体就是一个抽象的FIFO队列来完成资源获取线程的安排工作,并通过一个int类变量表示持有锁的状态。 使用到AQS的一些类 ReentranLock: CountDownLatch ReentrantReadWriteLock:…

Go语言开发小技巧易错点100例(四)

往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三) 本期看点(技巧类用【技】表示,易错点用…

_14LeetCode代码随想录算法训练营第十四天-C++二叉树

_14LeetCode代码随想录算法训练营第十四天-C二叉树 题目列表 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长…

RabbitMQ 第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序【生产者】

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础3 RabbitMQ 快速入门3.1 入门程序3.1.1 生产者第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序 3.1.1 生产者 看下文档 点进去 先就来做一个 这个简单模式 P&…

vector

目录vector的介绍和使用vector的介绍vector的使用vector 空间增长问题vector 迭代器失效问题。(重点)vector与erase迭代器失效的代码vector深度剖析及模拟实现vector模拟实现代码使用memcpy拷贝问题动态二维数组理解vector反向迭代器reverse_iteratorvec…

Android开发进阶——Coil对比Glide分析

Coil概述 Coil是Android上的一个全新的图片加载框架,它的全名叫做coroutine image loader,即协程图片加载库。 与传统的图片加载库Glide,Picasso或Fresco等相比。该具有轻量(只有大约1500个方法)、快、易于使用、更现代的API等优…

【Vue项目搭建】vue-admin-template修改(2)

接上文、、 --------------------------------------------------------- 优化登录 单独封装路由守卫 ,设置白名单,permission.js,鉴权 跳转动画优化(使用NProgress插件) 显示logo svg 改填充颜色 stroke //画线颜色…

小题 错题总结

要是对象具有序列化,应该实现的接口是 Java.IO.Serializable在 JVM 内存划分中 ,方法通常存储在 方法区多态的3种表现形式: 继承重写 重载 向上转型Java 中继承可以间接继承,即便中间跨过一个类,栗子:所有…

一文读懂Linux内核中的Device mapper映射机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流…

基于PHP的动漫电影信息管理系统

有需要请私信或看评论链接哦 可远程调试 基于PHP的动漫电影管理系统一 介绍 此动漫电影信息管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员,用户注册登录后可观看/下载/收藏/留言/评分动漫电影等&#xff0c…

Multi-Channel PCe QDMARDMA Subsystem

可交付资料: 1. 详细的用户手册 2. Design File:Post-synthesis EDIF netlist or RTL Source 3. Timing and layout constraints,Test or Design Example Project 4. 技术支持:邮件,电话,现场&…

隐私计算概述

1. 基本概念 隐私计算是指在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一些列信息技术,保障数据在流通和融合过程中的“可用不可见”。 从技术交付出发,隐私计算是众多学科的交叉融合技术,目前主流的隐私计算技术分为三大方向:第一类是多方安全计算为代…

linux内核中断

目录 硬中断特点 中断API 线程中断 系统标准的优先级顺序 中断信息查看 中断上半部与下半部 软中断与并发 硬中断特点 优先级最高中断函数在中断上下文中,不能阻塞不要间接或直接调用shedule() 在申请内存空间时,使用GFP_ATOMIC 标志&#xff08…

Blender——苹果纹理绘制

效果图 前言 在进行纹理绘制之前,首先要具有苹果三维模型。 关于苹果的建模请参考:Blender——“苹果”建模_行秋的博客 1.苹果UV的展开 1.1首先点击UV Eidting,滑动三维模型,使其大小适中。 1.2打开左上角的UV选区同步&#x…

IPv6 的地址(计算机网络-网络层)

目录 IPv6地址的表示方法 IPv6的分类 IPv6 全球单播地址 IPv6 多播地址 IPv6地址的表示方法 在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 *10^ 38 。在想象得到的将来,IPv6的地址空间是不可能用完的 128位的IPv6地址使用冒号十六进制记…

玩以太坊链上项目的必备技能(库 [library]-Solidity之旅十七)

库(library) 作为开发者的您,想必对项目中重复使用的工具函数,抽取到一个公共中,以便可以在您项目中的其它位置可调用。 而 Solidity 与您所熟知的没有什么不同,它也是用来实现可重复调用,且还…

基于 Traefik 的激进 TLS 安全配置实践

前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易。 Traefik可以与现有的多种基础设施组件(Docker、Swarm模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地配置自…

力扣(39.40)补9.20

目前打算刷些算法题&#xff0c;数据结构的题暂时放一放吧。 39.组合总和 不会&#xff0c;毕竟好久没做回溯了。 看了这个图会好理解很多呦。 class Solution { List<List<Integer>> ansnew ArrayList<>(); List<Integer> listnew ArrayList<>(…

AcWing算法学习之动态规划(基础)

背包问题 01背包问题 思路&#xff1a; 01背包问题&#xff0c;表示每个物品要么放&#xff0c;要么不放。从集合的角度分析DP问题&#xff0c;状态表示为&#xff1a;选择前i个物品&#xff0c;总体积小于等于j的选法的集合&#xff0c;属性f[i][j]表示价值的最大值。状态计算…

正交编码器数字滤波器(二)

正交编码器数字滤波器&#xff08;一&#xff09;电路初画完了&#xff0c;正交编码器数字滤波器&#xff08;二&#xff09;把核心部分用HDL描述语言实现了&#xff0c;放在一个小芯片里。 上面的整张图上&#xff0c;截出下面的小图&#xff0c;就用古老的ABEL工具实现它。 这…