2708浏览
查看: 2708|回复: 11

[项目分享] 深度学习目标检测之井字棋

[复制链接]
【项目背景故事】
  先看一下视频感受一下整体情况:
井子棋(tic-tac-toe)又称“过三关”,是一款历史悠久、流传广泛的益智游戏。棋盘是一个3*3=9的九宫格,棋子只有X和O两种,轮流下棋,直到某一方棋子在棋盘的纵横或斜线形成三子连线,即告获胜。如果双方轮流走子,直至棋盘摆满(9子)则宣告和棋。
由于井子棋简单、流传广泛,所以在棋类的AI(人工智能)学习中,井子棋成为比较常见的研究对象,有很多算法和攻略对其进行深入研究,被称为“已经解决”的棋类游戏。此类书籍也非常多。
Snipaste_2021-04-07.png
Tic Tac Toe is a “solved” game, meaning that there aremathematically proven strategies which will give you the best results for eachgame.
井字棋是一款"已解决"的游戏,这意味着经过数学验证的策略,将为您提供每局比赛的最佳解。
本文研究的重点并不在于下棋算法,而是使用K210作为深度学习平台,通过模型训练,运用K210对井子棋的两类棋子(X,O)进行目标检测,返回棋子的类别以及在棋盘上的坐标。并且描绘成棋盘列表,将当前棋盘的棋子类别以及位置编制成json数据格式的字符串,通过串口(uart)传送给m5stack basic,后者是一个非常优秀成熟的基于esp32的开发平台,带有屏幕、按键并且适配了完整的软件库。
M5stack basic接收到了来自K210的数据后,会有两种玩法:
一是“双人对战裁判”。将收到的棋盘数据进行json解析。在屏幕上对两类棋子以及其位置进行展示,实时显示对弈战况,并且判定两位玩家的胜负以及是否平局。即充当了“AI裁判”。
二是“简单的人机对弈”。如前文所述,井子棋被称为“已经解决”的棋类游戏,也就是说,其算法已经被充分认知和破解,如使用minmax算法后,后手棋玩家将没有机会获胜,最好的结果也是平局。这样的对弈技术含量颇高,但是兴味不足。为了增加乐趣,我们引入了一个非常简单的算法,实现了简单的人机对弈。即;esp32主控会对当前棋盘进行分析,对当前剩余的所有空位编列成列表,然后从该列表中随机推荐下一步的步骤,这样以来,玩家在和机器对弈中,对方的下一步实际上是随机状态,玩家就有很大机会获胜。这样就增加了乐趣。后续我们可以通过对算法难度的调节,来丰富对弈的难度和乐趣。
【目标检测简要回顾】
本文使用的是k210的yolo2,yolo核心就是you only look once,它是通过一张图片直接得到目标的位置坐标和目标所属类别。一次操作最多可以可以预测几百个目标,检测时间不会随着目标的数量增长。其他的知识和k210的背景可以参考我其他文章或者网上资料。
【主要知识点以及难度评估】
本项目属于一个趣味4星★★★★☆,难度3星★★★☆☆的小项目,适合初学者尤其是对深度学习感兴趣的玩家入门级练手。主要知识点:
K210Sipeed Bit)侧
一是k210目标检测模型训练的;二是目标检测以及矩形遮罩绘制,AI工作区的概念;三是micropythonuart+json通信、解析;
M5STACK basic侧:
一是uart+json通信、解析;二是剩余空位形成列表并且产生随机值;三是json解析后的变量转换为string
硬件方面需要动手的地方不多,本次仍然是利用了一个吃灰的全新充电宝外壳,将K210进行包装,引出与m5stack basic通信的串口线即可。
【硬件准备】

编号
内容
型号
备注
1
K210深度学习平台
Sipeed Bit
套件,带有摄像头并且引出所有GPIO,深圳矽速科技
2
ESP32人机信息处理以及交互
M5stack Basic
套件,带有屏幕、按键,深圳明栈科技
3
外壳
/
吃灰的充电宝外壳,全新,塑料材质,需要进行开孔、打磨等简单DIY加工
4
俯拍支架

用于网络直播的俯拍支架,用于放置sipeed  bitK210)视觉识别摄像头
5
井子棋附件

棋盘(手绘)、棋子(塑胶、网购)、飞线等
硬件.jpg 线材.jpg

【软件准备】

编号
内容
型号
备注
1
K210深度学习软件
Sipeed Bit
IDE V0.2.5
2
M5STACK UIFOLW
1.7.4
UI以及流程设计,ESP32固件1.7.4
3
VScode+pymakr

