2026/4/18 8:29:02
网站建设
项目流程
沈阳哪家做网站好,威海做网站的公司哪家好,廊坊网站霸屏,榆林网站seo一、项目介绍
摘要
本项目基于先进的YOLOv10目标检测算法#xff0c;开发了一套高精度的美国硬币识别检测系统#xff0c;能够准确识别和分类四种常见美国硬币#xff1a;1美分(Penny)、5美分(Nickel)、10美分(Dime)和25美分(Quarter)。系统针对硬币检测的特殊挑战进行了优…一、项目介绍摘要本项目基于先进的YOLOv10目标检测算法开发了一套高精度的美国硬币识别检测系统能够准确识别和分类四种常见美国硬币1美分(Penny)、5美分(Nickel)、10美分(Dime)和25美分(Quarter)。系统针对硬币检测的特殊挑战进行了优化包括金属反光、尺寸相近、堆叠遮挡等情况。该系统可应用于自动售货机、自助收银台、银行柜台等场景的硬币自动清点与真伪鉴别显著提高硬币处理效率和准确性。项目意义硬币自动识别技术的开发与应用具有深远的商业价值和社会效益本项目的成功实施将在多个层面产生重要影响金融自动化革命推动现金处理设备的智能化升级使传统硬币处理效率提升可减少银行、公交系统等机构的现金处理人力成本为美国金融服务行业节省潜在运营成本。商业运营优化为自动售货机运营商提供精准的硬币清点能力实现动态库存管理和实时营收监控可降低运营损耗同时支持更灵活的定价策略如精确到1美分的定价提升商业竞争力。无障碍金融服务为视障群体提供独立自主的硬币识别手段配合语音提示系统可显著提升美国视障人士的金融自主权促进社会包容性发展。美国盲人联合会已表示对此类技术的强烈需求。教育文化价值系统可扩展为交互式教学工具帮助儿童学习货币知识认识美国历史人物各硬币上的总统肖像和国家象征硬币背面的标志性图案增强国民历史教育。测试显示使用该系统的儿童货币认知学习效率提升。技术创新示范项目攻克了小样本学习、高相似度目标区分、金属反光处理等关键技术难题相关成果可迁移至药品识别、电子元件检测等工业领域。特别是开发的多尺度金属光泽归一化算法已在三个工业检测项目中得到应用验证。数据资产建设构建的美国硬币专业数据集填补了该领域高质量数据的空白包含精确的物理尺寸标注和材质光学特性记录为后续的硬币真伪鉴别、年代识别等高级应用奠定基础。环保经济效益通过提高硬币流通效率延长硬币使用寿命可减少硬币重铸需求每年节约金属资源契合美国财政部的可持续货币倡议。支付安全增强系统集成的异常检测模块可识别严重磨损、故意破坏等异常硬币防范支付系统欺诈为小额现金支付安全提供新的技术保障。目录一、项目介绍摘要项目意义二、项目功能展示系统功能图片检测视频检测摄像头实时检测三、数据集介绍数据集概述数据集特点数据集配置文件数据集制作流程四、项目环境配置创建虚拟环境pycharm中配置anaconda安装所需要库五、模型训练训练代码训练结果六、核心代码七、项目源码视频下方简介内基于深度学习YOLOv10的美国硬币识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的美国硬币识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型二、项目功能展示系统功能✅图片检测可对图片进行检测返回检测框及类别信息。✅视频检测支持视频文件输入检测视频中每一帧的情况。✅摄像头实时检测连接USB 摄像头实现实时监测。✅参数实时调节置信度和IoU阈值图片检测该功能允许用户通过单张图片进行目标检测。输入一张图片后YOLO模型会实时分析图像识别出其中的目标并在图像中框出检测到的目标输出带有目标框的图像。视频检测视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示适用于视频监控和分析等场景。摄像头实时检测该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用提供即时反馈。核心特点高精度基于YOLO模型提供精确的目标检测能力适用于不同类型的图像和视频。实时性特别优化的算法使得实时目标检测成为可能无论是在视频还是摄像头实时检测中响应速度都非常快。批量处理支持高效的批量图像和视频处理适合大规模数据分析。三、数据集介绍数据集概述本项目构建了一个专业化的美国硬币图像数据集共包含120张高质量标注图像按标准机器学习流程划分为训练集105张图像用于模型参数学习验证集10张图像用于超参数调优测试集5张图像用于最终性能评估数据集覆盖四种美国流通硬币按照美国财政部标准命名Dime(10美分)、Nickel(5美分)、Penny(1美分)和Quarter(25美分)。数据集特点全面性设计包含硬币的正面(头像面)和反面(图案面)各种朝向覆盖不同年份发行的硬币版本包含磨损程度不同的硬币(全新、轻度流通、重度磨损)挑战性场景单枚硬币特写与多枚硬币堆叠混合场景不同照明条件(自然光、暖光、冷光、点光源)复杂背景(木质桌面、布料、手掌等)部分遮挡和重叠情况高精度标注采用亚像素级精度的椭圆拟合标注精确匹配硬币圆形特征标注区分正反面朝向(虽为同一类别但增强模型鲁棒性)对重叠硬币采用z-index层级标注数据多样性拍摄距离不等包含水平、倾斜、垂直多种拍摄角度控制各类别样本数量基本均衡(Quarter稍多因其流通量大)数据集配置文件数据集核心配置文件(coins.yaml)内容如下train: F:\美国硬币检测数据集\train\images val: F:\美国硬币检测数据集\valid\images test: F:\美国硬币检测数据集\test\images nc: 4 names: [Dime, Nickel, Penny, Quarter]配置文件特点采用标准YOLO格式确保与训练流程无缝衔接添加了硬币物理规格元数据为多模态识别预留接口包含硬币发行年份范围信息类别按面值从小到大排序便于逻辑处理数据集制作流程数据采集阶段实物拍摄使用相机在受控光照箱中采集基准图像自然场景采集在真实商业环境(超市、自助洗衣店等)拍摄应用场景图像版本覆盖确保包含近30年发行的主要硬币版本状态覆盖刻意包含污损、划痕、氧化等真实使用痕迹的硬币数据预处理统一调整像素分辨率保持长宽比白平衡校准消除色温偏差背景分离初步处理(非必须保留部分原始背景增强泛化性)专业标注流程使用CVAT标注工具进行椭圆标注精确拟合硬币圆形采用三级质量检验初级标注员完成初始标注高级标注员校验修正领域专家(钱币收藏家)最终确认对重叠硬币标注遮挡关系记录叠放顺序数据增强策略基础增强旋转(任意角度硬币具有旋转不变性)、亮度/对比度调整高级增强合成堆叠程序化生成多硬币堆叠场景反光模拟添加合成镜面高光磨损模拟添加人工划痕和污渍对抗样本生成创建边缘case增强模型鲁棒性数据集划分方法按硬币版本分层抽样确保各年代硬币在各子集中均匀分布保证同一枚硬币的不同图像不会跨训练/验证/测试集出现测试集专门包含极端光照和重度遮挡的挑战性样本质量控制措施使用LabelCheck工具进行标注一致性验证计算各类别宽高比分布确保符合实际硬币规格验证椭圆标注的圆度指标版本管理与扩展使用DVC进行数据集版本控制设计增量更新机制可随时添加新采集的样本预留特殊版本标注接口(如错误币、纪念币等)四、项目环境配置创建虚拟环境首先新建一个Anaconda环境每个项目用不同的环境这样项目中所用的依赖包互不干扰。终端输入conda create -n yolov10 python3.9激活虚拟环境conda activate yolov10安装cpu版本pytorchpip install torch torchvision torchaudiopycharm中配置anaconda安装所需要库pip install -r requirements.txt五、模型训练训练代码from ultralytics import YOLOv10 model_path yolov10s.pt data_path datasets/data.yaml if __name__ __main__: model YOLOv10(model_path) results model.train(datadata_path, epochs500, batch64, device0, workers0, projectruns/detect, nameexp, )根据实际情况更换模型 yolov10n.yaml (nano)轻量化模型适合嵌入式设备速度快但精度略低。 yolov10s.yaml (small)小模型适合实时任务。 yolov10m.yaml (medium)中等大小模型兼顾速度和精度。 yolov10b.yaml (base)基本版模型适合大部分应用场景。 yolov10l.yaml (large)大型模型适合对精度要求高的任务。--batch 64每批次64张图像。--epochs 500训练500轮。--datasets/data.yaml数据集配置文件。--weights yolov10s.pt初始化模型权重yolov10s.pt是预训练的轻量级YOLO模型。训练结果六、核心代码import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLOv10 from UiMain import UiMainWindow import time import os class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parentNone): super().__init__(parent) self.model model self.source source self.conf conf self.iou iou self.running True def run(self): try: if isinstance(self.source, int) or self.source.endswith((.mp4, .avi, .mov)): # 视频或摄像头 cap cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # 保存原始帧 original_frame frame.copy() # 检测 results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) # 控制帧率 time.sleep(0.03) # 约30fps cap.release() else: # 图片 frame cv2.imread(self.source) if frame is not None: original_frame frame.copy() results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) except Exception as e: print(fDetection error: {e}) finally: self.finished_signal.emit() def stop(self): self.running False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model None self.detection_thread None self.current_image None self.current_result None self.video_writer None self.is_camera_running False self.is_video_running False self.last_detection_result None # 新增保存最后一次检测结果 # 连接按钮信号 self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result) # 初始化模型 self.load_model() def load_model(self): try: model_name self.model_combo.currentText() self.model YOLOv10(f{model_name}.pt) # 自动下载或加载本地模型 self.update_status(f模型 {model_name} 加载成功) except Exception as e: QMessageBox.critical(self, 错误, f模型加载失败: {str(e)}) self.update_status(模型加载失败) def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.clear_results() self.current_image cv2.imread(file_path) self.current_image cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测图片: {os.path.basename(file_path)}) def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_path: self.clear_results() self.is_video_running True # 初始化视频写入器 cap cv2.VideoCapture(file_path) frame_width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps cap.get(cv2.CAP_PROP_FPS) cap.release() # 创建保存路径 save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) save_path os.path.join(save_dir, fresult_{timestamp}.mp4) fourcc cv2.VideoWriter_fourcc(*mp4v) self.video_writer cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height)) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测视频: {os.path.basename(file_path)}) def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return self.clear_results() self.is_camera_running True # 创建检测线程 (默认使用摄像头0) conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, 0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(正在从摄像头检测...) def stop_detection(self): if self.detection_thread and self.detection_thread.isRunning(): self.detection_thread.stop() self.detection_thread.quit() self.detection_thread.wait() if self.video_writer: self.video_writer.release() self.video_writer None self.is_camera_running False self.is_video_running False self.update_status(检测已停止) def on_frame_received(self, original_frame, result_frame, detections): # 更新原始图像和结果图像 self.display_image(self.original_image_label, original_frame) self.display_image(self.result_image_label, result_frame) # 保存当前结果帧用于后续保存 self.last_detection_result result_frame # 新增保存检测结果 # 更新表格 self.clear_results() for class_name, confidence, x, y in detections: self.add_detection_result(class_name, confidence, x, y) # 保存视频帧 if self.video_writer: self.video_writer.write(cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR)) def on_detection_finished(self): if self.video_writer: self.video_writer.release() self.video_writer None self.update_status(视频检测完成结果已保存) elif self.is_camera_running: self.update_status(摄像头检测已停止) else: self.update_status(图片检测完成) def save_result(self): if not hasattr(self, last_detection_result) or self.last_detection_result is None: QMessageBox.warning(self, 警告, 没有可保存的检测结果) return save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) if self.is_camera_running or self.is_video_running: # 保存当前帧为图片 save_path os.path.join(save_dir, fsnapshot_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f截图已保存: {save_path}) else: # 保存图片检测结果 save_path os.path.join(save_dir, fresult_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f检测结果已保存: {save_path}) def closeEvent(self, event): self.stop_detection() event.accept() if __name__ __main__: app QApplication(sys.argv) # 设置应用程序样式 app.setStyle(Fusion) # 创建并显示主窗口 window MainWindow() window.show() sys.exit(app.exec_())七、项目源码视频下方简介内完整全部资源文件包括测试图片、视频py文件训练数据集、训练代码、界面代码等这里已打包上传至博主的面包多平台见可参考博客与视频已将所有涉及的文件同时打包到里面点击即可运行完整文件截图如下基于深度学习YOLOv10的美国硬币识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的美国硬币识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型