最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

7.1濾波

2023-08-29 11:50 作者:亦或丫  | 我要投稿

決定先寫這一部分,害怕堅持不下去,就先把最重要的東西寫。

總是有人說K210不行,沒有openmv好,強大也就僅僅能加載AI罷了,識別結果也十分混亂。但就個人理解來講K210是強過openmv的,K210的視覺處理結果錯誤很大程度上與干擾相關聯(lián),就如同STM32與STC51類似,性能上的差異,最終會導致一定程度上的取代。

本章節(jié)的內(nèi)容:

實現(xiàn)濾波,在封裝完成的庫基礎上,對圖像處理結果進行濾波處理以提高視覺識別的精準度。

針對AI視覺分析以及顏色追蹤過程中的識別(以送藥小車視覺識別為例)

本章節(jié)的內(nèi)容完全是個人對于k210使用過程中的理解,網(wǎng)絡上應該沒有相關的資料。

設備:鴨脖K210開發(fā)板????????固件:maixpy_0.6.2_85.openmv_kmodel_v4_with_ide_support.

根據(jù)鴨脖二群內(nèi)的說法:先燒錄鴨脖固件后再燒錄maixpy的固件即可

#####################################################################

一、AI視覺識別

#####################################################################

  1. 燒錄固件:

    使用K-flash,CanMV IDE 以及 Maixpy IDE的燒錄功能即可。

    需要注意的是:鴨脖請先燒錄自身固件后再燒錄maixpy固件!!!

K-flash

2.選用模型

由于Canaan總是崩潰,而且沒有模型分享,需要自己訓練,這里只是找一個例子。

所以選擇maixhub,而且這個也是我在訓練往年送藥小車時發(fā)現(xiàn)的問題(當時canaan已崩),很多人便投入到maixhub的懷抱,我也不例外,當時還挺害怕庫不通用,得重新學一遍,結果便是很多東西都是基于openmv的,所以函數(shù)名稱也沒有太多變化??傊诓煌脑O備移植只需要保證燒錄固件(固件中有對應引腳關系以及函數(shù)執(zhí)行邏輯)正確即可。

選擇在maixhub上分享的數(shù)字識別模型

??這位大佬的
使用kmodel固件前將模型燒錄或則放入sd卡中

3.問題

這個模型訓練的次數(shù)和質量已經(jīng)挺好的,但即便如此識別還是有很多問題。

首先便是對于數(shù)字1的識別,很多時候閾值只能達到0.54左右。

接著便是數(shù)字2的問題,很多情況下,都能夠將邊框識別為數(shù)字2,特別是閾值較低的時候。

其次相似的數(shù)字比如2,5,8之間便很容易識別錯誤,造成波動。

然后便是波動,識別很容易受到外界影響,容易發(fā)生識別結果波動,列如 1 1 2 1 1 1?

最后便是這位大佬的模型是在一定高度訓練的,距離數(shù)字的距離也會影響識別結果(嚴重)。

下面將一一列舉這些問題并且提出解決方案:

(1) 閾值較低時候會多次識別,且擁有波動

選用threshold=0.5(maixhub訓練后默認),這里以數(shù)字1為例,其classid:0?

數(shù)字1被圈定多次


如果將識別結果進行輸出則可以看到如下的結果

classid:0->1,classid:6->7

而且可以看到數(shù)字1的value(準確率0~1)是較低的,大概在0.5~0.7之間,這樣便會導致識別十分不準確,如果將閾值設置到0.7則會多次出現(xiàn)為7的情況,少次為1的結果。

現(xiàn)在的問題是:在不改變threshold的情況下實現(xiàn)濾去7個結果。

當然,目前出現(xiàn)了兩個問題,但目前我們先來解決第一個問題——波動;從上圖的結果可以看到,即便存在1,7誤認的情況,數(shù)字1的識別次數(shù)也是多于數(shù)字7,所以是不是可以設計一種濾波器:必須存在n次連續(xù)的變化后才會讓輸出變化。這個原理類似于STM32捕獲通道里所使用的濾波器,實際上我的靈感正來自于此。

