从YOLOv3到YOLOv5s6:我的《明日之后》自动采集脚本升级实录(附完整代码)
从YOLOv3到YOLOv5s6我的《明日之后》自动采集脚本升级实录三年前用YOLOv3写的《明日之后》自动采集脚本最近打开GitHub发现居然还有人在提issue。看了眼游戏官网——好家伙这游戏居然还活着趁着周末把代码翻出来重跑了一遍结果在RTX 3060上帧率还不到20fps。这性能放在2023年实在说不过去于是决定用YOLOv5s6彻底重构这个项目。1. 为什么要从YOLOv3升级到YOLOv5s6去年帮朋友部署一个工业质检系统时第一次接触YOLOv5当时就被它的易用性震惊了。相比YOLOv3需要手动编译Darknet的折腾YOLOv5开箱即用的体验简直像从DOS时代跳到了macOS。性能对比实测数据指标YOLOv3-608YOLOv5s6-1280提升幅度mAP0.552.3%63.7%21.8%推理延迟(ms)48.223.5-51.2%内存占用(MB)1872896-52.1%更惊喜的是模型兼容性。原本担心要重新标注数据集结果发现YOLOv5完全兼容v3的标注格式中心点宽高归一化坐标我的旧数据集直接就能用。PyTorch生态也比Darknet友好太多想加个TensorBoard监控训练进度pip install tensorboard就搞定了。实际测试发现YOLOv5s6在1280x720分辨率下的检测精度比YOLOv3在608x608下还高出11.4个百分点2. 训练环境搭建与数据准备我的开发环境配置GPU: RTX 3060 12GBCUDA: 11.7PyTorch: 1.13.1# 创建conda环境 conda create -n yolo5 python3.8 conda activate yolo5 # 安装依赖 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install opencv-python matplotlib pandas seaborn tqdm pyyaml数据集结构保持与v3时代一致datasets/ └──明日之后/ ├── images/ # 存放所有游戏截图 │ ├── scene1.png │ └── scene2.png └── labels/ # 对应标注文件 ├── scene1.txt └── scene2.txt标注文件示例class_id center_x center_y width height0 0.512 0.723 0.124 0.156 3 0.112 0.456 0.078 0.3423. 模型训练实战记录3.1 配置文件详解创建data/game.yaml配置文件# 数据集路径配置 path: ../datasets/明日之后 train: images # 训练集路径相对path val: images # 验证集路径 test: # 测试集路径可选 # 类别定义 nc: 11 # 类别数量 names: [树, 石头, 草药, 狼, 僵尸, 鹿, 熊, 直升机, 浆果, 蘑菇, 煤]3.2 启动训练的关键参数python train.py --img 1280 \ --batch 16 \ --epochs 100 \ --data data/game.yaml \ --weights yolov5s6.pt \ --device 0 \ --optimizer AdamW \ --cache ram遇到的坑与解决方案CUDA内存不足将batch size从32降到16启用--cache ram将数据集预加载到内存过拟合问题添加--rect参数启用矩形训练减少图像填充带来的噪声类别不平衡使用--cls 0.5增加分类损失权重3.3 训练过程监控YOLOv5内置的TensorBoard日志太香了实时查看各项指标tensorboard --logdir runs/train重点关注三个指标曲线metrics/mAP_0.5- 置信度阈值0.5时的平均精度metrics/precision- 识别结果的精确率val/obj_loss- 验证集的目标检测损失4. 部署优化与性能调优4.1 模型导出为ONNX格式import torch model torch.hub.load(ultralytics/yolov5, custom, best.pt) model.eval() torch.onnx.export(model, torch.randn(1, 3, 1280, 1280), game_model.onnx)4.2 OpenCV加速推理方案import cv2 net cv2.dnn.readNetFromONNX(game_model.onnx) blob cv2.dnn.blobFromImage(img, 1/255.0, (1280,1280), swapRBTrue) net.setInput(blob) outs net.forward()性能对比推理方式帧率(fps)GPU占用PyTorch原生4278%ONNXOpenCV5365%TensorRT加速6852%4.3 游戏窗口实时捕获方案import mss import win32gui def capture_game_window(): hwnd win32gui.FindWindow(None, 明日之后) left, top, right, bottom win32gui.GetWindowRect(hwnd) with mss.mss() as sct: monitor {left: left, top: top, width: right-left, height: bottom-top} img np.array(sct.grab(monitor)) return img[:,:,:3] # 去除alpha通道5. 完整代码实现核心检测类封装class GameDetector: def __init__(self, model_path): self.model torch.hub.load(ultralytics/yolov5, custom, pathmodel_path) self.model.conf 0.6 # 置信度阈值 self.model.iou 0.45 # NMS阈值 def detect(self, img): results self.model(img, size1280) return results.pandas().xyxy[0] # 返回DataFrame格式结果 def filter_targets(self, results, target_types): targets [] for _, row in results.iterrows(): if row[name] in target_types and row[confidence] self.model.conf: targets.append({ type: row[name], x1: int(row[xmin]), y1: int(row[ymin]), x2: int(row[xmax]), y2: int(row[ymax]) }) return targets主循环控制逻辑def main(): detector GameDetector(best.pt) while True: start_time time.time() # 捕获游戏画面 img capture_game_window() # 执行目标检测 results detector.detect(img) trees detector.filter_targets(results, [树, 石头]) # 显示检测结果 show_detection(img, trees) # 计算帧率 fps 1 / (time.time() - start_time) print(f当前帧率: {fps:.2f})6. 效果对比与优化建议升级前后的关键指标对比采集效率测试10分钟版本采集次数误采率平均帧率YOLOv38712.6%18.2fpsYOLOv5s61425.3%47.5fps几个实用优化技巧启用--half参数使用FP16精度推理速度提升20%对于固定场景使用--rect矩形推理减少图像变形调整--conf-thres和--iou-thres平衡精度与速度在Mumu模拟器上最终实现了稳定50fps的检测速度比旧版本快近3倍。最让我意外的是YOLOv5s6的功耗控制——GPU温度始终保持在65℃以下风扇噪音比v3时代小多了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2581591.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!