yolox源码的一个简单复现

0前言

  1. 本文基于的电脑配置:win11、RTX3060 12G

  2. 因此不同的电脑配置可能限制的cuda不一样,请注意

  3. 相关链接:

    1. 本文基于的项目源码地址:GitHub - bubbliiiing/yolox-pytorch at bilibili
  4. 本文做了什么

    1. 文章是在看了项目源码地址提供的代码和视频之后的一个具体操作实现

1环境准备

注意:

①RTX30系列最低要求CUDA版本为11.1,否则最后跑程序会报错

②3060显卡支持cuda11.0、cudnn9.0以上版本

1.1pytorch版本问题

  1. 视频里选择的是pytorch1.2.0,但是该版本不适配cuda11.0,因此需要更换
  2. 因此选择pytorch1.7.0(该版本是最早支持cuda11.0的)。(pytorch各版本网址
  3. 因此,最终选择pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=11.0。对应的cuDnn版本可通过这个网址查询。
  4. 通过这个网址查询pytorchPython的对应关系。由下图可知,Python版本可以选择3.6

在这里插入图片描述

1.2开始安装

1.2.1配置conda国内镜像源。

  1. 查看镜像源,发现电脑没有配置,因此先配置一下。通过以下代码查看和配置镜像源。

在这里插入图片描述

conda config --show channels # 查看镜像源

# 为conda配置清华镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
#设置搜索时显示通道地址(此步骤可有可无)
conda config --set show_channel_urls yes
# 通过上面的代码再次查看一下配置好的镜像源,如下图所示。

在这里插入图片描述

1.2.2建立虚拟环境

  1. 通过以下命令建立虚拟环境
conda create -n yolox_py3_6 pip python=3.6

1.2.3安装pytorch

# 1、激活虚拟环境
conda activate yolox_py3_6

# 2、安装pytorch等 CUDA 11.0
conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=11.0 -c pytorch

在这里插入图片描述

在这里插入图片描述

# 3、安装cuDnn
conda install cudnn # 会自动匹配合适的版本
# 这里匹配的是8.4.1版本。
# 查询官网,发现是匹配的,如下图所示。

在这里插入图片描述

在这里插入图片描述

2项目准备

2.1项目准备

  1. 通过这个网址下载视频中的yolox源码,并导入到pycharm中,同时使用上面下载的虚拟环境。

2.2数据集准备

  1. 视频中使用了voc2007voc2012两个数据集,这里只使用voc2007数据集
  2. 这是数据集的官网,可以下载训练和测试数据集。网上有人提供了下载链接,通过迅雷进行下载。
  3. 下载下来的数据集中训练集和验证集与测试集是分开的,需要进行合并。
    1. 合并AnnotationsJPEGImages中的文件(合并之后都是9963个)
    2. 按照视频中的描述,分别从训练集和测试集压缩包中获得下图所示的四个文件,并移动到ImageSets\Main目录下
    3. 四个图片索引文件中,trainval.txt文件其实并没有用到

2.3预训练权重下载

  1. 通过2.1中提供的网址下载预训练权重,并使用其中一个(使用yolox_s.pth

3训练

3.1训练参数解析(train.py文件解析)

该部分对应的项目文件:

  1. 基础设置相关的参数解释如下:
Cuda = True # 是否使用GPU进行训练

classes_path = 'model_data/voc_classes.txt' # 自己的数据集中包含的目标类别

model_path = 'model_data/yolox_s.pth' # 网络权值文件

input_shape = [640, 640] #输入到模型的图片的shape大小,如果要修改,一定要是32的倍数

phi = 's' #所使用的YoloX的版本。nano、tiny、s、m、l、x。如果修改了,也要对应修改上面的model_path参数

mosaic = False # 马赛克数据增强
Cosine_scheduler = False # 余弦退火学习率
  1. 训练的相关参数解释如下:
# 冻结阶段训练参数
#----------------------------------------------------#
Init_Epoch          = 0
Freeze_Epoch        = 50 # 冻结训练总共训练50-0代
Freeze_batch_size   = 8
Freeze_lr           = 1e-3
#----------------------------------------------------#

# 解冻阶段训练参数
#----------------------------------------------------#
UnFreeze_Epoch      = 100 # 解冻训练总共训练100-50代
Unfreeze_batch_size = 4
Unfreeze_lr         = 1e-4
#------------------------------------------------------#

Freeze_Train = True # 是否进行冻结训练,默认先冻结主干训练后解冻训练
  1. 其它参数
num_workers = 4 # 用于设置是否使用多线程读取数据

#   获得图片路径和标签
#----------------------------------------------------#
train_annotation_path   = '2007_train.txt'
val_annotation_path     = '2007_val.txt'

3.2数据集划分(voc_annotation.py)

  1. annotation_mode参数
    1. 视频里是将两年给出的数据集进行了合并,因此重新进行了数据集的划分
    2. 而本次只使用2007年给的数据集,已经分好了训练集、验证集、测试集,因此无需再进行数据集的划分了.所以要将该参数值设置为2
# 1、决定是只生成2007_train.txt、2007_val.txt还是同时要生成
#    VOCdevkit/VOC2007/ImageSets里面的txt
annotation_mode = 0 
  1. 其他参数如下:
classes_path        = 'model_data/voc_classes.txt'

trainval_percent    = 0.9
train_percent       = 0.9

VOCdevkit_path  = 'VOCdevkit'

3.3划分训练集和验证集

  1. 运行voc_annotation.py,生成2007_train.txt2007_val.txt文件
    1. 只修改了参数:annotation_mode = 2
    2. 结果如下图

在这里插入图片描述

3.4开始训练

  1. 在命令行输入以下命令实时更新GPU占用情况
# 每5秒更新一次gpu的信息,更新频率最高可设置为1s/次,ctrl+c停止更新
nvidia-smi -l 5
  1. 还需要安装一些包
conda install scipy

conda install matplotlib

pip install opencv_python==4.1.2.30 # 安装OpenCV,安装的时候是 opencv_python,但在导入的时候采用 import cv2

conda install tqdm # 进度条

3.4.1训练时报错及解决

  1. 有可能会报这个页面所描述的错误,说:页面文件太小,无法完成操作,因此修改了如下的参数
Freeze_batch_size   = 2
Unfreeze_batch_size = 2
num_workers         = 2
  1. 接下来报了下图所示的错误
    1. 12G显存,空闲9G,需要分配4.27G,明显是足够的,但是却报错了,说不够
    2. 这个博客提到,是win10下多线程的问题,直接设置num_workers = 0,然后就可以训练了(然而这种方式会大大降低数据的读取速度,因此还有另一种解决方式(尚未尝试),就是调大页面大小)

在这里插入图片描述

在这里插入图片描述

  1. 下图是训练结束时的损失值。

在这里插入图片描述

4预测

预测涉及到两个文件:yolo.pypredict.py

4.1参数解析(yolo.py文件解析)

  1. 重要参数如下:
# logs文件夹下有多个权值文件,选择验证集损失较低的
"model_path"        : 'logs/ep044-loss4.467-val_loss3.191.pth',

"classes_path"      : 'model_data/voc_classes.txt',

"phi"               : 's',
  1. 其他参数:
"input_shape"       : [640, 640],
"confidence"        : 0.5,

# 非极大抑制所用到的nms_iou大小。非极大抑制用于筛选出一定区域内属于同一种类的得分最大的框
# 当这个值越小,说明越严格,一定范围内属于同一种类的框的数量就会越少
"nms_iou"           : 0.3,

"letterbox_image"   : True,
"cuda"              : True,

4.2预测单张图片

  1. 直接运行predict.py文件,输入待预测图片的相对路径,即可得到下图所示的结果。

在这里插入图片描述

5评估

涉及到的文件:get_map.py

5.1参数解析

  1. 重要参数:
classes_path    = 'model_data/voc_classes.txt'
  1. 其他参数:
map_mode        = 0
MINOVERLAP      = 0.5
map_vis         = False
VOCdevkit_path  = 'VOCdevkit'
map_out_path    = 'map_out'

5.2运行代码

  1. 运行get_map.py。有下图所示的过程。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/colleges/article/details/128584899