YOLOS调试记录

news2024/11/26 13:37:54

YOLOS是由华中科大提出的将Transformer迁移到计算机视觉领域的目标检测方法,其直接魔改ViT!本文首次证明,通过将一系列固定大小的非重叠图像块作为输入,可以以纯序列到序列的方式实现2D目标检测。
在这里插入图片描述

模型结构

在这里插入图片描述

下面来调试一下该项目,该项目通过Transformer与YOLO相结合进行目标检测,Transformer可谓是自然语言处理领域的常青树,在迁移到计算机视觉领域后凭借其优异的性能引发关注。

该项目的结构参考的是DETR模型,因此在代码理解时我们可以以此为借鉴。

环境配置

首先是创建虚拟环境:

conda create -n yolos python=3.7

随后我们将项目上传到服务器上,完成后激活yolos环境并切换到项目根目录下执行安装依赖包命令

pip install -r requirements.txt

在这里插入图片描述

(博主曾在本地上下载pycocotools 包时时常报错,但在服务器上却正常,想必是与博主的下载通道相关)
随后
值得注意的是在代码中要求的是pytorch1.5及以上,而在运行过程中报错:

cannot import name ‘Dataloader’ from ‘torch.utils.data’

这是由于torch版本不匹配导致的,可以将代码中Dataloader改为torch.utils.data.DataLoader,并将前面的import屏蔽即可,抑或是像博主这样下载一个对应版本的torch,理论上torch 1.8以下就没有问题了。博主安装的是torch 1.6

conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch -y

随后环境基本就没有什么问题了。

在这里插入图片描述

随后便是代码的调试过程了,由于代码结构参考的DETR项目,因此我们的修改参数配置可以借鉴DETR的调试过程。当然,其实官方给出了readme已经讲解的很清楚了,我们按照其步骤来即可。

数据集配置

数据集使用的是COCO2017。建议不要从官网下载,很慢且极易被墙。

随后便是数据集的加载了,将数据集上传到服务器上(论文中实验数据集为COCO2017,该数据集很大,建议找个空闲时间上传)
随后将数据集解压,博主放置的路径为:

unzip annotations_trainval2017.zip
unzip val2017.zip
unzip train2017.zip

在这里插入图片描述在这里插入图片描述

所需模型文件

这里的模型文件分为两种,一个是使用ImageNet做预训练得到的预训练模型,实验中在COCO数据集上训练时使用的便是该模型,另一个便是通过在COCO数据集上训练所得到的模型文件,供我们做评估使用。
当然我们在训练时可以不使用预训练模型,但对于Transformer这种没有先验知识的模型而言消耗无疑是巨大的。

在这里插入图片描述

模型训练

完成后按照官方给出的要求,我们在使用COCO数据集训练微调时,需要加载一下通过ImageNet数据集预训练的预训练模型:

Before finetuning on COCO, you need download the ImageNet pretrained
model to the /path/to/YOLOS/ directory

博主选择的是YOLOS-S这个预训练模型

To train the YOLOS-S model with 200 epoch pretrained Deit-S in the paper, run this command:

python -m torch.distributed.launch 
    --nproc_per_node=8 
    --use_env main.py 
    --coco_path /path/to/coco
    --batch_size 1 
    --lr 2.5e-5 
    --epochs 150 
    --backbone_name small 
    --pre_trained /path/to/deit-small-200epoch.pth
    --eval_size 800 
    --init_pe_size 512 864 
    --mid_pe_size 512 864 
    --output_dir /output/path/box_model

当然我们也可以直接运行main.py,只需要指定好参数即可。
主要就是配置一下数据集地址,init_pe_size,mid_pe_size,预训练模型。

在这里插入图片描述

在这里插入图片描述

至于其他的batch-size,num-workers根据自己电脑性能来即可。
不得不说,Transformer模型都是十分吃配置的,博主只能将batch-size设置为1(与官方给定参数相同)

由于模型与数据集太过庞大,训练起来也是十分缓慢。

在这里插入图片描述
在这里插入图片描述

评估

这里评估即使用YOLOS-S模型在COCO数据集上训练的所得模型进行评估
关于模型评估,官方给出的步骤为:

To evaluate YOLOS-S model on COCO, run:

