图像识别之---斗地主扑克牌识别

转载请说明出处:

特此声明:此文章仅为 图像识别技术研究  别有用心的朋友请绕道!谢谢!!!

此贴为前面几篇图像识别的衍生帖子,后续会更新更多关于图像识别的技术帖子。有需求的朋友可以关注前面几篇的技术贴!!!!!

网上有很多识别扑克牌的教程,要么讲得不是很清晰,要么就是识别很不准确。我们在实际应用中都需要很准确的识别出扑克牌,不能有一点差错。最近研究一个项目实时识别游戏中的扑克牌,基本上能达到95%以上的识别准确率。

我们常见的扑克牌识别就是就是像素颜色点比对。也就是我们常说的图像二值化,比如下面一张图片。

图像识别之---斗地主扑克牌识别_第1张图片

 

我们需要在图片里面识别出来,这个2我们首先就要创建这张图片的比对模板。然后将图像去色(即灰度化)。去色是将彩色图像转换成8bit图像的一种操作。我们需要将彩色图像转换成灰度图像以便对其进行二值化。

说得通俗一点一点就是,我们把这个图片有黑色地方标1,白色的地方标0.然后和图片中的每一个地方做对比,然后取相似值最大的第一个地方返回。

图像识别之---斗地主扑克牌识别_第2张图片

 

通过这种方式我们能图像识别出我们想要的结果。如果说我们需要识别图像就是这种单一的一成不变的,完全没有任何问题。但是我们运用到游戏里面,往往就不是这样的,有可能这个2被放大,被缩小了,被旋转了。我们有该怎么来解决这个问题了。这点很多人可能就会说那我们直接在做几个模板就可以解决这个问题了。还是那句话如果你检测的目标就是2我们可能就很好来处理这个问题工作量也不大。但是我们实际中遇到问题 可能比这个要复杂很多。我们知道一副扑克里面有2----A 还有大鬼小鬼。一共15种类型,我们一个做4种图片。就是几十个模板了,可能到那个时候你就是简单的做图像的模板就会发疯。那我们有没有更好的办法来解决这个问题。。。。。重点来了,这个就是我们今天要讲解的通过深度学习来实现扑克牌的识别。

深度学习就会解决我们这个问题,不管是图像的放大,缩小旋转都是一个固定的特征。我们只要最开始的时候标对这个特征,在图像识别过程中都能很准确的识别。

那我们具体要怎么来实现了这个功能了。我们具体分这几步。

  1. 通过标注软件来标注,我们标准的这个图像是什么,然后识别出来就是什么。

这个就像小孩出生之后,其实她是不知道一个东西到底叫什么名字的。比如我们给她一个水果,我们告诉她,这个是苹果。可能我们告诉她一次,她下次又会忘记这个水果叫什么。我们只有反复的告诉她这个是苹果。给她不同大小的苹果,让她多次产生记忆,然后加以学习。后面你给她苹果她就知道这个水果是苹果。所以这点我们标注图片就需要很多的图片来标注。

  1. 对我们所有的标准的图片,加以训练学习。
  2. 训练之后得到一个模型,这个模型就是我们所有种类特征的一个集合。再计算机中可能就是不同特征的一个函数。

首先我们使用软件标注的时候我们需要建立一个标签类,就是定义好每一个识别出来之后的结果我们用什么来表示。

图像识别之---斗地主扑克牌识别_第3张图片

 

这单我们就是3-----2就是我们对应的数字,10就用T来表示。大鬼就用D来表示,小鬼就用X来表示。A1-A9就是我们玩家对应的剩余牌的数量,其余就是一些按钮的表示。我想大家应该也能看懂这个东西。这个就是中文加英文的结合体。哈哈哈哈,原谅一个英文不怎么好的程序员。

现在我们的标签分类出来了,现在我们就需要游戏里面去手机图片,这个可能就是一个很大的工作量了,这点就需要很多的图片来标注,因为这个就像小孩一样,你只告诉她一次是肯定不可以的。需要注意的是这点尽量不要使用相同的图片来标准,因为相同的图片所有的信息都是一样的,这点不利于学习。

我们还需要注意一点的事情就是,在标注的时候一定不要标注错误,这个是一个慢工出细活的工作。宁愿前面多花一点时间来做这个事情,也不要后面重复的来检查问题。因为你标注错了,计算机就学习错了,最后识别就会出问题。这个是一个很麻烦得事情,如果后面出错的话,这个是我们长时间的经验告诉我们的。

我们这点用到的标注软件就是labelImg。CSDN一搜就能搜到很多的。

 

我们接下来的工作就是这样一张一张仔细的标注。千万千万千万不要标注错误,千万千万千万不要标注错误,千万千万千万不要标注错误!!!重要的事情说三遍。标准错了,这个以后有得你受的。

你最后想识别的结果最准确,就尽可能的使用多得图片。我们一个项目基本上至少都要使用500张以上的图片。最后才能达到一个理想的结果。

我们标准完成了之后,我们就可以使用一个训练算法,来训练我们的模型。最后我们调用模型,就能得到我们想要的一个结果。下面给你们看一下我们最后的识别效果。

图像识别之---斗地主扑克牌识别_第4张图片

图像识别之---斗地主扑克牌识别_第5张图片

最后你能看到我们这个效果基本上都是95%以上的准确率。只要你最开始没有标错错误的话,最后训练出来的模型就是没有任何问题的。

在标注的时候还有一点需要注意的,就是如果都出现了牌,如果你程序是不需要识别他的时候就不需要去标准,以免影响程序的正确识别率。就像下面最后的结算界面,玩家剩余的牌,其实在我们游戏过程中我们是不需要了解的。所以我们在抓取图片的时候就不要抓取最后的结算界面。

图像识别之---斗地主扑克牌识别_第6张图片 

其实最上面的3张小牌我们也是不需要的,所以在标注的时候我们也不需要标准最上面的小牌,因为小牌的特征不是特别的明显就不需要标准小牌。

最后如果你有什么问题或者是疑问,请留言或者私信,私信必回。只讨论技术研究!!!别有用心的朋友请绕道!谢谢!!!

最后发一个游戏运行起来的实时动态检测结果。

斗地主游戏图像识别演示效果视频

 

 

你可能感兴趣的:(图像识别,python,深度学习,pytorch)