1.环境安装
硬件配置最好内存>=16GB,显卡NVIDIA 20系列及其以上显卡,显存>=8GB
建议新建虚环境:
conda create -n yolo11 python=3.10
进入虚环境,查询CUDA支持的最高版本:
conda activate yolo11
nvidia-smi

进入Pytorch官网,下载Pytorch-GPU版本,建议2.0以上版本,CUDA不高于你显卡的版本的都行,我这里下载的是:

conda install pytorch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 pytorch-cuda=12.1 -c pytorch -c nvidia
打开requirements.txt,将其中的如下三行删除,否则会再次安装一遍
torch==2.2.1+cu121
torchaudio==2.2.1+cu121
torchvision==0.17.1+cu121
保存关闭后,用cd命令将路径切换到requirements.txt下,
cd requirements.txt文件所在的路径(替换为自己的实际路径)
安装其他依赖包
pip install -r requirements.txt --timeout 6000
已经自动安装了包含YOLO11的ultralytics包,后面可以直接用命令行训练。
2.王者荣耀英雄状态检测
2.1 数据集获取
这里可以从网上下载王者荣耀游戏视频,或者本地游戏时候保存的视频,然后用视频工具或者QQ截屏截取不同的游戏画面图片后,用labelme手动标注。我这里标注了886张图片,共计6个英雄状态类别:attacked_by_tower(被塔打), death(死亡),destroy_towers(打塔), kill_heroes(杀死英雄), kill_minions_monsters(杀怪), killed(被杀),其中划分数据集如下:训练集619张,验证集177张,测试集90张。
在项目路径下创建data目录,将训练集、验证集和测试集图片放在该路径下,编写data.yaml文件如下:
train: train/images
val: valid/images
test: test/images
nc: 6
names: ['attacked_by_tower', 'death', 'destroy_towers', 'kill_heroes', 'kill_minions_monsters', 'killed']
数据集分享:https://pan.baidu.com/s/1aHuOg69s0yC2o7bC3DEjHA?pwd=1314
2.2 编写训练代码
train.py
from ultralytics import YOLO
if __name__ == '__main__':
# Load a pretrained YOLOv8 model
model = YOLO('yolo11n.pt')
# Train the model on a custom dataset
model.train(data='data/data.yaml', epochs=400, imgsz=640, batch=64, workers=4)
2.3 编写测试代码
单张图片检测
将run/train/weights下的best.pt复制到项目根路径方便使用。
inference.py
from ultralytics import YOLO
if __name__ == "__main__":
model = YOLO("best.pt")
# Perform inference on an image
results = model(r"data\test\images\128_jpg.rf.7f830770b9c891c77dd21aad61fb68fc.jpg")
results[0].show()
pass

2.4 游戏视频实时目标检测
import cv2
from ultralytics import YOLO
if __name__ == "__main__":
model = YOLO("best.pt")
# 打开视频源(可以是摄像头或视频文件)
video_path = 'king.mp4' # 使用摄像头,值设置为0
cap = cv2.VideoCapture(video_path)
# 获取视频的宽度、高度和帧率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 定义保存视频的路径和格式
output_path = 'output_detected_video.mp4' # 输出视频路径
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 视频编码格式
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
# 读取视频帧
success, frame = cap.read()
if not success:
print("End of video or error occurred.")
break
# 使用模型进行检测
results = model(frame, verbose=False)[0] # 获取检测结果
# 绘制检测框
for box in results.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0]) # 获取检测框坐标
confidence = float(box.conf[0]) # 获取置信度
class_id = int(box.cls[0]) # 获取类别ID
class_name = model.names[class_id] # 获取类别名称
# 绘制检测框和标签
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f'{class_name}: {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(0, 255, 0), 2)
# 写入处理后的帧到输出视频
out.write(frame)
# 显示结果
cv2.imshow('Real-Time Detection', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"Detection completed. Saved video to {output_path}")
output_detected_video
可以看出,由于标注质量问题,还是存在误报,尤其是查看其他英雄时候