文章目录
0前言
-
本文基于的电脑配置:win11、RTX3060 12G
-
因此不同的电脑配置可能限制的cuda不一样,请注意
-
相关链接:
- 本文基于的项目源码地址:GitHub - bubbliiiing/yolox-pytorch at bilibili
-
本文做了什么
- 文章是在看了项目源码地址提供的代码和视频之后的一个具体操作实现
1环境准备
注意:
①RTX30系列最低要求CUDA版本为11.1,否则最后跑程序会报错
②3060显卡支持cuda11.0、cudnn9.0以上版本
1.1pytorch版本问题
- 视频里选择的是
pytorch1.2.0
,但是该版本不适配cuda11.0
,因此需要更换 - 因此选择
pytorch1.7.0
(该版本是最早支持cuda11.0
的)。(pytorch各版本网址) - 因此,最终选择
pytorch==1.7.0
torchvision==0.8.0
torchaudio==0.7.0
cudatoolkit=11.0
。对应的cuDnn
版本可通过这个网址查询。 - 通过这个网址查询
pytorch
与Python
的对应关系。由下图可知,Python
版本可以选择3.6
。
1.2开始安装
1.2.1配置conda国内镜像源。
- 查看镜像源,发现电脑没有配置,因此先配置一下。通过以下代码查看和配置镜像源。
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建立虚拟环境
- 通过以下命令建立虚拟环境
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项目准备
- 通过这个网址下载视频中的
yolox
源码,并导入到pycharm中,同时使用上面下载的虚拟环境。
2.2数据集准备
- 视频中使用了
voc2007
和voc2012
两个数据集,这里只使用voc2007
数据集 - 这是数据集的官网,可以下载训练和测试数据集。网上有人提供了下载链接,通过迅雷进行下载。
- 下载下来的数据集中训练集和验证集与测试集是分开的,需要进行合并。
- 合并
Annotations
、JPEGImages
中的文件(合并之后都是9963个) - 按照视频中的描述,分别从训练集和测试集压缩包中获得下图所示的四个文件,并移动到
ImageSets\Main
目录下 - 四个图片索引文件中,
trainval.txt
文件其实并没有用到
- 合并
2.3预训练权重下载
- 通过2.1中提供的网址下载预训练权重,并使用其中一个(使用
yolox_s.pth
)
3训练
3.1训练参数解析(train.py文件解析)
该部分对应的项目文件:
- 基础设置相关的参数解释如下:
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 # 余弦退火学习率
- 训练的相关参数解释如下:
# 冻结阶段训练参数
#----------------------------------------------------#
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 # 是否进行冻结训练,默认先冻结主干训练后解冻训练
- 其它参数
num_workers = 4 # 用于设置是否使用多线程读取数据
# 获得图片路径和标签
#----------------------------------------------------#
train_annotation_path = '2007_train.txt'
val_annotation_path = '2007_val.txt'
3.2数据集划分(voc_annotation.py)
annotation_mode
参数- 视频里是将两年给出的数据集进行了合并,因此重新进行了数据集的划分
- 而本次只使用2007年给的数据集,已经分好了训练集、验证集、测试集,因此无需再进行数据集的划分了.所以要将该参数值设置为2。
# 1、决定是只生成2007_train.txt、2007_val.txt还是同时要生成
# VOCdevkit/VOC2007/ImageSets里面的txt
annotation_mode = 0
- 其他参数如下:
classes_path = 'model_data/voc_classes.txt'
trainval_percent = 0.9
train_percent = 0.9
VOCdevkit_path = 'VOCdevkit'
3.3划分训练集和验证集
- 运行
voc_annotation.py
,生成2007_train.txt
、2007_val.txt
文件- 只修改了参数:
annotation_mode = 2
- 结果如下图
- 只修改了参数:
3.4开始训练
- 在命令行输入以下命令实时更新GPU占用情况
# 每5秒更新一次gpu的信息,更新频率最高可设置为1s/次,ctrl+c停止更新
nvidia-smi -l 5
- 还需要安装一些包
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训练时报错及解决
- 有可能会报这个页面所描述的错误,说:页面文件太小,无法完成操作,因此修改了如下的参数
Freeze_batch_size = 2
Unfreeze_batch_size = 2
num_workers = 2
- 接下来报了下图所示的错误
- 下图是训练结束时的损失值。
4预测
预测涉及到两个文件:
yolo.py
和predict.py
4.1参数解析(yolo.py文件解析)
- 重要参数如下:
# logs文件夹下有多个权值文件,选择验证集损失较低的
"model_path" : 'logs/ep044-loss4.467-val_loss3.191.pth',
"classes_path" : 'model_data/voc_classes.txt',
"phi" : 's',
- 其他参数:
"input_shape" : [640, 640],
"confidence" : 0.5,
# 非极大抑制所用到的nms_iou大小。非极大抑制用于筛选出一定区域内属于同一种类的得分最大的框
# 当这个值越小,说明越严格,一定范围内属于同一种类的框的数量就会越少
"nms_iou" : 0.3,
"letterbox_image" : True,
"cuda" : True,
4.2预测单张图片
- 直接运行
predict.py
文件,输入待预测图片的相对路径,即可得到下图所示的结果。
5评估
涉及到的文件:
get_map.py
5.1参数解析
- 重要参数:
classes_path = 'model_data/voc_classes.txt'
- 其他参数:
map_mode = 0
MINOVERLAP = 0.5
map_vis = False
VOCdevkit_path = 'VOCdevkit'
map_out_path = 'map_out'
5.2运行代码
- 运行
get_map.py
。有下图所示的过程。