查看原文
其他

送书 10 本丨敢跟我 PK 接球游戏吗?让你两只手!

点击左上方蓝字关注我们




,兄弟,下面这个小游戏熟悉吧。

(游戏截图)

这个小游戏你是不是自打会走路开始就在玩了呢?但是不是也还是会输给游戏系统得不到高分?不用怀疑自己手残,让我们走进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为你带来一些启发、真实好用的话,还请不要吝啬,给他点亮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

END



福利:本周,开源中国 联合 华章 为大家带来 2 本关于 Kotlin 的书籍,可以送 10 本给大家,快来目睹一下这 2 本书的风采吧!




Kotlin编程实践

本书基于成熟的Kotlin 1.3版编写,是开发者可以快速入门 Kotlin 的超棒资源,为常见的开发任务提供了简明实用的指南,同时指出了从Java过渡到Kotlin面临的困难。由携程机票移动端高级工程师、Kotlin中文社区成员、Kotlin官方文档译者乔禹昂翻译。





深入理解Kotlin协程

这是一部从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等多个维度全面讲解Kotlin协程的专著,它同时提供了多语言视角,亦可通过本书了解其他语言的协程。本书作者是腾讯高级工程师、国内知名Kotlin开发者和布道师、“Kotlin”公众号作者。


送书大福利





2020.8.27—2020.8.29

参与方式:留言送 10 本书

1、留言话题 1:说说 Kotlin 主要优势及应用场景

2、留言话题 2:你是如何学习 Kotlin 的?&其他和 Kotlin 相关的话题

3、留言点赞数排名第1,3,5,7,9,11,13,15,17,19。可获得以上任意一本正版图书,先到先得。

4、开奖时间:2020.8.29 20:00


▼  往期精彩回顾 ▼两个月新增 80 万行代码,Linux 内核维护为什么不会崩?
TypeScript 4.0 发布
被盯上了?美国知名媒体 TechCrunch 关注中国建设独立开源平台 Gitee以假乱真?加州伯克利分校的学生用 GPT-3 生成伪文章成功骗得 26000 访问
2019 年 Dota2 比赛中,AI 战胜世界冠军的最强算法在这里!


                  

觉得不错,请点个在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存