转战米国,经过一段时间的调整和适应,终于有时间整理下最近做的一个项目。从infra到云到大数据到AI,各个领域都应该保持学习,技术的道路从来都不是一帆风顺。

1. 场景介绍

MOBA玩家都比较熟悉不论是DOTA2还是LOL,游戏内会有minimap,为玩家提供位置、视野及信号等信息,帮助对局势进行判断。

假设我们在一个非直播的比赛数据页面,通过小地图的数据,一方面帮助高玩在没有流量的情况下也能合理分析比赛形势,有更多的参与度;另一方面,一个选手的运动轨迹我们补获后,做大数据的分析,对其某个英雄某一种行动路径在什么时间都可以有一个基于历史的推演,有助于战队针对性的训练。

那我们要怎么获取小地图的行动轨迹数据呢,方法A成为游戏厂商的数据下游,花钱花关系妥妥的;方法B找下官方有没有实时数据的接口,实时数据的接口里有没有位置的信息,方法C,自己想办法人工实时录(几乎不可能), 上网一搜LOL小地图识别,Farzaa大佬已经验证过基于YOLO算法的英雄地图识别的,但是也仅此一篇文章。

Farzaa的文章中还是存在几个问题:

  • 只验证了LCS的部分比赛,样本集不够多,怎么快速覆盖全英雄比赛?
  • 根据Farzaa的描述,获取实时数据的方式貌似已经过时了,怎么获取到英雄位置数据的样本?

接下来为大家介绍我的实践方式与最终的效果。

2. yolo - yolov2 - yolov3算法

在开始我们系统搭建之前,还是有必要说明下什么是yolo算法。(作者也是AI starter,需要各位读者也补充些AI的知识,比如吴恩达的CNN课程,神经网络的课程及线性代数等等)

YOLO(You only look once) 是一种快速且高识别率的目标检测和识别的算法和网络模型。YOLO的基本逻辑是将输入图片或者视频帧做多尺寸resize,然后送入CNN网络,最后处理网络预测结果得到检测的目标的confidence和bounding box(处理大致流程如下图)。

2.1 YOLOv1的CNN网络模型

2.2 YOLOv2及v3在此基础上做的部分优化(持续补充):

  • 正则化,做反向传播时加速训练
  • 结合Faster RCNN的思路,引入RPN(Region Proposal Network)替代v1的全连接层并减少网络计算量, 大致步骤如
    • Step1: 图片通过CNN网络进行滤波,得到各通道特征
    • Step2: 选择滑动窗(一般3X3),每次滑动时会生成9个标定窗口,并计算IoU(Intersection over union)
    • Step3: 将得到的IoU进行classification和regression,最终得到检测目标的boudning box
  • 特征提取的优化,比如参考vgg16的darknet-19到v3的darknet-53

按照yolov3作者的操作说明(YOLOv3操作指南),基本可以成功得到以下的测试结果:

3. 打标系统

CNN/DL没有想象那么复杂,一个深度学习的模型,部分精力是在设计怎么提取特征,如果对数据进行预处理,以及tuning parameter及hyperparamter。我们之前有了使用darknet训练和识别的经验,现在来说明下怎么获取LOL的minimap样本的VOC数据。

3.1 打标步骤

首先,我们做个简单的截屏脚本,在各直播画面截取上图的minimap,频率可以10-15s一个; 之后我们将图片批量倒入我们的打标系统进行标定,这里主要是生成每个英雄的boudning box坐标(xmin, ymin, xmax, ymax),保存后会生成VOC所需的xml文件。

这里为什么需要打标系统,主要是打标依赖人工,以s9为例,一场比赛就可以生成1000多张的图片,所以打标系统服务化可以最大程度的多人同时标定。当然每个人获取到的图片也是随机获取显示的,尽量不重复标定。(后续我们做了基于特定场景的自动生成样本集和自动增量训练系统,下一篇可以介绍)

3.2 打标数据

标定之后的xml数据格式如

