SuperYOLO安装以及训练自定义数据集

SuperYOLO安装以及训练自定义数据集

实验环境

本次使用的关键实验环境如下

Windows11
python=3.8
torch 2.0.1+cu117 
CUDA:0 (NVIDIA GeForce RTX 3050 Laptop GPU, 4095.5MB)
Cuda compilation tools, release 11.7, V11.7.99

环境安装

Anaconda创建虚拟环境super-yolo并进入

conda create -n super-yolo python=3.8 -y
conda activate super-yolo

拉取super-yolo项目并进入项目目录

官网地址:icey-zhang/SuperYOLO: SuperYOLO is accepted by TGRS (github.com)

git clone https://github.com/icey-zhang/SuperYOLO.git
cd SuperYOLO

安装pytorch环境

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

安装项目环境

pip install -r requirements.txt

经测试,后面运行项目会缺少库,还需安装如下库

pip install numba timm

训练官方数据集

官方数据集下载地址

或者使用我的下载地址

下载完后解压到某个目录即可,数据集格式如下

你的存放路径
├── dataset
│   ├── VEDAI
│   │   ├── images
│   │   ├── labels
│   │   ├── fold01.txt
│   │   ├── fold01test.txt
│   │   ├── fold02.txt
│   │   ├── .....
│   ├── VEDAI_1024
│   │   ├── images
│   │   ├── labels
  1. 处理数据集
    修改data/transform.py文件中的数据集存放路径

    修改前

    PATH = '/home/data/zhangjiaqing/dataset/'
    

    修改为自己的存放路径

    PATH = r'D:\Users\13055\Documents\BaiduDisk\dataset'+'/'
    

    运行data/transform.py,划分下数据集,更新训练时用的txt文件

    python data/transform.py
    
  2. 修改配置文件

    修改数据集配置文件data/SRvedai.yaml中数据集存放路径

    修改前

    train: /home/data/zhangjiaqing/dataset/VEDAI/fold01_write.txt
    test: /home/data/zhangjiaqing/dataset/VEDAI/fold01test_write.txt
    val: /home/data/zhangjiaqing/dataset/VEDAI/fold01test_write.txt
    

    修改后

    train: D:\Users\13055\Documents\BaiduDisk\dataset\VEDAI/fold01_write.txt
    test: D:\Users\13055\Documents\BaiduDisk\dataset\VEDAI/fold01test_write.txt
    val: D:\Users\13055\Documents\BaiduDisk\dataset\VEDAI/fold01test_write.tx
    
  3. 开始训练

    python train.py --cfg models/SRyolo_MF.yaml --super --train_img_size 1024 --hr_input --data data/SRvedai.yaml --ch 64 --input_mode RGB+IR+MF
    
  4. 运行存在的问题

    • AssertionError: train: No labels in D:\Users\13055\Documents\BaiduDisk\dataset\VEDAI_1024\images.cache. Can not train without labels.

      问题报错如下

      Traceback (most recent call last):
        File "train.py", line 673, in <module>
          train(hyp, opt, device, tb_writer)
        File "train.py", line 212, in train
          dataloader, dataset = create_dataloader(train_path, imgsz, batch_size, gs, opt,
        File "D:\projects\python\SuperYOLO\utils\datasets.py", line 92, in create_dataloader_sr
          dataset = LoadImagesAndLabels_sr(path, imgsz, batch_size,
        File "D:\projects\python\SuperYOLO\utils\datasets.py", line 701, in __init__
          assert nf > 0 or not augment, f'{prefix}No labels in {cache_path}. Can not train without labels. See {help_url}'
      AssertionError: train: No labels in D:\Users\13055\Documents\BaiduDisk\dataset\VEDAI_1024\images.cache. Can not train without labels. See https://github.com/ultralytics/yolov3/wiki/Train-Custom-Data
      

      问题原因

      Windows下路径问题,区别在于’/‘与’\',问题出在utils/datasets.pyimg2label_paths方法处理路径替换时出错,未能正常处理,这个方法作用是根据images路径计算出labels路径

      解决方案

      修改img2label_paths中的逻辑处理

      img2label_paths中源代码

      def img2label_paths(img_paths):
          # Define label paths as a function of image paths
          sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep  # /images/, /labels/ substrings
          return [x.replace(sa, sb, 1).replace('_' + x.split('_')[-1], '.txt') for x in img_paths] #replace('.' + x.split('.')[-1], '.txt')
      

      修改后(注意数据集存放路径不要包含'/images/',否则该方法会失效)

      def img2label_paths(img_paths):
          # Define label paths as a function of image paths
          return [x.replace('/images/', '/labels/').replace('_' + x.split('_')[-1], '.txt') for x in img_paths]
      
    • AttributeError: module 'numpy' has no attribute 'int'

      问题报错如下

      Traceback (most recent call last):
        File "train.py", line 673, in <module>
          train(hyp, opt, device, tb_writer)
        File "train.py", line 212, in train
          dataloader, dataset = create_dataloader(train_path, imgsz, batch_size, gs, opt,
        File "D:\projects\python\SuperYOLO\utils\datasets.py", line 92, in create_dataloader_sr
          dataset = LoadImagesAndLabels_sr(path, imgsz, batch_size,
        File "D:\projects\python\SuperYOLO\utils\datasets.py", line 718, in __init__
          bi = np.floor(np.arange(n) / batch_size).astype(np.int)  # batch index
        File "D:\software\anaconda3\envs\super-yolo\lib\site-packages\numpy\__init__.py", line 284, in __getattr__
          raise AttributeError("module {!r} has no attribute "
      AttributeError: module 'numpy' has no attribute 'int'
      

      问题原因

      numpy版本问题,np.int不可用

      解决方案

      全局搜索将np.int换为np.int64

      报错主要集中在utils/datasets.pyutils/general.py,替换这俩文件里边的即可

    • RuntimeError: result type Float can't be cast to the desired output type __int64

      完整报错

      Traceback (most recent call last):
        File "train.py", line 673, in <module>
          train(hyp, opt, device, tb_writer)
        File "train.py", line 396, in train
          loss, lbox , lobj , lcls  = compute_loss(pred, targets.to(device))  # loss scaled by batch_size
        File "D:\projects\python\SuperYOLO\utils\loss.py", line 118, in __call__
          tcls, tbox, indices, anchors = self.build_targets(p, targets)  # targets
        File "D:\projects\python\SuperYOLO\utils\loss.py", line 218, in build_targets
          indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1)))  # image, anchor, grid indices 该网格是哪张图片的,并由哪个锚框进行预测
      RuntimeError: result type Float can't be cast to the desired output type __int64
      

      问题原因

      Yolov5训练模型时报错RuntimeError: result type Float can t be cast to the desired output type long int_result type float can’t be cast to the desired out-CSDN博客

      解决方案

      utils/loss.py中的下面这句

      indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1)))
      

      换为

      indices.append((b, a, gj.clamp(0, int(gain[3]) - 1), gi.clamp(0, int(gain[2]) - 1)))
      
  5. 运行成功

训练自定义数据集

动手之前先批判以下官方代码,其代码是建立在UltralyticsYolov5基础上,Ultralytics官方给的代码中原来是images目录下文件个数与labels目录下文件个数一致,且文件名一一对应的,作者在其基础上修改的自动划分数据集是值得提倡的,但是省便签文件是不值得提倡的。作者的数据集中images下多张图片对应一个labels,其数据加载过程不符合大多数人的数据集,将其修改为我的数据集格式

数据集格式

我的数据集中,images目录下的文件数与labels目录下一致,且文件名一致,文件后缀不同,这也是大多数人的数据集格式

├── images
│   ├── s1.jpg
│   ├── s2.jpg
├── labels
│   ├── s1.txt
│   ├── s2.txt

注意:该项目中区分训练集与测试集方法是用的fold01.txtfold01test.txt,上述images与labels应该包含全部数据集

fold01.txtfold01test.txt需要自备,其内容格式如下

000001.jpg
0001.jpg

fold01.txt存储训练集文件名

fold01test.txt存储测试集文件名

再将原来数据集中的imageslabels目录用自己的这俩替换,此时目录如下

你的存放路径
├── dataset
│   ├── VEDAI
│   │   ├── images
│   │   ├── labels
│   │   ├── fold01.txt
│   │   ├── fold01test.txt
│   ├── VEDAI_1024
│   │   ├── images
│   │   ├── labels

前期也看不懂它的多个txt文件,仅使用fold01.txtfold01test.txt,为了不影响转化代码运行,还需对data/transform.py稍微修改

    for i in ['01','02','03','04','05','06','07','08','09','10']:

改为

    for i in ['01']:

运行data/transform.py,划分下数据集,更新训练时用的txt文件

python data/transform.py

至此,数据准备完成

我的数据集最终目录如下

你的存放路径
├── dataset
│   ├── VEDAI
│   │   ├── images
│   │   ├── labels
│   │   ├── fold01.txt
│   │   ├── fold01test.txt
│   │   ├── fold01_write.txt
│   │   ├── fold01test_write.txt
│   ├── VEDAI_1024
│   │   ├── images
│   │   ├── labels

修改数据集加载代码

修改utils/datasets.py
  • 修改根据图片找标签路径逻辑

    修改处

    def img2label_paths(img_paths):
        # Define label paths as a function of image paths
        sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep  # /images/, /labels/ substrings
        return [x.replace(sa, sb, 1).replace('_' + x.split('_')[-1], '.txt') for x in img_paths] #replace('.' + x.split('.')[-1], '.txt')
    

    修改后(Windows)

    def img2label_paths(img_paths):
        # Define label paths as a function of image paths
        return [x.replace('/images/', '/labels/').replace( x.split('.')[-1], 'txt') for x in img_paths]
    

    修改后(Linux)

    def img2label_paths(img_paths):
        # Define label paths as a function of image paths
        return [x.replace(sa, sb, 1).replace( x.split('.')[-1], 'txt') for x in img_paths]
    
  • LoadImagesAndLabels

    修改ir路径逻辑(这里我也不懂是干嘛的,只保证修改后能运行)

    修改处

    self.ir_files = img2ir_paths(self.img_files)
    

    修改后

    self.ir_files = self.img_files
    
  • LoadImagesAndLabels_sr方法中

    修改处

                for j in range(len(self.img_files)):
                    self.img_files[j] = self.img_files[j].rstrip() + '_co.png'  #self.img_path + self.img_files[j].rstrip() + '_co.png'
    
    

    修改后

                for j in range(len(self.img_files)):
                    self.img_files[j] = self.img_files[j].rstrip()  
    

    修改处

            self.ir_files = img2ir_paths(self.img_files)
    

    修改后

            self.ir_files = self.img_files
    
修改data/SRvedai.yaml

这里主要是修改类别为自己数据集类别,和YOLOv5原版是一样的格式,照着改就行,再者就是自己数据集路径问题了

开始训练

后续根据自己需求训练参数,这里主要是起到运行项目测试作用

python train.py --cfg models/SRyolo_noFocus_small.yaml --train_img_size 512 --data data/SRvedai.yaml --ch 3 --input_mode RGB

运行截图

源代码

百度云盘链接:https://pan.baidu.com/s/1-fqkI5dUm70s53BGOqEXnA?pwd=f603

  • 32
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
VEDAI数据集是一个用于目标检测的遥感图像数据集。在该数据集上,SuperYOLO模型实现了75.09%的准确率(以mAP50计),比其他大型模型如YOLOv5l、YOLOv5x和RS设计的YOLOrs高出10%以上。同时,SuperYOLO的参数大小和GFLOPs比YOLOv5x少了约18倍和3.8倍。这表明我们提出的模型在精度和速度之间取得了有利的权衡。\[1\] 在表一中,不同基线YOLO框架的模型大小和推理能力是以层数、参数大小和GFLOPs来评价的。YOLOv4虽然实现了最好的检测性能,但它比YOLOv5s多了169层,参数大小是YOLOv5s的7.4倍,GFLOPs是YOLOv5s的7.2倍。相比之下,YOLOv5s虽然mAP略低于YOLOv4和YOLOv5m,但它的层数、参数大小和GFLOPs都比其他模型小很多。因此,在实际应用中,更容易在船上部署YOLOv5s来实现实时性能。这证实了将YOLOv5s作为基线检测框架的合理性。\[2\] 最近,多模态数据在许多实际应用场景中被广泛利用,包括视觉问题回答、自动驾驶汽车、显著性检测和遥感分类。人们发现,结合多模态数据的内部信息可以有效地传递互补的特征,避免单一模态的某些信息被遗漏。\[3\] #### 引用[.reference_title] - *1* *2* *3* [Super Yolo论文翻译](https://blog.csdn.net/qq_41048761/article/details/130304993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还没秃头~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值