尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
YOLOv5自动脚本实战:从环境配置到避坑调优
简介这是一份面向游戏自动化与计算机视觉学习者的YOLOv5实战项目包聚焦DNF场景下的目标识别与自动操作实现适合具备一定Python基础、希望深入理解YOLOv5工程落地的开发者参考。压缩包共94个文件约27.28MB以32个py源码与34个pyc编译文件为核心辅以8个yaml模型配置、2个pt权重文件及xml、png、jpg等资源涵盖模型推理、图像抓取、按键模拟、技能识别与方向移动等模块目录结构完整。已有179人学习下载。读者可从中获取YOLOv5检测脚本、训练权重、屏幕采集与输入控制等完整代码链路并参考未央、幽暗密林等场景测试脚本理解识别与自动化逻辑的衔接方式对学习目标检测落地与自动化脚本设计具有实际参考价值。1. 拆开这个 YOLOv5 自动脚本包它到底能跑通什么又会在哪翻车如果你手里正好有一个「基于 YOLOv5 识别算法实现的 DNF 自动脚本.zip」大概率第一反应是这东西能不能直接双击运行我的判断是——能跑但别指望开箱即用。这个包的核心链路其实很清晰用 YOLOv5 做屏幕目标检测把识别到的怪物、掉落物、门框坐标换算成鼠标键盘动作再通过输入模拟层把操作打回游戏窗口。它解决的是「重复刷图时人眼盯屏幕、手按技能」的疲劳问题适合想学 YOLOv5 落地、想做视觉驱动自动化、或者单纯想拆一套完整推理控制闭环的从业者。但它的边界也很硬分辨率一变、窗口模式一换、游戏渲染层一改识别框就会飘脚本立刻变「玄学」。所以这篇不吹它能全自动搬砖只讲怎么把它拆开、跑通、调稳以及哪些坑我替你踩过了。2. 环境与依赖把 YOLOv5 推理链路先跑通2.1 为什么优先用 conda 而不是裸 pip这个包大概率带了一个requirements.txt或者environment.yml但很多人直接pip install -r就翻车原因是 YOLOv5 对torch、torchvision、opencv-python、numpy的版本咬得很死。裸 pip 会把你系统里已有的 CUDA 版 torch 升到不匹配的版本然后报DLL load failed或者CUDA error: no kernel image is available。我一般会先建一个独立 conda 环境把 Python 锁在 3.8 或 3.9这两个版本对 YOLOv5 各分支兼容性最好。# 创建独立环境Python 版本别追新3.8/3.9 最稳 conda create -n yolov5_dnf python3.9 -y conda activate yolov5_dnf # 先装 torch按你显卡驱动选 cu113 或 cpu 版本 # 如果你没有 NVIDIA 显卡直接装 cpu 版别硬上 CUDA pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html # 再装其余依赖注意 opencv 用 headless 版避免 GUI 冲突 pip install opencv-python-headless numpy pyautogui pillow pyyaml requests逻辑说明先锁 torch 再装其他是因为opencv-python和numpy会间接依赖 numpy 版本如果顺序反了pip 会为了满足 opencv 把 numpy 降级导致 torch 推理时numpy.core.multiarray报错。参数上cu113对应 CUDA 11.3你可以在nvidia-smi右上角看到驱动支持的 CUDA 版本别超过它。没有独显就老老实实pip install torch1.12.1cpuCPU 推理单帧大概 80150ms刷图够用但别开太高帧率。2.2 权重文件与目录结构怎么摆解压后你通常会看到weights/、models/、utils/、detect.py或者一个自定义的main.py。权重文件一般是best.pt或last.pt大小在 14MB 到 90MB 之间取决于用的是 yolov5s 还是 yolov5m。别急着改代码先把目录摆成 YOLOv5 官方推理脚本认的样子project/ ├── weights/ │ └── best.pt # 训练好的 DNF 目标权重 ├── models/ │ └── common.py # 网络结构定义 ├── utils/ │ ├── general.py # 非极大值抑制等工具 │ └── torch_utils.py ├── data/ │ └── dnf.yaml # 类别名与颜色配置 └── main.py # 识别控制主循环dnf.yaml里通常写着names: [monster, drop, door, boss]这类类别。如果你拿到的包没有这个文件自己建一个类别顺序必须和训练时一致否则识别出来的框会张冠李戴——把门框当怪物打这就是第一个血泪坑。2.3 用一张截图验证推理是否正常在接游戏之前先拿一张静态截图跑通推理确认模型和依赖都没问题。这一步能帮你排除 80% 的环境问题。import torch import cv2 import numpy as np # 加载权重map_location 防止在无 GPU 机器上报错 model torch.hub.load(./, custom, pathweights/best.pt, sourcelocal) model.conf 0.45 # 置信度阈值太低会误检太高会漏检 model.iou 0.5 # NMS 的 IoU 阈值重叠框合并程度 img cv2.imread(test_screenshot.png) # YOLOv5 接受 RGBOpenCV 默认 BGR必须转 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results model(img_rgb) # 打印检测到的类别和坐标 for *box, conf, cls in results.xyxy[0].tolist(): print(f类别{model.names[int(cls)]} 置信度{conf:.2f} 坐标{box})逻辑说明sourcelocal告诉 torch.hub 不要联网拉代码直接用本地models/和utils/。conf0.45是我在 DNF 场景下常用的起点怪物贴图清晰、背景重复度高低于 0.4 会把血条和特效误判成怪物。iou0.5控制重叠框合并如果发现同一个怪物出两个框降到 0.4如果两个挨得近的怪物被合并成一个升到 0.6。跑完这张图你能看到控制台输出坐标就说明推理链路通了接下来才轮到控制层。3. 从识别框到键鼠动作控制层的参数与节奏3.1 坐标换算屏幕分辨率与窗口偏移YOLOv5 输出的坐标是相对于你喂进去那张图的像素值。如果你直接截全屏坐标就是屏幕绝对坐标如果只截游戏窗口就得加上窗口左上角的偏移。很多人在这里翻车用窗口截图训练推理时却拿全屏坐标去点结果鼠标飞到屏幕外。import pyautogui import win32gui def get_window_rect(title_keyword): # 根据窗口标题关键字找句柄DNF 窗口标题通常含特定字符 hwnd win32gui.FindWindow(None, title_keyword) if not hwnd: raise RuntimeError(没找到游戏窗口检查是否已启动) # 返回 (left, top, right, bottom) return win32gui.GetWindowRect(hwnd) def to_screen_coord(box, win_rect): left, top, _, _ win_rect x_center (box[0] box[2]) / 2 left y_center (box[1] box[3]) / 2 top return int(x_center), int(y_center)逻辑说明win32gui只在 Windows 下可用这个包本身也是 Windows 游戏场景。GetWindowRect拿到的是包含标题栏和边框的矩形如果你截图用的是客户区还得用GetClientRect加ClientToScreen换算否则 Y 坐标会差一个标题栏高度大概 30 像素足够让你点空。参数上title_keyword要填你游戏窗口标题里稳定不变的那段别填会变的等级或地图名。3.2 动作触发为什么用 pyautogui 而不是直接发消息控制层常见两种做法一种是pyautogui.moveToclick模拟真实鼠标轨迹另一种是win32api.PostMessage直接往窗口发消息。前者兼容性好但慢后者快但很多游戏不认。DNF 这类游戏对后台消息过滤比较严我一般用 pyautogui 前台操作配合pyautogui.PAUSE控制节奏。import pyautogui import time # 全局暂停每次 pyautogui 调用后等 0.05 秒防止动作堆叠 pyautogui.PAUSE 0.05 pyautogui.FAILSAFE True # 鼠标甩到左上角强制中断后悔药 def attack_at(x, y): pyautogui.moveTo(x, y, duration0.08) # 加一点移动时长更像人 pyautogui.click() time.sleep(0.12) # 技能后摇按你职业攻速调 def pick_drop(x, y): # 掉落物通常要按特定键比如 X 或空格 pyautogui.moveTo(x, y, duration0.05) pyautogui.press(x) time.sleep(0.08)逻辑说明duration0.08是鼠标移动耗时太短游戏可能判定为瞬移太长影响刷图效率。time.sleep(0.12)是技能后摇不同职业攻速不一样狂战士和漫游差很多这个值要你自己测。FAILSAFETrue是保命设置脚本失控时把鼠标甩到屏幕左上角就能停别关。3.3 主循环识别频率与动作队列主循环的节奏决定了脚本是「流畅」还是「抽搐」。常见做法是每帧截图、推理、决策、执行但推理本身要 80ms 以上所以实际帧率大概 812 FPS。别把time.sleep设得太小否则 CPU 占满、游戏掉帧反而更慢。import mss import numpy as np import cv2 import time sct mss.mss() monitor {top: 0, left: 0, width: 1280, height: 720} while True: # mss 截屏比 pyautogui 快适合循环 frame np.array(sct.grab(monitor)) frame cv2.cvtColor(frame, cv2.COLOR_BGRA2RGB) results model(frame) detections results.xyxy[0].tolist() for *box, conf, cls in detections: name model.names[int(cls)] if name monster and conf 0.5: sx, sy to_screen_coord(box, win_rect) attack_at(sx, sy) elif name drop and conf 0.4: sx, sy to_screen_coord(box, win_rect) pick_drop(sx, sy) time.sleep(0.03) # 给 CPU 喘口气别死循环逻辑说明mss截屏比pyautogui.screenshot快 35 倍适合高频循环。monitor区域要和你训练时的截图区域一致训练用 1280x720 就别推理时截 1920x1080。conf 0.5对怪物更严因为打错目标比漏打更致命掉落物可以松一点漏捡只是少收益。time.sleep(0.03)是让出 CPU 时间片不加的话单核跑满游戏和脚本互相抢资源。4. 避坑与排查那些让脚本「时灵时不灵」的细节4.1 现象识别框乱飘怪物不动它也动原因游戏窗口有缩放或者你训练时的截图比例和推理时不一致。DNF 窗口模式支持多种分辨率拉伸后像素坐标全变。解决固定游戏分辨率训练和推理都用同一套截图参数如果必须缩放在推理前把帧resize到训练尺寸再把框坐标按比例映射回屏幕。4.2 现象鼠标点到了但技能没放出来原因游戏窗口没有焦点或者鼠标被其他窗口遮挡。pyautogui 是前台模拟窗口不在最前时点击无效。解决在每次动作前用win32gui.SetForegroundWindow(hwnd)把游戏拉到前台或者用pyautogui.click之前先pyautogui.moveTo到窗口内触发一次激活。注意别用管理员权限运行脚本而游戏是普通权限权限不一致也会导致输入被拦截。4.3 现象跑几分钟后报 CUDA out of memory原因每帧都创建新 tensorPython 垃圾回收跟不上显存碎片累积。解决在循环里用torch.cuda.empty_cache()定期清理或者把model设为half()半精度推理显存占用直接减半。如果还不行把torch.no_grad()上下文加上别让推理建计算图。4.4 现象掉落物识别到了但捡不起来原因掉落物有拾取范围鼠标点过去但角色没走到范围内。解决别直接点掉落物坐标先点角色附近地面让角色移动等距离够了再按拾取键。或者用「移动拾取」组合键很多职业有远程拾取技能。这个坑没有通用解得按你玩的职业调。4.5 现象脚本运行后游戏卡顿、帧率暴跌原因截屏和推理占用了太多 CPU/GPU 资源和游戏抢。解决把mss截图区域缩小到游戏画面中心区域别全屏截推理用yolov5s而不是yolov5mtime.sleep从 0.03 提到 0.05。如果还卡考虑把推理放到另一台机器或者用 GPU 推理但限制功耗。5. 进阶调优把「能用」推到「稳用」的几个硬技巧5.1 用置信度分层做决策而不是一刀切很多人所有类别都用同一个conf这是浪费。怪物、Boss、掉落物、门框的误检代价完全不同。我一般会按类别设不同阈值Boss 最高掉落物最低。类别建议 conf理由boss0.65打错 Boss 可能团灭宁可漏检monster0.50普通怪误检代价低但太松会乱打drop0.35漏捡只是少收益多捡不亏door0.55走错门浪费时间但比 Boss 松实现上不用改模型在遍历detections时按model.names[int(cls)]查表判断即可。这个表放在 YAML 里改起来不用动代码。5.2 用截图差分降低推理频率游戏画面大部分时间是静止的每帧都推理很浪费。常见做法是每隔几帧做一次帧差变化超过阈值才触发推理。这样能把推理频率从 10 FPS 降到 34 FPSCPU 占用直接砍半。prev_frame None diff_threshold 15 # 像素差阈值按画面复杂度调 while True: frame np.array(sct.grab(monitor)) gray cv2.cvtColor(frame, cv2.COLOR_BGRA2GRAY) if prev_frame is not None: diff cv2.absdiff(gray, prev_frame) if np.mean(diff) diff_threshold: prev_frame gray time.sleep(0.02) continue # 画面没变跳过推理 prev_frame gray # 这里接推理和动作逻辑逻辑说明diff_threshold15是经验值画面特效多就调高画面干净就调低。np.mean(diff)是整帧平均差异比逐像素判断快。这个技巧在挂机刷图时特别有用角色站着不动的时候几乎不推理。5.3 权重更新后必须重新校准阈值如果你自己重新训练了权重或者换了别人的best.pt别直接套用旧阈值。新模型的置信度分布可能完全不同旧阈值要么全漏要么全误。我习惯用一批测试截图跑一遍统计每个类别的置信度分布取 F1 最高的点作为新阈值。这个步骤没有捷径但做一次能省后面无数调试时间。5.4 日志与回放出问题时能查脚本跑久了总会遇到「刚才那一下为什么没打」。我一般会在每次动作时写一行日志记录时间、类别、坐标、置信度同时保存触发动作的那一帧截图。出问题时翻日志和截图比盯着屏幕猜快得多。import logging logging.basicConfig(filenamednf_script.log, levellogging.INFO, format%(asctime)s %(message)s) # 在动作触发处加 logging.info(fattack {name} conf{conf:.2f} at ({sx},{sy})) cv2.imwrite(fdebug/{int(time.time())}.png, frame)逻辑说明日志别写太细每帧都写会撑爆磁盘只在动作触发时写。截图存debug/目录定期清理。这个习惯救过我很多次——有一次掉落物一直捡不到翻截图才发现是识别框偏了 20 像素点到了空地。从那以后我每次拿到新的视觉脚本包都强制先跑静态截图验证、再跑窗口坐标校准、最后才接游戏主循环三步缺一不可。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

