【目标检测】记录我在自己的红外数据集上训练YOLOX的过程和遇到的坑

news/2024/7/10 2:03:33 标签: python, 目标检测

最近在自己的红外数据集上训练YOLOX网络(以COCO数据集的形式),把过程记录下来。
YOLOX代码:https://github.com/Megvii-BaseDetection/YOLOX

目录

  • 数据集准备
    • 生成数据标签的json文件
  • 代码修改
    • 修改数据集的目录信息
    • 修改类别数量
    • 修改标签
  • 训练
  • 我遇到的坑
    • 生成json标签文件时出现图片和标签不对应的问题
    • 改动数据集后需手动删除缓存数据文件

数据集准备

生成数据标签的json文件

我手上的数据集的格式是jpg图像和对应的txt标签文件,要训练YOLOX的话需要先对标签文件进行处理,生成COCO数据集格式的标签文件,由于官方代码中没有这部分的内容,我在QueryDet的data_prepare.py文件找到类似的代码,对其稍作修改,就可以生成我们所需要的json标签文件。

代码修改

修改数据集的目录信息

创建自己的exp文件。
我想先训练yolox_l,所以我在exps\default目录下创建了一个新文件yolox_l_mydata.py,然后将yolox_l.py中的内容复制过来,增加数据集的目录信息:

python">        self.data_dir = "dataset"
        self.train_ann = "dataset/annotations/instances_train2017.json"
        self.val_ann = "dataset/annotations/instances_val2017.json"

修改类别数量

同样在yolox_l_mydata.py文件中增加类别数量,这里我只有一类目标:

python">        self.num_classes = 1

最终yolox_l_mydata.py文件如下:

python">#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp

class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.depth = 1.0
        self.width = 1.0
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
        
        self.data_dir = "dataset"
        self.train_ann = "dataset/annotations/instances_train2017.json"
        self.val_ann = "dataset/annotations/instances_val2017.json"
        
        self.num_classes = 1

修改标签

我需要检测的目标名为target,因此在yolox\data\datasets\coco_classes.py文件中将原本的所有类别注释掉,改为:

python">#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

COCO_CLASSES = (
    "target",
)

训练

然后应该就可以训练了(希望我没有漏写啥):

python tools/train.py -f exps/default/yolox_l_mydata.py -d 2 -b 16 --fp16 -o -c pretrained/yolox_l.pth --cache

其中,
-d:GPU数量
-b:batch size(建议设置为GPU数量的8倍)
--fp16: 混合精度训练
--cache: 利用RAM缓存加速训练(we now support RAM caching to speed up training! Make sure you have enough system RAM when adopting it.)

我遇到的坑

生成json标签文件时出现图片和标签不对应的问题

这部分内容记录在【python】由os.listdir导致的惨案中。

改动数据集后需手动删除缓存数据文件

就是这个坑!坑了我好多天!也是我想写这篇博客的唯一原因!
从上面可以看到,我一开始生成的标签和图片不对应,所以我后来重新又生成了一遍json文件,然后重新训练网络,但是!损失变化和原来一样,都是完全降不下去,我百思不得其解,以为我数据处理部分还是有问题,就一直在找生成json的代码哪里写错了,找啊找啊找啊,愣是没发现问题在哪。
今天,我都准备换个数据集格式训练了(当时看到了以训练yolo的格式来训练YOLOX:https://github.com/xialuxi/yolox-yolov5,准备尝试),然后再次打开了数据集文件夹,突然发现里面有一个原本没有的文件img_resized_cache_train2017.array,这个文件是在第一次训练网络时自动生成的,有几十个G,我猜大概是把所有数据集的内容都放在了这个缓存文件中,以后再训练网络的时候直接读取这个缓存文件而不需要重新去annotations、train2017、val2017三个文件夹中读取,加快训练的速度。也就是说!上面我虽然改正了标签文件,但我之后训练网络时它读取的一直是我之前错误的标签文件所生成的缓存文件!所以我训练网络时的损失始终无法下降,因为图片标签都不对应啊!

哭了,说多了都是泪,亏我找了这么久的问题T T


关于YOLOX训练的部分就先记录到这,等网络训练完了看看效果咋样。


http://www.niftyadmin.cn/n/1585485.html

相关文章

Python实现读取多个excel;以及统计词频;使用词典

# -*- coding: utf8 -*-import xlrdimport codecsimport osdef handExcel(path): #定义输出文件 output1 codecs.open("7.8_userQue.txt","w","utf-8") output2 codecs.open("7.8_StandQue.txt","w","utf-8…

【python】终于解决了cv2.VideoWriter生成视频后视频文件始终为1KB且无法播放的问题

把图片序列合成视频: import cv2 import imageio import ospath rD:\dataset\images dir_name os.listdir(path) for dir in dir_name:dir_path os.path.join(path, dir)img imageio.imread(os.path.join(dir_path, os.listdir(dir_path)[0]))vid_writer cv2.…

程序员大调查:年薪普遍超过30万 男性多半单身!

今天给大家分享的是一组程序员大调查的数据,数据表明程序员年薪普遍超过30万但是男性大多数多是单身!哈哈 ,看看你有没有中枪吧!这里还是要推荐下我自己建的前端学习群:659247717,如果你正在学习前端&#…

为什么深度学习中一般使用mean=[0.485, 0.456, 0.406]和std=[0.229, 0.224, 0.225]来归一化图像?

Q:图像预处理部分在resize后还会使用均值:image_mean[0.485,0.456,0.406],标准差:image_std[0.229,0.224,0.225]进行归一化,为什么使用这几个值? A:image_mean[0.485,0.456,0.406]、image_std[…

我所认知的 ANT DESIGN

一、引言 由于工作的关系对于 React 并没有过度的深入,因此对 Ant Design 并无太多了解。当然也是因为工作中存在大量的 Angular 项目,后来 ng-zorro-antd 的发布引起我极大的关注。 当我决定基于 ng-zorro-antd 发布一款企业后台管理模板 ng-alain 之前…

【SOT】SiamFC代码笔记

代码来源:https://github.com/huanglianghua/siamfc-pytorch 结合siamfc-pytorch代码讲解的三篇博客 下面是阅读上述SiamFC代码时的笔记 preprocess data(数据预处理) dataset.py 概括:通过index索引返回item (z, x, box_z, box_x),然后经…

wcf服务契约的重载

a. 服务端 1.服务端 契约用OperationContract的Name实现重载 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text;namespace WCF.Chapter2.Overloading.Host{[ServiceCon…

【SOT】SiamRPN代码笔记

代码来源:https://github.com/laisimiao/siamrpn.pytorch 结合博客关于SiamRPN代码的一些要点 下面是阅读上述SiamRPN代码时的笔记 1、template frame和detection frame经过相同的Siamese Network得到一个feature,然后经过RPN的classification branch和regression b…