MSvscode IDE以及用于micropython调试的pymakr插件
4
Thonny ide
3.3.6
对新手非常友好的python ide,本文部分调试工作也用此IDE进行
5
labelImg
1.8.1 for win
目标检测的模型标记软件
ui.png
【制作步骤】
1、硬件连线
  
  

K210侧(sipeed bit)
Esp32侧(m5stack basic)
1
UART-TX
9
Rx(16)
2
UART-RX
10
Tx(17)
3
GND
8*
Gnd
由于连线非常少,所以不再单独制作PCB,用一个小型的面包板把sipeed bit与其屏幕装在一起,制作飞线并且用热缩处理,与m5stack basic进行连接。
IMG_20210401_231756_副本.jpg
2、硬件外壳制作
第一步:将外壳上多余的紧固件拆除
工具:电磨。
外壳.jpg
第二步:开孔
面板上对摄像头位置进行标记、开孔;在底板上对屏幕位置进行标记开孔。
外壳2.jpg 外壳1.jpg
装配好的sipeed bit视觉识别摄像头,放置在俯拍支架上后,是这样的:
装置俯拍.jpg
3、模型训练
模型训练是按照sipeed 的目标检测说明来进行训练的(https://www.maixhub.com/ModelTrainingHelp_zh.html),我在写《深度学习之微信跳一跳》https://www.arduino.cn/thread-94433-1-1.html时,已经进行了详细介绍,玩家可以根据训练文档进行训练。有几个需要注意的问题,我在本文中简要串联一下。
步骤编号
步骤
备注
1
安装labelImg软件
Win下使用安装版一步到位,不需要再配置环境、安装依赖程序
2  
拍摄X/O两类棋子素材
100张以上素材,照片尺寸224x224,我用了约200张每个类别,尽量在不同光线、棋盘的位置对其拍摄。我编写了一个自动拍摄小程序,用于连续拍摄素材
3
X/O棋子进行标记
使用labelImg软件进行标记,形成xml标记文件
4  
标记文件与图像文件按照要求进行整理归档后,打包上传
sipeed官方文档中,介绍labelImg标记的素材可以分两层目录,但我实际使用中用一层目录,实测可用,目录结构见附图
5
获取sipeed bit的机器码
记下来
6
将打包的素材上传至训练网站,训练成功后,将收到反馈回来的模型、boot.py示例代码
https://www.maixhub.com/ModelTraining

dataset.png
注:所有图片放置在images目录下,如棋子O的照片从0~190.jpg,棋子X的照片x0~x190.jpg,所有标记后的xml文件也都放在xml目录下,棋子Oxml文件从0~190.xml,棋子Xxml文件x0~x190.xml。强烈建议,在上传之前,打开labelImg程序,再次验证一下,所有的标记框和xml是否对应(目标被方框所完整包裹,即为正确标记)。
Snipaste_2021-04-06_23-16-54_副本.png Snipaste_2021-04-06_23-17-36_副本.png
4、软件编写
(1)k210侧软件框图以及代码
有两个好玩的点可以和玩家分享一下:
第一个点是矩形遮罩,我在进行目标检测调试时,发现目前k210的yolo2识别单个目标非常准确,无论是类别还是坐标都很准确,但是在多个目标同时进入画面时,尤其是距离较近时,会发生相互干扰,造成误识别或者漏识别,从而影响棋类玩家的用户体验。
目前我的解决办法是,将九宫格的棋盘分成了9个矩形遮罩,每当识别出来一个目标,就将这个位置对应的区块用一个矩形遮罩进行遮挡,即:在图片上绘制一个与期盼底色相近的白色矩形遮罩,然后将绘制了矩形遮罩的图片传入AI工作区(pix_to_AI函数),AI在工作的时候,并不知道它所识别的对象有一个人为绘制的遮罩,在其工作区里,只会看到下一个需要识别的棋子,这样识别率会非常高。这个方法并不是上策,只是对目前软硬件状况的一种折衷做法,期待在后续深度学习产品中性能能够不断提升,解决此类问题。
IMG_20210401_224800_副本.jpg 遮罩.png
第二个点是棋盘生成。将棋子识别出来的目标坐标根据棋盘位置,转换为棋子位置(1~9),用于编列入json格式的数据串,从而用uart串口传送至esp32(m5stackbasic)进行后续处理。在下图的九宫格里,设置了一个矩形的判断区,一旦目标中心点坐标点落入此区域,即认定为棋子在该位置。注意:目标检测获取的坐标是在兴趣框的左上角,所以需要转换一下,才可以得到中心点坐标。
棋盘以及判断_副本.png k210框图.png
(2)M5STACK侧软件框图以及代码
m5stack框图1.png
5、测试情况
玩法一:双人对战、AI裁判模式
双人轮流走棋,一旦一方三子成一线,即判该方获胜,如果全部九宫格均填满,仍未分胜负,则判定和棋。
玩法二:人机对战模式

初始模式下即为人机对战模式,或者在对弈中,按BUTTON_B键,右侧绿色标签显示“machine”即为人机对战模式,在X方先手后,basic即将推荐的步骤标号显示在屏幕右侧,请玩家代机器走子,因为机器方为随机填补空位,所以人类玩家的获胜几率很大,在经受minimax算法荼毒之后,遇到这样的“人机对弈”,会有相当成就感。
开局前.jpg 识别_遮罩.jpg
【小结】
井子棋简单有趣,本文从素材采集、模型训练到井子棋对弈的数据处理、简单算法,进行了一个完整的串接,利于玩家学习了解。
后续的展望;(1)将对井子棋的人机对弈部分难度进行提升,比如在对手即将取胜(三子即将连线)时,进行阻挡等策略。当然也可以直接引入minmax算法,虽会降低游戏趣味,但是可以对棋类算法有更加深入的了解。另外,我们非常期待sipeed和m5satck后续推出的,基于cpu和linux系统的深度学习产品,大幅提升目标检测的用户体验。(2)目前人机对弈是有劳人类玩家代为走子,下一步也可以结合机械臂以及吸盘,进行落子。那样就更接近对弈的真实性。
感谢sipeed以及m5stack社区师兄们的指导和帮助,如:大佬鼠、点灯鼠、zyleon等,一并致谢。
清明已过,繁花似锦的春天毕竟到来了。
沧海抱拳。


代码分享如下(内有详细注释):
code.zip (6 KB, 下载次数: 27)
终局.jpg

岑剑伟  初级技师

发表于 2021-4-7 19:44:13

好像看到了大佬的笑脸,我也惊奇地的笑了
回复

使用道具 举报

rzegkly  版主

发表于 2021-4-7 21:19:28

岑剑伟 发表于 2021-4-7 19:44
好像看到了大佬的笑脸,我也惊奇地的笑了

k210很好的案例,
咱们流程图用啥软件绘制的,很赞
回复

使用道具 举报

木子呢  高级技匠

发表于 2021-4-8 10:01:28

流程图用的啥软件画的,好好看,安利下
回复

使用道具 举报

沧海笑  高级技师
 楼主|

发表于 2021-4-8 16:44:13

本帖最后由 沧海笑 于 2021-4-8 16:49 编辑
木子呢 发表于 2021-4-8 10:01
流程图用的啥软件画的,好好看,安利下

我也没想到,目标检测还没有流程图更加关注。哈哈。
软件名字叫做:draw.io   https://github.com/jgraph/drawio-desktop
里面有手绘和阴影风格。
回复

使用道具 举报

木子呢  高级技匠

发表于 2021-4-8 17:32:56

沧海笑 发表于 2021-4-8 16:44
我也没想到,目标检测还没有流程图更加关注。哈哈。
软件名字叫做:draw.io   https://github.com/jgraph/ ...

哈哈,get !
回复

使用道具 举报

Sipeed-大佬鼠  版主

发表于 2021-4-15 15:43:35

沧海大叔还是一如既往的专业啊!!!!!!
回复

使用道具 举报

沧海笑  高级技师
 楼主|

发表于 2021-4-15 17:37:59

Sipeed-大佬鼠 发表于 2021-4-15 15:43
沧海大叔还是一如既往的专业啊!!!!!!

哈哈,感谢支持
回复

使用道具 举报

ydsceo  学徒

发表于 2021-4-23 17:35:59

Sipeed-大佬鼠 发表于 2021-4-15 15:43
沧海大叔还是一如既往的专业啊!!!!!!

Sipeed的大佬鼠无处不在啊
回复

使用道具 举报

timothyWU  见习技师

发表于 2021-5-15 08:05:52

专业





回复

使用道具 举报

媛媛  高级技师

发表于 2021-5-25 15:43:03

膜拜大神,太厉害了
回复

使用道具 举报

沧海笑  高级技师
 楼主|

发表于 2021-5-26 12:35:51

媛媛 发表于 2021-5-25 15:43
膜拜大神,太厉害了

感谢鼓励
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail