新闻详情

新闻详情

首页 / 资讯中心 / 详情

扑克牌识别数据集与YOLO v11实战:从1850张图到98.7%识别率

发布时间:2026/10/1 13:27:10来源:尧图网络
扑克牌识别数据集与YOLO v11实战:从1850张图到98.7%识别率
简介这份扑克牌识别数据集面向计算机视觉学习者、目标检测开发者及棋牌类应用研发人员用于训练可识别A至K全部牌面字母的检测模型解决扑克牌牌面分类与定位的样本获取问题。资源包共2000个文件包含1850个txt标注文件、149张jpg原始图像和1个yaml配置文件压缩包约109.76MBtxt为YOLO v11格式的边界框与类别标注jpg为实拍牌面原图yaml用于定义数据集路径与类别名称可直接接入训练流程。目前已有241人学习下载。数据集覆盖A到K各牌面字母官方给出正确识别率可达98.7%样本包含多角度、多光照条件下的实拍图像适合直接用于模型微调、数据增强实验与识别效果验证也可作为目标检测课程设计或毕业项目的训练素材帮助读者省去从零采集与标注的时间成本。1. 扑克牌识别数据集1850 张原始图如何撑起 98.7% 的识别率做牌桌视觉项目的人绕不开一个尴尬通用目标检测模型能认出「人」「车」「杯子」却认不出「红桃 Q」和「黑桃 Q」的区别。扑克牌识别数据集就是为这个场景准备的——1850 张原始图覆盖 A 到 K 全部 13 个点数、4 种花色用 yolo v11 格式标注官方给出的正确识别率可达 98.7%。这个数字不是随便写的它背后是「点数 花色」双维度分类的工程取舍。这套数据适合三类人做棋牌辅助工具、做直播牌局分析、做机器人发牌校验的工程师。如果你只是想跑个 demo随便找几十张图微调也能出效果但一旦要上真实牌桌光照变化、牌面反光、遮挡叠牌会立刻让识别率掉到 70% 以下。1850 张的规模不算大但胜在覆盖了不同角度和背景配合 yolo v11 的标注格式能直接进训练管线。数据标注这件事很多人以为标完就完事实际上标注质量决定了模型上限——牌角字母标偏 2 个像素训练出来的框就会飘。2. yolo v11 标注格式拆解从 txt 文件到可训练张量2.1 扑克牌数据集的目录结构与类别映射拿到数据集先别急着训练第一步是确认目录结构是否符合 yolo v11 的约定。常见做法是 images 和 labels 平行存放train/val 各自独立。扑克牌识别数据集通常会把 52 张牌去掉大小王映射成 52 个类别或者更聪明的做法13 个点数类别 4 个花色类别用两个头分别预测。前者简单但类别不平衡后者需要改模型结构。我一般会先跑一段脚本统计每个类别的样本数看看有没有哪张牌被漏标。下面这段代码用来检查 images 和 labels 是否一一对应以及每个类别的框数量import os from collections import Counter img_dir dataset/images/train lbl_dir dataset/labels/train img_files {os.path.splitext(f)[0] for f in os.listdir(img_dir)} lbl_files {os.path.splitext(f)[0] for f in os.listdir(lbl_dir)} # 检查缺失 missing_lbl img_files - lbl_files missing_img lbl_files - img_files print(f缺少标注的图片: {len(missing_lbl)}) print(f缺少图片的标注: {len(missing_img)}) # 统计类别分布 counter Counter() for f in os.listdir(lbl_dir): with open(os.path.join(lbl_dir, f)) as fp: for line in fp: cls int(line.split()[0]) counter[cls] 1 for cls_id in sorted(counter): print(f类别 {cls_id}: {counter[cls_id]} 个框)逻辑说明先做集合差集找出配对异常再逐文件读第一列类别 ID。参数上cls是整数对应 data.yaml 里的 names 列表索引。如果发现某个类别只有个位数框说明这类牌在 1850 张里出现太少训练时会被其他类压制。解决办法要么补图要么在 loss 里加类别权重。2.2 data.yaml 的五个必填字段与路径陷阱yolo v11 训练入口认的是 data.yaml里面五个字段一个都不能少path、train、val、nc、names。很多人翻车在 path 上——写相对路径时Ultralytics 会以当前工作目录为基准而不是 yaml 文件所在目录。我习惯写绝对路径省得后面排查半天。path: /home/user/poker_dataset train: images/train val: images/val nc: 52 names: 0: AS 1: 2S 2: 3S # ... 省略中间 51: KD参数说明nc是类别数扑克牌如果按 52 张全分类就是 52如果拆成点数花色两个任务这里写 13 或 4但需要改模型头。names的顺序必须和标注文件里的类别 ID 严格对应错一位整个训练就废了。建议把 names 写成「点数花色首字母」的格式比如 AS 代表黑桃 AKD 代表方块 K方便肉眼核对。2.3 用 labelimg 或 CVAT 补标时的坐标归一化1850 张原始图不可能覆盖所有场景实际落地时总要补标。数据标注工具里labelimg 适合小批量快速标CVAT 适合多人协作。不管用哪个导出时都要选 yolo 格式因为 yolo v11 吃的是归一化后的中心点坐标和宽高。补标时最容易犯的错是框贴太紧。牌角字母「A」的框如果只包住字母本身模型学到的特征就是「一个小白块」换个字体就认不出。我一般会把框放大到包含字母周围 2-3 像素的背景让模型看到字母和牌面底色的对比关系。下面这段代码用来把 labelimg 导出的 xml 转成 yolo txt顺便做坐标归一化import xml.etree.ElementTree as ET from PIL import Image def xml_to_yolo(xml_path, img_path, class_map): tree ET.parse(xml_path) root tree.getroot() img Image.open(img_path) w, h img.size lines [] for obj in root.findall(object): cls_name obj.find(name).text cls_id class_map[cls_name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化中心点与宽高 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) return lines逻辑说明class_map是类别名到 ID 的字典必须和 data.yaml 的 names 一致。归一化用 6 位小数足够yolo v11 内部会再处理。注意cx和cy是中心点不是左上角这是新手最容易搞反的地方。3. 从 1850 张到 98.7%训练参数与数据增强的实操配置3.1 yolo v11 训练命令与 batch size 的显存换算数据集准备好之后训练本身反而简单。yolo v11 的 CLI 一行就能跑但参数怎么设决定了你能不能复现 98.7%。我一般先用小模型探路确认管线通了再换大模型。yolo detect train \ data/home/user/poker_dataset/data.yaml \ modelyolo11n.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ patience30 \ device0 \ projectpoker_run \ nameexp1参数说明imgsz640是牌面字母识别的底线再小字母就糊了batch16在 8G 显存上刚好12G 可以上 32lr00.01是 SGD 的初始学习率如果用 AdamW 要降到 0.001patience30表示 30 轮没提升就早停防止过拟合。1850 张图跑 200 轮大约 2-3 小时单卡 3060如果 loss 在 50 轮后还在震荡先检查标注有没有框错。3.2 针对牌面反光的三种数据增强策略原始图里的牌面反光是识别率杀手。yolo v11 默认开了 mosaic 和 HSV 增强但扑克牌场景需要额外注意两点一是色调抖动不能太大否则红桃和方块会混二是随机裁剪要控制比例别把牌角字母裁掉。我一般会在 data.yaml 同级加一个 aug.yaml覆盖默认增强hsv_h: 0.01 # 色调抖动降到 0.01防止花色混淆 hsv_s: 0.5 # 饱和度可以大一点适应不同灯光 hsv_v: 0.4 # 亮度抖动模拟阴影 degrees: 10.0 # 旋转角度牌不会倒着放10 度够用 translate: 0.1 scale: 0.3 shear: 2.0 perspective: 0.0 # 透视变换关掉牌面是平的 flipud: 0.0 # 上下翻转没意义牌不会倒 fliplr: 0.5 # 左右翻转可以但要注意花色对称性 mosaic: 1.0 mixup: 0.1逻辑说明hsv_h调小是关键红桃和方块在色调上只差一点抖动大了模型就分不清。flipud0是因为扑克牌上下翻转后点数位置变了属于错误增强。mosaic1.0保留它能模拟多张牌叠在一起的情况对遮挡场景有帮助。3.3 验证集上的 mAP 与混淆矩阵怎么看训练完别只看一个 98.7%要拆开看每个类别的 AP。yolo v11 跑完会在 runs 目录下生成混淆矩阵和 PR 曲线。我习惯先看混淆矩阵的对角线如果某个点数比如 6 和 9互相混淆说明模型没学到旋转不变性需要补旋转样本。yolo detect val \ modelruns/detect/poker_run/exp1/weights/best.pt \ data/home/user/poker_dataset/data.yaml \ imgsz640 \ conf0.25 \ iou0.5参数说明conf0.25是置信度阈值低于这个值的框不算iou0.5是 NMS 的 IoU 阈值。如果验证集 mAP 比训练集低超过 5 个点大概率是过拟合回去加增强或减层数。98.7% 这个数字通常是在特定测试集上跑的换一批新图可能会掉所以一定要自己留 10% 的图不参与训练专门做最终验证。4. 避坑与排查扑克牌识别训练中最容易翻车的 5 个点4.1 现象训练 loss 正常但验证 mAP 为 0原因data.yaml 里的val路径写错或者验证集图片和标注没对上。yolo v11 在找不到验证集时不会报错而是静默跳过验证导致 mAP 一直是 0。解决跑训练前先用第 2.1 节的脚本检查 val 目录的配对情况。另外确认val字段是相对于path的路径不是绝对路径。4.2 现象模型把红桃认成方块黑桃认成梅花原因HSV 增强的hsv_h太大红桃和方块在色调上被抖到同一个区间。另外如果标注时花色区域框得太小模型只能看到红色/黑色分不清形状。解决把hsv_h降到 0.01 以下同时在标注时确保花色符号完整入框。如果已经训完可以用混淆矩阵定位是哪两个类在混针对性补 50-100 张该类别的图重新微调。4.3 现象叠牌场景下漏检严重原因原始图里叠牌样本太少mosaic 增强虽然能拼图但拼出来的叠牌边缘不自然模型学不到真实的遮挡关系。解决手动补 100-200 张叠牌图标注时只标可见部分被遮住的牌不标。训练时把mosaic降到 0.5让模型多看真实叠牌。另外overlap_mask参数在 detect 任务里没用别乱开。4.4 现象训练到 100 轮后 loss 突然飙升原因学习率没衰减或者 batch 里有脏数据标注框超出图片边界。yolo v11 默认用余弦退火但如果lr0设太大后期会震荡。解决检查标注文件里有没有坐标大于 1 或小于 0 的行用脚本过滤掉。然后把lr0降到 0.005lrf设为 0.01让学习率平滑降到初始值的 1%。4.5 现象换一批新牌后识别率暴跌原因训练集的牌面样式太单一模型学到了「背景颜色」而不是「字母形状」。1850 张原始图如果都来自同一副牌换个品牌就翻车。解决训练时强制hsv_v抖动到 0.5模拟不同亮度的牌面。另外在验证集里放至少 20% 的不同品牌牌图如果 mAP 掉超过 10 个点说明泛化不够需要补数据。5. 把 98.7% 搬到真实牌桌一个验证技巧和我的习惯数据集给的 98.7% 是在理想条件下测的真实牌桌有三大变量光照不均、牌面磨损、摄像头角度。我一般会做一个「压力测试集」用手机在台灯下拍 200 张不同角度的牌不参与训练只做最终验证。如果这个集上能到 90% 以上才考虑上线。具体做法是用 yolo v11 的 predict 模式批量跑然后写脚本统计每个类别的召回率from ultralytics import YOLO import os model YOLO(runs/detect/poker_run/exp1/weights/best.pt) test_dir stress_test/images results model.predict(sourcetest_dir, conf0.3, save_txtTrue) # 统计每个类别的检出数量 from collections import Counter det_counter Counter() for r in results: for box in r.boxes: cls int(box.cls) det_counter[cls] 1 print(压力测试集检出分布) for cls_id in sorted(det_counter): print(f类别 {cls_id}: {det_counter[cls_id]} 次)逻辑说明conf0.3比训练时的 0.25 稍高减少误检。save_txtTrue会把预测结果存成 yolo 格式方便和人工标注对比。如果某个类别检出次数远低于预期说明该类在真实场景下漏检严重需要针对性补图。我的习惯是每次换牌或换场地先跑 50 张压力测试图看混淆矩阵里有没有新的混淆对。如果有别急着重新训练先手动标 30 张错例加进去用yolo detect train的resume参数接着训 20 轮通常就能拉回来。扑克牌识别这个方向数据质量比模型大小重要得多1850 张标得准比 5000 张标得糙要强。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Kali Linux中文输入法配置指南:IBus-Pinyin实战调优 2026/10/1 14:09:33

