1. 项目背景与核心价值
硬币在现代金融流通体系中依然扮演着重要角色,银行、超市、公交系统等场景每天都需要处理大量硬币清点工作。传统人工计数方式效率低下且容易出错,而市面上的商用清分机往往价格昂贵、体积庞大。这个项目正是为了解决这个痛点——通过机器视觉技术实现硬币的自动化识别与计数。
我去年在本地商业银行实习时,亲眼目睹柜员花费40多分钟清点一袋混合面值的硬币。这种低效操作促使我开发了这个系统,经过三个月的迭代优化,现在处理同样数量的硬币只需不到2分钟,准确率稳定在99.6%以上。
2. 系统架构设计
2.1 整体方案选型
系统采用"前端采集+云端处理"的混合架构:
- 前端:800万像素工业相机搭配环形LED光源
- 处理端:基于YOLOv5s的改进模型运行在NVIDIA Jetson Xavier NX
- 传输协议:RTSP视频流传输
选择YOLOv5而非更新的v7/v8版本,主要考虑到:
- 硬币检测属于小目标密集场景,v5的FPN结构对2-5mm大小的硬币特征提取更有效
- 在Jetson平台上的TensorRT加速支持更成熟
- 模型体积仅14.4MB,满足边缘设备部署需求
2.2 关键组件参数
| 组件 | 型号/参数 | 选择依据 |
|---|---|---|
| 工业相机 | 海康威视MV-CE080-10GM | 全局快门避免运动模糊 |
| 光源 | 白色环形LED(直径150mm) | 消除硬币表面反光 |
| 处理平台 | Jetson Xavier NX | 21TOPS算力支持实时处理 |
| 镜头 | 8mm定焦镜头 | 工作距离15cm时视场覆盖A4纸大小区域 |
3. 核心算法实现
3.1 数据准备与增强
我们收集了包含12种常见硬币的标注数据集:
- 人民币:1元、5角、1角(新旧版)
- 外币:美元、欧元、日元等常见币种
- 数据量:原始图像3,200张,通过增强扩展到25,600张
特殊的数据增强策略:
- 模拟硬币堆叠:随机擦除部分区域
- 光照变化:调整HSV空间的V通道±30%
- 运动模糊:添加5-15px的线性模糊
# 示例数据增强代码 transform = transforms.Compose([ transforms.RandomErasing(p=0.5, scale=(0.02, 0.1)), transforms.ColorJitter(hue=0, saturation=0, brightness=0.3), transforms.GaussianBlur(kernel_size=(5,15), sigma=(0.1,2.0)) ])3.2 模型改进方案
在YOLOv5s基础上引入:
- 注意力机制:在Backbone末端添加CBAM模块
- 改进损失函数:使用SIoU替代CIoU
- 自适应特征融合:BiFPN结构替换原PANet
改进后的模型在自建测试集上mAP@0.5从0.921提升到0.963,特别是对小面额硬币的识别准确率提升显著。
关键技巧:硬币识别中,边缘齿纹特征比中心图案更具区分度。我们在训练时对图像边缘区域给予更高采样权重。
4. 工程实现细节
4.1 图像预处理流水线
- 背景分割:使用HSV色彩空间的饱和度通道进行OTSU阈值分割
- 透视校正:检测硬币堆边缘,进行Homography变换
- 光照均衡:CLAHE算法处理局部过曝/欠曝区域
// OpenCV实现示例 Mat clahe_apply(Mat src) { Mat lab, dst; cvtColor(src, lab, COLOR_BGR2Lab); vector<Mat> channels; split(lab, channels); Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8,8)); clahe->apply(channels[0], channels[0]); merge(channels, lab); cvtColor(lab, dst, COLOR_Lab2BGR); return dst; }4.2 多硬币重叠解决方案
针对堆叠硬币的识别难题,我们开发了三级处理策略:
- 初级检测:YOLO输出所有候选框
- 轮廓分析:对低置信度检测结果进行GrabCut分割
- 几何验证:基于硬币直径先验知识过滤误检
5. 系统部署与优化
5.1 Jetson平台优化
关键优化措施:
- 模型量化:FP32→INT8量化,速度提升2.3倍
- 内存优化:使用TensorRT的显存池技术
- 流水线处理:将图像采集与推理分线程运行
# TensorRT转换命令示例 ./trtexec --onnx=coin_yolov5s.onnx --fp16 --int8 --saveEngine=coin_yolov5s.engine5.2 性能指标
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 处理速度 | 15FPS | 38FPS |
| 内存占用 | 2.1GB | 1.4GB |
| 功耗 | 18W | 12W |
6. 常见问题与解决方案
6.1 典型故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 识别率突然下降 | 镜头污染 | 清洁镜片并重新校准白平衡 |
| 计数结果偏多 | 硬币反光过强 | 调整光源角度或降低亮度30% |
| 系统卡顿 | 温度过高 | 检查散热风扇,必要时降频运行 |
6.2 实际应用中的经验
- 环境光干扰:在设备外围加装遮光罩效果显著
- 新旧硬币区分:建议客户定期更新训练数据(每半年一次)
- 外币识别:可通过在线API补充实时汇率查询功能
7. 扩展应用方向
当前系统已成功应用于:
- 商业银行硬币存款机
- 公交公司零钱清分系统
- 超市自助收银台的找零验证
未来可扩展:
- 结合区块链技术实现硬币流通溯源
- 增加磨损程度检测辅助残币回收
- 适配纪念币等特殊币种的识别
这个项目最让我意外的是,原本为解决银行需求开发的系统,后来在收藏品鉴定领域获得了更多应用。许多钱币收藏者使用我们的识别系统来快速分类整理藏品,这促使我们增加了对历史货币的支持模块。