当前位置 博文首页 > Yunlord的博客:杀鸡用牛刀!通过YOLOv5识别斗地主牌型,做一个A
目录
前言
一、YOLOv5环境配置
二、制作自己的扑克牌数据
1.采集扑克牌数据
2.通过labelimg进行数据标注
3. 划分训练集和验证集
三、训练扑克牌数据集
1.修改数据和模型配置文件
1.1 修改数据配置文件
1.2 修改模型配置文件
2.使用yolov5s.pt预训练模型进行训练
四、使用训练好的预训练模型进行测试
五、下一步工作
最近在CSDN上看到一个很火的开源项目《斗地主老是输?一起用Python做个AI出牌器,欢乐豆蹭蹭涨!》,作者Dragon少年也分享了源代码,确实很好用,但是在扑克牌牌型识别的时候由于使用的是特定模板匹配,所以只适用于某游戏大厅的欢乐斗地主,而无法识别某手游助手的欢乐斗地主。
某游戏大厅欢乐斗地主:可以识别牌型?
?某手游助手欢乐斗地主:无法识别牌型
可以看到两者之间扑克牌牌型确实存在差异,所以通过特定模板匹配肯定无法识别出来。于是考虑通过神经网络进行扑克牌型识别,从而可以针对不同平台的斗地主进行扑克牌牌型识别,通用性更强。
由于该过程分为两个过程,一是定位到扑克牌数字或者字母位置,二是对相应位置上的图像进行牌型分类。经过一系列比较与试验,最终选择了YOLOv5进行扑克牌目标检测与识别。
本教程所用环境:代码版本V3.0,源码下载地址:https://github.com/ultralytics/yolov5.git
通过git clone https://github.com/ultralytics/yolov5.git,将YOLOv5源码下载到本地,然后配置虚拟环境:conda create -n yolov5 python==3.7,在YOLOv5中尽量使用python3.7。创建好虚拟环境,并通过pip install -r requirements.txt安装依赖包。
项目的测试平台为:
操作系统:windows10
IDE:Spyder
python版本:anaconda Pyhon3.7
pytorch版本:torch 1.9.1
cuda版本:10.1
显卡:RTX 2080 Ti
分为三类数据:手牌、底牌、出牌。
由于牌型特征明显,所以仅需要针对每一类采集少量数据进行标注,就能取得较好效果,采集结果如下图所示:
由于第一次安装labelimg时,其中安装的pyqt5库与Spyder发生冲突,导致无法打开Spyder界面,折腾了很久才弄好。
所以建议新建一个虚拟环境,避免发生冲突。
(1)在Anaconda Prompt建立建立一个安装labelImg的python虚拟环境;
conda create -n LabelIMG python==3.7
(2)然后激活该环境?
activate LabelIMG
(3)打开标注工具LabelImg
我们要标定数据的时候,一般是已经制定好了要标注物体的类别,这样在打开LabelImg之后,我们只要框定目标之后,选择要对应的标签即可。
labelimg cards predefined_classes.txt
其中cards为存放采集数据的文件夹,predefined_classes.txt为存放标注物体的类别的文本文件。
具体labelimg使用可以参考目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程。
PS:注意直接选择存储为YOLO格式,即标注数据最终保存为txt格式。
数据集标注好之后,存放如下目录格式:
pokercard
├── images
│ ? ├── train ? ? ? ?# 训练集图片,这里我只列举几张示例
│ ? │ ? ├── 1.png
│ ? │ ? ├── 2.png
│ ? │ ? └── 3.png
│ ? └── val ? ? ? ? ?# 验证集图片
│ ? ? ? ├── t1.png
│ ? ? ? ├── t2.png
│ ? ? ? └── t3.png
└── labels ? ? ? ? ? ? ??
? ? ├── train ? ? ? ?# 训练集的标签文件
? ? │ ? ├── 1.txt
? ? │ ? ├── 2.txt
? ? │ ? └── 3.txt
? ? └── val2 ? ? ? ? # 验证集的标签文件
? ? ? ? ├── t1.txt
? ? ? ? ├── t2.txt
? ? ? ? └── t3.txt
?
原先的配置文件为:./yolov5/data/coco128.yaml。
我们把将文件复制一份,重命名为pokercard.yaml。
然后在pokercard.yaml中需要修改3处内容:
(1)训练集和验证集图片的路径
train: ../pokercard/images/train?
val: ../pokercard/images/val??
(2)修改类别数nc
nc: 15 # number of classes
(3)修改类别列表,把类别修改为自己的类别
names: [ 'A','2','3', '4', '5','6', '7','8', '9', '10','J','Q','K','xjk','djk'] # class names
修改后的pokercard.yaml完整配置内容如下:
# YOLOv5 🚀 by Ultralytics https://ultralytics.com, licensed under GNU GPL v3.0
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017)
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
# └── coco128 ← downloads here
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# path: ../datasets/coco128 # dataset root dir
# path:
train: ../pokercard/images/train # train images (relative to 'path') 128 images
val: ../pokercard/images/val # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
nc: 15 # number of classes
names: [ 'A','2','3', '4', '5','6', '7','8', '9', '10','J','Q','K','xjk','djk'] # class names
# Download script/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
修改模型配置文件,这里我使用的是yolov5\models\yolov5s.yaml。
因此,在yolov5s.yaml中只需要修改一处,把nc修改为自己的类别数即可。
nc : 15
训练命令:
python train.py --img 640 --batch 8 --epochs 500 --data data/pokercard.yaml --cfg ./models/yolov5s.yaml --weights ./weights/yolov5s.pt
?训练结果:
训练结束后,会生成两个预训练的模型:
best.pt
:保存的是中间一共比较好模型last.pt
:训练结束后保存的最后模型推理目录下图片集命令,将检测中有些图片置信度比较低的通过--conf-thres以及--iou-thres
参数过滤掉:
python detect.py --source data/images --weights best.pt --conf-thres 0.5 --iou-thres 0.5
测试结果如下所示:?
?
可以看到不管是手牌、底牌还是出牌的牌型都识别出来了,而且不管是哪个平台的欢乐斗地主都可以。
完美!!!
接下来就是如何在AI记牌器中融入YOLOv5牌型检测与识别模型,从而再也不用担心记牌、算牌,去赢取大量欢乐豆了!!!从此走上豆豆巅峰!!!
今天我们就到这里,明天继续努力!未完待续!
感谢H师姐的鼎力相助!!!
如果该文章对您有所帮助,麻烦点赞,关注,收藏三连支持下!
创作不易,白嫖不好,各位的支持和认可,是我创作的最大动力!
如果本篇博客有任何错误,请批评指教,不胜感激 !!!
参考:
斗地主老是输?一起用Python做个AI出牌器,欢乐豆蹭蹭涨!
YOLOv5训练自己的数据集(超详细完整版)
目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程
YOLOv5的详细使用教程,以及使用yolov5训练自己的数据集
cs