<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用OpenCV構(gòu)建會(huì)玩石頭剪刀布的AI

          共 5106字,需瀏覽 11分鐘

           ·

          2022-03-16 04:48

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          這個(gè)項(xiàng)目的代碼可以在我的Github上找到
          • https://github.com/HOD101s/RockPaperScissor-AI-?

          簡(jiǎn)介

          這個(gè)項(xiàng)目的基礎(chǔ)是深度學(xué)習(xí)和圖像分類,目的是創(chuàng)建一個(gè)簡(jiǎn)單而有趣的石頭剪刀布游戲。首先,這個(gè)項(xiàng)目是我在5月份的COVID19隔離期中無(wú)聊的產(chǎn)物,希望當(dāng)你讀到這個(gè)時(shí),一切都恢復(fù)正常了。我的目的是通過這篇文章用簡(jiǎn)單的術(shù)語(yǔ)向初學(xué)者解釋這個(gè)項(xiàng)目的基本原理。讓我們開始吧!
          在構(gòu)建任何類型的深度學(xué)習(xí)應(yīng)用程序時(shí),有三個(gè)主要步驟:
          1. 收集和處理數(shù)據(jù)
          2. 建立一個(gè)合適的人工智能模型
          3. 部署使用
          整個(gè)項(xiàng)目都引用了我的Github repo,并與之?dāng)y手并進(jìn),所以請(qǐng)做好參考準(zhǔn)備。
          項(xiàng)目地址:https://github.com/HOD101s/RockPaperScissor-AI-?

          收集我們的數(shù)據(jù)

          ?

          任何深度學(xué)習(xí)模型的基礎(chǔ)都是數(shù)據(jù),任何一位機(jī)器學(xué)習(xí)工程師都會(huì)同意這一點(diǎn),在ML中,數(shù)據(jù)遠(yuǎn)比算法本身重要。我們需要收集石頭,布和剪刀的符號(hào)圖像,我沒有下載別人的數(shù)據(jù)并在上面進(jìn)行訓(xùn)練,而是制作了自己的數(shù)據(jù)集,鼓勵(lì)你也建立自己的數(shù)據(jù)集。之后嘗試更改數(shù)據(jù)并重新訓(xùn)練模型,以查看數(shù)據(jù)對(duì)深度學(xué)習(xí)模型究竟有怎樣的影響。
          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()
          我使用了Python的OpenCV庫(kù)進(jìn)行所有與相機(jī)相關(guān)的操作,所以這里的label指的是圖像屬于哪個(gè)類,根據(jù)標(biāo)簽,圖像保存在適當(dāng)?shù)哪夸浿?。ct和maxCt是用來(lái)保存圖像的起始索引和最終索引,剩下的是標(biāo)準(zhǔn)的OpenCV代碼,用于獲取網(wǎng)絡(luò)攝像頭源并將圖像保存到目錄中。需要注意的一點(diǎn)是,我所有的圖片維數(shù)都是300 x 300的。運(yùn)行此目錄樹后,我的目錄樹如下所示。
          C:.
          ├───paper
          │ paper0.jpg
          │ paper1.jpg
          │ paper2.jpg

          ├───rock
          │ rock0.jpg
          │ rock1.jpg
          │ rock2.jpg

          └───scissor
          scissor0.jpg
          scissor1.jpg
          scissor2.jpg
          如果你引用的是Github存儲(chǔ)庫(kù)(https://github.com/HOD101s/RockPaperScissor-AI-) ,則getData.py會(huì)為你完成這項(xiàng)工作!

          預(yù)處理我們的數(shù)據(jù)
          ?

          我們需要使用圖像,而計(jì)算機(jī)可以識(shí)別數(shù)字,因此,我們將所有圖像轉(zhuǎn)換為它們各自的矢量表示,另外,我們的標(biāo)簽尚待生成,由于已建立的標(biāo)簽不能是文本,因此我使用shape_to_label字典為每個(gè)類手動(dòng)構(gòu)建了“獨(dú)熱編碼”表示。
          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)
          當(dāng)我們根據(jù)類將圖像保存在目錄中時(shí),目錄名用作標(biāo)簽,該標(biāo)簽使用shape_to_label字典轉(zhuǎn)換為獨(dú)熱表示。在我們遍歷系統(tǒng)中的文件以訪問圖像之后,cv2.imread()函數(shù)返回圖像的矢量表示。
          我們通過翻轉(zhuǎn)圖像并放大圖像來(lái)進(jìn)行一些手動(dòng)的數(shù)據(jù)增強(qiáng),這增加了我們的數(shù)據(jù)集大小,而無(wú)需拍攝新照片,數(shù)據(jù)增強(qiáng)是生成數(shù)據(jù)集的關(guān)鍵部分。最后,圖像和標(biāo)簽存儲(chǔ)在單獨(dú)的numpy數(shù)組中。
          • cv2.imread()函數(shù)
            • https://www.geeksforgeeks.org/python-opencv-cv2-imread-method/
          更多關(guān)于數(shù)據(jù)增強(qiáng)的信息。
          • https://towardsdatascience.com/data-augmentation-for-deep-learning-4fe21d1a4eb9

          ?

          通過遷移學(xué)習(xí)建立我們的模型:
          ?

          在處理圖像數(shù)據(jù)時(shí),有許多經(jīng)過預(yù)訓(xùn)練的模型可供使用,這些模型已經(jīng)在具有數(shù)千個(gè)標(biāo)簽的數(shù)據(jù)集上進(jìn)行了訓(xùn)練,由于這些模型通過其應(yīng)用程序api的Tensorflow和Keras分布,我們可以使用這些模型,這使得在我們的應(yīng)用程序中包含這些預(yù)先訓(xùn)練的模型看起來(lái)很容易!
          總之,遷移學(xué)習(xí)采用的是經(jīng)過預(yù)訓(xùn)練的模型,并且不包含進(jìn)行最終預(yù)測(cè)的最終層,能夠區(qū)分這種情況下圖像中的特征,并將這些信息傳遞給我們自己的Dense神經(jīng)網(wǎng)絡(luò)。
          為什么不訓(xùn)練你自己的模型呢?完全取決于你!然而,使用遷移學(xué)習(xí)可以在很多時(shí)候使你的進(jìn)步更快,從某種意義上說(shuō),你避免了重復(fù)造輪子。
          其他一些受歡迎的預(yù)訓(xùn)練模型:
          • InceptionV3
          • VGG16/19
          • ResNet
          • MobileNet
          這是一篇關(guān)于遷移學(xué)習(xí)的有趣文章!
          • https://ruder.io/transfer-learning/
          注:每當(dāng)我們處理圖像數(shù)據(jù)時(shí),幾乎都會(huì)使用卷積神經(jīng)層,這里使用的遷移學(xué)習(xí)模型就有這些層。有關(guān)CNNs的更多信息,請(qǐng)?jiān)L問:
          • https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep-learning-99760835f148

          ?

          實(shí)現(xiàn)

          我已經(jīng)使用DenseNet121模型進(jìn)行特征提取,其輸出最終將輸入到我自己的Dense神經(jīng)網(wǎng)絡(luò)中。
          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
          )
          關(guān)鍵點(diǎn) :
          • 由于我們的圖片尺寸為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)練!
          至此,我們已經(jīng)收集了數(shù)據(jù),建立并訓(xùn)練了模型,剩下的部分是使用OpenCV進(jìn)行部署?

          OpenCV實(shí)現(xiàn):
          ?

          此實(shí)現(xiàn)的流程很簡(jiǎ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
          上面的代碼片段包含相當(dāng)重要的代碼塊,其余部分只是使游戲易于使用,RPS規(guī)則和得分。
          所以我們開始加載我們訓(xùn)練過的模型,它在開始程序的預(yù)測(cè)部分之前顯示倒計(jì)時(shí),預(yù)測(cè)后,分?jǐn)?shù)會(huì)根據(jù)球員的動(dòng)作進(jìn)行更新。
          我們使用cv2.rectangle()顯式地繪制目標(biāo)區(qū)域,使用prepImg()函數(shù)預(yù)處理后,只有幀的這一部分傳遞給模型進(jìn)行預(yù)測(cè)。
          整個(gè)play.py在我的repo上有代碼(https://github.com/HOD101s/RockPaperScissor-AI-/blob/master/play.py)。?

          結(jié)論:

          我們已經(jīng)成功地實(shí)現(xiàn)并學(xué)習(xí)了這個(gè)項(xiàng)目的工作原理,所以請(qǐng)繼續(xù)使用我的實(shí)現(xiàn)進(jìn)行其它實(shí)驗(yàn)學(xué)習(xí)。我做的一個(gè)主要的改進(jìn)可能是增加了手部檢測(cè),所以我們不需要顯式地繪制目標(biāo)區(qū)域,模型將首先檢測(cè)手部位置,然后進(jìn)行預(yù)測(cè)。我鼓勵(lì)你改進(jìn)這個(gè)項(xiàng)目,并給我你的建議。精益求精!
          原文鏈接:https://towardsdatascience.com/r-scissors-ai-using-tensorflow-and-opencv-d5fc44fc8222
          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(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)出群,謝謝理解~


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女操逼免费看 | 盗摄—AV国产盗摄 | 色网站操逼 | 欧美AAA性爱 | 台湾成人中文网 |