使用Tensorflow+OpenCV構建會玩石頭剪刀布的AI
我已經(jīng)使用DenseNet121模型進行特征提取,其輸出最終將輸入到我自己的Dense神經(jīng)網(wǎng)絡中。
densenet = DenseNet121(include_top=False, weights='imagenet', classes=3,input_shape=(300,300,3))
densenet.trainable=True
def genericModel(base):
model = Sequential()
model.a(chǎn)dd(base)
model.a(chǎn)dd(MaxPool2D())
model.a(chǎn)dd(Flatten())
model.a(chǎn)dd(Dense(3,activation='softmax'))
model.compile(optimizer=Adam(),loss='categorical_crossentropy',metrics=['acc'])
return model
dnet = genericModel(densenet)
history = dnet.fit(
x=imgData,
y=labels,
batch_size = 16,
epochs=8,
callbacks=[checkpoint,es],
validation_split=0.2
)
關鍵點 :由于我們的圖片尺寸為300x300,因此指定的輸入形狀也為3x300x300,3代表RGB的維度信息,因此該層具有足夠的神經(jīng)元來處理整個圖像。我們將DenseNet層用作第一層,然后使用我們自己的Dense神經(jīng)網(wǎng)絡。我已將可訓練參數(shù)設置為True,這也會重新訓練DenseNet的權重。盡管花了很多時間,但是這給了我更好的結果。我建議你在自己的實現(xiàn)中嘗試通過更改此類參數(shù)(也稱為超參數(shù))來嘗試不同的迭代。由于我們有3類Rock-Paper-Scissor,最后一層是具有3個神經(jīng)元和softmax激活的全連接層。最后一層返回圖像屬于3類中特定類的概率。如果你引用的是GitHub repo(https://github.com/HOD101s/RockPaperScissor-AI-) 的train.py,則要注意數(shù)據(jù)準備和模型訓練!至此,我們已經(jīng)收集了數(shù)據(jù),建立并訓練了模型,剩下的部分是使用OpenCV進行部署OpenCV實現(xiàn):此實現(xiàn)的流程很簡單:啟動網(wǎng)絡攝像頭并讀取每個幀將此框架傳遞給模型進行分類,即預測類用電腦隨意移動計算分數(shù)def prepImg(pth):
return cv2.resize(pth,(300,300)).reshape(1,300,300,3)
with open('model.json', 'r') as f:
loaded_model_json = f.read()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("modelweights.h5")
print("Loaded model from disk")
for rounds in range(NUM_ROUNDS):
pred = ""
for i in range(90):
ret,frame = cap.read()
# Countdown
if i//20 < 3 :
frame = cv2.putText(frame,str(i//20+1),(320,100),cv2.FONT_HERSHEY_SIMPLEX,3,(250,250,0),2,cv2.LINE_AA)
# Prediction
elif i/20 < 3.5:
pred = arr_to_shape[np.a(chǎn)rgmax(loaded_model.predict(prepImg(frame[50:350,100:400])))]
# Get Bots Move
elif i/20 == 3.5:
bplay = random.choice(options)
print(pred,bplay)
# Update Score
elif i//20 == 4:
playerScore,botScore = updateScore(pred,bplay,playerScore,botScore)
break
cv2.rectangle(frame, (100, 150), (300, 350), (255, 255, 255), 2)
frame = cv2.putText(frame,"Player : {} Bot : {}".format(playerScore,botScore),(120,400),cv2.FONT_HERSHEY_SIMPLEX,1,(250,250,0),2,cv2.LINE_AA)
frame = cv2.putText(frame,pred,(150,140),cv2.FONT_HERSHEY_SIMPLEX,1,(250,250,0),2,cv2.LINE_AA)
frame = cv2.putText(frame,"Bot Played : {}".format(bplay),(300,140),cv2.FONT_HERSHEY_SIMPLEX,1,(250,250,0),2,cv2.LINE_AA)
cv2.imshow('Rock Paper Scissor',frame)
if cv2.waitKey(1) & 0xff == ord('q'):
break
上面的代碼片段包含相當重要的代碼塊,其余部分只是使游戲易于使用,RPS規(guī)則和得分。所以我們開始加載我們訓練過的模型,它在開始程序的預測部分之前顯示倒計時,預測后,分數(shù)會根據(jù)球員的動作進行更新。
我們使用cv2.rectangle()顯式地繪制目標區(qū)域,使用prepImg()函數(shù)預處理后,只有幀的這一部分傳遞給模型進行預測。
結論:我們已經(jīng)成功地實現(xiàn)并學習了這個項目的工作原理,所以請繼續(xù)使用我的實現(xiàn)進行其它實驗學習。我做的一個主要的改進可能是增加了手部檢測,所以我們不需要顯式地繪制目標區(qū)域,模型將首先檢測手部位置,然后進行預測。我鼓勵你改進這個項目,并給我你的建議。精益求精!
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
10月31日立即下載>> 【限時免費下載】TE暖通空調系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市