最近在服务器上折腾环境的事情,因为之前训练的大都是yolov7及之前的模型,可以直接使用我们前面系统上安装的python3.6,但是yolov8的官方指导里面写明了要求python3.8+与pytorch1.8+,这个的确就是需要重新安装才行了。
简答的安装过程如下:
1、更新系统
sudo yum update
2、安装必要的依赖
sudo yum install gcc openssl-devel bzip2-devel libffi-devel
3、下载Python 3.8源代码
wget https://www.python.org/ftp/python/3.8.12/Python-3.8.10.tgz
4、解压源代码文件
tar -xf Python-3.8.10.tgz
5、进入源代码目录:
cd Python-3.8.10
6、配置编译选项
./configure --enable-optimizations
7、编译并安装Python
make
sudo make altinstall
注意:使用make altinstall而不是make install来避免Python 3.8覆盖系统中默认的Python 2.x版本。
8、检查Python版本
python3.8 --version
我这里选择安装的是3.8.10版本的Python,安装成功截图如下所示:
按照YOLOv8官方项目需要的requirements进行对应的包的安装,这里有一个问题就是,我本身系统环境下是默认安装的Python3.6的版本,对应的pytorch也是匹配安装的,cuda、driver以及cudnn也都是与pytorch对应安装的,但是现在新安装了Python3.8以后就会存在cuda、driver和cudnn无法与Python3.8支持的版本兼容了,这时候我的想法是先错位安装一下试试看看能否正常工作起来。
安装pytorch官网地址在这里,如下所示:
安装指南如下:
如果你的CUDA版本比较高比如11.8甚至更高的话是可以直接使用这里的安装命令的如下:
CUDA11.8
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
CUDA12.1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
但是我的显然不能够,我的CUDA是100版本的,如下:
在这里搜索:CUDA 10.0,如下所示:
可以看到:与我的CUDA匹配的torch版本都是比较低的不能够用于训练构建YOLOv8模型,这时候首选的想法就是看看是否不按照官方指南去安装对应的版本并且成功使用起来?这个过程里面其实我是尝试了好几次不同的版本了,过于耗费时间,这里就不再展开描述了,最后直接给出来我安装好用的版本:
python3.8 -m pip install torch==1.10.2+cu102 torchvision==0.11.3+cu102 torchaudio -f https://download.pytorch.org/whl/torch_stable.html
接下来去测试是否能够使用GPU资源,命令如下:
import torch
print(torch.__version__) # 查看torch当前版本号
print(torch.version.cuda) # 编译当前版本的torch使用的cuda版本号
print(torch.cuda.is_available()) # 查看当前cuda是否可用于当前版本的Torch,如果输出True,则表示可用
结果如下:
可以看到:安装这种安装方式torch是可以检测到GPU并且探测是可用的。
接下来就想着训练一个YOLOv8的模型来看看实际表现,但是在使用的时候报错:
ModuleNotFoundError: No module named '_lzma'
网上查询了很多解决办法,说的是没有安装这个模块。解决方法如下:
第一步:
yum install xz-devel
yum install python-backports-lzma
pip install backports.lzma
第二步:
进入 python 安装路径,找到 lzma.py,如上日志提示的 /usr/local/lib/python3.8/lzma.py,修改 zma.py 文件中的导入部份如下
vim lzma.py
修改前
from _lzma import *
from _lzma import _encode_filter_properties, _decode_filter_properties
修改后
try:
from _lzma import *
from _lzma import _encode_filter_properties, _decode_filter_properties
except ImportError:
from backports.lzma import *
from backports.lzma import _encode_filter_properties, _decode_filter_properties
上面的内容可以直接复制使用,如下所示:
网上的教程按理到这里就结束了,我也以为问题应该也解决了,但是发现并不是的。
我的环境下有报错了,如下所示:
AttributeError: '_lzma.LZMADecompressor' object has no attribute 'needs_input'
又是一顿狂查资料,但是相关的帖子寥寥无几,如下:
基本全网就这么一篇,其他的都是转载的,解决方案如下:
我也按照这个降低了pandas的版本依旧是没有能解决我的问题,感觉我这里的问题跟我前面的错位安装有关系,不过也是没有办法的事情,后面我甚至升级了pandas的版本依旧解决不了问题,基本上能够安装的版本都试了一下最终宣告放弃,如果有遇上同样报错问题的朋友欢迎指导交流一下。
倒不是说折腾了这么久还是不能训练YOLOv8,我这里采取了“曲线救国”的想法,说白了就是层层溯源分析lzma到底是干嘛,最后发现这个跟Python底层的文件压缩有关系,我就定位到了问题产生的地方就是这里:
最简单的解决办法就是把这里注释掉就行了,如下:
file = check_file(dataset)
# Download (optional)
extract_dir = ''
# if zipfile.is_zipfile(file) or is_tarfile(file):
# new_dir = safe_download(file, dir=DATASETS_DIR, unzip=True, delete=False)
# file = find_dataset_yaml(DATASETS_DIR / new_dir)
# extract_dir, autodownload = file.parent, False
# Read YAML
data = yaml_load(file, append_filename=True) # dictionary
# Checks
因为本身我是不会用压缩包的数据集用来训练模型的,我前面有很多超详细的教程有对我如何一步一步构建数据集进行详细的描述感兴趣的话可以看看。
到这里就“暂时解决”了我的问题,YOLOv8可以正常训练了,如下所示:
训练完成结果详情如下所示:
整体训练可视化如下:
【Precision曲线】
精确率曲线(Precision-Recall Curve)是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。精确率(Precision)是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
【Recall曲线】
召回率曲线(Recall Curve)是一种用于评估二分类模型在不同阈值下的召回率性能的可视化工具。它通过绘制不同阈值下的召回率和对应的精确率之间的关系图来帮助我们了解模型在不同阈值下的表现。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。召回率也被称为灵敏度(Sensitivity)或真正例率(True Positive Rate)。
【F1值曲线】
F1值曲线是一种用于评估二分类模型在不同阈值下的性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)、召回率(Recall)和F1分数的关系图来帮助我们理解模型的整体性能。F1分数是精确率和召回率的调和平均值,它综合考虑了两者的性能指标。F1值曲线可以帮助我们确定在不同精确率和召回率之间找到一个平衡点,以选择最佳的阈值。
【PR曲线】
精确率-召回率曲线(Precision-Recall Curve)是一种用于评估二分类模型性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)和召回率(Recall)之间的关系图来帮助我们了解模型在不同阈值下的表现。精确率是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
【混淆矩阵】
记录一下,折腾了不少时间了!