Skip to main content

端侧垃圾分类方案:物料类别、中国四分类与 MQTT 输出

使用须知

中国四分类映射是本项目维护的一张表,不是主管部门的认定,各城市标准也不同;输出不能作为收费、处罚或合规判定的唯一依据。

这套方案是干什么的​

一次触发(按钮、HTTP 调用或画面里的移动)让设备拍一张图,把图里的物品分到八个物料类别之一,由类别查表得到中国生活垃圾四分类,然后发一条 MQTT 消息。同时一个异步回调收到四分类结果,翻盖、继电器或分道指示灯可以据此动作。

  • 一个头出两层答案。 模型预测 paper、cardboard、glass、metal、plastic、textile、organic、residual 八类。四分类(可回收物 / 厨余垃圾 / 有害垃圾 / 其他垃圾)是在八类 argmax 上查表得到的,适配某地标准只需改表,不用重训。
  • 触发即拍。 按钮、HTTP 或移动侦测,800 ms 去抖;前一次未完成时到达的触发会被合并,不排队。另有连续模式,限速运行,连续三帧 top-1 相同才发布。
  • 发布前校验 payload。 每条 payload 发布前过一遍事件 schema 校验,另加 JSON Schema 表达不了的两条:category 必须等于 top3[0],confidence 必须等于 top3[0].confidence。不合格的计数并丢弃。
  • 可选的开放词汇 track。 SigLIP 2 视觉塔对常量文本原型打分,部署时用 model.track: open_vocab 选择。不重训就能加类别,同一份图像嵌入可以用中文或英文回答,并能给出「不在词表里」的分数。
  • 执行机构接口不绑引脚。 运行时回调带上一个类别,送到哪个引脚由集成代码决定,所以同一份构建能跑在排针不同的板子上。

图片字节不出设备,payload 里只有路径或对象存储 URI。

  • 设备开箱即用

    装好应用包即可运行,首次部署约 35 分钟。reComputer R2000 系列(R2035-12,Hailo-8)在 7417 张验证图上实测物料 top-1 0.8889、四分类 top-1 0.9507(见性能与实测数据)。

  • 代码开源

    运行时代码 Apache-2.0;训练数据 TrashNet(MIT)与 GC3(CC BY 4.0)都允许再分发。

  • 自有相机、系统与执行机构直接接入

    USB / RTSP 相机或文件源;结果走 MQTT,POST /trigger 可由终端或 PLC 网关触发,GPIO 回调驱动翻盖或指示灯。

  • 全程本地运行

    拍照、分类、查表与 MQTT broker 都在主机上,图片不出设备,主链路不需要外网。

设备上跑起来是什么样​

下面是 reCamera PoE 装完 waste-sorting 应用包后,摄像头看到的投放区取景。图中相机前没有放物品,只作取景参考。

reCamera PoE 俯视投放区的取景,相机前未放物品

分类结果直接进 MQTT。下面是订阅 waste/recamera-cvi/results 抓到的连续事件:

订阅 waste/recamera-cvi/results 抓到的连续分类事件,每条含八类结果、四分类映射与推理耗时

需要哪些硬件​

投放点上三样东西:触发源、相机、主机。选 reCamera 或 reCamera Pro 时,相机与分类主机是同一台设备。

① 触发 —— 接在主机上的按钮、8080 端口上的 POST /trigger,或画面里的移动。三者共用同一个 800 ms 去抖,产生同样的事件,用 payload 里的 trigger 字段区分。

② 相机 —— 任意俯视投放区的 USB、RTSP 或文件源,型号不限。要求单件物品在画面里占到足够比例,且画面里只有一件。物品太小会降低分类效果,性能与实测数据里的数字都不是在这种取景下测的。

③ 分类主机 —— 决定能用哪几条模型路径。