Kali Linux中文输入法配置指南:IBus-Pinyin实战调优

1. 为什么Kali默认不带中文输入法?这不是疏忽,而是设计选择刚装好Kali Linux图形界面的那一刻,你点开终端敲下gedit或firefox,想输入“渗透测试”四个字——光标在那儿一动不动,键盘敲出来的全是英文字母。你下意识去右…

阅读更多 →
Anthropic Claude API实战:从Nice Play到稳定交付的交互设计 2026/10/1 14:09:33

Anthropic Claude API实战:从Nice Play到稳定交付的交互设计

1. 从“Nice Play”说起:一个被低估的交互设计信号 第一次看到“Nice Play Anthropic”这个组合,我脑子里蹦出来的不是某个具体产品,而是一种交互反馈的节奏感。Anthropic这家公司做的东西,圈内人都知道,核心产品是Cla…

阅读更多 →
TensorFlow生产部署核心指南:SavedModel、安装避坑与2024工业落地实践 2026/10/1 14:09:33

TensorFlow生产部署核心指南:SavedModel、安装避坑与2024工业落地实践

1. 这不是“又一个深度学习框架”:TensorFlow 的真实定位与误用重灾区 很多人第一次听说 TensorFlow,是在某篇“2024年最值得学的AI工具”榜单里,和 PyTorch 并列排在前两位;也有人是在安装时被 pip install tensorflow 卡在凌…