<annotation><folder>imgs</folder><filename>xxxxxx.jpg</filename><path>/xxxx/lol-champions/imgs/xxxxxx.jpg</path><source><database>Unknown</database></source><size><width>290</width><height>285</height><depth>3</depth></size><segemented>0</segemented><object><name>urgot</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>94</xmin><ymin>22</ymin><xmax>110</xmax><ymax>43</ymax></bndbox></object><object><name>thresh</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>189</xmin><ymin>70</ymin><xmax>203</xmax><ymax>89</ymax></bndbox></object>
</annotation>

4. TF训练

这里貌似没有什么特别要介绍的,github上已经有挺多开源的YOLOv3的TF实现,不过这里有必要提一下darknet是c的实现,会比tf的训练速度快很多,GTX 1080的显卡跑20000个epoch darknet基本一晚上就好了,tf跑的话要几天,当然这个还取决于显卡的内存,batch size的大小,图片的大小以及epoch的设置,仁者见仁,智者见智吧。

这里逻辑上说下我的思路,打标系统的图片和生成的xml文件需要符合VOC的目录结构,这样可以用一些生成训练集及测试集的脚本统一处理,再由下面的脚本处理提取出坐标和分类名。

PASCAL VOC的目录结构(自定义也可以)

.
└── VOCdevkit     └── VOC2012 ├── Annotations      #xml文件├── ImageSets        │   ├── Main         #训练集与测试集.txt文件├── JPEGImages       #原图片
def convert_voc_annotation(data_path, data_type, anno_path, use_difficult_bbox=True):classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus','car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse','motorbike', 'person', 'pottedplant', 'sheep', 'sofa','train', 'tvmonitor']img_inds_file = os.path.join(data_path, 'ImageSets', 'Main', data_type + '.txt')with open(img_inds_file, 'r') as f:txt = f.readlines()image_inds = [line.strip() for line in txt]with open(anno_path, 'a') as f:for image_ind in image_inds:image_path = os.path.join(data_path, 'JPEGImages', image_ind + '.jpg')annotation = image_pathlabel_path = os.path.join(data_path, 'Annotations', image_ind + '.xml')root = ET.parse(label_path).getroot()objects = root.findall('object')for obj in objects:difficult = obj.find('difficult').text.strip()if (not use_difficult_bbox) and(int(difficult) == 1):continuebbox = obj.find('bndbox')class_ind = classes.index(obj.find('name').text.lower().strip())xmin = bbox.find('xmin').text.strip()xmax = bbox.find('xmax').text.strip()ymin = bbox.find('ymin').text.strip()ymax = bbox.find('ymax').text.strip()annotation += ' ' + ','.join([xmin, ymin, xmax, ymax, str(class_ind)])print(annotation)f.write(annotation + "\n")return len(image_inds)

5. 结论


是不是很有意思,欢迎讨论。还有什么电竞中的场景可以结合deeplearning呢?