分类主机加速器当前下发的分类器开放词汇 track什么时候选它
reComputer Super J3011reComputer Super J3011(Jetson Orin Nano 8GB)
基础边缘计算主机
Orin GPUEfficientNet-Lite0 224²,TensorRT FP16不提供单个投放点、只跑基线分类器
reComputer Super J4012reComputer Super J4012(Jetson Orin NX 16GB)
大算力边缘计算主机
Orin GPUEfficientNet-Lite0 224²,TensorRT FP16提供(唯一提供它的设备类别)以后要在不重训的前提下加物品类别
reComputer Industrial R2035-12reComputer Industrial R2035-12(Hailo-8)
无风扇工业机箱
Hailo-8EfficientNet-Lite0 224²,INT8 HEF不提供已有摄像头、装控制柜;HEF 在设备外编译,部署时下载,Hailo 运行时版本必须对齐
reComputer RK3588reComputer RK3588 系列
高性价比工控板卡
RK3588 NPUEfficientNet-Lite0 224²,INT8不提供已有摄像头、硬件成本压到最低,装在桶体或自助终端里;模型在设备外转换,不在设备上构建引擎
reCamera 2002reCamera 2002(SG2002)
一体化智能相机
相机自带 TPUEfficientNet-Lite0 224²,BF16不提供投放点还没有摄像头、硬件成本压到最低;分类器跑在相机上,不用另配主机
reCamera ProreCamera Pro
高性能一体化智能相机
相机自带 NPU(RV1126B)EfficientNet-Lite0 224²,INT8不提供投放点还没有摄像头、成本不是第一考虑;分类器跑在相机上

两款 reComputer 都有无风扇工业机箱版本(reComputer Industrial J3011 / J4012),模组与运行时相同,可装控制柜或户外机箱。

开放词汇一列来自设备目录里的资源说明:SigLIP 2 视觉塔是 371 MB 的 ONNX,CPU onnxruntime 离线基准单图 p50 66.93 ms,需要加速器。

④ 其余 —— 一个 MQTT 消费方(包里自带本地 broker,监听 1883);方案里有翻盖或分道指示灯时,还需要驱动硬件和 GPIO 回调的集成代码,出厂不绑任何引脚。主链路不需要外网。

选型排他边界​

  • 开放词汇免重训需求:若业务需要在不重新训练模型的前提下动态增加物品分类,请勿选择 J3011(不提供该 Track),必须选配 J4012(16GB)。
  • 高速传送带运动模糊:传送带速度若超过 1.5 m/s,普通卷帘快门(Rolling Shutter)USB 摄像头会产生严重果冻效应与运动模糊,必须选配工业全局快门相机。

现场怎么部署​

先定取景与触发方式,再装软件。难度为 intermediate,首次部署约 35 分钟。

一、装硬件:定取景与触发方式​

一图一件,物品要够大

这条链上没有检测器。一帧里有两件物品只会得到一个答案,对应哪一件不确定;物品在画面里占比太小时分类会变差。相机俯视投放区安装,让单件物品占到足够比例,部署前确定触发方式用按钮、HTTP 还是移动侦测。

二、装软件​

逐设备的步骤在可部署方案页,按现场条件选完配置后可以直接下载对应的应用包。


共五个套餐:摄像头 + reComputer J30 / J40(Orin)、摄像头 + reComputer R2000 系列(R2035-12,Hailo-8)、摄像头 + reComputer RK3588、reCamera(SG2002)、reCamera Pro。下面是 Orin 与 Hailo-8 两个套餐的流程,其余三个套餐的步骤见部署页。

  1. 选套餐与主机。 摄像头 + reComputer J30 / J40(Orin) 或 摄像头 + reComputer R2000 系列(R2035-12,Hailo-8)。
  2. 部署垃圾分类运行时(必需)。Orin 路径在部署时于设备上构建 TensorRT engine(J4012 上 68 s),engine 绑定具体 GPU 架构与 TensorRT 版本,不能预编分发。Hailo 路径的部署步骤先检查三道 Hailo ABI 关卡,再下载 HEF。
  3. 看实时分类(可选)。8080 端口的本地面板有 MJPEG 预览、健康计数与最近结果的 top3。接任何设备之前,先在这里确认取景。
  4. 接触发并确认一次分类(必需)。一次按钮、HTTP 调用或移动事件应在 waste/<流编号>/results 上恰好产生一条 MQTT 消息,且 category 与 confidence 与 top3[0] 一致。
  5. 切换到开放词汇 track(可选,仅 Orin)。部署时设 model.track: open_vocab。

有哪些接口​

分类主机对外有两个接口、一个进程内回调,全部由主机自己提供。

  • 运营或记录系统 —— 订阅 1883 端口上的 waste/<流编号>/results。一次分类一条 JSON。
  • 自助终端界面、PLC 网关或测试脚本 —— 8080 端口上的 POST /trigger 触发一次拍照分类;/events 返回最近结果与 top3。
  • 翻盖、继电器或分道指示灯 —— 异步 GPIO 回调带上四分类结果。不绑引脚,绑定代码属于集成工作。

完整的接口与 payload​