python -m torch.distributed.launch 
	--nproc_per_node=8 
	--use_env main.py 
	--coco_path /path/to/coco 
	--batch_size 1 
	--backbone_name small 
	--eval 
	--eval_size 800 
	--init_pe_size 512 864 
	--mid_pe_size 512 864 
	--resume /path/to/YOLOS-S

与训练时采用相同的方式,我们也可以使用运行main.py文件来实现。

可视化结果

Visualize box prediction and object categories distribution
可视化标注框预测和对象类别分布

To Get visualization in the paper, you need the finetuned YOLOS models on COCO, run following command to get 100 Det-Toks prediction on COCO val split, then it will generate /path/to/YOLOS/visualization/modelname-eval-800-eval-pred.json

python cocoval_predjson_generation.py 
	--coco_path /path/to/coco 
	--batch_size 1 
	--backbone_name small 
	--eval 
	--eval_size 800 
	--init_pe_size 512 864 
	--mid_pe_size 512 864 
	--resume /path/to/yolos-s-model.pth 
	--output_dir ./visualization

To get all ground truth object categories on all images from COCO val split, run following command to generate /path/to/YOLOS/visualization/coco-valsplit-cls-dist.json

python cocoval_gtclsjson_generation.py 
	--coco_path /path/to/coco 
	--batch_size 1 
	--output_dir ./visualization

To visualize the distribution of Det-Toks’ bboxs and categories, run following command to generate .png files in /path/to/YOLOS/visualization/

 python visualize_dettoken_dist.py 
 	--visjson /path/to/YOLOS/visualization/modelname-eval-800-eval-pred.json 
 	--cococlsjson /path/to/YOLOS/visualization/coco-valsplit-cls-dist.json

在这里插入图片描述

在这里插入图片描述

结语

再次发表一下对于调试该模型时的一些感悟:首先一定要认认真真阅读readme中给我们的指导,这会让我们的调试事半功倍。
其次关于这个模型,该模型根据论文中给出的结果与分析来看,其相较于当下的主流模型如yolov7,yolov8等还是由差距的,但这也意味着其改进空间巨大。Transformer作为NLP领域的中流砥柱,在迁移到计算机视觉后能够表现出如此性能已是出人意料,而这也给我们了许多启示。
对于该模型而言,博主觉得想要复现他的结果还是很难的,以训练为例,在使用COCO数据集时,面对如此庞大的数据集(在Transformer眼中这还只是小数据集)其运行起来是颇为耗时的,博主使用的Nvidia T4 显卡在这种状态也是力不从心。batch-size只能调整为1,而且在训练时,一个epochs所要耗费的时间也是极长的,初步估计可能需要一天时间,这对于我而言无疑是无法接受的。

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

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

相关文章

【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

javaScript基础面试题 ---对象考点

1、对象是通过new操作符构建出来的,所以对象之间不相等 2、对象注意引用类型,如果是引用类型,就可能会相等 3、现在对象本身查找 -> 构造函数中找 -> 对象原型中找 -> 构造函数原型中找 -> 对象上一层原型… 1、对象是通过new操作…

被骗进一个很隐蔽的外包公司,入职一个月才发现,已经有了社保记录,简历污了,以后面试有影响吗?...

职场的套路防不胜防,一不留神就会掉坑,一位网友就被“骗”进了外包公司,他说公司非常隐蔽,入职一个月才发现是外包,但已经有了社保记录,简历污了,不知道对以后面试有影响吗?楼主说&a…

Mysql迁移Postgresql

目录原理环境准备操作系统(Centos7)Mysql客户端安装Psql客户端安装数据库用户导表脚本dbmysql2pgmysqlcopy测试在mysql中建表导表测试查看pg中的表原理 Mysql抽取:mysql命令重定向到操作系统文件,处理成csv文件; PG装载:copy方式…

【大数据源码】Hadoop源码解读 Namenode 启动加载FsImage的过程

Namenode 启动前言启动 Namenode 组件启动脚本Namenode.initializeFSNamesystem.loadFromDiskFsImage.recoverTransitionReadFSImageFormat.loadFSImageFormatProtobuf.load反序列化加载FsImage文件内容FsImage内存数据结构前言 NameNode是HDFS中负责元数据管理的组件&#xf…

