分類: point cloud

  • The Devil is in the Pose: Ambiguity-free 3D Rotation-invariant Learning via Pose-aware Convolution 論文導讀

     
    本文建議有點雲特徵的先驗知識者閱讀,

    我會盡量講得平易近人,

    但仍建議請先參考此篇,先了解基本點雲處理如何處理特徵。

    這篇論文的重點在於改變了底層特徵方法。

    論文中由這張圖來解釋:

    因為現行解決 Rotation Invariant 的方法都是乘上一個矩陣去收集數據,

    並沒有考慮點與點之間的結構關係(i.e.上圖笑臉)。

    但是我覺得這個例子呈述得很容易誤導,

    聽起來很像在解決高低解析度、上下採樣的問題,

    實際上在點雲裡面應該是解決類似 KNN 特徵的問題才對。

    像是那三個有黑色像素的點,間隔距離、彼此夾角之類的結構關係所產生的資訊。

    作者認為現在的 CNN 都沒有抓到結構關係 (Pose) 的精華

    (e.g. 點雲中點與點的區域關係 AKA 底層特徵),

    所以要提出解決方法稱為 PaRI 的新架構來解決問題

    (我猜是 Pose: Ambiguity-free 3D Rotation-invariant 的縮寫)。

    舊有的底層特徵方法:

    好,那要改進一定得知道改哪裡嘛?

    之前別人是怎麼做這種結構特徵的?

    答案是:Point Pair Feature(PPF)

    Point Pair Peature

    Pr 是參考點,想像成 KNN 的目標點;
    Pj 是 Pr 附近的鄰居點,有 K 個;

    ∂n_r 是相較於 r 的三維座標軸,用  gram-schmidt orthogonalization 算出來的,

    忘記的同學可以去複習一下 GSO

    所以經過 PPF 計算,我們會得到一組四個特徵如下圖:

    這樣會出個小問題,各位想想好的底層特徵應該要具備什麼特性?

    應該要具備獨特性嘛!
    因為這樣訓練起來才不會與其他特徵混淆。

    仔細觀察 αn 的方程式我們會發現,沒有一條能分辨在這個半徑為 d 的圓圈上,

    有若干個法向量相同的  Pj 的辦法。 

    (∂1_r, ∂1_j 分別代表各自的法向量,ModelNet40資料集會給定。)

    改善方法:

    在改善之前,我們先想想舊有方法遇到什麼問題?

    問題是缺少 Pr 與 Pj 間的獨特特徵,對吧?

    所以我們希望新的方法最好讓每個 Pj 對 Pr 有獨特性。

    Local Reference Frame(LRF) +   Augmented Point Pair Feature(APPF)

    就能解決這個問題。

    LRF


    Local Reference Frame


    左邊那個飛機圖,是為了說明使用 Global Feature 會有問題而存在的,

    有興趣可以深入論文研究。

    LRF 這裡我們要先建三軸,首先要拿到 e^2_r;

    e^2_r = Pr – mr 的座標向量,mr 是 Pj 們的重心。

    接著根據公式建三軸:


    APPF

    Augmented Point Pair Feature

    接著把 d 投影到 π_d 上。

    什麼?你說 π_d 是什麼?

    論文這裡沒有寫得很清楚,

    我也看了很久,最後是對照著官方程式碼看才看出來。

    其實 π_d 就是座標向量 e^2_r! 

    投影上去,然後用 arctan 取角度回來。

    不知道為什麼用 arctan 而不用 tan 的同學,這裡有兩個理由:

    1.對應域

    i.e. tan(45°) = 1 = tan(225°)

    但是 arctan 只會給你 45°

    2.極值

    tan(89.9°) ≈ 5729.58,但 tan(90.1°) ≈ -5729.58。 

    arctan(5729.58) ≈ 89.9°,但 arctan(-5729.58) ≈ -90.1°。

    以上。

    若有任何錯誤請聯絡我xD

  • [論文筆記] 三維點雲的 Transformer 方法 Spatial Transformer for 3D Point Clouds

     

    前幾天 meeting 被老師單獨叫過去說:

    "黑武士,你知道你這學期要畢業對吧?"


    於是乎,為了早點把論文生出來(#)最近看了比較多論文,

    其中一個很感興趣的是 3D Spatial Transformer  方法。

    這個方法有部分 depened on 2D Spatial Transformer ,

    至於 2D Spatial Transformer,李弘毅大師講得很清楚,

    我就不多贅述了。

    李弘毅老師 – Spatial Transformer Layer

    借用一下 2D Spatial Transformer 的架構圖:

    Spatial Transformer 架構圖

    原本 2D Spatial Transformer 的 Localisation Net 等於 Affine ,

    但是因為 3D 嘛,多了一個維度,而且抓特徵的方法不同,就用需要新增兩個方法處理。

    首先我們要知道三維任務裡面,我們是拿什麼樣的資料來做處理?

    這篇文章以 DGCNN 為主幹,DGCNN 抓特徵的方法就是先假設一張圖有 N 個點。

    N 個點裡面,每個點都去做 KNN,假設 K值設為 20,

    最後我們就是拿 N*20 個最近鄰居點的三維座標當作特徵,進入網路處理。

    KNN 示意圖

    知道了要處理的資料長什麼樣子,那就分別來看看 3D Spatial Transformer 的三種方法。

    • Affine & Projective Transformations

    這兩個合在一起講,因為相當於 2D Spatial Transformer 的 Affine 功能,

    包含 旋轉、縮放、位移,其中 Projective Transformations 是專門處理位移問題。


    讓 R 矩陣 代表 Affine , T 矩陣 代表 Projective ,

    這兩個矩陣合起來就會變成 M 矩陣,能夠一次處理旋轉、縮放、位移


    M矩陣一次處理 旋轉、縮放、位移。

    • Projective Transformations


    講到這裡一定又很多人會問了,問我怎麼知道每次投影都會把位移量投回來?

    論文明明寫共扼到高次方維度,所以怎樣怎樣才會一樣。

    黑武士你又在搞,到底在說什麼?

    很簡單,四維的世界人類無法想像,那就用三維投二維來舉例:

    假設在三維空間中恆有一 av 向量,

    我們希望這組猴死囝仔 av 向量在 xy 平面上恆有一點 xy 座標代表,

    這樣我們就知道不管這條 av 向量怎麼跑,我們都有方法辨別。

    (口裡面一個子 = ㄐㄧㄢˇ,不用謝了。)

    這還只是一條向量,如果很多個向量平行,是不是就能在 xy 平面上投出一個圖案?

    再加上我們前面有辦法處理 3D 圖片 的旋轉,

    是不是一定程度上能在三維空間得到旋轉與平移的容許值?

    讓機器更好辨別哪些 3D 圖片 是一樣的?

    • Deformable Transformations

    這邊論文講了一堆說什麼最重要的、可以改變 3D 圖片外觀的,

    簡單來說只做了兩件事情:

    1. 融合前後層特徵(第一層為原始三維座標)。
    2. 把融合後的特徵做成 C向量 往下傳播。

    原文寫得不是很好,
    前面黑色C代表上一層傳遞來的向量,後面紅色C代表往下傳的向量,
    兩者是不同內容,避免混淆我就用顏色區分。


    以上就是我對於 Spatial Transformer for 3D Point Clouds  的論文理解,

    如果大家有不同理解,歡迎底下留言讓我知道。

  • [論文筆記] SegGCN – 利用 Fuzzy Spherical 改善 Octree guided CNN 的分割點雲方法

    因為教授可能想讓我做 partial & segmentation,

    所以被 assign 了這篇論文。
    SegGCN 做了兩件事情:

    一是 Fuzzy Spherical 的波波獸(Proposal),
    可以有效提升舊有 Hard Spherical 的準確度、提升稀疏點雲的 robustness。
    二來提出了新的 SegGCN 架構,只有提到效能還不錯,
    主要是 Decoder 端的 Resnet block 換成 1×1 的 Conv。
    這篇主要比較對象是 KPConv。
    首先來了解 Fuzzy Spherical,
    Fuzzy Spherical 是 base on Hard Spherical。
    而 Hard Spherical 是 Octree guided CNN 那個流派提出來的,
    Octree guided CNN 主要的貢獻就是用 球座標 來處理點雲。
    為了更好的節省球座標的記憶體容量,所以用了八元樹(Octree)來處理。
    有點混亂?
    沒關係,你只要知道 Hard Spherical  是球座標的一種模式就可以了。
    用論文圖來解釋:
    圖(一)

    假設把球座標投影至二維平面(後面會提到特別指 XY平面)。
    左邊的 (a) 就是 Hard Spherical,每個區塊有個別的權重、越靠近原點的區塊權重越大,
    這就是 Hard Spherical  的核心概念。  
    Hard Spherical  的三維概念大概長這樣:
    圖(二)
    在論文裡面 Hard Spherical 尺寸是 n * p * q ,但讀論文的時候要注意:
    總共有 n * p * q 個 Bins
    "n , p , q"在這裡全都代表分割的個數,不是軸的概念。
    論文裡面還是用球座標的 


    {displaystyle (r, theta , varphi )}

    但是這裡 Hard Spherical 會遇到兩個問題:
    第一
    看到 圖(一) 左側的 s,t 點,當兩點很接近 Bin 邊緣的時候,
    空間位置接近、但是權重會落差很大。
    第二
    見圖(三),當兩點 phi 角呈正負關係,且其餘兩維不變時,
    在 Hard Spherical 裡面權重會不一樣。
    附註.這裡的權重為 

    k for Hard Spherical
    圖(三)
    所以 Fuzzy Spherical 的解決方法就是把 半徑 r 軸線性化、不分 Bin 了。
    想像一下,把上面 圖(一) 視為 球座標 對 XY軸 的投影。
    使用新的 k 計算方法:
    比較一下 Fuzzy Spherical(上) 與 Hard Spherical(下) 的特徵方程式:
    可以看到有個靠北難念的 ξk 向量,
    那代表在 Fuzzy Spherical 中所有點都考慮隔壁鄰居 k 的關係向量。
    而 Hard Spherical 是 Fuzzy Spherical 的特例,把 ξk 變成 one-hot 向量去處理掉了。
    (one-hot 向量 這篇 講得不錯,建議閱讀。)

    再來是 SegGCN 架構:

    比較特別的是把編碼器把權重複製進解碼器,這樣就不用多餘的計算(?)
    還有解碼器用 1×1 的 Conv 把 Resnet block 換掉,結論是比較快。

    最後給了個在 SegGCN 中使用 Fuzzy 與 Hard 的比較圖,
    這張圖同樣在 8192 點的資料下面做的、變因是 dropout 的參數。
    可以看到 Fuzzy 的很 robust。
    但是用哪個資料集就沒有明講,
    可能是什麼獨家機密吧(#?
    結論:
    1. Fuzzy Spherical 在取樣點數少的情況下較 robust,換句話說 Acc 也比較高。
    2. SegGCN 在 S3DIS 與 ScanNET 資料集下比 KPConv 快 100倍。
    (但是 mIOU 跟 mAcc 是輸的xD)

    他們給的解釋是 16 for 20 都有贏啦
    (剩下四個巨爛)
    然後自己搞了個 Kernal comparison 說我們把 Fuzzy Spherical 帶進 KPConv 有贏!

    用哪個資料集、怎麼比的都不知道xD

    哇,如此厚顏無恥之人!
    好總之,晚安。
  • 何謂利用語義分割(semantic segmentation)分類三維點雲?

    前言:

     因為左岸的論文導讀只有一份,而且抄來抄去跟大學生做畢業專題一樣。
     所以我打算自己來幫自己讀的 paper 下註解。

    這篇文章要告訴你兩件事:


    一、語義分割在幹嘛、原理是什麼?


    二、語義分割怎麼用在分類點雲?

    我這篇不會講太多關於 NLP 實務上怎麼做、怎麼實現…

    只會概念式的讓你知道:語義分割與點雲的關係






    一、語義分割在幹嘛、原理是什麼?



     講語義分割就要稍微介紹一下 NLPNatural Language Processing

     NLP 就是把 自然語言(人類講的話:英文、中文、德文…)轉成機器可以用的東西,
     基本上這就是 NLP 在做的事情。

     口說無憑,舉個例子:

     假設"Costco"這個詞在電腦眼裡看起來是"0100" ;

     "IKEA"在電腦眼裡看起來是"1111"
     (BTW 這邊的字串代表向量)

     兩個差了 3  bits
     那麼這兩個詞在做 NLP 的時候就不會視為同義詞
     電腦不會跟你說:IKEA?我都念 Costco ლ(´ڡ`ლ)

     如果是"Ben"與"Benny"的話,因為"Ben"是"Benny"的縮寫,
     所以電腦做 NLP 的時候 這兩個詞的向量就會很接近

     簡單來語義分割的用途就是把句子裡面的詞一個一個切出來看向量,
     比較資料庫裏面的向量找出使用者到底想要表達什麼意思?
     通常語音辨識、輸入會大量用到這個功能

     NLP 裡面還有很多東西可以講,這只是大概介紹要用到的功能。

    二、語義分割怎麼用在分類點雲?


     首先我要引用這張圖片:

     

    (ftrom https://arxiv.org/abs/1801.07829 , Yue WangYongbin SunZiwei LiuSanjay E.SarmaMichael M. BronsteinJustin M. Solomon

     我們可以看到機身的顏色不一樣(廢話)

     黃色代表與選取的紅點關係相近的點

     其實這是一張利用"語義分割"做"飛機部件分割"的訓練過程,
     你可以看見由左至右,原本我們找的 紅點 只跟物理距離相近的點有關;

     但是越訓練越往右走,你會發現與 紅點 有關的逐漸像是相同的部件而不是物理距離。
     最後飛機被分為:機翼、渦輪、機身…等各部件。

     在這裡的原始檔案可能是 .ply 或是 .off 都可以
     原理就是把頂點的 x,y,z 拿出來去做部件分割

     然後我們就會把被語義分割出來的各部件拿去做訓練,這樣就可以取得更好的結果。
     (譬如說有些機掰的倒三角翼飛機就不是乖乖的長這樣,但我們可以辨識成飛機。)

     你會問為什麼飛機兩邊的翼明明絕對位置不一樣,還能訓練出來?

     因為其中利用到 NLP 的句子的語義分割,類似"Ben是我"、"我是Ben"
     為同義句,在數學中就是 幾何變換 geometric transformation)

     可以寫矩陣轉換過去,至於怎麼寫就那又是一門學問了
     先交給我們電信仔就行惹 ლ(´ڡ`ლ)
     
     有時間再來談談實作,或許先從怎麼 initial data 開始是不錯的選擇?