【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO

news2024/11/16 23:34:23

【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO

  • 1. 环境安装
  • 2. 数据集制作
    • 2.1 数据准备
    • 2.2 数据结构
  • 3. 模型训练
    • 3.1 数据文件配置
    • 3.2 训练超参数配置
    • 3.3 模型训练
  • 4. 模型验证
    • 4.1 验证超参数配置
    • 4.2 模型验证
  • 5. 模型推理
    • 5.1 推理超参数配置
    • 5.2 模型推理
  • 6. 踩坑记录
    • 6.1 AssertionError: train_target_real_fake: No labels in xxx/labels/train.cache. Can not train without labels.
    • 6.2 ValueError: could not broadcast input array from shape (427,325,3) into shape (428,325,3)
    • 6.3 RuntimeError: result type Float can't be cast to the desired output type long int.
    • 6.4 RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:2!


Code 链接: SSDA-YOLO
Paper 链接: SSDA-YOLO: Semi-Supervised Domain Adaptive YOLO for Cross-Domian Object Detection

1. 环境安装

# 创建环境
conda create -n ssda_yolo python=3.9

# 激活环境
conda activate ssda_yolo

# torch 安装
# 本机 CUDA 为 11.8,故安装了符合要求的 pytorch==1.13,这里需要自行根据 CUDA 版本安装适配的 torch 版本
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117

# clone 代码
git clone https://github.com/hnuzhy/SSDA-YOLO.git

# pip 包
cd SSDA-YOLO
pip install -r requirements.txt

2. 数据集制作

2.1 数据准备

  • 以下面展示 README.md 中提到的 CityScapes --> CityScapes Foggy 域适应为例,需要准备数据集 CityScapesCityScapes FoggyNormal-style --> Foggy-styleFoggy-style --> Normal-style
    在这里插入图片描述
  • 其中 Normal-style --> Foggy-styleFoggy-style --> Normal-style 均由 CUT 模型训练得来。CUT 模型训练过程见链接: 【模型复现】自制数据集上复现风格迁移模型 CUT:Contrastive Unpaired Translation

2.2 数据结构

  • 准备训练数据,数据集的文件结构为:
    my_datasets/
    ├──cityscapes_source
    │	├──cityscapes_real
    │	│	├──images/train
    │	│	│	├──xxx.jpg
    │	│	│	└──xxx.jpg
    │	│	└──labels/train
    │	│		├──xxx.txt
    │	│		└──xxx.txt
    │	└──cityscapes_fake
    │		├──images/train
    │		│	├──xxx.jpg
    │		│	└──xxx.jpg
    │		└──labels/train
    │			├──xxx.txt
    │			└──xxx.txt
    └──cityscapesfoggy_target
    	├──cityscapesfoggy_real
    	│	├──images
    	│	│	├──train
    	│	│	│	└──xxx.jpg
    	│	│	│	└──xxx.jpg
    	│	│	└──val
    	│	│		└──xxx.jpg
    	│	│		└──xxx.jpg
    	│	└──labels
    	│		├──train
    	│		│	└──xxx.txt
    	│		│	└──xxx.txt
    	│		└──val
    	│			└──xxx.txt
    	│			└──xxx.txt
    	└──cityscapesfoggy_fake
    		├──images/train
    		│	├──xxx.jpg
    		│	└──xxx.jpg
    		└──labels/train
    			├──xxx.txt
    			└──xxx.txt
    

3. 模型训练

3.1 数据文件配置

  • ./data/yamls_sda 路径下新建数据配置 yaml 文件并进行配置,修改数据加载路径等参数。
    • path: 数据存放路径
    • train_source_real:源域真实训练数据
    • train_source_fake:源域上使用 CUT 生成目标域形式的数据
    • train_target_real:目标域真实训练数据
    • train_target_fake:目标域上使用 CUT 生成源域形式的数据
    • test_target_real:目标域真实测试数据
    • nc:标签数量
    • names:标签名称
  • 数据配置文件示例如下:
    在这里插入图片描述

3.2 训练超参数配置

  • 通过 ssda_yolov5_train.py 进行训练超参数配置,按需进行超参数配置。
    在这里插入图片描述

