第一章:点云中的滤波问题---Filters
濾波的范圍非常的廣泛,像噪聲去除,降采樣,上采樣,平滑等等都可以叫做濾波。
上采樣是一個(gè)比較罕見(jiàn)的東西,上采樣就是沒(méi)有的東西我把他創(chuàng)造出來(lái),就是創(chuàng)造信息,其實(shí)是不可以創(chuàng)造信息的,只是說(shuō)經(jīng)過(guò)已有的信息,怎么去估算未知的地方可能的信息。如上圖,就是對(duì)激光雷達(dá)的圖進(jìn)行了一個(gè)上采樣,最上邊的一層是吧激光雷達(dá)的圖投影到了圖像上,可以看到一些很小的很稀疏的點(diǎn),但是他沒(méi)有辦法把每一個(gè)像素都填滿,比如我們?cè)谧龆鄠鞲衅魅诤系臅r(shí)候我們希望圖片上的每一個(gè)像素都能夠帶一個(gè)深度,這樣圖片所攜帶的信息就非常的豐富了,比如說(shuō)既有深度,又有紋理(RGB嘛),但是激光雷達(dá)的點(diǎn)那么稀疏,我們?cè)趺窗阉兊某砻芤稽c(diǎn)呢?其中一個(gè)方法就是Bilateral Filter(雙邊濾波)。
上圖中BF就代表了使用雙邊濾波對(duì)點(diǎn)云做上采樣的結(jié)果(可以看出他并不是完美的,從圖中可以看出這個(gè)電線桿子經(jīng)過(guò)BF之后就變粗了很多,但是也有一些非常好的地方,比如說(shuō)車的輪廓被保存的非常的好)。上圖中還使用了一些MED(median filtering中值濾波)。以及AVE(平均值濾波)等等。
(1)Radious Outlier Removal
在一定的鄰域半徑范圍內(nèi),鄰域點(diǎn)的個(gè)數(shù)是否滿足一定的數(shù)量。其中不包括本身。比如說(shuō)下圖半徑范圍內(nèi)鄰域點(diǎn)數(shù)量小于2的點(diǎn)去除掉,那么圖中黃色的點(diǎn)和綠色點(diǎn)都會(huì)被去除掉。
劃定半徑為r的鄰域,然后去數(shù)一下里面有多少個(gè)點(diǎn)。
(2)Statistical Outlier Removal
對(duì)于每一個(gè)點(diǎn)找到鄰域之后,算一下每一個(gè)鄰居距離我自己有多遠(yuǎn),記做,就是我自己這個(gè)點(diǎn),就是他的鄰居,在一個(gè)半徑為r的鄰域的鄰居。然后算一下這個(gè)集合的平均值還有方差標(biāo)準(zhǔn)差,對(duì)一個(gè)點(diǎn)都計(jì)算一下這個(gè)統(tǒng)計(jì)數(shù)值,就可以知道平均下來(lái)我這個(gè)鄰域里邊的應(yīng)該是什么樣子的;統(tǒng)計(jì)完之后我們?cè)龠^(guò)一遍所有的點(diǎn),就是每一個(gè)我們還是找他半徑為r的鄰域,如果他的鄰居的距離大于就表示這個(gè)鄰居距離我太遠(yuǎn)了,就可以去掉。
(3)Voxel Grid Downsampling(降采樣的方法1)
降采樣最主要的目的就是降低點(diǎn)的數(shù)量,使得我們?cè)诤罄m(xù)處理時(shí)需要用到的算力更加的少。
以二維舉例,先把二維的空間劃分成一模一樣的均等的格子,比如說(shuō)左邊就劃分為1個(gè)格子,那么這么多點(diǎn)中我就只選擇了1個(gè)點(diǎn),那么這么多的點(diǎn)我就降采樣之后就變成為了1個(gè)點(diǎn);或者我們也可以選擇選擇更好的分辨率,比如說(shuō)每一個(gè)格子長(zhǎng)度更小,所以右邊是劃分為4個(gè)格子,每一個(gè)小格子里邊我就選擇1個(gè)點(diǎn),那么這些點(diǎn)就被降采樣成為了4個(gè)點(diǎn)。
Q1:就是左邊劃分為1個(gè)格子的時(shí)候,我們?cè)趺催x擇這1個(gè)格子內(nèi)的一個(gè)點(diǎn)呢?比如說(shuō)我是隨便選一個(gè)點(diǎn)呢?還是選擇平均值呢?
A:這兩種方法都可以,要么是隨便選擇一個(gè)點(diǎn),要么是選擇平均值。
第一個(gè)方法是平均值或者voting:對(duì)于坐標(biāo)點(diǎn)比如XYZ我們可以求平均值;但是有一些點(diǎn)我們不能求平均值,比如說(shuō)有的點(diǎn)他都有一個(gè)標(biāo)簽,比如說(shuō)這個(gè)點(diǎn)是屬于一個(gè)人的點(diǎn)或者說(shuō)是屬于一個(gè)車的點(diǎn),這個(gè)時(shí)候就不能求平均值,所以對(duì)于這些不能求平均值的點(diǎn),我們會(huì)去做一個(gè)投票之類的操作。所以這個(gè)方法就是選擇平均值或者做voting,他會(huì)更加精確的去描述這個(gè)方框內(nèi)的內(nèi)容,但是代價(jià)就是比較慢。
第二個(gè)方法就是隨便選擇一個(gè)。
從h=0這個(gè)格子里邊的4個(gè)點(diǎn)是按照平均值選擇點(diǎn)還是隨機(jī)選擇取決于你是要速度還是準(zhǔn)確度。
從二維直觀的理解h計(jì)算的由來(lái)。
Q2:我們?cè)趺礃邮沟媒挡蓸拥倪^(guò)程在實(shí)現(xiàn)的時(shí)候更加的高效?
上述的Voxel算法,需要排序,如果幾個(gè)數(shù)據(jù)中點(diǎn)非常多,那么復(fù)雜度就會(huì)很高。為了加快速度我們可以使用這一個(gè)特性,就是空間中大部分的空間是沒(méi)有點(diǎn)的,所以如果我們使用Voxel算法建立一個(gè)Voxel Graid的話,其實(shí)很多個(gè)Voxel中說(shuō)是沒(méi)有點(diǎn)的;比如說(shuō)我們有一萬(wàn)個(gè)點(diǎn),而且我們假設(shè)知道做完降采樣之后點(diǎn)數(shù)會(huì)小于100,比如說(shuō)95個(gè),假設(shè)存在一個(gè)非常神奇的函數(shù),這個(gè)神奇的函數(shù)可以將這1萬(wàn)個(gè)點(diǎn)映射到100個(gè)容器里邊去,然后我們只需要從這100個(gè)容器里邊去取出非空容器里邊的點(diǎn)就好了,但是前提是我們有這樣一個(gè)神奇的函數(shù),這個(gè)神奇的函數(shù)實(shí)現(xiàn)了降采樣的過(guò)程,把100個(gè)點(diǎn)變成了95個(gè)點(diǎn),放在了100個(gè)容器里邊去,那么如果這個(gè)神奇的函數(shù)是完美的話,那么我就有95個(gè)容器是非空的,有5個(gè)是空的,我只要取出這95個(gè)就OK了。?? 這個(gè)神奇的函數(shù)我們可以使用Hash Table(哈希表)來(lái)模擬這個(gè)神奇的函數(shù)。
下面是近似的降采樣(不需要做N*logN的排序,所以速度會(huì)快),為了降低復(fù)雜度。近似降采樣使用的不多。
整體思想就是1萬(wàn)個(gè)點(diǎn)劃分為100個(gè)格子,但是有5個(gè)格子是空的,有95個(gè)格子里邊是有點(diǎn)的。
前邊4步跟普通的降采樣是一模一樣的,第一步算最大最小值,選出一個(gè)最大的框。第二個(gè)選出分辨率;第三步算一下Voxel Grid每一個(gè)方向上的格子的數(shù)量;第四步算每一個(gè)點(diǎn)在這個(gè)voxel Grid上的什么位置,也就是h;第五步定義一個(gè)哈希函數(shù)去把h或者說(shuō)是、、這三個(gè)方向上的h把它映射成一個(gè)數(shù)字,這個(gè)數(shù)字代表了這個(gè)容器的位置,比如上述說(shuō)的我有100個(gè)容器,有1萬(wàn)個(gè)點(diǎn),那么我需要一個(gè)哈希函數(shù)把一萬(wàn)個(gè)點(diǎn)每一個(gè)點(diǎn)映射到這100個(gè)容器里邊的其中一個(gè)。一個(gè)常用的哈希函數(shù)就是我把h去一下他對(duì)于我容器數(shù)量的余數(shù),%是求余數(shù)的函數(shù),通過(guò)這個(gè)哈希函數(shù)我可以保證最后出來(lái)的這個(gè)數(shù)值是小于等于這個(gè)容器的數(shù)量,也就是說(shuō)我出來(lái)的一定是小于等于100的。我就可以把這個(gè)數(shù)值用來(lái)指代我是選擇的哪一個(gè)容器。
發(fā)現(xiàn)沖突之后我就把原來(lái)的點(diǎn)都清理出去,然后就把這個(gè)容器給騰空了,來(lái)放我新來(lái)的h。
近似的降采樣不需要做N*logN的排序,所以速度會(huì)快;當(dāng)然會(huì)出現(xiàn)沖突的問(wèn)題,所以他出來(lái)的點(diǎn)會(huì)比普通的Voxel Grid Downsample更多,因?yàn)樗麜?huì)出現(xiàn)沖突,沖突之后我就要騰位置,有可能我會(huì)多放出來(lái)一些點(diǎn)作為我的輸出。
(4)Farthest Point Sampling(FPS)(降采樣的方法2)
思想:是想找一些點(diǎn),使得這些點(diǎn)之間的距離越遠(yuǎn)越好。第一步是隨便選擇一個(gè)點(diǎn)作為我降采樣的輸出,作為第一個(gè)點(diǎn);第一個(gè)點(diǎn)選出來(lái)之后算一下剩下的點(diǎn)距離我隨機(jī)選的這個(gè)點(diǎn)距離最遠(yuǎn)的點(diǎn),作為第二個(gè)點(diǎn)。之后再算一下剩下的點(diǎn)中離選出來(lái)的兩個(gè)點(diǎn)中的距離有多遠(yuǎn),挑選一個(gè)點(diǎn)這個(gè)點(diǎn)距離已選出來(lái)的兩個(gè)點(diǎn)的距離是最遠(yuǎn)的,作為選出來(lái)的第三個(gè)點(diǎn)。之后依次挑選點(diǎn),使其距離已選出來(lái)的紅色的點(diǎn)的距離是最遠(yuǎn)的。
這個(gè)方法可以把一些密度非常大的一些點(diǎn)的地方的點(diǎn)給去掉,因?yàn)槊看伪A舻亩际蔷嚯x比較遠(yuǎn)的點(diǎn)。這個(gè)方法FPS最常用的地方其實(shí)是在深度學(xué)習(xí)里面,很多的方法都會(huì)使用FPS處理一下輸入的點(diǎn)云。
(5)Normal Space Sampling(NSS)(降采樣的方法3)
如下圖想實(shí)現(xiàn)的是求1和2之間的旋轉(zhuǎn)平移矩陣,但是又不想加大運(yùn)算量使用那么多的點(diǎn),這個(gè)時(shí)候如果只是簡(jiǎn)單的使用Voxel Grid的話就會(huì)很可能造成中間凹下去的部分沒(méi)有采樣到點(diǎn),選到的所有的點(diǎn)都是在1和2之間平滑上的點(diǎn),那么,這樣就沒(méi)有辦法把1和2對(duì)齊起來(lái),因?yàn)橹虚g凹下去的部分已經(jīng)不見(jiàn)了,所以在做ICP怎么對(duì)齊兩個(gè)點(diǎn)云的時(shí)候通常會(huì)使用一些特殊的降采樣的方法,比如NSS方法,他就會(huì)更多的把采樣的重心放到這些法向量不同的空間上邊去。
具體方法:
第一步:先在法向量的空間里邊去建立一堆的容器,比如說(shuō)12點(diǎn)鐘方向是一個(gè)容器,1點(diǎn)鐘方向是一個(gè)容器,一直把這個(gè)空間分成很多個(gè)在法向量上的格子;
第二步:把所有的點(diǎn)都遍歷一下,把所有的點(diǎn)都丟進(jìn)去這個(gè)容器,丟進(jìn)去是根據(jù)的自己的法向量。
第三步:在每一個(gè)容器里邊都挑選同等數(shù)量的點(diǎn),比如說(shuō)我在12點(diǎn)鐘方向選擇10個(gè)點(diǎn),在1點(diǎn)鐘方向也選擇10個(gè)點(diǎn),那么這樣就保證了不關(guān)我這些點(diǎn)是擁有什么樣的法向量,他都會(huì)最終的出現(xiàn)在我降采樣的結(jié)果空間里邊去,不會(huì)出現(xiàn)像上述情況這些凹進(jìn)去的點(diǎn)全部都被漏掉的現(xiàn)象。
PS:至于方向的劃分可以預(yù)先定義一個(gè)方向,讓每一個(gè)點(diǎn)的法向量與該預(yù)定義方向做對(duì)比,進(jìn)行劃分。(本人預(yù)定義的是垂直方向)
(6)基于深度學(xué)習(xí)的方法進(jìn)行降采樣(降采樣的方法4)
6.1Laerning to Sampling:(第一個(gè)應(yīng)用降采樣)
輸入的點(diǎn)就是這個(gè)A或者B,然后中間經(jīng)過(guò)一個(gè)神經(jīng)網(wǎng)絡(luò)(S-NET)(上述提到的Voxel Grid或者NSS其實(shí)就是一些函數(shù)輸入是一堆點(diǎn)輸出是降采樣之后的點(diǎn),這個(gè)時(shí)候不用這些降采樣的函數(shù),他使用的是神經(jīng)網(wǎng)絡(luò)替代我們所有的算術(shù)運(yùn)算),這個(gè)神經(jīng)網(wǎng)絡(luò)的輸出就是一些降采樣的點(diǎn),輸入這些降采樣的點(diǎn)(假如有5個(gè)點(diǎn))之后再把這些點(diǎn)輸入進(jìn)一個(gè)分類網(wǎng)絡(luò)里邊去,分類網(wǎng)絡(luò)對(duì)于形狀為A的點(diǎn)的輸入,他的輸出也應(yīng)該是這個(gè)點(diǎn)云他的標(biāo)簽是A,同時(shí)也要求經(jīng)過(guò)降采樣之后的5個(gè)點(diǎn)輸進(jìn)去同樣一個(gè)網(wǎng)絡(luò),他也要得出同樣的結(jié)論說(shuō)這5個(gè)點(diǎn)是屬于字母A,所以這就是神經(jīng)網(wǎng)絡(luò)獲取降采樣點(diǎn)的方法,之前使用Voxel等做降采樣的方法基本上都是基于幾何空間來(lái)做降采樣即希望我降采樣之后的點(diǎn)均勻分布在原來(lái)的空間里邊,不管怎么都是幾何空間;但是在神經(jīng)網(wǎng)絡(luò)的這里的方法,他不涉及幾何空間,而是基于語(yǔ)義的。比如說(shuō)這里的Task Network是一個(gè)分類網(wǎng)絡(luò)的話,我只是希望我降采樣之后的點(diǎn)還是能夠得到同樣標(biāo)簽的,所以在這種訓(xùn)練模式下這些降采樣之后的點(diǎn)就會(huì)盡量的去放在一些比較有特征的地方,比如說(shuō)A的話可能會(huì)選擇這些角點(diǎn) 其中也用到了幾何信息,希望降采樣之后的點(diǎn)G,他會(huì)盡量的去靠近原有的點(diǎn)P,不然的話因?yàn)樯窠?jīng)網(wǎng)絡(luò)他是不可控的,如果我們不給任何的幾何的限制那么有可能神經(jīng)網(wǎng)絡(luò)給出降采樣的點(diǎn)就是兩個(gè)點(diǎn),但是并不是我們想要的結(jié)果。我們希望經(jīng)過(guò)降采樣之后的點(diǎn)還是靠近原來(lái)的點(diǎn),所以加了一個(gè)基于幾何的約束。
(2)表示對(duì)于任何一個(gè)在我降采樣完了之后的點(diǎn)的地方,我都要找一個(gè)離他最近的在原來(lái)點(diǎn)集里面的點(diǎn)。
(4)是反過(guò)來(lái)的,對(duì)于任何一個(gè)在原來(lái)點(diǎn)集里邊里面的點(diǎn)我都希望有一個(gè)降采樣完了之后的點(diǎn)離他比較近,所以公式(2)+(4)=Chamfer loss就是如何使得兩個(gè)點(diǎn)云在幾何空間上是相近的,也就誰(shuí)說(shuō)兩個(gè)點(diǎn)云長(zhǎng)的差不多,就可以使用chamfer loss去描述。
Chamfer loss參考鏈接:https://blog.csdn.net/weixin_42894692/article/details/106148094?
PS:(這就是learning to sampling文章的思路,他不是通過(guò)幾何的關(guān)系來(lái)找出這些降采樣點(diǎn),而是通過(guò)語(yǔ)義分析來(lái)找降采樣的點(diǎn))
6.2Laerning to Sampling:(第二個(gè)應(yīng)用重構(gòu))
比如說(shuō)原來(lái)的椅子如1,然后對(duì)其進(jìn)行降采樣為2或者3,我根據(jù)降采樣之后的點(diǎn)來(lái)重新構(gòu)建出來(lái)一個(gè)椅子,如果這個(gè)椅子跟我之前的椅子比較相近的,就是一個(gè)比較好的結(jié)果。
NRE來(lái)描述重構(gòu)的點(diǎn)云和原來(lái)點(diǎn)云之間的差異。
(7)上采樣
Bilateral Filter(既可以作為降采樣也可以作為上采樣)
參考鏈接:https://www.cnblogs.com/cheermyang/p/6637186.html
Edge Preserving Blurring(邊緣保持模糊)
參考鏈接:https://blog.csdn.net/zhaoyin214/article/details/102714697
比如上圖我有一張圖片,里面有一個(gè)亭子,想要對(duì)他做一個(gè)模糊,就是使用一個(gè)高斯核應(yīng)用到一個(gè)圖片上(把一個(gè)高斯核應(yīng)用到一個(gè)圖片上就是說(shuō)比如說(shuō)我選取一個(gè)像素A點(diǎn),然后我選取A點(diǎn)他周邊一個(gè)區(qū)域,然后把這個(gè)點(diǎn)這個(gè)像素的RGB數(shù)值替換成他周圍這個(gè)鄰域的像素加權(quán)平均,這個(gè)加權(quán)里邊的權(quán)重就來(lái)自于這個(gè)高斯核,我在這里畫一個(gè)高斯核,離他近的像素給他更高的權(quán)重,離他更遠(yuǎn)的我就給他一個(gè)低一點(diǎn)的權(quán)重),那么這個(gè)時(shí)候我的高斯核選擇的越來(lái)越肥的話,就是每個(gè)點(diǎn)我受到遠(yuǎn)處點(diǎn)的影響會(huì)越來(lái)越大,那么這時(shí)候所有的邊緣都會(huì)模糊,再大到都看不清里邊是什么了。
那么有沒(méi)有什么辦法做一個(gè)模糊或者說(shuō)做一個(gè)平滑,但是這個(gè)平滑是能夠保持我物體的邊緣的呢?如下圖模糊只是把一些細(xì)節(jié)給去掉了,大的結(jié)構(gòu)并沒(méi)有被改變,經(jīng)過(guò)了4次(4 iteration)模糊操作雖然樹木已經(jīng)變得非常模糊,但是亭子的輪廓還是比較清楚的。怎么實(shí)現(xiàn)邊緣的保護(hù)和保留呢?我們就可以使用Bilateral Filter(因?yàn)樗母咚购瞬皇且粋€(gè),而是2個(gè)高斯核所以叫做Bilateral)。
是一個(gè)非常標(biāo)準(zhǔn)的高斯函數(shù),均值為0,標(biāo)準(zhǔn)差是。然后對(duì)于任何一個(gè)像素點(diǎn)p,需要給他一個(gè)鄰域,把這個(gè)鄰域標(biāo)記為s,就是p點(diǎn)的一個(gè)鄰域s,s里邊的每一個(gè)像素把它記做q,然后把p的像素替換成q的加權(quán)平均。根據(jù)距離分配權(quán)重(幾何空間上的像素核),根據(jù)兩者顏色相似度來(lái)分配,如果q的顏色和p非常的相似,那么我就放一個(gè)高的權(quán)重;前邊還要加一個(gè)標(biāo)準(zhǔn)化的參數(shù)Wp;這樣下來(lái)的效果就是如果有一個(gè)像素q,它距離p很遠(yuǎn),顏色也不想相似,那么分配的兩項(xiàng)權(quán)重就會(huì)很小,乘起來(lái)的數(shù)值就會(huì)更小,那么所以他對(duì)于p的影響就會(huì)很小。
--------------在做傳感器融合的時(shí)候,我們希望不同傳感器得到的數(shù)據(jù)是在表達(dá)形式上是類似的,而激光電云他的點(diǎn)是稀疏的,而圖像和像素是稠密的,所以當(dāng)我們把激光電云的點(diǎn)投影到圖片上就會(huì)出現(xiàn)很多像素是沒(méi)有深度信息的,如何把這個(gè)深度信息補(bǔ)全,有很多的方法,在kitti上有一個(gè)數(shù)據(jù)集是專門用來(lái)做深度補(bǔ)全的,當(dāng)然刷榜的還得是深度學(xué)習(xí)。這里使用的是雙邊濾波,為什么不直接使用高斯濾波呢?在用雙邊濾波的時(shí)候可以考慮到顏色信息,因?yàn)殡娋€桿和后邊墻壁的顏色不一樣,而高斯的話電線桿和墻壁在深度上其實(shí)差距的很遠(yuǎn),但是在圖片上他們是相近的,如果要補(bǔ)全建筑墻壁上的一個(gè)深度,如果直接用高斯濾波就會(huì)找到這個(gè)電線桿上的點(diǎn),就用很近的點(diǎn)的深度信息去賦予到很遠(yuǎn)色的建筑上邊去這是錯(cuò)的,所以在用雙邊濾波的時(shí)候就會(huì)考慮到顏色信息,結(jié)果會(huì)更好。?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的第一章:点云中的滤波问题---Filters的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PointNet++:(1)网络完成的任
- 下一篇: 三维点云课程第一章:应用