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

【模型复现】自制数据集上复现目标检测域自适应 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.mfbz.cn/a/421466.html

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

相关文章

计算机网络-典型网络组网架构

前面基本网络知识已经能够满足中小企业的需要了,今天来看下一些基本网络组网架构。 首先网络是分层架构,从接入层到汇聚层再到核心层,然后接入运营商出口。内部包括有线网络、无线网络,出口一般可以使用路由器或者防火墙进行安全防…

Docker:开启访问端口 || IDEA开发工具快速部署到服务器

参考文档:Docker开启远程安全访问-腾讯云开发者社区-腾讯云 一、Linux服务器环境 1.1、安装Linux 1.2、安装docker 二、Linux服务器配置docker开放端口 2.1、首先进入docker配置文件打开 /usr/lib/systemd/system/docker.service 或运行以下命令 vi /usr…

智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)

智能咖啡厅助手:人形机器人 融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛) “机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术,开发能在模拟的咖啡厅场景中承担服务员角色并…

蓝桥杯:真题讲解3(C++版)附带解析

报纸页数 来自:2016年七届省赛大学C组真题(共8道题) 分析: --画出报纸长的样子,如果我们在上面多画一张报纸,那么就符合题意的5,6,11,12。 观察这张图:观察3&#xf…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

JVM 第二部分-2(堆,方法区)

4.堆 堆 一个Java程序&#xff08;main方法&#xff09;对应一个jvm实例&#xff0c;一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建&#xff0c;大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域&#xff0c;是垃圾回收的重点区域堆可以位…

基于SSM的高校竞赛和考级查询系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的高校竞赛和考级查询系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Sp…

带着问题阅读源码——Spring MVC是如何将url注册到RequestMappingHandlerMapping?

背景 在 Spring MVC 中&#xff0c;DispatcherServlet 是前端控制器&#xff08;front controller&#xff09;&#xff0c;它负责接收所有的 HTTP 请求并将它们映射到相应的处理器&#xff08;handler&#xff09;。为了实现这一点&#xff0c;Spring MVC 使用了适配器模式将…

Atcoder ABC342 E - Last Train

Last Train&#xff08;最后一班火车&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入…

<网络安全>《61 微课堂<第1课 南北向流量是什么?>》

1 形象化解释 在网络安全中&#xff0c;经常听到南北向流量这个词。那究竟是什么意思呢&#xff1f; 这里的南北&#xff0c;就是地图上的东西南北&#xff0c;是方向。我们在画网络架构图时&#xff0c;往往是由上到下依次是web层、应用层、数据层&#xff0c;流量从web层到…

数据结构——跳表

简单介绍跳表 跳表&#xff08;Skip List&#xff09;是一种可以进行对数级别查找的数据结构&#xff0c;它通过在数据中构建多级索引来提高查询效率。跳表是一种基于链表的随机化数据结构&#xff0c;其本质是由多个链表组成&#xff0c;每个链表中的元素都是原始链表中的元素…

图神经网络导论 - 刘知远

一、神经网络基础 近年来&#xff0c;机器学习领域的发展迅速&#xff0c;主要表现在多种神经网络架构的出现。尽管不同的神经网络架构相差甚远&#xff0c;但现有的神经网络架构可以分为几个类别&#xff1a; 卷积神经网路是前馈神经网路的特殊形式&#xff0c;FNN通常是全…

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖&#xff0c;由于具体依赖本人也不是记得很清楚了&#xff0c;所以简短的说一下。 iText&#xff1a;PDF 操作库&#xff0c;用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。 MultipartFile&#xff1a;Spring 框架中处理文件上传的类…

MyBatis 学习(四)之 SQL 映射文件

目录 1 SQL 映射文件介绍 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 参考文档 1 SQL 映射文件介绍 映射器是 MyBatis 中最复杂并且是最重要的…

机器学习 -- 梯度下降算法加深

梯度下降算法 在机器学习中&#xff0c;梯度下降算法常用于最小化代价函数&#xff08;或损失函数&#xff09;&#xff0c;以此来优化模型的参数。代价函数衡量的是模型预测值与实际值之间的差异。通过最小化这个函数&#xff0c;我们可以找到模型预测最准确的参数。 代价函…

蓝桥杯-单片机组基础6——定时计数器与外部中断混合使用(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…

[AutoSar]BSW_Com07 CAN报文接收流程的函数调用

目录 关键词平台说明一、背景二、顺序总览三、函数说明3.1 Com_RxIndication&#xff08;&#xff09; 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)…