3.3 模型训练

  • 训练指令
    python -m torch.distributed.launch --nproc_per_node 8 ssda_yolov5_train.py
    
  • 在终端中运行训练命令,若看到下述界面,即成功复现!!!
    在这里插入图片描述

4. 模型验证

4.1 验证超参数配置

  • 通过 ssda_yolov5_test.py 进行验证超参数配置,按需进行超参数配置。
    在这里插入图片描述

4.2 模型验证

  • 验证指令
    python ssda_yolov5_test.py
    
  • 验证成功界面如下。
    在这里插入图片描述

5. 模型推理

  • 官方代码中并未给出模型推理脚本,但分析代码不难发现,推理脚本可复用 YOLOv5-5.0 的推理脚本 detect.py,见链接 YOLOv5-5.0 detect.py,将代码放在主目录下配置参数即可。

5.1 推理超参数配置

  • 通过 detect.py 进行推理超参数配置,按需进行超参数配置。
    在这里插入图片描述

5.2 模型推理

  • 推理指令
    python detect.py
    
  • 推理成功界面如下。
    在这里插入图片描述

6. 踩坑记录

6.1 AssertionError: train_target_real_fake: No labels in xxx/labels/train.cache. Can not train without labels.

在这里插入图片描述

  • 解决方法:
    • 虽然 targetlabels 训练中未使用,但也需按照规范放置 imageslabels.

6.2 ValueError: could not broadcast input array from shape (427,325,3) into shape (428,325,3)

在这里插入图片描述

  • 问题分析:
    • 在进行 mosaic 增强时,图片尺寸不符。查看 soure_fakesource_real 的尺寸后,发现经过 CUT 生成的图像和源域的图像中存在尺寸不一致的情况,导致增强时报错。
      在这里插入图片描述
  • 解决方法:
    • 分别将 soure_fake & source_realtarget_fake & target_real 的尺寸调整一致后进行模型训练。
    • 实现脚本如下:
      import os
      from PIL import Image
      
      # 图像文件夹路径
      folder_a = './real/images/train'  # 存放jpg图像的文件夹
      folder_b = './fake/images/train'  # 存放png图像的文件夹
      
      for filename in os.listdir(folder_a):
          if filename.lower().endswith('.jpg'):
              jpg_path = os.path.join(folder_a, filename)
              png_path = os.path.join(folder_b, filename.replace('.jpg', '.png'))
      
              if os.path.exists(png_path):
                  with Image.open(jpg_path) as jpg_image:
                      with Image.open(png_path) as png_image:
                          jpg_size = jpg_image.size
                          png_size = png_image.size
      
                          # 比较尺寸
                          if jpg_size != png_size:
                              print(f"尺寸不一致: {filename}")
                              # 如果尺寸不一致,调整png图像的大小
                              png_image_resized = png_image.resize(jpg_size, Image.ANTIALIAS)
                              png_image_resized.save(png_path)
                          else:
                              print(f"尺寸一致: {filename}")
              else:
                  print(f"在文件夹B中找不到对应的png文件: {filename}")
      

6.3 RuntimeError: result type Float can’t be cast to the desired output type long int.

在这里插入图片描述

  • 解决方法:
    • utils/loss.py 第 216 行进行如下修改:
    # indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1)))  # image, anchor, grid indices
    indices.append((b, a, gj.clamp_(0, gain[3].long() - 1), gi.clamp_(0, gain[2].long() - 1)))   # image, anchor, grid indice
    
    • 修改完成后如下所示。
      在这里插入图片描述

6.4 RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:2!

在这里插入图片描述

  • 解决方法:
    • 在使用多卡时,训练命令使用 python -m torch.distributed.launch --nproc_per_node 8 ssda_yolov5_train.py

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

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

相关文章

智能驾驶规划控制理论学习03-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图(PRM) 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树(RRT) 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

机器学习---主动学习

1. 概念区分 使用传统的监督学习方法做分类,往往训练样本规模越大,分类的效果越好。但是在现实生活中的 很多场景下,标记样本的获取较困难,需要领域内的专家进行人工标注,需要较大的时间成本和经 济成本。另外&…

R语言安装和简单入门HelloWorld用法

R语言安装和简单入门HelloWorld用法 #R语言安装地址 https://www.r-project.org/ click->CRAN mirror->选择China下列表: https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 选择Download R for Windows 选择base Download R-4.3.2 for Windows 下载文件R-4.3.2-…