文献参考

  • YOLOv1
  • YOLOv2
  • YOLOv3
  • Faster RCNN
  • VGG16
  • YOLO详细分析(英文)
    VGG16](https://neurohive.io/en/popular-networks/vgg16/)
  • YOLO详细分析(英文)
  • YOLO详细分析(中文)

电竞AI之视觉篇:YOLO算法在电竞中的应用(Darknet + TF)相关推荐

  1. 深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系列算法原理,以及Faster RCNN的实现.这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起 ...

  2. python目标识别算法_深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    摘要: 本文是目标检测系列文章--YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣. 在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系 ...

  3. AI学术大地震---YOLO之父退出CV界,以此来反对AI算法用于军事和隐私窥探

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 我们可能看不到根红苗正的 YOLO v4 面世了. 「YOLO 之父」Joseph ...

  4. 定义电竞AI,引领数据体育-火星数据

    随着moba类游戏的井喷式爆发,新冠疫情大规模爆发,传统体育比赛大面积停摆,使得更多赛事用户转向电竞方向,其中玩游戏.观看电竞赛事成为年轻用户的潮流生活方式之一.早在英雄联盟S6全球总决赛,全球观赛人 ...

  5. 腾讯AI Lab视觉计算中心招聘计算机视觉算法实习生

    腾讯 AI Lab 腾讯 AI Lab 是腾讯的企业级 AI 实验室,于 2016 年 4 月在深圳成立,团队由 100 余位来自世界知名院校的科学家,以及 300 多位经验丰富的应用工程师组成,并与 ...

  6. 商汤组了「最强大脑」局,正儿八经解释为啥搞起电竞AI

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 前不久,<星际争霸2>虫王iA周航加入商汤科技,担任AI研究员. 堪称电竞职业玩家「转型最成功」的案例之一. 而商汤作为一家以计 ...

  7. 分享一篇关于陌生人社交的竞品分析报告

    上次分享了学员写的陌生人竞品分析报告上(分享一篇关于陌生人社交的竞品分析报告(上)),这次接着分享下半部分,也欢迎大家提意见. 3.5 重要数据对比 数据来源 -- 易观数据2020年3月 根据以上数 ...

  8. 北京/上海内推 | 小红书多模态算法组招聘视觉/多模态/NLP算法实习生

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 小红书 小红书多模态算法组是小红书多模态和计算机视觉技术应用的最前线,拥有 ...

  9. 小米AI实验室六篇论文获 ICASSP 2022收录,多模态语音唤醒挑战赛夺冠

    近日,全球语音.声学顶级会议ICASSP 2022公布了论文入选名单,小米AI实验室6篇学术论文被接收.同时,小米"自由说"系统在MISP(基于多模态信息的语音处理)挑战赛中荣获多 ...

最新文章

  1. java 解释型和编译型
  2. 系列四、SpringMVC响应数据和结果视图
  3. R语言使用psych包的describeBy函数计算不同分组(group)的描述性统计值(样本个数、均值、标准差、中位数、剔除异常均值、最小最大值、数据范围极差、偏度、峰度、均值标准差等)
  4. js验证身份证号,超准确
  5. 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
  6. c语言通讯录以及写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序...
  7. html中怎么选择相同的代码,不同的HTML,相同的代码隐藏和相同的控件
  8. c语言atof字母,C语言字符转换之atof()
  9. 导航栏-滚动渐变 - 封装版
  10. cocos2d-x+lua开发模式下编辑器的选择
  11. 服务器根没有web文件系统,Web服务器
  12. python模拟内置函数all_python内置函数all和any
  13. GD32 笔记 01:如何用 Keil 新建 GD32E230 工程
  14. python获取网页数据判断并提交_python3爬虫无法通过网页内容判断存在与否?
  15. 清华大学计算机系2016名单,2016年本科生表彰名单
  16. eclipse官网下载不了eclipse开发工具的解决方法
  17. 写在“华为伙伴暨开发者大会”前夕:给昇腾AI划三个重点
  18. Appium:配置华为手机鸿蒙HarmonyOS系统参数
  19. 地方门户+html+模板,帝国CMS地方门户网站模板(含分类信息,WAP手机模板)
  20. 【iOS安全】App Store 应用爬取

热门文章

  1. AE不能导入mov等格式文件
  2. 【不得不看】aiwi游戏电脑安装步骤
  3. 默认墨迹天气 下雪效果
  4. 华为2020届实习生校招机考题(2019-3-20版)
  5. ubuntu安装nvidia官方驱动(安装CUDA7.5之后,找不到TITAN显卡的解决方法)
  6. 软件工程_东师站_课堂笔记
  7. c# IPAddress类
  8. 【Redis高级应用总结】
  9. 万能乘法速算法大全_小学生两位数乘法容易出错?只因没掌握这个“万能”速算法...
  10. 基于搜索指数预测各城市首轮感染高峰期;AI+眼镜:失聪者看字幕盲人听语音;ChatGPT VSCode插件教程;谷歌开源注意力中心模型 | ShowMeAI资讯日报