1. 项目概述
硬币识别系统在自动售货机、金融清点等场景中具有重要应用价值。传统基于图像处理的硬币识别方法往往受限于光照条件、硬币磨损程度等因素,识别准确率难以突破90%门槛。我们基于YOLOv11目标检测算法开发了一套美国硬币识别系统,能够准确识别四种常见硬币(Dime、Nickel、Penny、Quarter),在复杂背景下仍保持95%以上的识别准确率。
系统采用PyQt5构建用户界面,支持图片、视频和实时摄像头三种检测模式,并集成了用户登录注册功能。项目完整开源了训练代码、预训练模型和标注数据集,为相关应用开发提供了可靠的技术参考。
技术选型思考:相比传统OpenCV方案,YOLOv11在保持高精度的同时实现了每秒120帧以上的处理速度,更适合实时检测场景。而PyQt5的跨平台特性使得系统可以轻松部署到Windows、Linux等不同环境。
2. 系统架构设计
2.1 整体架构
系统采用典型的三层架构设计:
- 数据层:包含硬币图像数据集和预训练模型
- 算法层:基于YOLOv11的核心检测算法
- 应用层:用户界面和业务逻辑实现
mermaid复制graph TD
A[用户界面] --> B[检测控制器]
B --> C[YOLOv11模型]
C --> D[图像处理模块]
D --> E[检测结果]
E --> F[结果可视化]
2.2 技术栈选型
| 技术组件 | 版本 | 选择理由 |
|---|---|---|
| Python | 3.9 | 丰富的CV库支持 |
| PyTorch | 2.0+ | YOLOv11的底层框架 |
| PyQt5 | 5.15 | 跨平台GUI开发 |
| OpenCV | 4.5+ | 图像处理基础 |
| Ultralytics | 8.0+ | YOLO模型接口 |
3. 数据集准备
3.1 数据采集
我们收集了2000+张包含四种美国硬币的图像,覆盖以下场景:
- 不同光照条件(自然光、室内光、低光)
- 多种背景(桌面、手掌、复杂纹理)
- 不同摆放角度(正面、侧面、堆叠)
3.2 数据标注
使用LabelImg工具进行标注,生成YOLO格式的标注文件:
code复制0 0.536719 0.511719 0.060937 0.087500 # Dime
1 0.396094 0.503906 0.071875 0.103125 # Nickel
数据集划分:
- 训练集:1400张
- 验证集:300张
- 测试集:300张
4. 模型训练
4.1 训练配置
python复制from ultralytics import YOLO
model = YOLO('yolov11s.pt') # 加载预训练模型
results = model.train(
data='coins.yaml',
epochs=100,
batch=8,
imgsz=640,
device='0', # 使用GPU
workers=4,
optimizer='AdamW',
lr0=0.001,
weight_decay=0.0005
)
关键参数说明:
batch=8:显存占用约6GB(RTX 3060)imgsz=640:输入图像尺寸optimizer='AdamW':相比SGD收敛更快
4.2 训练结果
在测试集上的表现:
| 指标 | 数值 |
|---|---|
| mAP@0.5 | 0.963 |
| Precision | 0.952 |
| Recall | 0.958 |
| FPS | 128 |
训练过程可视化:

5. 系统实现
5.1 核心检测逻辑
python复制class DetectionThread(QThread):
def run(self):
while self.running:
# 图像预处理
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 模型推理
results = self.model(frame, conf=self.conf, iou=self.iou)
# 结果解析
for box in results[0].boxes:
class_id = int(box.cls)
confidence = float(box.conf)
x, y = box.xywh[0][:2] # 中心点坐标
# 发送信号更新UI
self.frame_received.emit(original_frame, result_frame, detections)
5.2 多线程处理
采用生产者-消费者模式:
- 主线程:处理用户交互
- 检测线程:执行模型推理
- 结果线程:更新UI显示
python复制# 创建检测线程
self.detection_thread = DetectionThread(model, source, conf, iou)
self.detection_thread.frame_received.connect(self.update_result)
self.detection_thread.start()
6. 用户界面设计
6.1 界面布局
主要功能区域:
- 图像显示区(原始图像/检测结果)
- 控制面板(模式选择、参数调节)
- 结果表格(检测数据统计)
- 状态栏(系统信息)

6.2 关键交互实现
参数同步控制:
python复制# 置信度滑块与数值框联动
self.confidence_slider.valueChanged.connect(
lambda: self.confidence_spinbox.setValue(self.confidence_slider.value()/100)
)
self.confidence_spinbox.valueChanged.connect(
lambda: self.confidence_slider.setValue(int(self.confidence_spinbox.value()*100))
)
7. 部署与优化
7.1 性能优化技巧
-
模型量化:将FP32模型转为INT8,体积减小4倍,速度提升2倍
python复制model.export(format='onnx', int8=True) -
TensorRT加速:针对NVIDIA显卡优化
bash复制
trtexec --onnx=yolov11s.onnx --saveEngine=yolov11s.engine -
多尺度推理:对小目标检测更有效
python复制results = model(frame, imgsz=[640, 1280]) # 多尺度输入
7.2 常见问题解决
-
检测漏检:
- 调低置信度阈值(建议0.3-0.5)
- 增加训练数据中的小目标样本
-
类别混淆:
- 检查数据标注质量
- 调整分类损失权重
python复制model.train(cls_loss_weight=1.5) # 加大分类损失权重 -
界面卡顿:
- 限制检测帧率(30FPS足够)
- 使用QPixmap缓存显示图像
8. 应用扩展
系统可进一步扩展的功能:
- 金额统计:根据硬币类型自动计算总金额
- 假币检测:增加真假硬币分类模型
- 多币种支持:扩展支持其他国家的硬币
- 边缘部署:使用NVIDIA Jetson等嵌入式设备
核心代码扩展示例:
python复制# 金额统计功能
coin_values = {'Dime':0.1, 'Nickel':0.05, 'Penny':0.01, 'Quarter':0.25}
total = sum(coin_values[cls] for cls in detected_classes)
9. 项目总结
在实际开发中,我们遇到了几个关键挑战:
- 硬币反光问题:通过数据增强(添加高斯噪声)缓解
- 密集堆叠检测:使用更小的anchor box尺寸
- 实时性要求:采用多线程和模型量化技术
对于想要复现项目的开发者,建议:
- 从yolov11s小型模型开始训练
- 使用自动混合精度(AMP)加速训练
python复制model.train(amp=True) # 启用AMP - 优先优化召回率(减少漏检)
这个项目展示了如何将前沿的目标检测技术应用于具体的实际问题。通过合理的架构设计和持续的优化迭代,我们实现了既准确又高效的硬币识别解决方案。