這里由于我已經(jīng)將這個數(shù)字濾波器寫成了模塊的形式,所以這里直接引用完成的模塊

已經(jīng)寫好的濾波模塊庫

不過在進行濾波前,必須要先知道識別的結果是什么,可以依靠哪個值來進行篩選

這里以一次很早的結果為例,返回的是一個列表,包含每個框的信息:x,y,w,h,value,classid。

實際上能夠使用的也僅僅是這六個值,或則說是三個值(x,y,w,h可看錯一個坐標信息)。

x,y,w,h:起始點像素坐標(x,y),框寬度:w,框高度:h

value:識別結果的可靠性

classid:識別結果對應的標簽

返回值的形式

首先,如果要連續(xù)n次變化,則需要有一個變量能夠記錄上一次結果;

其次還要有一個變量能夠記錄連續(xù)出現(xiàn)同一個結果的次數(shù);

最終,當濾波次數(shù)需要外部輸入的時候,還需要一個變量記錄給定次數(shù);


Digital Filter

func是函數(shù)功能選擇,是指在運行其他函數(shù)濾波后再次濾波

注:經(jīng)過func_cmpobj只會返回一個值,所以可以使用此濾波器

注:經(jīng)過func_Div_cmp會返回多個值,分別為每個區(qū)域中可能性最大的結果,不可使用此濾波器

注:func_none為測試此濾波器功能使用的值,在直接調(diào)用時必須先經(jīng)過排序

所以,現(xiàn)在反思一下,好像也僅僅func_cmpobj可以調(diào)用欸......好吧,我的鍋。Div_cmp只會返回每個區(qū)域中最有可能的值,但并不會將區(qū)域返回,并且會有多個需要記錄的值,所以這個濾波器會失效(濾波性能)。只要value最大值不變化,那么返回值便不會有較多處理。不過,這個功能也僅僅是為了屏蔽掉某些多次出現(xiàn)的框。

由于這里0的識別結果出現(xiàn)明顯多于7,所以僅僅使用這個濾波器便可以很好的解決這個問題。

緊接著便是func_cmpobj功能的敘述,這個縮寫為compare_objects核心便是比較,所以最早我這樣稱呼它,當然這個稱呼是十分不準確,不形象的。這個功能建議稱為篩選,核心思想便是通過比較value值篩去一部分干擾值(特指2)

readvalue是一個函數(shù):返回值為字典中的value值(需要自己定義)

score是用于記錄可信度差值,當差值大于一定的閾值時候才會輸出。

這里由于2個干擾太大,所以將2與其他情況分開討論。

數(shù)字篩選閾值設置
篩選函數(shù)內(nèi)容

其實這個篩選的方法來自亞博K210手寫數(shù)字里的部分內(nèi)容:

這里來講寫的還是不錯的

但篩選法的不足還是十分明顯的,最終只會篩選出一個結果返回,其他結果都會舍棄掉。

但這對于送藥小車的第一步,識別單個數(shù)字,確定遠中近端來講是十分有益的,結果必須十分準確,且視覺識別的結果有切近能有一個數(shù)字,所以必須要十分準確,故將篩選和濾波一同使用。

(2)接下來便是多個數(shù)字識別的問題,在屏幕上會出現(xiàn)多個數(shù)字,每個數(shù)字被框定多次。

這個問題會出現(xiàn)在巡線遇到十字線(使用模板匹配即可)判斷遠近端時候出現(xiàn),對此我也提出幾種解決方案。

  1. 分屏:對于第N次十字線的數(shù)字識別結果一定在某個范圍內(nèi)(1,2),(3,4)......且出現(xiàn)的位置為屏幕的兩側(灰度巡線保證線在正中央),分為二框,四框識別即可。

  2. 小車轉動:到達十字線時候,小車會從左到右自轉(既然解決不了問題,也解決不了提出問題的人,那么就將問題交給別人解決<( ̄ c ̄)y▂ξ),識別數(shù)字。

  3. 分塊篩選:將返回值的結果自動分為幾塊,每塊都執(zhí)行以此篩選。這個不光可以用于執(zhí)行小車,實際上任何多框出現(xiàn)都可以使用。

