让AI帮你玩游戏(一) 基于目标检测用几个样本帮你实现在魔兽世界中钓鱼(群已满)
讓AI幫你玩游戲
- 讓AI幫你玩游戲(一) 基于目標(biāo)檢測(cè)用幾個(gè)樣本實(shí)現(xiàn)在魔獸世界中釣魚
- 前言
- 思路
- 環(huán)境
- 獲取圖像(幾個(gè)樣本即可)
- 標(biāo)記圖片
- 從標(biāo)記文件中獲取Boxes坐標(biāo)
- 搭建目標(biāo)檢測(cè)模型
- 準(zhǔn)備訓(xùn)練數(shù)據(jù)
- (未完待續(xù)!我們下一篇來(lái)介紹如何訓(xùn)練模型!)
?
讓AI幫你玩游戲(一) 基于目標(biāo)檢測(cè)用幾個(gè)樣本實(shí)現(xiàn)在魔獸世界中釣魚(所有代碼已上傳qq群)
聲明:
本文所涉及的內(nèi)容僅用作學(xué)習(xí)研究,嚴(yán)禁用于非法用途,游戲中違反相關(guān)協(xié)議可能會(huì)使你失去你的游戲賬號(hào)!本文為作者原創(chuàng),如果轉(zhuǎn)載請(qǐng)注明出處,盜用將追責(zé)!
前言
本來(lái)還偶爾體驗(yàn)下游戲樂(lè)趣的我,隨著魔獸世界新版本的到來(lái),謎一樣的設(shè)計(jì)師弄一堆半成品實(shí)在提不起興趣來(lái)玩了,不知道是否小伙伴跟我一樣有同感!最想要吐槽的是釣魚系統(tǒng),我的天,簡(jiǎn)直是種折磨!今天我們來(lái)挑戰(zhàn)一下,實(shí)現(xiàn)自動(dòng)釣魚,看下效果先!視頻鏈接地址:https://v.qq.com/x/page/e3163jkj9e3.html
想要代碼的的可以聯(lián)系VX:JTSMJJ? 加入qq群獲取!
人工智能幫你玩游戲#是心動(dòng)的感覺(jué)# #解壓手工# #人工智能那點(diǎn)事# #AI#
思路
- 獲取浮標(biāo)坐標(biāo)
本來(lái)想走捷徑,通過(guò)api獲取鼠標(biāo)形狀句柄來(lái),然后在正前方區(qū)域掃描移動(dòng)鼠標(biāo),只要鼠標(biāo)變?yōu)獒炪^形狀我們就獲取當(dāng)前鼠標(biāo)的位置作為浮標(biāo)的位置,但事實(shí)告訴我們,我們太年輕了,鼠標(biāo)句柄只要指向可交互的物體時(shí)是不停的變化的,變化的,變化的,變化的,沒(méi)有固定值(設(shè)計(jì)師此時(shí)笑出了某種聲音)!沒(méi)有辦法了嗎?NoNoNo,是時(shí)候祭出我們的人工智能來(lái)了,我們搭建一個(gè)神經(jīng)網(wǎng)絡(luò),并訓(xùn)練它,讓它幫我們找到坐標(biāo)!
- 判斷上鉤
這是一個(gè)麻煩的問(wèn)題,我們有了坐標(biāo)了,就要判斷什么時(shí)候來(lái)收桿??梢耘袛喔?biāo)的位置的變化來(lái)獲取位置,這就需要及時(shí)獲取屏幕圖像,我們用截屏是無(wú)法實(shí)現(xiàn)的,需要HOOK 技術(shù)來(lái)實(shí)時(shí)獲取畫面,咱不走這條路!怎么簡(jiǎn)單怎么來(lái),我們聽聲音,當(dāng)魚上鉤時(shí)會(huì)發(fā)聲,我們把其他聲音效果全關(guān)掉,只要聲卡發(fā)聲咱們就收網(wǎng)!
環(huán)境
- Anaconda集成python環(huán)境
- tenserflow 2.0+庫(kù)
- Tensorflow objection detection api庫(kù)
- Labelme
- VC++環(huán)境,我的的VC++2019
獲取圖像(幾個(gè)樣本即可)
進(jìn)入客戶端,到合適位置釣魚,為了提高模型準(zhǔn)確性(畢竟我們僅用幾個(gè)樣本來(lái)訓(xùn)練模型)我們將視野拉到最近,使用浮標(biāo)玩具讓浮標(biāo)更打一點(diǎn)(我用的浮船玩具),開始釣魚,調(diào)整視角角度從不同的角度截屏(游戲內(nèi)按下PrintScreen)。
這是我自己截取的樣張,可見畫面復(fù)雜程度其實(shí)是很高的,我截取了6張圖片為樣本,下面我們來(lái)標(biāo)記圖片
標(biāo)記圖片
我們有了樣本現(xiàn)在開始標(biāo)記樣本,我們用Labelimg來(lái)標(biāo)記,未安裝的直接打開Anaconda prompt命令行輸入:pip install labelImg,安裝完以后還是在Anaconda prompt運(yùn)行l(wèi)abelimg,如圖:
打開后會(huì)出現(xiàn)如下界面:
簡(jiǎn)單介紹下用法:
- 標(biāo)號(hào)1
為打開你想要標(biāo)記圖片所在的文件夾,用open一張張打開麻煩,可以用這個(gè)將文件夾整個(gè)打開。
- 標(biāo)號(hào)2
你想要保存標(biāo)記文件的文件夾,文件格式是xml格式的。
-
標(biāo)號(hào)3
每標(biāo)記完一張圖片請(qǐng)點(diǎn)擊保存
-
標(biāo)號(hào)4
點(diǎn)擊后開始用一個(gè)方塊區(qū)域標(biāo)記目標(biāo)區(qū)域
-
標(biāo)號(hào)5
打?qū)春?#xff0c;在對(duì)話框里填上你想為標(biāo)記區(qū)域起的名字,這樣不用每張圖片輸入類名
開始愉快的標(biāo)記圖片吧_
從標(biāo)記文件中獲取Boxes坐標(biāo)
直接上代碼,其中path為上一個(gè)步驟你保存xml的文件夾
import glob import xml.etree.ElementTree as ET xml_list = [] bxes = [] # 讀取注釋文件 for xml_file in glob.glob(path + '/*.xml'):tree = ET.parse(xml_file)root = tree.getroot()for member in root.findall('object'):width = int(root.find('size')[0].text)height = int(root.find('size')[1].text)xmin = int(member[4][0].text)ymin = int(member[4][1].text)xmax = int(member[4][2].text)ymax = int(member[4][3].text)value = (root.find('filename').text,width,height,member[0].text,xmin,ymin,xmax,ymax)boxes.append(np.array([[round(ymin / height, 3),round(xmin / width, 3),round(ymax / height, 3),round(xmax / width, 3),]],dtype=np.float32))這樣就從標(biāo)注文件中將標(biāo)注信息讀取到boxes里了。
搭建目標(biāo)檢測(cè)模型
這里假設(shè)你已經(jīng)擁有Object Detection API庫(kù)了,安裝方法在這里可以找到(https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2.md)
構(gòu)筑模型:
這里需要說(shuō)明下,model_config跟checkpoint_path分別是你建立模型的配置文件以及官方給出的預(yù)訓(xùn)練模型路徑,你需要按照你搭載的模型來(lái)下載相應(yīng)的文件,我這里搭建的是ssd_resnet50模型,其對(duì)應(yīng)的配置文件在https://github.com/tensorflow/models/tree/master/research/object_detection/configs/tf2圖示位置:
checkpoint在https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md
圖示位置:
下載下來(lái)的是一個(gè)壓縮包,需要解壓,checkpoint就在解壓后的checkpoint文件夾里
準(zhǔn)備訓(xùn)練數(shù)據(jù)
沒(méi)啥好說(shuō)的直接上代碼:
import numpy as np from PIL import Imagedef load_image_into_numpy_array(path):global X_max, Y_maximg_data = tf.io.gfile.GFile(path, 'rb').read()image_ = Image.open(BytesIO(img_data))(width, height) = image_.sizeX_max = widthY_max = heightreturn np.array(image_.getdata()).reshape((height, width, 3)).astype(np.uint8) train_images_np = [] for i in glob.glob(os.path.join(train_image_dir, '*.jpg')):train_images_np.append(load_image_into_numpy_array(i))dummy_scores = np.array([1.0], dtype=np.float32) #給你標(biāo)記的數(shù)據(jù)記100分 label_id_offset = 1 train_image_tensors = [] gt_classes_one_hot_tensors = [] gt_box_tensors = [] for (train_image_np, gt_box_np) in zip(train_images_np, gt_boxes):train_image_tensors.append(tf.expand_dims(tf.convert_to_tensor(train_image_np, dtype=tf.float32), axis=0))gt_box_tensors.append(tf.convert_to_tensor(gt_box_np, dtype=tf.float32))zero_indexed_groundtruth_classes = tf.convert_to_tensor(np.ones(shape=[gt_box_np.shape[0]], dtype=np.int32) - label_id_offset)gt_classes_one_hot_tensors.append(tf.one_hot(zero_indexed_groundtruth_classes, num_classes))其中 gt_boxes為我們前邊步驟獲取到的boxes,train_image_dir為你所標(biāo)記的圖片所在路徑。
(未完待續(xù)!我們下一篇來(lái)介紹如何訓(xùn)練模型!https://blog.csdn.net/pp2351/article/details/109302828)
?
總結(jié)
以上是生活随笔為你收集整理的让AI帮你玩游戏(一) 基于目标检测用几个样本帮你实现在魔兽世界中钓鱼(群已满)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: easyExcel中合并单元格文件读取实
- 下一篇: 学AI买计算机,如何用免费GPU学习AI