CNN中添加HOG特征的pytorch实现——基于Alexnet

news/2024/5/19 12:42:37/文章来源:https://blog.csdn.net/weixin_44851176/article/details/127087414

CNN中添加HOG特征的pytorch实现——基于Alexnet

几天前花了差不多两天时间基本实现了这个需求,经历了从一开始的毫无头绪,到最后对CNN模型 (加载数据集和数据流向) 和HOG特征有了更进一步的理解,实现需求之后又杂七杂八的看了一些相关的文章(第一次找论文看,精准的寻找高质量相关论文也是有技巧的~),看的也是似懂非懂,有些论文中涉及到的一些概念和技术以前没有了解过,也会影响对设计思想的理解,所以想要借鉴其他场景下的一些创新也并非易事,再者,也发现了对CNN中涉及到的一些机器学习的基础知识掌握也不好,对CNN中基础的概念和原理还需要进一步巩固。本文目的在于梳理和记录一下实现需求的过程中的思考和逻辑。

HOG

一开始的想法就是无论在模型的哪里或者如何传进去所获得的HOG特征,首先得把HOG特征向量准备好,所以先从了解HOG提取传统特征开始入手。

经过查询了解之后发现,可以使用skimage中提供的hog函数进行特征提取,那么接下来的问题就是了解此函数的传入参数和返回值,以及它们的含义(可以去看源码),当将 visualize=False 时,返回值就是一维的浮点数array,代表传入图片的HOG特征。

使用cv2读取图片,就需要图片的路径,初步的想法就是一次性从.csv中将所有图片的路径保存在数组中,然后就可以遍历数组将所有图片的HOG特征保存在二维array中,当这些都做完之后就发现了问题,由于model在forward时传入的的图片是通过dataloader打乱之后随机组合成的mini_batch,所以在拼接的时候,按数据集中图片的顺序保存的HOG特征就没办法和对应图片的深度特征进行拼接了,所以需要以别的方式获取到图片的路径,以保证每张图片的HOG特征和深度特征的拼接是一一对应的

from skimage import feature as ft
import cv2# def Get_Path(dataPath):     # 从数据集(.csv文件)中一次性获取每张图片的绝对路径
#     csvFile = open(dataPath, "r")
#     reader = csv.reader(csvFile)
#     data= []
#     for item in reader:
#         if reader.line_num == 1:
#                 continue
#         data.append(item[0])
#     csvFile.close()      
#     data = np.array(data)
#     return datadef Get_HOG_NP(HOG_data):HOG_NP = []for path in HOG_data:#print(path)path = str(path)img = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2GRAY)img = cv2.resize(img, (224,224))#print (img.shape)#normalised_blocks, hog_image = hog(img, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(8, 8), block_norm='L2-Hys',visualize=True)features = ft.hog(img,orientations=9,    pixels_per_cell=[16,16],cells_per_block=[2,2],visualize=False,feature_vector= True)# print( type(features) )# print(features.shape)HOG_NP.append(features)HOG_NP = np.array(HOG_NP)# print(HOG_NP.shape)# print(HOG_NP.dtype)# pca = PCA(n_components=64,copy=False)# HOG_NP = pca.fit_transform(HOG_NP)# lda = LDA(n_components=1)# HOG_NP = lda.fit_transform(HOG_NP,labels)return HOG_NP

Dataloader

由于模型中forward的图片数据是dataloader 随机组成 的mini_batch,所以我们就尝试一下能否从mini_batch组合的过程中获得每张图片的路径,这就到了第二个关键部分——模型的数据集加载过程
来源网络

了解了数据记载的全过程,就会发现只需要在重载__getitem__()方法时,将每一张处理过之后的图片同此图片的路径一同打包进Mini_batch即可。