类型位置内容备注
mqtt1883,waste/<流编号>/resultstype、version、taxonomy_version、device、stream_id、frame_id、timestamp、trigger、inference_time_ms、pipeline_ms、category(class_id、class_name、china_category、china_category_zh)、confidence、top3[]、image_ref、model(名称、backbone、输入、onnx_sha256、加速器)一次分类一条。发布前过事件 schema 校验
http8080,/trigger /preview.mjpg /healthz /eventsPOST /trigger 触发一次拍照分类(触发源记为 http);MJPEG 实时画面;带推理耗时、触发与去抖计数以及 MQTT 计数的健康接口;最近结果与 top3本地面板,无鉴权
GPIO 回调进程内异步给出四分类结果actuator.enabled 默认 false。不绑引脚

读字段时注意两点:

  • 图片不在 payload 里。 image_ref.kind 只有 none、local、object_store。payload 里出现 base64 图片字节违反契约,发布前会被拒。
  • category 恒等于 top3[0],confidence 恒等于 top3[0].confidence。 两条都在发布前检查,不合格的 payload 计数并丢弃,消费方不需要自己核对。
{
"type": "waste_classification",
"version": "1.0.0",
"device": "waste-sorting-station-01",
"stream_id": "cam_inlet_01",
"timestamp": 1729000000.789,
"trigger": "sensor",
"inference_time_ms": 3.53,
"pipeline_ms": 4.12,
"category": {
"class_id": 3,
"class_name": "plastic_bottle",
"china_category": "recyclable",
"china_category_zh": "可回收物"
},
"confidence": 0.942,
"top3": [
{"class_id": 3, "class_name": "plastic_bottle", "confidence": 0.942},
{"class_id": 5, "class_name": "glass_bottle", "confidence": 0.038},
{"class_id": 1, "class_name": "metal_can", "confidence": 0.012}
]
}

随包的 MQTT broker 允许匿名连接,用于本地调试;正式部署换成带凭据的 broker。

性能与实测数据​


设备实测:基线分类器(EfficientNet-Lite0)​

设备精度验证图物料 top-1四分类 top-1与同批图 CPU fp32 之差纯推理 p50 / p95
reComputer R2000 系列(R2035-12)+ Hailo-8INT8(uint8 输入 HEF)74170.88890.9507+0.12 pp3.166 ms / 3.249 ms
reComputer RK3588 系列INT8(calib256+mmse)74170.88820.9507+0.05 pp3.165 ms / 3.857 ms
reComputer RK3588 系列fp1674170.88820.9505+0.05 pp5.962 ms / 12.566 ms
reCamera Pro(RV1126B NPU)INT810600.87640.9566+0.19 pp5.824 ms / 6.047 ms
reCamera(SG2002 TPU)BF1610600.87920.9566+0.47 pp24.276 ms / 24.323 ms

条件:纯推理,不含取图与预处理,单路背靠背;预处理为短边 256 → 中心裁剪 224,归一化烘焙进模型,设备只接收 uint8。7417 张是验证集全集;1060 张是每 7 张取 1 张的子集,该子集上 CPU fp32 top-1 为 0.8745(全集 0.8877),跨图集比较时看「与同批图 CPU fp32 之差」一列。reCamera Pro 在停掉相机内置应用后测得;reCamera 峰值常驻内存 11.6 MB。

  • 两台 NPU 主机的 p50 相同(3.2 ms);Hailo-8 的 p95 只比 p50 高 0.08 ms,RK3588 INT8 高 0.69 ms。
  • RK3588 上 INT8 与 fp16 的物料 top-1 相同,INT8 快 1.9 倍。INT8 用 252 张校准图、mmse 算法、per-channel 量化;50 张抽样上 normal 算法与 CPU 一致率 0.90,mmse 为 0.98–1.00。mmse 的转换耗时是 normal 的 40–90 倍(256 张校准时 17.3 分钟对 11.5 秒),只在转换时付出一次。
  • Hailo-8 的 HEF 用 DFC 3.31.0、optimization_level=2(量化感知微调)编译;此前 optimization_level=1 的 HEF 比 CPU fp32 低 2.40 pp,换成当前 HEF 后差距消失。
  • reCamera Pro 上 INT8 比 fp16 快 2.9 倍,是 reCamera 的 4.2 倍;INT8、fp16 与 CPU fp32 在同一 1060 张上相差不到 0.2 pp。

复现:evaluation/runs/2026-09-07-hailo-quant-tuning、evaluation/runs/2026-09-07-devices/results-rk3588.md、evaluation/runs/2026-09-06-m1c-rk3588-radxa、evaluation/runs/2026-09-07-recamera-pro、evaluation/runs/2026-09-07-devices/results-recamera-sg2002.md

