接球小遊戲玩膩了?換個姿式讓PaddleX幫你吊打遊戲系統

飛槳開發者說】曹志浩,PPDE飛槳開發者技術專家,哈爾濱工業大學(深圳) 在讀,研究方向爲計算機視覺圖像與視頻處理。php

嘿,兄弟,下面這個小遊戲熟悉吧。html

(遊戲截圖)python

這個小遊戲你是否是自打會走路開始就在玩了呢?可是不是也仍是會輸給遊戲系統得不到高分?不用懷疑本身手殘,讓咱們走進AI的世界,嘗試使用飛槳PaddleX開發一款「莫得感情」的自動接球程序,實現一頓讓朋友們目瞪口呆、讓遊戲系統"自我懷疑"的操做吧!git

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

項目效果

項目使用工具簡介github

飛槳PaddleX是自動接球項目關鍵算法的生產工具。PaddleX飛槳推出的全流程、低代碼開發工具,集飛槳飛槳智能視覺領域圖像分類目標檢測語義分割實例分割任務能力,將深度學習開發全流程從數據準備、模型訓練與優化到多端部署端到端打通,並提供統一任務API接口圖形化開發界面Demo。開發者無需分別安裝不一樣套件,以低代碼的形式便可快速完成飛槳全流程開發。web

PaddleX 還沉澱了質檢安防巡檢遙感零售醫療等十多個行業實際經驗,並提供豐富的案例實踐教程,全程助力開發者產業實踐落地。開發者能夠依照案例教程來『按圖索驥』,快速端到端的實現產業實際項目落地。算法

案例集詳情請參考:api

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.一、數據預處理和數據加強

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.二、數據集的定義

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

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
相關文章
相關標籤/搜索