传统图像识别方案(模板找图)有个硬伤:图标稍微变个大小、换个颜色、转个角度,就找不到了。如果你做过抖音点赞、评论区按钮这类自动化,一定深有体会——不同机型的屏幕分辨率、不同版本的 App 界面,模板图经常失效。
YOLO 是另一条路线:训练一个模型“认识”目标,而不是死记一张图。这篇文章从零开始,讲完一条完整的链路:环境搭建 → 数据标注 → 模型训练 → 导出 → 手机端调用。
一、手机端跑 YOLO 的底气:ncnn 推理框架
先打消一个疑虑:手机端跑 YOLO 不需要高端硬件,也不需要云端算力。
EC 安卓版(10.15.0+)集成了 Tencent/ncnn 神经网络组件——这是腾讯开源的、专门为手机设备优化的推理框架。ncnn 支持 yolov5–yolov8 系列模型,EC 采用 yolov8 模型进行训练、推理和检测。
手机端推理还支持两个实用特性:
- CPU 绑定:可选 ALL / BIG / LITTLE,把推理绑到大核上提速,或绑到小核上省电;
- Vulkan 硬件加速:启用 GPU 计算(
use_vulkan_compute设为 1),进一步提速。
二、环境搭建:Anaconda + 三个库
训练在电脑上做,用的是 Python 环境。推荐安装 Anaconda(官方地址 anaconda.com,国内可用清华镜像源)。
2.1 新建虚拟环境
安装好 Anaconda 后:
- 启动软件,点击 Create 新建虚拟环境,名字随意(示例用
yolotest),Python 版本选择 3.8.19; - 环境创建成功后,点环境右侧的绿色三角,选 Open Terminal 进入终端——终端前面出现环境名(
yolotest)就说明激活成功。
2.2 安装依赖库
在终端依次执行(国内建议先切清华源):
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
# yolo 库(这里用 0.3.1 版本)
pip install yolo==0.3.1
# ultralytics(这里用 8.2.79 版本)
pip install ultralytics==8.2.79
pip install ncnn==1.0.20240410
pip install labelimg
装完后分别验证:命令行输入 yolo 能看到命令帮助;输入 labelimg 能打开标注工具,就说明环境 OK。
三、数据标注:labelimg 画框
训练第一步是让模型“见过”目标。以识别某音的点赞和评论按钮为例:
3.1 准备目录结构
建一个训练根目录(示例 E:/yolotrain),结构如下:
yolotrain/
├── images/
│ ├── test/ # 测试图片
│ ├── train/ # 训练图片
│ └── val/ # 验证图片
└── labels/
├── train/ # 训练标注
└── val/ # 验证标注
同一批图片分别放进 images/train、images/val、images/test。
3.2 用 labelimg 标注
- 终端输入
labelimg打开工具; - Open Dir 选择
images/train文件夹; - Change Save Dir 选择
labels/train文件夹; - 把左下角格式切换到 YOLO 模式;
- 右键图片选择 Create RectBox(或点左侧同名字段),在目标区域拉出选框,输入分类名称——点赞按钮填
aixin,评论按钮填pinglun,这个名称后面脚本调用要用,务必记牢; - 每张图标完点 Save,再 Next Image 切下一张。
标注完成后,labels/train 下会生成 classes.txt(分类名称列表)和与图片同名的 txt 标注文件。把 labels/train 的数据复制一份到 labels/val,供验证使用。
四、训练模型:yolov8s 一条命令
4.1 写训练配置
在 yolotrain 目录下新建配置文件 aixin.yaml:
path: E:/yolotrain
train: images/train
val: images/val
test: images/test
nc: 2
names: ["aixin","pinglun"]
参数说明:
| 参数 | 说明 |
|---|---|
path |
训练根目录绝对路径 |
train / val / test |
三份图片目录(相对 path) |
nc |
分类数量,这里是 2 个类别 |
names |
分类名称数组,顺序必须和标注时一致,写错会影响训练结果 |
4.2 开始训练
在终端进入 yolotrain 目录,执行:
yolo detect train data=e:/yolotrain/aixin.yaml model=e:/yolotrain/yolov8s.pt imgsz=640
yolov8s.pt是预训练基础模型,首次运行会自动下载(失败可从 ultralytics 官方 assets 下载后放到目录里);imgsz=640是训练输入尺寸,这个值后面配置模型时要保持一致;- 需要控制训练轮数可加
epochs=100。
训练完成后,结果保存在 runs/detect/train/ 目录下,其中 weights/best.pt 就是训练好的最佳模型。
五、导出模型:onnx 与 ncnn
训练好的 pt 模型不能直接给手机用,需要导出为手机端格式。
导出 onnx:
yolo export model=e:/yolotrain/runs/detect/train/weights/best.pt format=onnx
导出 ncnn(导出时会下载 pnnx 组件):
yolo export model=e:/yolotrain/runs/detect/train/weights/best.pt format=ncnn
导出成功后:
| 格式 | 产物文件 | 放到手机 |
|---|---|---|
| onnx | best.onnx |
/sdcard/ |
| ncnn | model.ncnn.param + model.ncnn.bin |
/sdcard/ |
六、手机端调用:yolov8Api 实战
把模型文件放到手机 /sdcard/ 根目录后,在 EC 脚本里初始化并检测。ncnn 用 newYolov8,onnx 用 newYolov8Onxx,其余调用几乎一致。下面是 ncnn 完整示例:
function main() {
// 初始化 YOLO 实例
let yolov8s = yolov8Api.newYolov8();
// 初始化配置:模型名、输入尺寸640、置信度0.25、IoU 0.35、
// 绑定全部CPU、不开硬件加速、分类名称数组
let config = yolov8s.getDefaultConfig("yolov8s-640", 640, 0.25, 0.35, "ALL", 0, [
"aixin",
"pinglun"
])
logd("config : " + JSON.stringify(config))
// 初始化训练过的模型
let inted = yolov8s.initYoloModel(config, "/sdcard/model.ncnn.param", "/sdcard/model.ncnn.bin");
if (inted) {
logd("初始化yolov8s成功");
} else {
logd("初始化yolov8s失败: " + yolov8s.getErrorMsg());
return;
}
// 截当前屏幕进行检测
let bitmap = image.captureScreenBitmapEx()
// 也可以读取本地图片: image.readBitmap("/sdcard/a.png")
let result = yolov8s.detectBitmap(bitmap, []);
// 只过滤 pinglun 类别: detectBitmap(bitmap, ["pinglun"])
if (result == null || result == "") {
logd("yolov8s 无结果: " + yolov8s.getErrorMsg());
} else {
logd("yolov8s 结果: " + result);
}
if (bitmap != null) {
bitmap.recycle(); // 回收图片
}
yolov8s.release(); // 需要时再释放,不要用一次释放一次
}
main();
关键配置项:
| 参数 | 说明 |
|---|---|
model_name |
模型名称,默认 yolov8s-640 |
input_size |
训练时的 imgsz 参数,与训练时一致(640) |
conf |
置信度阈值(0.25),误检多调高 |
iou |
IoU 阈值(0.35),用于非极大值抑制 |
bind_cpu |
绑定 CPU:ALL / BIG / LITTLE |
use_vulkan_compute |
是否硬件加速:1 开 / 0 关 |
obj_names |
分类名称数组,与训练时一致 |
onnx 版用 getOnnxConfig 配置,支持设置 num_thread 控制线程数(建议 1–2,避免 CPU 占用过高)。
七、常见问题
- Anaconda 创建环境选不了 Python 版本:一般是网络问题,在 channels 里删除默认源、添加清华源后重试;
- 下载 Arial.ttf 报错:Ultralytics 需要该字体,下载后放到
C:\Users\<用户名>\AppData\Roaming\Ultralytics目录; - GPU 训练:有独立显卡可参考 GPU 模式训练教程,速度提升明显;
- 检测不准确:优先加训练数据,特别是目标在不同机型、不同分辨率下的截图。
八、总结
一条链路走下来,YOLO 其实没有想象中神秘:
- 环境:Anaconda + yolo + ultralytics + labelimg,四个组件搞定;
- 数据:labelimg 画框标注,分类名称记住,训练配置里一一对应;
- 训练:一条
yolo detect train命令,得到 best.pt; - 导出:onnx 或 ncnn 任选,文件丢进手机 /sdcard;
- 调用:yolov8Api 初始化 + 截图 + detectBitmap,和普通脚本函数一样用。
相比模板找图,YOLO 的价值在于“认识”而不只是“匹配”——同一模型能识别多个类别,对尺寸变化、轻微变形都有很强的鲁棒性。如果你的自动化场景里目标经常“不听话”,是时候给脚本装上一双 AI 的眼睛了。
想要真实跑起来?
本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。