Java SPI:Service Provider Interface

SPI机制简介 SPI(Service Provider Interface),是从JDK6开始引入的,一种基于ClassLoader来发现并加载服务的机制。 一个标准的SPI,由3个组件构成,分别是: Service:是一个公开的接口…

K线实战分析系列之十四:三只乌鸦,行情趋弱,留意风险

K线实战分析系列之十四:三只乌鸦,行情趋弱,留意风险 一、三只乌鸦二、三只乌鸦形态总结 一、三只乌鸦 理想的三只乌鸦形态 向下的跳空更显示出盘面的弱势 二、三只乌鸦形态总结 三只乌鸦形态由三根K线组成,都是阴线&#xff…

激光雷达原理

全球汽车行业正在进行自动化变革,这将彻底改变交通运输的安全和效率水平。 戴姆勒在S级豪华车型中引入L3级自动驾驶(L3,在特定条件下自动驾驶,人类驾驶员一旦被请求就会随时接管)是自动驾驶革命的一个重大突破。其他多…

Redis 存储原理和数据模型

redis 是不是单线程 redis 单线程指的是命令处理在一个单线程中。主线程 redis-server:命令处理、网络事件的监听。 辅助线程 bio_close_file:异步关闭大文件。bio_aof_fsync:异步 aof 刷盘。bio_lazy_free:异步清理大块内存。io_…

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址:https://fly-barrage.netlify.app/; 👑🐋🎉如果感觉项目还不错的话,还请点下 star 🌟🌟🌟。 Gitee:https://gitee.com/fei_fei27/fly-barrage&a…

电子电器架构新趋势 —— 最佳着力点:域控制器

电子电器架构新趋势 —— 最佳着力点:域控制器 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师…

Ubuntu进入python时报错:找不到命令 “python”,“python3” 命令来自 Debian 软件包 python3

一、错误描述 二、解决办法 进入”/usr/bin”目录下,查看/usr/bin目录中所有与python相关的文件和链接: cd /usr/bin ls -l | grep python 可以看到Python3指向的是Python3.10,而并无指向python3的软连接 只需要在python与python3之间手动…

探索数字未来:DApp钱包Defi引领新纪元

​小编介绍:10年专注商业模式设计及软件开发,擅长企业生态商业模式,商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地;扶持10余个电商平台做到营收过千万,数百个平台达到百万会员,欢迎咨询。 随…

LINUX基础培训二十八之Shell正则表达式

一、何为正则表达式 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 在Windows/Dos下用于文件查找的通配符( wildcard…

借助ChatGPT使用Python搭建一个工具网站

文章目录 前言网站搭建过程总结 前言 不知不觉ChatGPT已经风靡一年多了,现在基本每天工作时都会用到,相比于传统的搜索引擎它究竟强在哪呢?我觉得以往的搜索引擎是一个机器,你给它关键信息它能返回匹配关键词的内容数据&#xff…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的,有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟,让程序员⾃⼰可以根据实际需求申请和释放相应空间,这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

管家婆云上管家新帐套建立步骤

第一步,客户服务管理; 第二步,添加帐套; 第三步,点击“管理”进入;第四步,添加帐套信息; 第五步,找到客户,查看帐套信息; 第六步,确认…

微服务简介及其相关技术栈

目录 1、简介 2、技术栈 3、单体架构 4、分布式架构 5、微服务 6、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Pyth…

【Java实战项目】SpringBoot + Vue3打造你的在线电子书平台!

今天给大家分享一个基础的Java实战项目,用SpringBoot和Vue3开发一个电子书平台,大家可以尝试做一下这个项目,以此来检验这段时间的学习成果!废话不多说,下面正式进入项目: 一、项目介绍 1. 项目简介 在线…

基于springboot+vue的公寓报修管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

机器人与AGI会撞出什么火花?

真正的科技变革是不是就要来临了?各方大佬都开始布局机器人,对于普通人的就业会造成什么影响? ​ 优牛企讯-企业动态信息监控专家 在优牛企讯-企业动态监控专家搜索可知,全国目前的机器人公司已经达到了26401家,近一年…

VSCode通过SSH连接Docker环境进行开发

文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…