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

          C++版OpenCV里的機(jī)器學(xué)習(xí)

          共 6759字,需瀏覽 14分鐘

           ·

          2023-07-28 07:04

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

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

          如果你在使用C ++安裝OpenCV時(shí)遇到任何麻煩,下面這個(gè)視頻,展示了如何輕松安裝它。
          • https://youtu.be/IzaXRux_FAY

          使用openCV的Knn

          定義
          在人工智能中,更確切地說在機(jī)器學(xué)習(xí)中,k最近鄰方法是一種有監(jiān)督的學(xué)習(xí)方法。
          在這個(gè)框架中,我們有一個(gè)由N個(gè)“輸入-輸出”對(duì)組成的訓(xùn)練數(shù)據(jù)庫(kù)。
          為了估計(jì)與新輸入x 相關(guān)聯(lián)的輸出,k最近鄰方法包括根據(jù)要定義的距離(以相同的方式)考慮k個(gè)訓(xùn)練樣本,其輸入最接近新輸入x。
          由于此算法基于距離,因此歸一化可以提高其準(zhǔn)確性。
          方法
          因此,要使用KNN方法進(jìn)行分類,我們必須首先聲明訓(xùn)練樣本,或者可以說輸入數(shù)據(jù)。
          在聲明了0和1矩陣之后,我們必須使用函數(shù)“RNG”將它們填充為隨機(jī)值。
          現(xiàn)在我們需要將兩個(gè)類連接起來,以便進(jìn)行學(xué)習(xí)。
          訓(xùn)練
          要進(jìn)行訓(xùn)練,你必須首先使用以下代碼行創(chuàng)建模型:
          現(xiàn)在,我們將進(jìn)行遍歷整個(gè)圖像的循環(huán)(我們選擇的平面為500x500像素,以繪制不同類別的區(qū)域,當(dāng)然也將點(diǎn)放置在它們的位置),然后學(xué)習(xí)模型的輸出對(duì)于第一類將為0,對(duì)于第二類將為1。
          通過查找(或者可以說通過計(jì)算距離),我們用定義該像素屬于此類的顏色填充圖像的每個(gè)像素,這樣就可以使邊框可視化。
          因此,要進(jìn)行訓(xùn)練,你必須首先使用以下代碼行創(chuàng)建模型:
          因此,你可以看到我們具有find_nearest函數(shù),該函數(shù)計(jì)算入口點(diǎn)與其他點(diǎn)之間的距離以查找鄰居,然后該函數(shù)為第一個(gè)類返回0或?yàn)榈诙€(gè)返回1。
          最后,我們使用了條件塊if,為每個(gè)類賦予特定的顏色。
          因此,通過執(zhí)行這些步驟,我們進(jìn)行了學(xué)習(xí),找到了兩個(gè)類,并且我們當(dāng)然劃定了邊界,如圖:
          現(xiàn)在,如果我們想展示用于學(xué)習(xí)的樣本,我們只需要把每個(gè)要點(diǎn)放在適當(dāng)?shù)奈恢眉纯?,這樣我們就可以了解學(xué)習(xí)是否做得很好。
          這是樣本表示后的輸出圖像:
          可以看出,這兩個(gè)類的界限是明確的,有一些點(diǎn)沒有很好地分類,但總的來說,學(xué)習(xí)效果不錯(cuò)。
          測(cè)試
          對(duì)于測(cè)試,我們聲明了一個(gè)200個(gè)元素的矩陣來進(jìn)行測(cè)試,并且在計(jì)算了這些樣本的最近鄰居之后,我們放了一個(gè)小循環(huán)來計(jì)算兩類的分類良好的樣本和分類不良的樣本。
          這是測(cè)試樣本的表示:

          評(píng)估
          現(xiàn)在,我們必須通過查看分類良好和分類較差的樣本來評(píng)估我們的模型。
          為了理解我們將要做什么,我將舉一個(gè)小例子。
          在我們的例子中,我們有兩個(gè)類,第一個(gè)包含綠色點(diǎn),另一個(gè)包含紅色點(diǎn)。
          為了進(jìn)行評(píng)估,我們必須放置一類好的和一類不好的,因此,在這里我將舉一個(gè)例子:
          對(duì)于綠點(diǎn),我們將說它們代表未生病的人(好的類),紅點(diǎn)代表生病的人(壞的類)。
          • 如果有病的人被歸類為有病的人(帶有紅點(diǎn)),那么在這里我們說他是一個(gè)真陰性(正確分類為真,生病為陰性)。
          • 如果將一個(gè)有病的人歸類為沒有生病的人,那么在這里我們說這是一個(gè)假陰性(錯(cuò)誤分類為假,生病為陰性)。
          • 如果沒有生病的人被歸類為沒有生病的人(帶有綠色),那么在這里我們說這是一個(gè)真陽(yáng)性(對(duì)于分類良好的人來說是真,對(duì)于沒有病的人來說是陽(yáng)性)。
          • 如果未生病的人被歸類為生病的人,那么在這里我們說這是假陽(yáng)性。
          因此,從這個(gè)原理開始,我們對(duì)結(jié)果進(jìn)行評(píng)估,以便我們可以計(jì)算精度
          TP:真陽(yáng)性
          TN:真陰性
          FP:假陽(yáng)性
          FN:假陰性
          因此,由于我們知道16個(gè)綠色的錯(cuò)誤分類點(diǎn)和9個(gè)紅色的錯(cuò)誤分類點(diǎn),并且知道每個(gè)類別的總點(diǎn)數(shù)是200,因此我們可以輕松地填充表格。
          現(xiàn)在,使用這些值,我們可以計(jì)算出準(zhǔn)確度
          準(zhǔn)確度
          召回
          特異性
          每個(gè)類的錯(cuò)誤
          第1類:
          第2類:
          總誤差

          具有OpenCV的SVM

          定義
          支持向量機(jī)或大邊緣分離器是一組有監(jiān)督的學(xué)習(xí)技術(shù),旨在解決判別和回歸問題。支持向量機(jī)是線性分類器的推廣。
          支持向量機(jī)可用于解決判別問題,即確定樣本屬于哪一類,或回歸問題,即預(yù)測(cè)變量的數(shù)值。解決這兩個(gè)問題需要構(gòu)造一個(gè)函數(shù)h,該函數(shù)與輸入向量x匹配輸出 y: y=h(x)
          在我們的例子中,我們將對(duì)包含隨機(jī)點(diǎn)的兩個(gè)類進(jìn)行分類,就像我們對(duì)KNN方法所做的那樣。
          方法
          在這種方法中,我們將執(zhí)行與KNN中幾乎相同的操作,但是在這里我們必須做不同的部分。
          第一個(gè)訓(xùn)練將始終使用具有正態(tài)分布函數(shù)的兩類100個(gè)隨機(jī)元素進(jìn)行訓(xùn)練,然后我們必須生成200個(gè)元素的其他測(cè)試樣本,然后進(jìn)行預(yù)測(cè)。
          因?yàn)槿绻覀兪冀K使用訓(xùn)練樣本,那么我們將無法研究生成的模型的性能。
          因此,要進(jìn)行學(xué)習(xí),我們還必須為兩個(gè)類創(chuàng)建兩個(gè)矩陣,然后將它們連接起來并將其放入SVM模型的輸入中。(與我們之前所做的相同)。
          要進(jìn)行學(xué)習(xí),我們必須執(zhí)行以下行:

          但是在此之前,我們必須通過執(zhí)行以下操作來初始化模型參數(shù):(我們使用了RBF核心)

          如果我們很好地注意到,當(dāng)我們啟動(dòng)學(xué)習(xí)時(shí),我們添加了類的向量,因?yàn)槲覀冋f這是監(jiān)督學(xué)習(xí),這意味著我們必須將類的名稱提供給模型。
          邊界顯示
          訓(xùn)練后,我們需要像在KNN中所做的那樣對(duì)數(shù)據(jù)進(jìn)行表示,這樣我們就可以看到邊界,也可以看到模型是否根據(jù)我們擁有的訓(xùn)練數(shù)據(jù)很好地選擇了邊界。
          我們注意到邊界確實(shí)使這兩個(gè)類之間有所不同,有些點(diǎn)很難分類,但基本上,學(xué)習(xí)做得很好。
          測(cè)試
          現(xiàn)在,我們需要通過聲明其他測(cè)試樣本來測(cè)試模型,并使用預(yù)測(cè)函數(shù)直接在模型中運(yùn)行它們,以預(yù)測(cè)每個(gè)點(diǎn)屬于哪個(gè)類。
          為此,我們?yōu)閮蓚€(gè)類聲明了另外兩個(gè)矩陣,每個(gè)矩陣包含200個(gè)測(cè)試項(xiàng)目。
          最后,只需通過執(zhí)行以下行來傳遞級(jí)聯(lián)矩陣(該矩陣包含兩個(gè)類的數(shù)據(jù))就可以了:
          這是測(cè)試結(jié)果:
          評(píng)估
          因此,由于我們知道16個(gè)綠色的錯(cuò)誤分類點(diǎn)和9個(gè)紅色的錯(cuò)誤分類點(diǎn),并且知道每個(gè)類別的總點(diǎn)數(shù)是200,因此我們可以輕松地填充表格。
          準(zhǔn)確度
          召回率
          特異性
          每個(gè)類的錯(cuò)誤
          第1類:
          第2類:
          總誤差
          結(jié)論
          總而言之,我們可以看到,獲得的評(píng)估值非常令人滿意。因?yàn)檎`差非常小,所以精度很高,這意味著該模型學(xué)習(xí)得很好,如果我們?cè)诖伺渲孟率褂肧VM模型,那么它將在這種類型的應(yīng)用程序中很好地工作。

          詞袋

          介紹
          在我們了解了如何將支持向量機(jī)用于一個(gè)基本案例之后,我們將嘗試在圖像上應(yīng)用支持向量機(jī)模型來進(jìn)行分類。
          為此,我們有一個(gè)4個(gè)類的數(shù)據(jù)庫(kù),每個(gè)類都有隔離的圖像。
          但這里的問題是,一個(gè)圖像包含幾個(gè)特征,因此如果我們想使用圖像,那么它將是一個(gè)具有大量值的輸入矩陣,這將使學(xué)習(xí)過程非常緩慢,甚至無法確定它們是否是正確的特征。
          這就是為什么我們需要找到一種方法,幫助我們從圖像中提取必要的信息,我們將學(xué)習(xí)這些信息。因?yàn)槿绻覀儾贿@樣做,那么輸入向量將是整個(gè)圖像。
          所以這里的想法是從圖像中找到只包含圖像重要信息的描述符,所以這里或者我們將使用BOW(bag of words)和SURF的方法。
          SURF方法用于提取圖像的興趣點(diǎn),它可以是輪廓、圓……因?yàn)槿绻覀冎惶崛D像的興趣點(diǎn),那么輸入向量將很大程度上非常小,并且只包含必要的內(nèi)容,這樣學(xué)習(xí)將非???。
          創(chuàng)建字典
          在進(jìn)行學(xué)習(xí)之前,我們說過必須先找到興趣點(diǎn),然后將它們放在單個(gè)矩陣中,所以此矩陣稱為字典,然后從該字典中對(duì)興趣點(diǎn)最多的圖像進(jìn)行分類分組。
          為了提取點(diǎn),我們將使用可完成此工作的openCV函數(shù)。我們決定為每個(gè)類拍攝10張圖像進(jìn)行訓(xùn)練,因此即使字典也必須包含10張圖像的信息,因此這是我們用來提取興趣點(diǎn)的代碼行:
          因此,這些代碼行將提取這些點(diǎn)并將其放入描述符中,最后,我們將此描述符放入保存的字典中,并在學(xué)習(xí)部分中使用它。
          訓(xùn)練
          提取興趣點(diǎn)并填充字典后,我們需要找到包含我們所有學(xué)習(xí)圖像之間共有興趣點(diǎn)的圖。
          我們將使用以下代碼行來進(jìn)行學(xué)習(xí),并使用此圖:
          對(duì)于模型的參數(shù),我們使用與點(diǎn)相同的參數(shù),也使用RBF內(nèi)核。
          因此,在訓(xùn)練完成之后,我們必須保存模型,以便稍后在測(cè)試部分中使用它。
          測(cè)試
          現(xiàn)在我們必須使用openCV的預(yù)測(cè)功能來測(cè)試模型,但是在執(zhí)行此操作之前,我們必須知道對(duì)于測(cè)試來說是一樣的,我們不會(huì)將整個(gè)圖像都放入模型的輸入中,而是相反,我們必須在此處應(yīng)用相同的SURF算法來提取該圖像的興趣點(diǎn),并獲得將要在預(yù)測(cè)輸入中獲得的此描述符。
          因此,對(duì)于測(cè)試,我選擇了每個(gè)類別的15張圖像,以便我們可以簡(jiǎn)單地構(gòu)建混淆矩陣。
          在將我解釋的方法應(yīng)用于所有測(cè)試圖像后,我得到了以下混淆矩陣:
          該矩陣表示:
          • 在有關(guān)手風(fēng)琴對(duì)象的15張測(cè)試圖像中,有5張分類錯(cuò)誤的圖像和10張分類正確的圖像。
          • 對(duì)于“飛機(jī)”:分類良好的11張圖像,分類不良的4張
          • 對(duì)于“錨”:5張圖像分類良好,10張圖像分類不良。
          • 對(duì)于“螞蟻”:8張分類良好的圖像和7張分類不良的圖像。
          我們注意到,對(duì)于“手風(fēng)琴”,“飛機(jī)”和“螞蟻”,該模型比“錨”模型更為敏感,因?yàn)樗雌饋砗芟耧w機(jī),因此飛機(jī)和錨點(diǎn)的興趣點(diǎn)非常接近這意味著很難在測(cè)試級(jí)別上區(qū)分這兩個(gè)對(duì)象
          評(píng)估
          為了進(jìn)行評(píng)估,我們將計(jì)算每個(gè)類的誤差和全局誤差。盡管如此,我們可以注意到該模型的性能較差。
          在計(jì)算了局部誤差之后,我們可以看到它并不是真正有效,這是由于以下幾個(gè)因素造成的:
          • 數(shù)據(jù)的類型非常接近,這使得4個(gè)類的關(guān)注點(diǎn)的提取變得非常接近。
          • 訓(xùn)練數(shù)據(jù),我們每班僅使用10張圖像,而有必要放置更多圖像,以便該模型在許多圖像上學(xué)習(xí)更多。
          • 而且在測(cè)試級(jí)別上,我們僅對(duì)15張圖像進(jìn)行了測(cè)試,也許如果我們?cè)黾訙y(cè)試數(shù)據(jù),則誤差會(huì)有所降低。
          結(jié)論
          將SVM與SURF一起使用是一種很好的方法,因?yàn)樗苊饬藢W(xué)習(xí)圖像的所有像素,并且使模型更加準(zhǔn)確,并包含了對(duì)圖像進(jìn)行分類所必需的功能。
          但在這種情況下,僅僅有一個(gè)好的模型是不夠的,這就給出了一個(gè)好的分類——也許描述符的選擇做得不好。這是我們?cè)跊]有神經(jīng)網(wǎng)絡(luò)的情況下制定機(jī)器學(xué)習(xí)算法時(shí)將會(huì)遇到的問題之一,這意味著我們必須自己選擇特征(我說自己是因?yàn)槲覀儽仨毞胖猛獠克惴▉硖崛√卣鳎?,但使用神經(jīng)網(wǎng)絡(luò),所有這些工作將自動(dòng)完成,并且特征的提取將在學(xué)習(xí)過程中由網(wǎng)絡(luò)完成。
          不幸的是,由于缺乏數(shù)據(jù),我們無法對(duì)案件進(jìn)行神經(jīng)網(wǎng)絡(luò)處理。因?yàn)槲艺J(rèn)為即使在這種情況下的神經(jīng)網(wǎng)絡(luò)也無法提供更準(zhǔn)確的結(jié)果。
          你可以在此鏈接中找到代碼
          https://github.com/amine0110/opencv-for-machine-learning-using-cpp


               
          下載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)出群,謝謝理解~


          瀏覽 433
          點(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>
                  污视频毛片 | 欧美视频亚洲色图 | 男女操逼拍小视频 | 黄色影片A片 | 日韩婷婷|