设备实测:Orin 路径的构建与触发到出结果​

项目结果设备条件
TensorRT engine 构建68 s / 72 sreComputer J40 系列(J4012)/ J30 系列(J3011)FP16,部署时在设备上构建
触发到出结果4.122 msreComputer J40 系列(J4012)一次 POST /trigger 对应 MQTT 事件里的 pipeline_ms,其中推理 3.533 ms
纯推理 p50 / p950.992 ms / 1.265 msreComputer J40 系列(J4012)部署用的 engine,1060 张验证子集,单路背靠背
物料 top-10.8755,与 CPU 一致率 99.91%reComputer J40 系列(J4012);J30 系列(J3011)复测逐位一致同一 1060 张子集,CPU fp32 为 0.8745

复现:evaluation/runs/2026-09-08-orin-nx-acceptance、evaluation/runs/2026-09-08-orin-nx-acceptance-2、evaluation/runs/2026-09-08-orin-nano-acceptance

基线分类器:CPU 参考精度​

指标数值条件
物料 top-1(8 类)0.8877val,7417 张;onnxruntime 1.25.1 CPU;ONNX e9f9e847…,13,477,056 B
物料 top-50.9833同上
中国四分类 top-10.9500同上;在八类 argmax 上查表
macro-F1(7 个有样本的类)0.8511排除 textile——零样本
物料 top-1,留出 test0.8802test,7290 张
单图推理时延,CPUmean 16.796 ms / p50 14.724 ms / p95 28.718 ms仅 session.run,CPU 离线基准,batch 1,不是设备指标
置信度低于 0.5 的图318 张(4.3%)val
ORT PTQ INT8 与 fp32 一致率0.965200 张 val 图,per-channel + MinMax,未塌缩

四分类 top-1(0.9500)比物料 top-1(0.8877)高,因为 glass、metal、plastic 之间的混淆都落在可回收物里;只看四分类会高估对材质的判别力。

复现:evaluation/runs/2026-09-06-m1c-cpu

开放词汇 track:SigLIP 2 ViT-B/16​

指标数值条件
物料 top-1(8 类)0.8501val,7417 张;英文 prompt 集 waste8-en/v1,模板 t02,16-shot α=0.8,temperature 0.0075
物料 top-50.9987同上
中国四分类 top-10.9393同上;分层路径(先八类再映射)
macro-F1(7 类)0.7460同上
ECE(15 bins)0.0221同上
开集 AUROC0.75387 个有样本类别的均值,留一类法,score = 1 - max softmax
中英一致率(同一张图)物料 0.8698 / 四分类 0.9143一份视觉嵌入、三套原型库
物料 top-1,留出 test0.8620test,7290 张
单图推理时延p50 66.93 ms / p95 91.62 msCPU 离线基准,batch 1,仅视觉塔,不是设备指标

与基线的对比(同一份 split):

指标基线(MobileNetV3-Small)开放词汇(SigLIP2-B/16)
物料 top-1,val0.87920.8501
物料 top-1,test0.88070.8620
中国四分类 top-1,val0.95190.9393
macro-F1,val0.82920.7460
ECE(15 bins),val0.03080.0221
开集 AUROC无(闭集头不重训就无法去掉一个类)0.7538
中英一致率没有文本侧0.8698 / 0.9143
零样本新类别需要重训改 prompt
CPU p50 时延1.57 ms66.93 ms

对比里的基线是已取代的 MobileNetV3-Small。出货的 EfficientNet-Lite0 在这份 split 上 val top-1 0.8877,CPU p50 约 14.7 ms,时延倍数从 40 倍缩到 4–5 倍。

复现:evaluation/runs/2026-09-05-w1-cpu

SigLIP 2 视觉塔在 Rockchip NPU 上的实测(fp16,rknn-toolkit2 / librknnrt 2.3.2,RK3588 上的模型为 191 MB .rknn):

设备单图 p50 / p95与 CPU 嵌入余弦 mean / min
reComputer RK3588 系列169.4 ms / 170.5 ms0.999617 / 0.998841
reComputer RK3576 系列152.51 ms / 176.59 ms0.99965 / 0.99900

复现:evaluation/runs/2026-09-06-m1c-rk3588-radxa、evaluation/runs/2026-09-06-rk3576-cat

部署占用​

项目大小
基线 ONNX(efficientnet_lite0_waste8.onnx)13,477,056 B
SigLIP 2 视觉塔 ONNX(siglip2_vision_224.onnx)371,695,898 B
原型库 + 校准报告合计约 155 KB

运行时与关键参数​

