基于AutoDL云服务器部署yolov11项目及模型分析
前言#
因为yolov11训练需要的配置要求已经超过我电脑了,所以我还是在AutoDL上租用一台GPU来跑,租用云服务器实际上就是租用一台装配了GPU显卡的Linux虚拟机来跑自己的模型,那么我们就需要提前把自己的代码和数据通过传输软件传上服务器(也可以直接拖到窗口,但是太慢了,这里我用的软件是Xftp),下面配备了比较完整的流程,在前面的yolov5相关操作教程中写的也比较详细了,这篇博客主要是用来分析yolov11训练后产生的结果文件。
一、项目部署教程#
我们在注册并登录AutoDL后,选择合适型号的GPU,建议如果是学习过程的话可以租用便宜一点的,比如2080ti,相对性能也够用了
记得在选择镜像时去使用就已经创建好的yolov11镜像,可以免去很多麻烦
在容器实例中选择刚才租的实例,选择更多--无卡模式开机,这样我们在传输数据时成本就要低一点,不然他就会一直按照0.88元来扣费,无卡模式除了没有GPU,其他都是一样的
打开后我们进入vscode,下载扩展远程资源管理器
点击图标输入ssh指令和密码(在容器实例上复制),我之前登录过,就只用输密码了
完成后我们就成功连接到服务器了,接下来就是传输数据部分
我们用到Xftp,具体下载安装教程可以看这个
免费Xshell、Xftp下载、安装、连接教程【图文】详细-CSDN博客
安装好后点击右上角加号创建新连接
连接成功后,点击autodl-tmp文件夹,将我们的yolov11项目整个打包上传到这里,稍后去命令行解压
解压压缩包
点进来可以看到jupyter页面,进到autodl-tmp文件夹后点击左上角加号新建终端,输入指令进行解压
unzip 压缩包名称.zip
到这里我们的项目部署就完成了,接下来打开vscode选择对应路径可以看到我们解压的项目,过程中让我们再次输入密码是正常的
二、模型训练和验证#
模型已经提前训练完成了,这里只是提供基本代码,项目准备和yolov5是相似的,但前面yolov5我们介绍的使用命令行指令来进行模型训练,这里我们用Python代码文件来操作,也很简单
2.1 模型训练#
from ultralytics import YOLO
model = YOLO("yolo11s.pt")
model.train(
data="datasets/ball/ball.yaml",
epochs=100,
batch=32,
save=True,
device="0",
)还可以指定一下默认可选参数,比如学习率,优化算法等
2.2 模型推理#
from ultralytics import YOLO
import os
# 创建保存结果目录
os.makedirs('results', exist_ok=True)
# 加载训练好的模型
model = YOLO('runs/detect/train/weights/best.pt')
# 设置测试图片文件夹路径
test_folder = 'datasets/ball/test/images'
# 遍历测试文件夹中的所有图片
for filename in os.listdir(test_folder):
if filename.endswith(('.jpg', '.png', '.jpeg', '.bmp')): # 支持常见的图片格式
# 构造完整的图片路径
image_path = os.path.join(test_folder, filename)
# 运行预测
results = model(image_path)
# 构造保存的文件名
save_filename = os.path.join('results', f'predicted_{filename}')
# 保存预测结果
results[0].save(filename=save_filename)
print(f'预测结果已保存到 {save_filename}')2.3 模型验证#
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('runs/detect/train/weights/best.pt')
# 验证
model.val(
data='datasets/ball/ball.yaml',
batch=32,
device='0',
)2.4 检验播报#
这段代码使用 ultralytics 提供的 YOLO 模型对指定图像进行目标检测,当检测到特定目标(如“棒球”)时,通过 pyttsx3 库进行语音提示,并提取检测结果中的类别和置信度信息存储到列表中。
使用之前先安装对应依赖库
pip install pyttsx3from ultralytics import YOLO
# import winsound
import pyttsx3
def set_voice():
# 初始化
engine = pyttsx3.init()
# 设置声音:音量、类型、语速
engine.setProperty('volume', 1.0) # 音量
engine.setProperty('rate', 150) # 语速
# 如果在 python 代码中遇到路径是 \,需要改成 \\ 或者 /
engine.setProperty('voice','HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\TTS_MS_ZH-CN_HUIHUI_11.0')
# 设置播放的内容
info = '发现棒球'
engine.say(info)
# 执行
engine.runAndWait()
if __name__ == '__main__':
model = YOLO('runs/detect/train/weights/best.pt')
results = model.predict(
source='datasets/ball/test/images/cricket_ball_3.jpg',
)
"""
提取出每一个框的信息:
类别信息 置信度信息
思路:
1、定义一个列表,来存储每一条数据 one_list
2、定义一个列表,存储所有的数据 result_list
"""
result_list = []
# 遍历处理结果
for result in results:
for item in result.boxes:
# 类别信息
cls = result.names[int(item.cls.item())]
"""
如果发现球(cricketBall),进行播报
"""
if cls == 'cricketBall':
# 频率 持续时间
# winsound.Beep(500, 2000)
set_voice()
# 置信度信息
conf = round(item.conf.item(), 2)
result_list.append([cls, conf])
print(result_list)2.5 视频检测#
可以使用训练好的模型来对视频帧进行检测
from ultralytics import YOLO
import cv2
# 1. 加载训练好的YOLOv11模型
# 替换为你的模型路径(如.pt文件),若使用预训练模型可直接写'models/yolov11n.pt'(n/s/m/l/x版本)
model = YOLO(r"runs\detect\train\weights\best.pt")
# 2. 配置视频源和输出
input_video_path = "input_video_2.mp4" # 输入视频路径
output_video_path = "output_video_2.mp4" # 输出视频路径
# 3. 读取视频并获取基本信息
cap = cv2.VideoCapture(input_video_path)
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 高度
# 4. 设置视频写入器(编码格式推荐使用mp4v)
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
# 5. 逐帧处理视频
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break # 视频读取完毕
# 6. 使用YOLOv11进行检测
# conf: 置信度阈值(如0.5,过滤低置信度结果)
# iou: IOU阈值(非极大值抑制参数)
results = model(frame, conf=0.5, iou=0.45)
# 7. 可视化检测结果(在帧上绘制边界框和类别)
annotated_frame = results[0].plot() # 直接调用plot()方法生成带标注的帧
# 8. 显示实时结果(可选,用于调试)
cv2.imshow("YOLOv11 Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按q退出
break
# 9. 写入输出视频
out.write(annotated_frame)
# 10. 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"检测完成,结果保存至:{output_video_path}")
2.6 推理加速#
导出为 tensorRT 格式
model.export(format="engine")
使用的目的:实现推理加速,大幅度的缩减了推理时间from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO("runs/detect/train/weights/best.pt")
model.export(format="engine", dynamic=True, int8=True, data="datasets/fire/fire.yaml")三、结果分析#
一个训练集指标,一个验证集指标,以训练集指标为例
weight文件夹
存储了最佳模型best.pt和最终模型last.pt,如果训练过程中断可以调用这两个模型其中一个来进行继续训练,使用模型测试是一般选用best.pt
args.yaml
存储模型训练参数配置信息,比如学习率,轮次等,可以再训练阶段的代码中设置
BoxF1_curve.png
F1指标是精确率和召回率的调和平均值,对于我们本次的任务而言,这样图在置信度阈值为0.497的时候,所有类的F1指标可以达到99%
BoxP_curve.png
P表示模型预测的正样本中,有多少是正确的,这张图表示在置信度为0.581的情况下,P值可以达到1.0
BoxPR_curve.png
- 浅蓝色曲线:表示“cricketBall”类别,平均精确率(AP)为0.990,表现接近完美。
- 深蓝色曲线:表示所有类别的平均精确率(mAP@0.5),值为0.990,整体表现优异。
BoxR_curve.png
R表示真实正样本中,有多少被正确预测,当置信度阈值为0的时候,我们模型的召回率可以达到0.99%
confusion_matrix_normalized.png和confusion_matrix.png
混淆矩阵及其归一化
labels_correlogram.jpg
这幅图是用来描述数据集中中心点、宽高的相关性。比如在有的数据集中,如果目标位于中心,那这个图像的高度也可能比较高一些,主要是用来描述指标之间的关联性
labels.jpg
图中包含四个部分:
- 左上角:类别样例个数分布。
- 右上角:边界框分布。
- 左下角:样本中心点分布,显示棒球多在图片中间。
- 右下角:目标宽高分布。
result.csv和result.jpg
训练过程中loss和准确率的变化数据及其可视化
train_batch.jpg
主要是用来描述数据是如何进入网络的,也能看出数据集是如何进行数据增强的,图上没有置信度信息
val_batch_labels.jpg和val_batch_pred.jpg
验证集信息,同一张图预测结果图有置信度