<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>

          基于計(jì)算機(jī)視覺的棋盤圖像識(shí)別

          共 5477字,需瀏覽 11分鐘

           ·

          2020-12-23 16:39

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

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

          本期我們將一起學(xué)習(xí)如何使用計(jì)算機(jī)視覺技術(shù)識(shí)別棋子及其在棋盤上的位置

          我們利用計(jì)算機(jī)視覺技術(shù)和卷積神經(jīng)網(wǎng)絡(luò)(CNN)為這個(gè)項(xiàng)目創(chuàng)建分類算法,并確定棋子在棋盤上的位置。最終的應(yīng)用程序會(huì)保存整個(gè)圖像并可視化的表現(xiàn)出來,同時(shí)輸出棋盤的2D圖像以查看結(jié)果。

          (左)實(shí)時(shí)攝像機(jī)進(jìn)給的幀和棋盤的(右)二維圖像


          01. 數(shù)據(jù)

          我們對(duì)該項(xiàng)目的數(shù)據(jù)集有很高的要求,因?yàn)樗罱K會(huì)影響我們的實(shí)驗(yàn)結(jié)果。我們?cè)诰W(wǎng)上能找到的國(guó)際象棋數(shù)據(jù)集是使用不同的國(guó)際象棋集、不同的攝影機(jī)拍攝得到的,這導(dǎo)致我們創(chuàng)建了自己的數(shù)據(jù)集。我使用國(guó)際象棋和攝像機(jī)(GoPro Hero6 Black以“第一人稱視角”角度)生成了自定義數(shù)據(jù)集,這使我的模型更加精確。該數(shù)據(jù)集包含2406張圖像,分為13類(請(qǐng)參閱下文)。總結(jié):這花費(fèi)了我們很多時(shí)間,但是這使得訓(xùn)練圖像盡可能地接近在應(yīng)用程序中使用時(shí)所看到的圖像。

          自定義數(shù)據(jù)集的細(xì)分

          為了構(gòu)建該數(shù)據(jù)集,我首先創(chuàng)建了capture_data.py,當(dāng)單擊S鍵時(shí),該視頻從視頻流中獲取一幀并將其保存。這個(gè)程序使我能夠無縫地更改棋盤上的棋子并一遍又一遍地捕獲棋盤的圖像,直到我建立了大量不同的棋盤配置為止。接下來,我創(chuàng)建了create_data.py,以使用下一部分中討論的檢測(cè)技術(shù)將其裁剪為單獨(dú)小塊。最后,我通過將裁剪后的圖像分成帶標(biāo)簽的文件夾來對(duì)它們進(jìn)行分類。


          02. 棋盤檢測(cè)

          對(duì)于棋盤檢測(cè),我想做的事情比使用OpenCV函數(shù)findChessboardCorners復(fù)雜的多,但又不像CNN那樣高級(jí)。使用低級(jí)和中級(jí)計(jì)算機(jī)視覺技術(shù)來查找棋盤的特征,然后將這些特征轉(zhuǎn)換為外邊界和64個(gè)獨(dú)立正方形的坐標(biāo)。該過程以Canny邊緣檢測(cè)和Hough變換生成的相交水平線、垂直線的交點(diǎn)為中心。層次聚類用于按距離對(duì)交叉點(diǎn)進(jìn)行分組,并對(duì)各組取平均值以創(chuàng)建最終坐標(biāo)(請(qǐng)參見下文)。

          完整的棋盤檢測(cè)過程


          03. 棋盤分類


          項(xiàng)目伊始,我們想使用Keras / TensorFlow創(chuàng)建CNN模型并對(duì)棋子進(jìn)行分類。但是,在創(chuàng)建數(shù)據(jù)集之后,僅考慮CNN的大小,單靠CNN就無法獲得想要的結(jié)果。為了克服這一障礙,我利用了ImageDataGenerator和transfer learning,它增加了我的數(shù)據(jù)并使用了其他預(yù)訓(xùn)練的模型作為基礎(chǔ)。

          創(chuàng)建CNN模型

          為了使用GPU,我在云中創(chuàng)建并訓(xùn)練了CNN模型,從而大大減少了訓(xùn)練時(shí)間。快速提示:Google Colab是使用GPU快速入門的簡(jiǎn)便方法。為了提高數(shù)據(jù)的有效性,我使用了ImageDataGenerator來擴(kuò)展原始圖像并將模型暴露給不同版本的數(shù)據(jù)。ImageDataGenerator函數(shù)針對(duì)每個(gè)時(shí)期隨機(jī)旋轉(zhuǎn),重新縮放和翻轉(zhuǎn)(水平)訓(xùn)練數(shù)據(jù),從本質(zhì)上創(chuàng)建了更多數(shù)據(jù)。盡管還有更多的轉(zhuǎn)換選項(xiàng),但這些轉(zhuǎn)換選項(xiàng)對(duì)該項(xiàng)目最有效。

          from keras.preprocessing.image import ImageDataGeneratordatagen = ImageDataGenerator(        rotation_range=5,        rescale=1./255,        horizontal_flip=True,        fill_mode='nearest')test_datagen = ImageDataGenerator(rescale=1./255)train_gen = datagen.flow_from_directory(    folder + '/train',    target_size = image_size,    batch_size = batch_size,    class_mode = 'categorical',    color_mode = 'rgb',    shuffle=True)test_gen = test_datagen.flow_from_directory(    folder + '/test',    target_size = image_size,    batch_size = batch_size,    class_mode = 'categorical',    color_mode = 'rgb',    shuffle=False)

          我們沒有從頭開始訓(xùn)練模型,而是通過利用預(yù)先訓(xùn)練的模型并添加了使用我的自定義數(shù)據(jù)集訓(xùn)練的頂層模型來實(shí)現(xiàn)轉(zhuǎn)移學(xué)習(xí)。我遵循了典型的轉(zhuǎn)移學(xué)習(xí)工作流程:

          1.從先前訓(xùn)練的模型(VGG16)中獲取圖層。

          from keras.applications.vgg16 import VGG16model = VGG16(weights='imagenet')model.summary()

          2.凍結(jié)他們,以避免破壞他們?cè)谟?xùn)練回合中包含的任何信息。

          3.在凍結(jié)層的頂部添加了新的可訓(xùn)練層。

          from keras.models import Sequentialfrom keras.layers import Dense, Conv2D, MaxPooling2D, Flattenfrom keras.models import Modelbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3))  # Freeze convolutional layers from VGG16for layer in base_model.layers:    layer.trainable = False# Establish new fully connected blockx = base_model.outputx = Flatten()(x) x = Dense(500, activation='relu')(x) x = Dense(500, activation='relu')(x)predictions = Dense(13, activation='softmax')(x)# This is the model we will trainmodel = Model(inputs=base_model.input, outputs=predictions)model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy'])

          4.在自定義數(shù)據(jù)集上訓(xùn)練新層。

          epochs = 10history = model.fit(    train_gen,     epochs=epochs,    verbose = 1,    validation_data=test_gen)model.save_weights('model_VGG16.h5')

          當(dāng)我們使用VGG16或VGG19作為預(yù)訓(xùn)練模型創(chuàng)建模型時(shí),由于驗(yàn)證精度更高,因此選擇了使用VGG16的模型。另外,最佳epochs 是10。任何大于10的數(shù)均不會(huì)使驗(yàn)證準(zhǔn)確性的提高,也不會(huì)增加訓(xùn)練與驗(yàn)證準(zhǔn)確性之間的差異。總結(jié):轉(zhuǎn)移學(xué)習(xí)使我們可以充分利用深度學(xué)習(xí)在圖像分類中的優(yōu)勢(shì),而無需大型數(shù)據(jù)集。


          04. 結(jié)果

          為了更好地可視化驗(yàn)證準(zhǔn)確性,我創(chuàng)建了模型預(yù)測(cè)的混淆矩陣。通過此圖表,可以輕松評(píng)估模型的優(yōu)缺點(diǎn)。優(yōu)點(diǎn):空-準(zhǔn)確率為99%,召回率為100%;白棋和黑棋(WP和BP)-F1得分約為95%。劣勢(shì):白騎士(WN)-召回率高(98%),但準(zhǔn)確性卻很低(65%);白主教(WB)-召回率最低,為74%。

          測(cè)試數(shù)據(jù)的混淆矩陣


          05. 應(yīng)用

          該應(yīng)用程序的目標(biāo)是使用CNN模型并可視化每個(gè)步驟的性能。我們創(chuàng)建了cv_chess.py,它清楚地顯示了步驟,并創(chuàng)建了cv_chess_functions.py,它顯示了每個(gè)步驟的詳細(xì)信息。此應(yīng)用程序保存實(shí)時(shí)視頻流中的原始幀,每個(gè)正方形的64個(gè)裁剪圖像以及棋盤的最終2D圖像。

          print('Working...')        # Save the frame to be analyzed        cv2.imwrite('frame.jpeg', frame)        # Low-level CV techniques (grayscale & blur)        img, gray_blur = read_img('frame.jpeg')        # Canny algorithm        edges = canny_edge(gray_blur)        # Hough Transform        lines = hough_line(edges)        # Separate the lines into vertical and horizontal lines        h_lines, v_lines = h_v_lines(lines)        # Find and cluster the intersecting        intersection_points = line_intersections(h_lines, v_lines)        points = cluster_points(intersection_points)        # Final coordinates of the board        points = augment_points(points)        # Crop the squares of the board a organize into a sorted list        x_list = write_crop_images(img, points, 0)        img_filename_list = grab_cell_files()        img_filename_list.sort(key=natural_keys)        # Classify each square and output the board in Forsyth-Edwards Notation (FEN)        fen = classify_cells(model, img_filename_list)        # Create and save the board image from the FEN        board = fen_to_image(fen)        # Display the board in ASCII        print(board)# Display and save the chessboard image        board_image = cv2.imread('current_board.png')        cv2.imshow('current board', board_image)        print('Completed!')


          代碼鏈接:https://github.com/andrewleeunderwood/project_MYM


          下載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)目31講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目31講,即可下載包括圖像分割、口罩檢測(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)階。

          下載4:leetcode算法開源書
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):leetcode,即可下載。每題都 runtime beats 100% 的開源好書,你值得擁有!




          交流群


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


          瀏覽 53
          點(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>
                  男女激情综合福利网站在线观看 | 操屄视频在线免费观看 | 狠狠躁狠狠躁视频专区 | 在线观看女人爽网 | 免费观看日本污的视频 |