银企直联对接工商银行:商业资料包如何减少联调返工

银企直联对接工商银行:商业资料包如何减少联调返工

简介:这份资源聚焦工商银行银企直联的接口开发与系统对接,面向ERP、财务及资金管理系统开发者与实施人员,帮助解决企业内外部系统与工行核心系统、网银或现金管理平台之间的实时结算与信息查询问题。压缩包共2000个文件,约28.47MB…

📅 2026/10/14 22:51:55
Spring Cloud Gateway整合Nacos:动态路由与灰度分流完整实践

Spring Cloud Gateway整合Nacos:动态路由与灰度分流完整实践

一直在调试一个模拟项目X的网关层时,遇到一个很典型的问题:后端某个服务把端口从 8081 改成 8082,网关转发就断了,只能手动改application.yml里的地址再重启网关。后来把 gateway 整合进 Nacos,同样是改配置&#xff0…

📅 2026/10/14 22:46:53
Imatest 教程:MTF、色彩与畸变测试的量化分析与自动化实践

Imatest 教程:MTF、色彩与畸变测试的量化分析与自动化实践

简介:这份 Imatest 教程面向相机与光学系统评测人员、影像工程师及摄影爱好者,帮助其读懂图像质量测试图表,解决色彩还原、噪声控制与解像力评估中结果难以量化解读的问题。资源包内含 1 个 doc 文档,压缩后约 128KB,以…