PhpStudy下载安装使用教程,图文教程(超详细)

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 PhpStudy一、官网下载二、安装三、简单使用四、粉丝福利PhpStudy:让天下没有难…

bable和AST概述

这里写目录标题bable定义Babel概述Babel 中重要的对象VistorAST定义Javascript 语法的AST(抽象语法树)bable 定义 Babel 是我们知道的将 ES6、ES7等代码转译为 ES5 代码且能安全稳定运行最好的工具同时它允许开发者开发插件,能够在编译时期…

关于 interface{} 会有啥注意事项?上

学习 golang ,对于 interface{} 接口类型,我们一定绕不过,咱们一起来看看 使用 interface{} 的时候,都有哪些注意事项吧 interface {} 可以用于模拟多态 xdm 咱们写一个简单的例子,就举动物的例子 写一个 Animal 的…

【LeetCode】剑指 Offer(17)

目录 题目:剑指 Offer 34. 二叉树中和为某一值的路径 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer …

Spring Cache简单介绍和使用

目录 一、简介 二、使用默认ConcurrentMapManager (一)创建数据库和表 (二)创建boot项目 (三)使用Api 1、EnableCaching 2、CachePut 3、cacheable 4、CacheEvict 三、使用redis作为cache 一、简…

云计算基础——云计算认知

云计算的总体框架在服务方面,主要以提供用户基于云的各种服务为主,共包含3个层次:1.软件即服务(Software as a Service,简称SaaS),这层的作用是将应用主要以基于Web 的方式提供给客户;2.平台即服务(Platform as a Serv…

STL讲解——模拟实现vector

STL讲解——模拟实现vector vector深度剖析 在STL源码中,发现vector定义的并不是 start、size、capacity,而是start、finish、end_of_storage. 这样就可以得到size()和capacity()。 sizefinish-start capacityend_of_storage-start 扩容可能是本地扩容也…

Entity Framework简单使用

我喜欢比较老派的database first , 所以先创建sql server的数据库,比如dbname叫做:Blogging这里我省略了。 在visual studio里面创建一个控制台程序, 然后添加ado.net项目 选择“gen from database” 然后新建你的数据库连接&…

基于粒子群优化算法的分布式电源选址定容【IEEE33节点】(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

测试人员须要知道的性能测试那些事

随着各企业的业务发展、用户量以及数据量的不断增加,系统承载的压力也会随之增加,服务系统的性能好坏又严重影响企业的利益。因此,性能测试重要性与需求越来越强烈。 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应…

数智引航 共赢未来 | 科士达2023数据中心合作伙伴大会圆满召开!

3月5日,科士达2023年全国合作伙伴大会在广东深圳隆重召开,本次大会以“数智引航 共赢未来”为主题,来自全国各地的核心渠道伙伴齐聚一堂,深度交流,展望未来,共同探讨数据中心技术发展趋势,碰撞…

[Python图像处理] 使用高通滤波器实现同态滤波

使用高通滤波器实现同态滤波同态滤波基础实现同态滤波相关链接同态滤波基础 同态滤波是一种去除图像中乘性噪声的技术,常用于校正图像中的不均匀照明。根据图像形成的光照反射模型,图像 f(x,y)f(x,y)f(x,y) 可以由以下两个分量表征: 入射到…

linux中改变了jdk版本,为什么其他用户无法使用?

linux中改变了jdk版本,为什么其他用户无法使用? 1、jdk建在/usr/local目录下 2、环境变量写在/etc/profile下 3、如果发现root用户下,java -version可以出现版本信息,其他用户下查询不到jdk版本信息 问题:root用户下&…

关于递归处理,应该怎么处理,思路是什么?

其实问题很简单,就是想要循环遍历整个data对象,来实现所有name转成label,但是想到里面还有children属性,整个children里面可能还会嵌套很多很多的name,如此循环,很难搞,知道使用递归&#xff0c…

Linux系统安装Hbase,通过Zookeeper管理

目录 一、安装包解压,重命名 二、修改环境配置 2.1、修改 Hbase配置 2.2、修改 zookeeper配置 2.3、修改/etc/profile 环境,添加Hbase和Zookeeper环境路径 三、启动Hbase 四、退出服务 一、安装包解压,重命名 安装包:链接…