安卓AI识别目标检测

安卓自动化脚本 YOLO 目标检测全流程:从标注训练到手机端 ncnn 推理

安卓端 YOLOv8 目标检测实战:Anaconda 环境搭建、labelimg 数据标注、yolov8s 模型训练、导出 onnx/ncnn、EC 脚本调用 yolov8Api 做实时识别,全流程手把手教程。

约 11 分钟

传统图像识别方案(模板找图)有个硬伤:图标稍微变个大小、换个颜色、转个角度,就找不到了。如果你做过抖音点赞、评论区按钮这类自动化,一定深有体会——不同机型的屏幕分辨率、不同版本的 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 后:

  1. 启动软件,点击 Create 新建虚拟环境,名字随意(示例用 yolotest),Python 版本选择 3.8.19
  2. 环境创建成功后,点环境右侧的绿色三角,选 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/trainimages/valimages/test

3.2 用 labelimg 标注

  1. 终端输入 labelimg 打开工具;
  2. Open Dir 选择 images/train 文件夹;
  3. Change Save Dir 选择 labels/train 文件夹;
  4. 把左下角格式切换到 YOLO 模式;
  5. 右键图片选择 Create RectBox(或点左侧同名字段),在目标区域拉出选框,输入分类名称——点赞按钮填 aixin,评论按钮填 pinglun这个名称后面脚本调用要用,务必记牢
  6. 每张图标完点 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 占用过高)。

七、常见问题

  1. Anaconda 创建环境选不了 Python 版本:一般是网络问题,在 channels 里删除默认源、添加清华源后重试;
  2. 下载 Arial.ttf 报错:Ultralytics 需要该字体,下载后放到 C:\Users\<用户名>\AppData\Roaming\Ultralytics 目录;
  3. GPU 训练:有独立显卡可参考 GPU 模式训练教程,速度提升明显;
  4. 检测不准确:优先加训练数据,特别是目标在不同机型、不同分辨率下的截图。

八、总结

一条链路走下来,YOLO 其实没有想象中神秘:

  • 环境:Anaconda + yolo + ultralytics + labelimg,四个组件搞定;
  • 数据:labelimg 画框标注,分类名称记住,训练配置里一一对应;
  • 训练:一条 yolo detect train 命令,得到 best.pt;
  • 导出:onnx 或 ncnn 任选,文件丢进手机 /sdcard;
  • 调用:yolov8Api 初始化 + 截图 + detectBitmap,和普通脚本函数一样用。

相比模板找图,YOLO 的价值在于“认识”而不只是“匹配”——同一模型能识别多个类别,对尺寸变化、轻微变形都有很强的鲁棒性。如果你的自动化场景里目标经常“不听话”,是时候给脚本装上一双 AI 的眼睛了。

想要真实跑起来?

本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。

访问 EasyClick 官网 →