1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5106字,需瀏覽 11分鐘

         ·

        2022-03-16 04:48

        點擊上方小白學視覺”,選擇加"星標"或“置頂

        重磅干貨,第一時間送達

        這個項目的代碼可以在我的Github上找到
        • https://github.com/HOD101s/RockPaperScissor-AI-?

        簡介

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

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

        ?

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

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

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

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

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

        ?

        通過遷移學習建立我們的模型:
        ?

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

        ?

        實現(xiàn)

        我已經(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.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)鍵點 :
        • 由于我們的圖片尺寸為300x300,因此指定的輸入形狀也為3x300x300,3代表RGB的維度信息,因此該層具有足夠的神經(jīng)元來處理整個圖像。
        • 我們將DenseNet層用作第一層,然后使用我們自己的Dense神經(jīng)網(wǎng)絡。
        • 我已將可訓練參數(shù)設置為True,這也會重新訓練DenseNet的權(quán)重。盡管花了很多時間,但是這給了我更好的結(jié)果。我建議你在自己的實現(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.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
        上面的代碼片段包含相當重要的代碼塊,其余部分只是使游戲易于使用,RPS規(guī)則和得分。
        所以我們開始加載我們訓練過的模型,它在開始程序的預測部分之前顯示倒計時,預測后,分數(shù)會根據(jù)球員的動作進行更新。
        我們使用cv2.rectangle()顯式地繪制目標區(qū)域,使用prepImg()函數(shù)預處理后,只有幀的這一部分傳遞給模型進行預測。
        整個play.py在我的repo上有代碼(https://github.com/HOD101s/RockPaperScissor-AI-/blob/master/play.py)。?

        結(jié)論:

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

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

        下載3:OpenCV實戰(zhàn)項目20講
        小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

        交流群


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


        瀏覽 36
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91福利国产成人精品播放 | 在线观看一级片 | av插b| 文中字幕一区二区三区视频播放 | 亲亲艺术一区二区 | 精品人妻伦一二三区蜜桃视频 | 美谷朱里av在线播放 | 青娱乐91成人电影 | 男女超爽视频 | 黄色三级片在线免费观看 |