這里,我選擇了方案3(*  ̄︿ ̄)

會有人說可以設置 識別結果的面積重合,不過,我們所需要的不僅僅是識別結果的classid,還有識別結果的位置坐標信息x,y,w,h 或則說 cx,cy(central_x,central_y),多個框重合會導致框的中心點坐標出現(xiàn)明顯的偏移,也就是左右無法判斷。

3,4由于波動恰好沒有錄上

先使用畫圖工具描述一下核心思想(>﹏<其他的可視化工具不會用,也沒有時間學了)

假設這是一套由視覺識別返回的識別結果(x,y都表示的是中心點坐標)


返回的結果(當然是沒有順序的)

第一步:排序:依據(jù)value值排序,篩除部分不可信的結果

排序情況

第二步:分組:將中心點鄰近的結果分為到同一組內(nèi):這里假設中心點坐標在-20~20以內(nèi)認為鄰近;(以abs(cx1-cx2)<=20)

(1)首先以可信度最高的作為第一組的第一個識別結果,然后將剩余識別的結果與此比較中心點坐標,相近的添加進來,并且從原排序結果中刪除;

第一組分組后的識別結果
剩余的原序列

(2)再以剩余結果內(nèi)置信度最高的結果再次分組

第二組分組后識別結果
第三組分組結果
第四組分組結果

直到剩余序列(原序列)中無剩余;這樣便得到了分組結果,再對分組結果進行前面設計的篩選函數(shù),對每組進行篩選,選擇最高情況便可以了。

python實現(xiàn)

Result:分組的結果

Temp:緩存列表(每次添加后剩余的識別結果所組成的列表)

i:分組數(shù)

threshold_x,threshold_y:中心點鄰近判斷閾值界限

進一步濾波

也可以對分組后的結果再進行進一步的篩選(這里僅僅以判斷2/4數(shù)字進行分析)

當然,也可以對結果的中心點坐標進行篩選。

(注:分組這一部分是8.29號所寫,有一部分東西已經(jīng)遺失,加上馬上要重裝系統(tǒng),暫時就先停止親自實驗咯)

當然到這里似乎已經(jīng)結束了,但各位還會在寫代碼的時候遇到各種各樣的情況,需要針對情況進行設計對應的濾波函數(shù)提高精準度。

原本是計劃寫一個帶有卡爾曼濾波的

某個擺爛貨的原話

最后是僅僅把MPU6050的卡爾曼濾波寫完,也沒有再思考如何加入到這個上面來的

(看情況,如果想要的人多的話,我盡量寫一份分享一下)

而色塊追蹤中也可以使用類似的思想

當然沒寫咯

最后呢,由于情況特殊(個人擺爛,剩余的部分也懶得寫,因為報銷需要上交物品,所以.....)

依據(jù)最后的觀看情況酌情是否續(xù)寫吧......

如有錯誤,請及時聯(lián)系我(經(jīng)常在線)


7.1濾波的評論 (共 條)

分享到微博請遵守國家法律
沾化县| 玉树县| 兰溪市| 金昌市| 安多县| 和龙市| 辉县市| 安义县| 抚顺市| 新野县| 额济纳旗| 霍州市| 泸定县| 新疆| 栖霞市| 临高县| 达日县| 精河县| 科技| 定州市| 土默特右旗| 青河县| 彰化县| 洛扎县| 顺平县| 陇西县| 惠来县| 大渡口区| 徐汇区| 苏州市| 佳木斯市| 怀宁县| 抚顺县| 泰顺县| 利川市| 淄博市| 盱眙县| 泰来县| 昌黎县| 分宜县| 霸州市|