使用yolov8实现自动化脚本
在移动端自动化脚本开发场景中,传统模板匹配找图存在明显短板:目标缩放、角度偏移、界面遮挡、颜色变化后识别成功率大幅下降,仅能匹配完全一致的图片素材,复杂界面下稳定性较差。冰狐智能辅助平台原生封装 YOLOv8 推理接口,将深度学习目标检测能力融入 JS 自动化脚本,无需部署云端推理服务,直接在安卓本地完成画面目标识别,支持多类别、不规则目标、多角度物体检测,大幅拓宽自动化脚本适用场景。本文基于YOLOv8 开发文档,完整梳理从环境准备、模型部署、API 调用、业务脚本开发到排错优化全流程,结合可直接运行的实战代码,讲解如何借助 YOLOv8 实现高鲁棒性屏幕自动化操作,适用于界面按钮识别、游戏元素定位、商品图标检测等各类自动化需求。
一、前期环境与模型准备工作
1. 设备基础权限配置
YOLOv8 图像识别依赖屏幕截图能力,脚本运行前必须完成两项核心权限配置,否则会出现初始化失败、黑屏、检测无结果等问题:
- 截屏权限:脚本首行调用
requestScreenShot()申请截图权限,首次运行会弹出系统授权弹窗,接口支持自动点击确认按钮,无需人工干预授权;建议脚本启动阶段优先执行,避免后续检测逻辑报错。 - 无障碍 / 后台权限:冰狐客户端需开启无障碍服务用于模拟点击、滑动操作;关闭手机电池限制、锁定后台进程,防止长时间循环检测时 APP 被系统回收,中断自动化流程。
2. YOLOv8 模型训练与文件规范
冰狐 YOLOv8 推理仅支持两种模型文件:xxx.param、xxx.bin,训练导出、文件存放、命名有严格规范,是脚本初始化成功的核心前提:
- 模型训练导出按照官方 YOLO 训练流程标注目标数据集,训练完成后导出 NCNN 推理格式文件,文件名统一,不能携带文件后缀。例如训练识别点赞、评论按钮,模型基础名设置为
btn_model,最终生成btn_model.param、btn_model.bin两个文件。 - 模型文件三种存放路径(对应 init 接口三种寻址方式)
- 本地存储全路径:
/sdcard/btn_model,文件直接放置手机根目录 sdcard 文件夹; - 相对路径:仅填写
btn_model,文件存放于手机外部存储根目录; - 资源打包路径:
asset:btn_model,将模型打包进 APK 资源,多设备批量部署时推荐使用,无需手动推送模型文件到手机。
- 本地存储全路径:
- 类别数组匹配规则
yolo.init()第二个参数为类别数组,数组内名称顺序必须和训练标注时的分类顺序完全一致,顺序错乱会出现标签识别错误,例如训练时第一类为点赞、第二类为评论,数组必须填写["like","comment"]。
二、冰狐 YOLOv8 核心 API 完整解析
冰狐平台内置YoloV8构造类,仅包含init初始化、detect目标检测两个核心方法,所有图像识别逻辑均围绕这两个接口实现,下面结合官方文档拆解参数、返回结构与使用限制。
1. YoloV8 构造函数
var yolo = new YoloV8();
无需传入参数,直接实例化推理对象,全局单例复用即可,循环脚本中无需重复创建实例,减少内存占用。
2. init 初始化方法
作用:加载本地模型文件、注册识别类别,返回布尔值true/false,用于判断模型加载是否成功。
| 参数名 | 类型 | 必填 | 详细说明 |
|---|---|---|---|
| modelName | string | 是 | 模型路径 + 名称,无后缀,支持全路径、相对路径、asset 资源路径 |
| categoryList | Array | 是 | 训练目标分类数组,顺序严格匹配训练标注 classes |
典型初始化代码:
// 加载sdcard目录下btn_model模型,识别点赞、评论两类目标
var loadState = yolo.init("/sdcard/btn_model", ["like", "comment"]);
console.log("模型加载状态:", loadState);
if(!loadState){
toast("模型加载失败,请检查文件路径与文件名");
exit();
}
常见加载失败原因:模型文件缺失、文件名带后缀、路径书写错误、类别数组顺序不匹配。
3. detect 目标检测方法
核心识别接口,默认截取当前屏幕画面推理,返回目标检测数组,每个元素包含目标坐标、置信度、类别标签,支持自定义置信阈值、NMS 抑制阈值、自定义位图检测。
可选参数说明
| 参数名 | 类型 | 默认值 | 作用 |
|---|---|---|---|
| probThreshold | float | 0.45 | 置信度阈值,低于该数值的目标直接过滤,减少误检 |
| nmsThreshold | float | 0.65 | 非极大值抑制阈值,去除同一目标重复检测框 |
| bitmap | Bitmap | null | 自定义位图,传入后不再截取全屏,仅检测传入图片;null 时自动截屏识别 |
返回数据结构示例
[
{"left":120, "top":560, "width":80, "height":80, "prob":0.96, "label":"like"},
{"left":250, "top":560, "width":80, "height":80, "prob":0.92, "label":"comment"}
]
- left、top:目标框左上角像素坐标;
- width、height:目标框宽高像素;
- prob:识别置信度 0~1,数值越高识别越准确;
- label:目标类别名称,与 init 传入数组一一对应。
三、完整可运行自动化脚本实战案例
下面提供两套落地脚本,基础版实现全屏目标识别 + 自动点击,进阶版加入循环检测、自定义阈值、局部位图检测、异常容错逻辑,覆盖绝大多数自动化业务场景。
案例 1:基础版 —— 识别界面点赞按钮并自动点击
function main() {
// 步骤1:申请截屏权限,YOLO识别前置操作
requestScreenShot();
// 步骤2:实例化YOLO对象
var yolo = new YoloV8();
// 步骤3:初始化模型,加载sdcard下按钮识别模型
var initResult = yolo.init("/sdcard/btn_model", ["like", "comment"]);
if (!initResult) {
toast("模型加载失败,脚本终止");
return;
}
// 步骤4:执行全屏检测,使用默认阈值
var detectResult = yolo.detect();
console.log("检测结果:", detectResult);
// 步骤5:遍历识别结果,匹配点赞按钮并点击中心坐标
for (var i = 0; i < detectResult.length; i++) {
var target = detectResult[i];
if (target.label === "like") {
// 计算目标框中心点
var clickX = target.left + target.width / 2;
var clickY = target.top + target.height / 2;
click(clickX, clickY);
toast("成功点击点赞按钮,置信度:" + target.prob);
delay(1000);
}
}
}
案例 2:进阶循环脚本 —— 持续检测商品图标,自定义过滤阈值
适用于商品刷新、游戏页面循环识别场景,增加置信度过滤、自定义 NMS、循环重试、自定义位图检测功能:
function main() {
// 开启截屏权限,自动授权弹窗
requestScreenShot({confirmPermissionTag:"允许|立即开始", retryCount:3});
var yolo = new YoloV8();
// 初始化商品识别模型,识别商品、购物车两类目标
var initOk = yolo.init("/sdcard/goods_model", ["goods", "cart"]);
if (!initOk) {
toast("模型文件缺失,请检查/sdcard目录");
exit();
}
// 循环检测10轮,每轮间隔1.5秒
for (var loop = 0; loop < 10; loop++) {
toast("第" + (loop+1) + "轮画面检测");
// 自定义阈值:置信度0.6,NMS0.7,过滤低可信度目标
var targets = yolo.detect({
probThreshold: 0.6,
nmsThreshold: 0.7,
bitmap: null // null=截取全屏,可传入自定义Bitmap实现局部检测
});
if (targets.length === 0) {
console.log("本轮未识别到目标,等待页面刷新");
delay(1500);
continue;
}
// 筛选商品图标,按置信度排序,点击置信度最高的商品
var bestTarget = null;
var maxProb = 0;
for (var item of targets) {
if (item.label === "goods" && item.prob > maxProb) {
maxProb = item.prob;
bestTarget = item;
}
}
if (bestTarget != null) {
var cx = bestTarget.left + bestTarget.width / 2;
var cy = bestTarget.top + bestTarget.height / 2;
click(cx, cy, {afterWait: 2000});
toast("识别商品,置信度" + maxProb + ",执行点击");
}
delay(1500);
}
toast("循环检测完成,脚本退出");
}
四、三种模型路径部署场景实操说明
根据多设备批量部署、单设备本地调试两种需求,三种模型路径适配不同开发场景,对应init参数写法区分清晰:
- 本地调试(全路径 /sdcard)电脑通过 ADB 将
xxx.param、xxx.bin推送至手机根目录 sdcard,脚本直接填写完整路径,适合单设备开发调试,修改模型文件方便。yolo.init("/sdcard/goods_model", ["goods","cart"]); - 简易本地存放(相对路径)模型文件放置手机内部存储根目录,无需写完整路径,适合临时快速测试。
yolo.init("goods_model", ["goods","cart"]); - 批量设备部署(asset 资源路径)将模型文件打包进冰狐 APK 资源包,脚本使用
asset:前缀寻址,多台手机同步脚本时无需单独推送模型文件,企业批量自动化首选。yolo.init("asset:goods_model", ["goods","cart"]);
五、常见问题排查与性能优化方案
1. 高频报错问题解决
- init 返回 false,模型加载失败排查方向:模型文件是否同时存在 param、bin 两个文件;文件名是否携带后缀;路径大小写、斜杠书写错误;类别数组顺序与训练标注不一致。
- detect 返回空数组,识别不到任何目标排查方向:未执行
requestScreenShot()申请截屏权限;probThreshold 阈值设置过高;目标画面缩放、遮挡严重,模型泛化能力不足;屏幕黑屏、权限弹窗遮挡画面。 - 识别出现大量误检解决方案:提高 probThreshold 置信阈值(0.45 调整至 0.6~0.7);重新扩充训练数据集,增加负样本;调高 nmsThreshold 消除重叠检测框。
- 脚本运行卡顿、闪退解决方案:循环内不要重复 new YoloV8 实例;减少循环检测频率,增加 delay 延迟;使用轻量 YOLOv8-n 模型,降低推理内存占用。
2. 性能优化技巧
- 复用 YoloV8 实例,循环脚本仅初始化一次模型,避免重复加载文件消耗性能;
- 局部位图检测:截取屏幕局部区域生成 Bitmap 传入 detect,缩小推理画面尺寸,大幅提升检测速度;
- 合理调整阈值,在满足识别精度前提下提高 probThreshold,减少无效目标遍历;
- 后台锁定冰狐 APP,关闭省电策略,避免长时间循环推理被系统降频。
六、YOLOv8 对比传统模板找图的核心优势
传统findImage模板匹配仅能识别和素材图片像素完全一致的目标,界面缩放、按钮变色、轻微遮挡后直接识别失败,而 YOLOv8 基于深度学习特征提取,具备天然优势:
- 抗干扰能力强:支持目标缩放、旋转、局部遮挡、界面滤镜变色,各类 APP 动态界面稳定识别;
- 多类别同步检测:单次推理可同时识别按钮、图标、文字框等数十类目标,无需多次调用找图接口;
- 适配复杂动态界面:短视频、游戏、电商滚动商品列表等元素位置不固定场景,识别稳定性远超模板匹配;
- 本地离线推理:无需网络、不依赖云端 API,断网环境下自动化脚本正常运行,无接口调用限制。
结语
整套开发流程遵循「模型训练导出→文件部署→权限初始化→推理检测→坐标操作」标准链路,结合文中示例代码与排错方案,可快速落地各类界面自动化需求。在实际项目开发中,根据设备数量选择对应模型部署方式,配合阈值、循环逻辑优化,能够构建稳定、高效、高鲁棒性的自动化脚本,解决传统图色识别无法适配复杂动态界面的痛点。
更多推荐


所有评论(0)