使用OpenCV構(gòu)建會(huì)玩石頭剪刀布的AI
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

https://github.com/HOD101s/RockPaperScissor-AI-?
簡(jiǎn)介
收集和處理數(shù)據(jù) 建立一個(gè)合適的人工智能模型 部署使用
收集我們的數(shù)據(jù)
?

PATH?=?os.getcwd()+'\\'
cap?=?cv2.VideoCapture(0)
label?=?sys.argv[1]
SAVE_PATH?=?os.path.join(PATH,?label)
try:
????os.mkdir(SAVE_PATH)
except?FileExistsError:
????pass
ct?=?int(sys.argv[2])
maxCt?=?int(sys.argv[3])+1
print("Hit?Space?to?Capture?Image")
while?True:
????ret,?frame?=?cap.read()
????cv2.imshow('Get?Data?:?'+label,frame[50:350,100:450])
????if?cv2.waitKey(1)?&?0xFF?==?ord('?'):
????????cv2.imwrite(SAVE_PATH+'\\'+label+'{}.jpg'.format(ct),frame[50:350,100:450])
????????print(SAVE_PATH+'\\'+label+'{}.jpg?Captured'.format(ct))
????????ct+=1
????if?ct?>=?maxCt:
????????break
cap.release()
cv2.destroyAllWindows()
C:.
├───paper
│ paper0.jpg
│ paper1.jpg
│ paper2.jpg
│
├───rock
│ rock0.jpg
│ rock1.jpg
│ rock2.jpg
│
└───scissor
scissor0.jpg
scissor1.jpg
scissor2.jpg
預(yù)處理我們的數(shù)據(jù) ?
DATA_PATH?=?sys.argv[1]?#?Path?to?folder?containing?data
shape_to_label?=?{'rock':np.array([1.,0.,0.,0.]),'paper':np.array([0.,1.,0.,0.]),'scissor':np.array([0.,0.,1.,0.]),'ok':np.array([0.,0.,0.,1.])}
arr_to_shape?=?{np.argmax(shape_to_label[x]):x?for?x?in?shape_to_label.keys()}
imgData?=?list()
labels?=?list()
for?dr?in?os.listdir(DATA_PATH):
????if?dr?not?in?['rock','paper','scissor']:
????????continue
????print(dr)
????lb?=?shape_to_label[dr]
????i?=?0
????for?pic?in?os.listdir(os.path.join(DATA_PATH,dr)):
????????path?=?os.path.join(DATA_PATH,dr+'/'+pic)
????????img?=?cv2.imread(path)
????????imgData.append([img,lb])
????????imgData.append([cv2.flip(img,?1),lb])?#horizontally?flipped?image
????????imgData.append([cv2.resize(img[50:250,50:250],(300,300)),lb])?#?zoom?:?crop?in?and?resize
????????i+=3
????print(i)
np.random.shuffle(imgData)
imgData,labels?=?zip(*imgData)
imgData?=?np.array(imgData)
labels?=?np.array(labels)
cv2.imread()函數(shù) https://www.geeksforgeeks.org/python-opencv-cv2-imread-method/
https://towardsdatascience.com/data-augmentation-for-deep-learning-4fe21d1a4eb9
?

InceptionV3 VGG16/19 ResNet MobileNet
https://ruder.io/transfer-learning/
https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep-learning-99760835f148
?

densenet?=?DenseNet121(include_top=False,?weights='imagenet',?classes=3,input_shape=(300,300,3))
densenet.trainable=True
def?genericModel(base):
????model?=?Sequential()
????model.add(base)
????model.add(MaxPool2D())
????model.add(Flatten())
????model.add(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)元來(lái)處理整個(gè)圖像。 我們將DenseNet層用作第一層,然后使用我們自己的Dense神經(jīng)網(wǎng)絡(luò)。 我已將可訓(xùn)練參數(shù)設(shè)置為True,這也會(huì)重新訓(xùn)練DenseNet的權(quán)重。盡管花了很多時(shí)間,但是這給了我更好的結(jié)果。我建議你在自己的實(shí)現(xiàn)中嘗試通過更改此類參數(shù)(也稱為超參數(shù))來(lái)嘗試不同的迭代。 由于我們有3類Rock-Paper-Scissor,最后一層是具有3個(gè)神經(jīng)元和softmax激活的全連接層。 最后一層返回圖像屬于3類中特定類的概率。 如果你引用的是GitHub repo(https://github.com/HOD101s/RockPaperScissor-AI-) 的train.py,則要注意數(shù)據(jù)準(zhǔn)備和模型訓(xùn)練!
OpenCV實(shí)現(xiàn): ?
啟動(dòng)網(wǎng)絡(luò)攝像頭并讀取每個(gè)幀 將此框架傳遞給模型進(jìn)行分類,即預(yù)測(cè)類 用電腦隨意移動(dòng) 計(jì)算分?jǐn)?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.argmax(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

結(jié)論:
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~
評(píng)論
圖片
表情