data_transform  = transforms.Compose( [lambda x: Image.open(x).convert('RGB'),#transforms.CenterCrop(300),transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])class MyDataSet(Dataset):  #两个私有成员函数必须被重载:__len__() 和 __getitem__() 方法def __init__(self,mode,data,labels):self.data = data    **#此时 data 还是图片的路径**self.labels = labelsself.transforms = data_transform def __getitem__(self, index):path = self.data[index] # 保存此图片的路径data = self.transforms(self.data[index])  # 拿到此图片路径后进行transformlabel = torch.tensor(int(self.labels[index]))return data,label,path  #将准备好的要传进forward里的图片数据 同 此图片的路径一同打包进Mini_batch  #这样就能保证Mini_batch中 图片数据和路径是对应的def __len__(self):return len(self.labels)def getDataSet(mode,dataPath):csvFile = open(dataPath, "r")reader = csv.reader(csvFile)data= []label = []for item in reader:if reader.line_num == 1:continuedata.append(item[0])label.append(int(item[1]))csvFile.close()data = np.array(data)label = np.array(label)dataSet = MyDataSet(mode,data,label)  # 获取到每个图片的路径和标签return dataSettrain_dataset = getDataSet("train","/home/xb/SARShip/openSARShip/train_old.csv")  # 传入.csv文件路径

cat

接下来就是一些cat前的准备工作了,将array转成能在GPU上运算的张量,数据类型也转换与深度特征数据一致等,然后就可以在每一次迭代中前向传播时尽情的拼接了~~

train_loader = DataLoader(train_dataset,shuffle=True,batch_size = batch_size,num_workers=0)for step, data in enumerate(train_loader):images, labels, path = data  # Mini_batch中images的图片和path中路径一一对应optimizer.zero_grad()#print( type(path) )HOG_data = Get_HOG_NP(path)data2 = torch.as_tensor(HOG_data, dtype=torch.float, device=device)logits = net(images.to(device),data2 )def forward(self, x, data):x = self.features(x)x = torch.flatten(x, start_dim=1)	# 展平后再传入全连接层# print(x.shape)# print(data.shape)x = torch.cat((x,data),1)            # 按列拼接,注意记得修改相应的网络参数#print( x.shape )x = self.classifier(x)return x

注:

由于数据集中的图片是一些大小不同的灰度图,所以,我们如果不像处理用于卷积的图片那样预处理图片大小的话,会得到长度不同的HOG特征向量,这样是没办法用于拼接的,因为模型中全连接层的维度是固定不变的,所以在HOG之前记得resize,或者在HOG之后对特征向量进行降维到统一维度(PCA)。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DolphinScheduler 进阶(资源中心)

文章目录内置参数引用依赖资源内置参数 DolphinScheduler 提供了一些时间相关的系统参数,方便定时调度使用。 1)基础内置参数 变量名参数说明system.biz.date${system.biz.date}定时时间前一天,格式为 yyyyMMddsystem.biz.curdate${system…

资深腾讯架构师耗时2个月整理的Redis全套学习笔记,涵盖所有核心知识点

Redis 是一个开源、基于内存、使用 C 语言编写的 key-value 数据库,并提供了多种语言的 API。它的数据结构十分丰富,基础数据类型包括:string(字符串)、list(列表,双向链表)、hash&a…

18【命令设计模式】

文章目录十八、命令设计模式18.1 命令设计模式简介18.1.1 命令设计模式概述18.1.2 命令设计模式的UML类图18.2 命令设计模式的实现18.3 命令设计模式的优缺点十八、命令设计模式 18.1 命令设计模式简介 18.1.1 命令设计模式概述 命令设计模式(Command Pattern&am…

元宇宙人均月入过万?智联报告大揭秘(附下载);华盛顿大学·线性代数进阶课程;电子书·深度神经网络应用(Keras);前沿论文 | ShowMeAI资讯日报

👀日报合辑 | 📆电子月刊 | 🔔公众号下载资料 | 🍩韩信子 📢 人均『月入过万』?元宇宙领域就业现状究竟如何 自2021年元宇宙元年之后,大批元宇宙相关岗位如雨后春笋涌现在市场上。从耳熟能详的…

罗克韦尔 Rockwell RSLogix 500 Crack

罗克韦尔自动化除了提供自动化基础硬件外,还提供大量的软件工具,并在其产品中包含了最新的Microsoft的32位Windows NT及ActiveXTM技术。这些软件为用户采用开放式的工业标准提供方便。另外借助DDE、ActiveX和ODBC兼容技术等,使现场数据能容易…

Chrome 浏览器的 ChromeOptions 参数介绍,selenium 动态渲染必看

背景 在使用 selenium 浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用。相对应的,当我们用ch…

SpringBoot+SpringSecurity+JWT

声明: 该文章为b站博主“三更草堂”视频讲解文档。 视频链接: https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.1007 文章目录SpringSecurity从入门到精通课程介绍0. 简介1. 快速入门1.1 准备工作1.2 引入SpringSecurity2. 认证2.1 登陆校…

Windows系统深度学习Anaconda、PyTorch软件安装教程

1.作者介绍 陈梦丹,女,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组 研究方向:机器视觉与人工智能 电子邮件:1169738496qq.com 安装思路: 根据电脑显卡选择cuda版本&#xf…

软件供应链中代码签名的重要性

你怎麼知道你的代碼是可信的? 在一個難以獲得信任的世界裡,這是一個重要的問題要問自己。 我們如何知道我們正在運行的應用程序、我們正在部署的容器或我們交付給客戶的代碼是真實的? 我們怎麼知道它沒有被篡改? 這一切都歸結為…

VUE3-实习笔记02

本节:ant design 3 的自定义校验规则 这里是获取数据,保存数据,有两个接口,测试邮箱的校验是非必要的,点击“发送测试邮件”才校验,所以规则是要另外加进去的,然后点击保存的时候,把…

python基本操作的作业

查看变量类型的Python内置函数是____。type () 返回单字符在unicode编码表中的值的函数为____。ord() Python中的布尔型只有两个值,分别为:____和____。True 和 False 执行下列语句后,从键盘输入10,程序的结果是: 1…

ActiveReportsJS 在 React 应用程序中添加和自定义查看器

谷歌搜破解版:ActiveReportsJS 3.2中文版是一个客户端报告解决方案,可用于各种不同的前端框架和库。从 vanilla JavaScript 到 NuxtJS,ARJS 在设计应用程序和使用其组件时非常灵活。在本文中,我们将讨论如何通过 Visual Studio Co…

Delphi 开发过程中简单的版本管理与回退

前言 很多时候,我们在进行代码编写或者窗体设计的时候,如果需要回退某些早前修改的内容,基本是使用CtrlZ做刚刚修改内容的回退处理,但如果某些修改已经过了一段时间我们就不能再这样退回,并且CtrlZ只能按顺序一个一个回…

用QT的modbus相关类编写ModbusTcp主站

目标程序运行界面, 1.新建Qwiget工程,工程文件如下, #------------------------------------------------- # # Project created by QtCreator 2022-09-28T14:53:02 # #------------------------------------------------- QT co…

MYSQL介绍——数据库查询

条件查询 很多时候,我们使用数据库时并不是关心表里所有的数据,而是一部分满足条件的数据,这类条件要用WHERE子 句来实现数据的筛选。 SELECT …… FROM …… WHERE 条件 [ AND | OR ] 条件 …… ;下面给出一个示例: SELECT * …

Android init.rc语言全解析

读懂init语言并不难,难的是有人愿意去做这个事情然后分享出来,如果不是接触到这块的知识,没有谁会专门研究这个,这也是为什么我写第一篇initrc文章到现在过去了7年多了一直没更新的原因,经常有小伙伴私信我希望我写一篇关于init文件解读的文章,或者是想请教下如何在custo…

vue搭建项目、创建登录页面和后台交互之引入axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css(css.txt) 2.3 配置路由 2.4 在Login组件中将提交按键调整为100%宽度 2.5 运行效果 3. 后台交互 3.1 引入ax…

北京跨境电商开发

受疫情影响,许多国际航班停运,民众只能通过网络购买海外商品。越来越多的商家嗅到了这个商机,于是扩大经营范围。2021年以来,跨境电商投资不断升温,随着SaaS体系的完善,需求也在增加。跨境电商在市场上的潜…

SpringCloud之注册中心

1.SpringCloud电商示例 1.1.示例架构 以常见的电商业务为例 cloud-demo:- order-service # 订单服务- user-service # 用户服务- product-service # 商品服务— cloud-common # 不是应用服务,主要用于存放一些公共的内容,如pojo、baseservice这种、还有utilsc…

冰冰学习笔记:反向迭代器的模拟

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…