x-yolo-s YOLO目标检测(单独付费)
通用 YOLO 目标检测。内置轻量 YOLOv8n(COCO80),支持静态图片检测、相机实时弹层、外部模型 zip 导入。换模型或标签即可扩展到垂直场景。检测全程在设备本地完成。
兼容性
| Harmony | IOS | Android | WEB | 小程序 |
|---|---|---|---|---|
| 支持 | 支持 | 支持 | 不支持 | 不支持 |
调用
import { loadModel, detect, openCamera, importModel } from "@/uni_modules/x-yolo-s"
loadModel({
success: (res) => {
console.log(res.labelCount, res.modelRoot)
}
})
detect({
imagePath: photoPath,
labelFilter: ["person", "car"],
success: (res) => {
console.log(res.detections.length, res.durationMs)
}
})
openCamera({
cameraPosition: "back",
onDetect: (evt) => {
// trackId 对同一物体跨帧稳定;isNew 只在该目标首次确认时为 true。
// 按物品计数只统计 isNew 的结果即可防止重复报数。
evt.detections.forEach((d) => {
if (d.isNew == true) {
console.log("新目标", d.trackId, d.label)
}
})
},
onCapture: (evt) => {
console.log(evt.imagePath)
},
onClose: () => {}
})相机采集、推理和绘框都在原生弹层内完成,帧不经过 uvue。业务只收检测事件和抓拍路径。
实时弹层布局与其它相机插件一致:顶栏关闭 / 标题 / 闪光,中间预览,底部居中圆形快门(继续 / 停止)。识别到物体时在快门上方弹出信息条,约 2 秒自动消失;onDetect 仍按 detectInterval 持续回调,方便记录。
实时链路为「检测 + 跟踪 + 插值渲染」三段式:C++ 侧多目标跟踪器(IoU 匹配 + 速度外推 + EMA 平滑)给每个物体分配稳定 trackId,短暂丢帧时框滑行不闪烁;原生 overlay 以 60fps 对检测结果插值渲染,框平滑跟随物体,不受检测帧率限制。跟踪与模型无关,换模型不影响 trackId 语义。
推理后端:Android / 鸿蒙默认尝试启用 ORT 内置 XNNPACK EP(ARM 卷积加速,失败自动回退默认 CPU EP),iOS 用默认 CPU EP。实际生效后端见 getRuntimeInfo().ep(xnnpack / cpu / none)。
类别过滤:detect / openCamera 传 labelFilter: ["person","cup"] 即只检测这些类别。过滤在 C++ 解码层完成(先全类 argmax 定类再按类丢弃,与 Ultralytics classes 参数同语义),非目标类不进 NMS、不占 maxDet 名额、不进跟踪器、不绘框不回调。注意:模型单次推理耗时不变(YOLO 一次前向输出全部类别),收益在后处理更轻、跟踪与计数聚焦目标类、画面与回调干净无干扰。
方法
| 名称 | 需要 | 说明 |
|---|---|---|
| loadModel | 可选 modelRoot、files、阈值 | 加载模型;不传 modelRoot 用内置模型 |
| unloadModel | 可选回调 | 卸载模型 |
| detect | imagePath,可选 labelFilter | 静态图片检测,返回原图像素坐标框 |
| openCamera | 可选相机与节流参数 | 打开原生实时检测弹层 |
| importModel | zipPath,可选 targetName、overwrite | 解压模型 zip,返回可给 loadModel 的目录 |
| setOptions | 可选阈值 | 运行中改置信度 / IoU / 最大框数 |
| getRuntimeInfo | 无 | 同步返回平台、是否就绪、pipelineReady、推理后端 ep |
| getState | 无 | 返回 idle / loading / ready / error |
参数
loadModel
| 字段 | 说明 | 默认 |
|---|---|---|
| modelRoot | 模型目录;空则释放内置模型 | 内置 |
| files.model | 检测 onnx 文件名 | model.onnx |
| files.labels | 标签表文件名,缺失回退 COCO80 | labels.txt |
| inputSize | letterbox 边长 | 640 |
| confidenceThresh | 置信度阈值 | 0.25 |
| iouThresh | NMS IoU | 0.45 |
| maxDet | 单帧最多框,0=不限制 | 100 |
| numThreads | ORT 线程数 | Android/鸿蒙 4,iOS 2 |
detect
| 字段 | 说明 | 默认 |
|---|---|---|
| imagePath | 本地图片路径;Android 支持 content:// | 必填 |
| labelFilter | 只检测这些类别,如 ["person","cup"](label 或 classId) | 全部 |
openCamera
| 字段 | 说明 | 默认 |
|---|---|---|
| cameraPosition | front / back | back |
| torch | 初始闪光灯 | false |
| detectInterval | 相邻两次推理最小间隔 ms;框由 overlay 60fps 插值跟随,不必拉高检测帧率 | 80 |
| drawBox | 原生 overlay 绘框 | true |
| labelFilter | 只检测这些类别,如 ["person","cup"] | 全部 |
| confidenceThresh | 覆盖当前阈值 | 沿用 |
| onDetect / onCapture / onClose | 弹层事件 |
importModel
zip 内需含 model.onnx,可选 labels.txt。解压目录可直接作为 loadModel({ modelRoot })。
内置模型
首次使用前把 YOLOv8n 放到插件里。导出必须钉 opset=19:鸿蒙预编译 ORT 是 1.16,官方只保证 ai.onnx 到 opset 19,默认 ultralytics 会出 opset 20 导致 loadModel 1006。
bash uni_modules/x-yolo-s/native-src/scripts/download_model.sh再按平台编译原生核心:
bash uni_modules/x-yolo-s/native-src/android/build_android.sh
bash uni_modules/x-yolo-s/native-src/ios/build_ios.sh
bash uni_modules/x-yolo-s/native-src/harmony/build_oh.sh修改 config.json 或原生 so / framework 后需要重新打自定义基座。