阅读更多 →
2024年TensorFlow实战:环境配置避坑与最小项目快速搭建 2026/10/1 14:09:33

2024年TensorFlow实战:环境配置避坑与最小项目快速搭建

2024 年,如果你还在纠结要不要学 TensorFlow,或者已经在 PyTorch 的声浪里犹豫不决,我想以这些年实际做项目的经验先给你交个底:TensorFlow 依然是工程化落地里最靠谱的选择之一。这篇文章不打算做任何新框架的推销,而…

阅读更多 →
DeepSeek Harness桌面版实操:从环境配置到工作流编排的完整指南 2026/10/1 14:09:33

DeepSeek Harness桌面版实操:从环境配置到工作流编排的完整指南

1. 从命令行到图形界面:DeepSeek Harness 到底改变了什么 做本地部署的朋友应该都有同感:DeepSeek 模型本身的推理能力已经很强了,但真正让人头疼的从来不是模型,而是模型之外那一整套编排和调度的工作。命令行下敲指令、写脚本、…

阅读更多 →
手术器械语义分割实战:1200张标注数据从基线到半监督优化 2026/10/1 14:09:27

手术器械语义分割实战:1200张标注数据从基线到半监督优化

简介:本资源为面向医学图像分割方向的学习者与研究人员整理的手术器械语义分割数据集,适用于深度学习分割模型的训练、验证与算法对比实验,尤其适合正在实践U-Net、SwinUnet、TransUnet等网络改进的读者。数据集已按训练集与验证集划分完毕&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