接球小游戏玩腻了?换个姿势让PaddleX帮你吊打游戏系统
嘿,兄弟,下面这个小游戏熟悉吧。
(游戏截图)
这个小游戏你是不是自打会走路开始就在玩了呢?但是不是也还是会输给游戏系统得不到高分?不用怀疑自己手残,让我们走进AI的世界,尝试使用飞桨PaddleX开发一款“莫得感情”的自动接球程序,实现一顿让朋友们目瞪口呆、让游戏系统"自我怀疑"的操作吧!
项目效果
项目使用工具简介
飞桨PaddleX是自动接球项目关键算法的生产工具。PaddleX是飞桨推出的全流程、低代码开发工具,集飞桨飞桨智能视觉领域图像分类、目标检测、语义分割、实例分割任务能力,将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通,并提供统一任务API接口及图形化开发界面Demo。开发者无需分别安装不同套件,以低代码的形式即可快速完成飞桨全流程开发。
PaddleX 还沉淀了质检、安防、巡检、遥感、零售、医疗等十多个行业实际经验,并提供丰富的案例实践教程,全程助力开发者产业实践落地。开发者可以依照案例教程来『按图索骥』,快速端到端的实现产业实际项目落地。
案例集详情请参考:
https://paddlex.readthedocs.io/zh_CN/develop/examples/index.html
项目开发过程介绍
本项目代码和文件已全部放在AI Studio,项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/628547
01
安装PaddleX
pip install paddlex -i https://mirror.baidu.com/pypi/simple
02
准备训练数据集
数据集为作者自己录的一段游戏视频,对视频切帧后使用labelImg对每帧图像进行标注,得到训练所需的数据集。这里主要标注两种类别:board(接球的板子)和ball(球)。
(使用labelImg对图片进行标注)
根据官方文档定义的数据集格式:
https://paddlex.readthedocs.io/zh_CN/develop/data/format/detection.html
准备好train_list.txt、val_list.txt、labels.txt。批量生成train_list.txt、val_list.txt的代码:
import os
path1 = 'jpg/'
path2 = 'xml/'
# 获取dir
dir1 = os.listdir(path1)
f_train = open('train_list.txt', 'w')
f_val = open('val_list.txt', 'w')
for i in dir1:
if int(i.split('.')[0])%30 == 0:
f_val.write(path1+i.split('.')[0]+'.jpg '+path2+i.split('.')[0]+'.xml'+'n')
else:
f_train.write(path1+i.split('.')[0]+'.jpg '+path2+i.split('.')[0]+'.xml'+'n')
f_train.close()
f_val.close()
03
导入PaddleX并指定0号GPU卡
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
04
数据预处理
4.1、数据预处理和数据增强
在PaddleX中,transforms用于定义模型训练和验证过程中,输入图像的处理流程。在训练过程中,使用MixupImage、RandomDistort、RandomExpand等图像增强策略,使得模型的泛化能力更强。
PaddleX中transforms模块参考文档:
https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
from paddlex.det import transforms
train_transforms = transforms.Compose([
transforms.MixupImage(mixup_epoch=250),
transforms.RandomDistort(),
transforms.RandomExpand(),
transforms.RandomCrop(),
transforms.Resize(target_size=608, interp='RANDOM'),
transforms.RandomHorizontalFlip(),
transforms.Normalize(),
])
eval_transforms = transforms.Compose([
transforms.Resize(target_size=608, interp='CUBIC'),
transforms.Normalize(),
])
4.2、数据集的定义
PaddleX中数据集读取模块参考文档:
https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#
由于labelImg标注的数据采用VOC格式保存,因此我们使用paddlex.datasets.VOCDetection接口加载数据集。
train_dataset=pdx.datasets.VOCDetection(
data_dir='dataset',
file_list='dataset/train_list.txt',
label_list='dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='dataset',
file_list='dataset/val_list.txt',
label_list='dataset/labels.txt',
transforms=eval_transforms)
05
定义YOLOv3网络并开始炼丹
我们使用效果更优的Darknet53作为YOLOv3的Backbone,设定训练过程中的批大小为8,初始学习率为0.0001并采取warmup策略,学习率在第50轮,和90轮时进行衰减,一共训练100轮。
网络结构如下图:
(YOLOv3网络结构)
YOLOv3论文地址:
https://arxiv.org/abs/1804.02767
PaddleX中关于目标检测模型的参考文档:
https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html
num_classes=len(train_dataset.labels)
model=pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53')
model.train(
num_epochs=100,
train_dataset=train_dataset,
train_batch_size=8,
eval_dataset=eval_dataset,
learning_rate=0.0001,
warmup_steps=500,
lr_decay_epochs=[50,90],
save_interval_epochs=20,
save_dir='output/yolov3_darknet53')
06
对模型进行测试
image_name = '0.jpg'
result = model.predict(image_name)
pdx.det.visualize(image_name,result, threshold=0.5, save_dir='PrePicture')
测试结果可视化如下:
07
对游戏进行控制
对截屏得到的游戏画面进行实时推理,预测出board(接球的板子)和ball(球)的位置后,通过python操控鼠标移动board,使得board和ball的中心点在同一条竖线上,这样就能保证board永远能接到ball了。
可视化说明如下:
控制代码:
if __name__ == '__main__':
# 定义参数
distance = 1 # 鼠标移动distance距离,可以调整
image_name = '0.jpg' # 截屏得到的图片
# 启动火狐浏览器
driver = selenium.webdriver.Firefox()
while True:
window_capture(image_name)
result = model.predict(image_name)
# 计算球的中心和板子的中心
center_x1 = result[0]['bbox'][0]+result[0]['bbox'][2]/2
center_y1 = result[0]['bbox'][1]+result[0]['bbox'][3]/2
center_x2 = result[1]['bbox'][0]+result[1]['bbox'][2]/2
center_y2 = result[1]['bbox'][1]+result[1]['bbox'][3]/2
# 实现控制
if(center_x1>center_x2):
driver.execute(Command.MOVE_TO,{'xoffset':distance,'yoffset':0})
else:
driver.execute(Command.MOVE_TO,{'xoffset':-distance,'yoffset':0})
项目小结
感谢飞桨平台提供丰富的深度学习资源,让AI替代我与朋友玩游戏的愿望得以实现。大家也可以尝试使用飞桨PaddleX实现更多好玩的游戏,例如下面这些:
期待大家更多更精彩的作品呦。
如在使用过程中有问题,可加入PaddleX QQ交流群进行交流:1045148026。
如果觉得PaddleX为你带来一些启发、真实好用的话,还请不要吝啬,给他点亮Star哦!
·飞桨PaddleX 项目地址·
GitHub:
https://github.com/PaddlePaddle/PaddleX
Gitee:
https://gitee.com/paddlepaddle/PaddleX
·PaddleX官方文档·
https://paddlex.readthedocs.io/zh_CN/develop/index.html
·PaddleX官网地址·
https://www.paddlepaddle.org.cn/paddle/paddlex
微信号 : PaddleOpenSource
- [接口测试 - 基础篇] 06 好吧也来解析下html
- [接口测试 - 基础篇] 05 好讨厌的xml解析
- 【专知-关关的刷题日记17】Leetcode 268. Missing Number
- 【专知-关关的刷题日记18】Leetcode 35. Search Insert Position
- [接口测试 - http.client篇] 15 常用API说明及基本的示例
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 【专知-关关的刷题日记19】Leetcode 118. Pascal's Triangle
- 每周学点大数据 | No.3算法设计与分析理论
- HDU 1874 畅通工程续【Floyd算法实现】
- 接口测试 | 21 基于flask弄个restful API服务出来
- 数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法
- [接口测试 -基础篇] 20 用flask写一个简单server用于接口测试
- 接口测试 | urllib篇 19 urllib基本示例
- 接口测试 | urllib篇 18 urllib介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「AndroidStudio」fastjson导包报错:Could not resolve com.alibaba:fastjson:1.1.56.android
- 「Android」通过注解自动生成类文件:APT实战(AbstractProcessor)
- 五、开始Github和码云之旅,新手如何上路
- 用 Shader 写个完美的波浪~
- K8s上的Go服务怎么扩容、发版更新、回滚、平滑重启?教你用Deployment全搞定!
- 图解Go内存管理器的内存分配策略
- why哥这里有一道Dubbo高频面试题,请查收。
- 「容器平台」Kubernetes网络策略101
- 架构师之路 - 服务器硬件扫盲
- 零基础Python教程045期 元组的增删改查测试实验
- 零基础Python教程044期 列表的函数方法,很耐用!
- 零基础Python教程047期 GUI窗体界面编程,迈出软件开发的第一步
- 零基础Python教程046期 矩阵行列互换算法,二维数组的典型应用
- 有一次小明传数据给我,把我弄哭了
- Java删除空字符:Java8 & Java11