无需手动标注,如何为扑克牌畸变图像批量关联文件名标签?可换模型
解决方案
一、先统一文件名规则
先把所有图像的文件名规整好,比如用 Ace_001.jpg、Queen_spades_078.jpg 这种格式,确保牌的标签(比如Ace、Queen)是文件名里能直接提取的固定部分,用下划线或其他分隔符和序号、后缀区分开。
二、分类模型场景(最适合你的单牌无背景情况)
因为每张图里只有一张扑克牌,直接做图像分类比目标检测更高效,完全没必要画检测框:
- 写个简单脚本遍历所有图像,从文件名里抠出标签(比如用
filename.split('_')[0]就能拿到第一个下划线前的标签) - 建个标签和类别ID的映射表,比如
label_map = {'Ace':0, 'King':1, 'Queen':2, ...},根据你是要区分52张不同的牌还是13种牌面来补全 - 生成分类数据集的索引文件(比如CSV),每行存
图像路径,标签ID,后续直接用框架加载:import os import csv # 按需补全所有标签的ID映射 label_map = {'Ace':0, 'King':1, 'Queen':2, 'Jack':3, ...} image_dir = '你的图像文件夹路径' output_csv = 'dataset.csv' with open(output_csv, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['image_path', 'label_id']) for img_name in os.listdir(image_dir): if img_name.endswith(('.jpg', '.png')): # 从文件名提取标签 label = img_name.split('_')[0] label_id = label_map[label] img_path = os.path.join(image_dir, img_name) writer.writerow([img_path, label_id]) - 也可以直接把图像按标签分到不同文件夹里,用PyTorch的
ImageFolder直接加载,省得写索引文件——脚本逻辑就是遍历文件时,根据标签创建对应文件夹,把图片移进去就行。
三、目标检测场景(如果后续要扩展多牌检测)
如果一定要做目标检测(比如以后要识别多张牌的场景),生成YOLO系列需要的txt标注也很简单:
- 每张图对应一个同名txt文件,内容是
类别ID x_center y_center width height,因为图像里只有扑克牌,所以检测框就是整个图像,归一化后就是类别ID 0.5 0.5 1.0 1.0 - 脚本示例:
import os label_map = {'Ace':0, 'King':1, ...} # 对应你的类别ID image_dir = '你的图像文件夹路径' label_dir = 'labels' # 新建个文件夹存标注文件 os.makedirs(label_dir, exist_ok=True) for img_name in os.listdir(image_dir): if img_name.endswith(('.jpg', '.png')): # 提取标签 label = img_name.split('_')[0] label_id = label_map[label] # 生成标注内容 txt_content = f"{label_id} 0.5 0.5 1.0 1.0" # 保存标注文件 txt_name = os.path.splitext(img_name)[0] + '.txt' txt_path = os.path.join(label_dir, txt_name) with open(txt_path, 'w') as f: f.write(txt_content) - 之后按YOLO的要求写个
data.yaml,指定训练/验证集路径、类别数量、类别名称列表就能直接训练了。
四、模型选择建议
- 分类任务:优先用轻量模型,比如MobileNetV2、EfficientNet-B0,训练快,精度足够应付扑克牌识别;追求精度的话可以用ResNet18/34。
- 检测任务:单牌检测用YOLOv5n或者YOLOv8n就行,nano版速度极快,完全能满足需求,没必要用大模型。
内容的提问来源于stack exchange,提问作者Bigred
相关产品推荐
相关产品推荐