设备模型精度运行时模型怎么到设备上
reComputer J30 / J40 系列EfficientNet-Lite0 224²FP16TensorRT部署时在设备上构建 engine,绑定 GPU 架构与 TensorRT 版本,不能预编分发
reComputer J40 系列(可选开放词汇 track)SigLIP 2 ViT-B/16 视觉塔 + 常量文本原型——model.track: open_vocab
reComputer R2000 系列 + Hailo-8EfficientNet-Lite0 224²INT8(uint8 输入,归一化在 HEF 内,optimization_level=2)HailoRT 4.21.0HEF 在设备外用 DFC 3.31.0 编译,部署时下载
reComputer RK3588 系列EfficientNet-Lite0 224²INT8(calib256+mmse)librknnrt 2.3.2rknn-toolkit2 2.3.2 在设备外转换
reCamera ProEfficientNet-Lite0 224²INT8相机 NPU(RV1126B),RKNNrknn-toolkit2 2.3.2 在设备外转换,部署时装到相机上
reCamera(SG2002)EfficientNet-Lite0 224²BF16相机 TPU,cvimodelTPU-MLIR 在设备外转换,部署时装到相机上
  • 触发去抖:800 ms,前一次未完成时到达的触发合并,不排队
  • 连续模式:连续 3 帧 top-1 相同才发布;触发模式一次拍摄一个答案
  • actuator.enabled:默认 false,GPIO 回调不绑引脚

已知退化​

  • textile 的训练与评测样本都是零:两个源数据集都没有布料类别,第八个 logit 保留(ONNX 输出仍是 1×8),但模型从未预测出这一类,所有表在这一类上报 n/a。
  • 没有物料类别映射到 hazardous(有害垃圾);它留在枚举里是为了 schema 稳定,当前构建不会输出它。
  • organic 占训练集 48.9%、val 47.1%,召回 0.9791,远高于其他类(0.70–0.88);模型把不确定的物品判向这一类。
  • residual 只有 20 张 val 样本;开放词汇 track 在它上面的精确率 0.2754、留一法 AUROC 0.5795,接近随机。
  • 开放词汇 track 用中文 prompt 直接预测四分类只有 0.8478,分层路径(先八类再映射)是 0.9393。
  • MobileNetV3-Small(已取代)的 INT8 在三条边缘链路上都塌缩:Hailo DFC 模拟器一致率 0.115、reComputer RK3576 系列 0.10、reComputer RK3588 系列 0.22(fp16 0.98–1.00),所以基线换成 EfficientNet-Lite0。RK3588 的 INT8 结果不能直接套用到 RK3576。
  • SigLIP 2 视觉塔在 Hailo-8 上 INT8 量化失败(hailo optimize 在 ne_activation_mul_and_add78 层报错),没有 HEF;开放词汇 track 不能在 reComputer R2000 系列上跑。
  • 两个数据集都是单件物品照片(TrashNet 白色背板,GC3 物体偏心且常被遮挡),不含潮湿、压扁、堆叠、逆光或部分装袋的垃圾;投放点现场的精度会低于表中数字。

数据与素材出处​

  • TrashNet —— github.com/garythung/trashnet,MIT License,Copyright (c) 2017 Gary Thung。依据两处一手来源:仓库在 commit 6fa2b87 上的 LICENSE 文件,以及官方 HuggingFace 数据集卡片的 license 字段。MIT 要求保留版权与许可声明,没有相同方式共享条款。
  • Garbage Classification 3 — Material Identification(Roboflow Universe) —— CC BY 4.0,导出包自带的 README.dataset.txt 里逐字写明。Roboflow Universe 上的项目路径是 material-identification/garbage-classification-3。
  • SigLIP 2 —— google/siglip2-base-patch16-224,revision 75de2d55…,Apache-2.0。仅供可选的开放词汇 track 使用。
  • MobileNetV3-Small 的 ImageNet 起始权重(torchvision)—— BSD-3-Clause。
  • 上游运行时代码 —— Apache-2.0。
  • 架构图 —— 依据本包的设备目录与输出接口绘制,不含任何数据集图像。

由这些数据集派生的对外材料,须逐字使用以下署名字符串:

TrashNet — Gary Thung and Mindy Yang, https://github.com/garythung/trashnet,
MIT License, Copyright (c) 2017 Gary Thung.
Garbage Classification 3 — Material Identification / Roboflow Universe,
https://universe.roboflow.com/material-identification/garbage-classification-3,
licensed CC BY 4.0.

本包不提交任何数据集派生的图像。 两个许可都允许再分发。

Loading Comments...