📅 2026/10/14 22:46:53
MORE NEWS

更多资讯

📰

AI专利撰写与布局实战:从可专利性判断到权利要求避坑指南

1. 当“AI专利”四个字摆在面前,真正该拆解的是什么 “AI专利”这个标题乍一看像是一个宏大叙事,但真正落到实操层面,它其实指向一个非常具体的问题: 当一项技术成果同时具备“人工智能”和“可专利性”两个属性时,从…

📰

Tcl脚本驱动FPGA工程自动化:从创建到编译全流程实战

1. 为什么要用Tcl脚本搭建易灵思工程:从痛点说起做FPGA开发有一段时间的朋友,大概率都经历过这种场景:明明只是改了一个引脚约束,结果打开工程GUI,等它加载完,点开约束编辑器,翻半天找到那行配置…

📰

Qt5.13 TCP服务端与客户端开发实战:信号槽与粘包处理

简介:一份基于 QT5.13.0 的 TCP 通信完整示例,面向初学 Qt 网络编程的开发者,用于理解服务端与客户端的建立、多客户端接入以及聊天消息的收发,既适合课程设计参考,也能作为入职前 Qt 网络模块的练手项目。资源内置可运…

📰

论文降重还在同义词替换?Okbiye 带你避开学术双重检测的坑

每年毕业季,总有一批同学在最后关头翻车:查重率降下来了,结果 AIGC 检测却亮起红灯;AI 痕迹消除了,语句又变得生硬不通顺。如今高校普遍实行 "查重 AIGC" 双重审核,单纯靠同义词替换降重的老方法…

📰

AI专利实战指南:从技术方案到专利布局的完整流程

1. 从“AI 专利”这个标题说起:它到底在聊什么“AI 专利”这四个字,乍一看像是一个法律或者知识产权话题,但真正在一线做技术、做产品的人看到它,脑子里浮现的往往不是法条,而是一连串非常具体的问题:我做的…

📰

KKSwarm多机协同框架实践:从架构选型到部署避坑

简介:开源机器人集群项目KKSwarm由易科机器人实验室与阿木实验室联合打造,面向机器人研究者、开发者及高校学生,提供一套基于开源理念的多机器人协同工作系统。项目涵盖群体通信、协调、导航与任务分配等核心技术,适用于工业生产、…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