【飛槳開發者說】曹志浩,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哦!
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