分類: Machine Learning

  • Occlusion-Net 用來解決物件遮蔽問題的 2D/3D 多視圖融合物件偵測方法

    Occlusion-Net 用來解決物件遮蔽問題的 2D/3D 多視圖融合物件偵測方法







    這是一個很有趣的方法,以我的觀點來看是跟 3D 點雲的 Multi-View 方法的延伸。

    主要是把 3D 點雲特徵用投影方法投回 2D 影像,
    利用 2D/3D 的融合特徵解決物件遮蔽的偵測問題。


    本篇數學推導較為艱澀,筆者在文中會推導重要部份。




    本文架構為四大 Loss值的組合。

    L_Keypoints:




    首先會先算 Keypoint Heatmaps,

    從一台車裡面算出 12 個點對標資料集的 Keypoint GT。
    (論文沒有細講,但個人從後面 KNN 猜測這裡做 L2  Norm。)




    L_Edge:








    在講 L_Edge 之前,我們要先定義 V 與 E:

    大V 是由 k 個頂點組成的關鍵點集合,
    而 V^l 代表 GT (真實的存在的關鍵點)、V^g 代表模型預測出來的關鍵點。

    E_ij 代表點i 與 點j 組成的邊,若點i && 點j 皆屬於關鍵點,則 E_ij 為 1、其餘為 0。








    把 V^g 還有 E_ij 拿去算三層的全連接層(FC)之後就會得到 E^l_ij。
    這邊要特別注意 V^l 代表 GT,但是 E^l_ij 代表模型算出來的邊。

    L_Edge 定義為:

    (-1)* sigma * E_ij * log(E^l_ij)

    L_Edge 的物理意義就是希望算出來的 E^l_ij 趨近於真實存在的 E_ij,
    這邊應該還蠻 trivial 的。




    L_Trifocal:




    這個 Loss 就複雜很多,我們要談到多視角融合的原理。

    首先我們要定義一個雙視圖:


    雙視圖解釋對極點


    圖中 C 代表第一攝影機,C’ 代表第二攝影機。
    第一視圖即是第一攝影機所看到的平面,第二視圖亦然。

    e 點即是第二攝影機在第一視圖上所代表的點,
    所以 e 點就是第二攝影機(C’ )對於第一攝影機(C)的對極點。

    要算出攝影機對極點需要攝影機內置矩陣 K,
    這個 K 矩陣牽涉基本矩陣 F,因為與本文較無關,筆者在此按下不表。

    有興趣了解的朋友,筆者推薦:

    “Multiple View Geometry in Computer Vision, 2/e, Richard Hartley” 一書

    中興的學弟可以修資工所吳俊霖老師開的影像處理,
    當年寫第一份作業就有寫到這部份。




    假設有三個攝影機照同一個 X點的三視圖



    現在我們有了攝影機矩陣 P、P’、P”:

    P = [ I  | 0 ]
    P’ = [ A | a_4 ]
    P” = [ B | b_4 ]

    a_i, b_i 代表攝影機矩陣的第 i 個 column。
    (如參照中國資料,那邊會說 column = 列,與臺灣直行橫列剛好相反,須注意。)


    以 P 當作觀察的攝影機來說,
    a_4, b_4 在此代表 P’, P” 攝影機在 P攝影機平面的對極點。


    讓 i 代表第i 個攝影機, a,b 代表非 i 的其他兩個攝影機,
    那麼三焦張量 T_i 的定義就是:

    T_i = (a_i)(b_4)^t – (a_4)(b_i)^t 

    所以 T 算出來應該要是 3x3x3 矩陣,可以自己推導一下。





    點線對應關係


    接下來我們要用三個視圖中的點線對應關係推導三焦張量的損失,

    兩關係式:

    • x” = H_13 * x
    • l = (H_13^t) * l”

    x” 為空間中 X點在第三視圖上的投影,
    H_13 矩陣實為第一視圖投影至第三視圖中的投影矩陣。




    H矩陣推導




    其中 H_13 = [h_1, h_2, h_3], h_i = T^t_i * l’。

    根據空間中的關係又可以推導出:

    H_12 = [T_1, T_2, T_3] * l”

    暫時看不懂 H_12 怎麼來的沒關係,先知道就好。


    因為 H_13 = [h_1, h_2, h_3], h_i = T^t_i * l’,
    所以 l = (H_13^t) * l” 
                -> l = ([T_1, T_2, T_3]^t * l’)^t * l”
                -> l = l’^t * [T_1, T_2, T_3] * l”




    skew-symmetric matrix

    接著因為三焦張量的特殊表達式,

    所以我們要複習一下大學線性代數 – 反對稱矩陣。

    先定義反對稱矩陣:

    任意矩陣 A 的反對稱矩陣 B 為 B = A^t – A,
    反對稱矩陣的特性為 B^t = (-1)*B。

    接著複習反對稱矩陣表達式:

    Assume two martrix a, b,
    a cross b == [a]x * b == (a^t * [b]x)^t.

    又自己 cross 自己等於零,
    零矩陣的轉置是不是也是零矩陣?

    所以 0^t == [a]x * a == a^t * [a]x

    沒錯!不要猶豫!
    自信地把等式同乘 (-1)!

    筆者高中時就是班上最自信的那位,自信地讓高中數學被當!
    但是這裡真的可以同乘啦!

    以上複習完畢。




    由線推導點的投影 – 1



    由線推導點的投影 – 2

    由點投影關係式 x” = H_13 * x 為基底推導, 
    由上一段可知 H_13 = [T^t_1, T^t_2, T^t_3] * l’,
    則 x” = H_13 * x 
              -> x” = [T^t_1, T^t_2, T^t_3] * l’ * x 
              -> x” = sum(X_i * T^t_i) * l’ 
              -> x”^t = l’^t * sum(X_i * T^_i)

    由前段可知 a cross a 為零,所以:

    x”^t * [x”]x == l’^t * sum(X_i * T^_i) * [x”]x == 0^t

    接著我們要來拆解 l’,
    x’為空間中 X 在第二視圖上的投影,令 y’ 為第二視圖上過 l’ 的任意點。

    l’ = x’ cross y’ = [x’]x * y’
    l’^t = y’^t * [x’]x^t




    將  l’ 帶回等式



    由前段可知 l’^t = y’^t * [x’]x^t,
    將其帶回 l’^t * sum(X_i * T^_i) * [x”]x == 0^t

    -> y’^t * [x’]x^t * sum(X_i * T^_i) * [x”]x == 0^t

    由於 y 點可以為 l’ 上的任意點,所以 y’^t 可以消去,
    此段在”Multiple View Geometry in Computer Vision, 2/e, Richard Hartley” 一書中有證明,
    但為文章內容簡潔本文按下不表。

    又可利用 skew-symmetric matrix 性質:

    A^t = (-1)*A

    所以

    [x’]x^t = (-1)*[x’]x

    推導最終結果為:

    -> [x’]x *(sumx_i*T_i)*[x”]x = 0





    與三焦損失相比較:

    將不可視的模型預測點 V^g_j 與推導結果做 cross,
    若完美預測,則 Loss 為零。

    L_Trifocal 以上推導完畢。




    L_Reproj:



    這裡的 pi 是相機的內置矩陣,W為 3D空間預測點座標圖,

    這裡做 pi(W_j) 的物理意義是把 3D空間預測點座標圖投影回 2D平面,
    特別注意 V^g_j 也是 2D平面的座標預測點。




    Total Loss:


    最後把四個 Loss 加總起來就可以了 ODO!


    如何對本文有任何疑問或書寫錯誤,
    歡迎留言或是聯絡我:

    wuyiulin@gmail.com


  • 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

  • Focal Loss – 基於 cross entropy 的分類 Loss function 改進

     

    假設各位都知道並了解  Cross Entropy 是什麼的前提下,

    這篇文章主要提到 Focal Loss ,一種基於  Cross Entropy 的改進方法。


    Cross Entropy 的簡介


    主要改進兩個方向:


    1. Data imbalanced
    2. Difficulty sample in weight ( Focal Loss )

    首先我們先來比較 Cross Entropy 與 Focal Loss 的 function:

    CE vs FL


    如上圖所見, 
    Alpha 負責解決 Data imbalancedGamma 負責解決 Difficulty sample 的問題。
    • Alpha
    講解 Alpha 之前,先讓我們了解什麼是 Data imbalanced
    Data imbalanced 就是關於你的資料集,如果每個類別的樣本分布不均,
    這樣模型就容易被樣本多的類別所決定。
    模型被牽著鼻子走 -> 樣本少的類型容易分不好 -> 分類精準度就會遇到瓶頸。
    像是 Modelnet40 就有這種問題。

    所以 Alpha 是一個 Vector ,把 Alpha 乘回原本該進去 CE 的分佈機率表,
    便可以用來來平衡樣本少與樣本多的類別。
    (個人是使用 總樣本數 / 該類別樣本數,作為該類別的 Alpha t 值)


    (但是如果你在一些優秀的公家機構,
        他們會花整整兩個月找工讀生,並用人工增加樣本少的樣本數,
        以達到 Data balanced這種工人智慧實在是讓我嘆為觀止。
        所以說數學很重要對吧?
         PS. 我絕對沒有說花試所會這麼做。)




    • Gamma


    Gamma 就比較難解釋了,
    首先假設分類網路分對且高信心(i.e. 好分類樣本)的情況下
      ( assume y = 1 , p = 0.8 , gamma = 1):


    原始的 CE 給出的 Loss 會是: -log(p) ~ 0.096
    改進後的 FL 給出的 Loss 會是: (-1) * (1-p)^gamma * log(p) ~ 0.019


    而在分類網路分對且低信心度(i.e. 難分類樣本)的情況下
      ( assume y = 1 , p = 0.2 , gamma = 1 )
    原始的 CE 給出的 Loss 會是: -log(p) ~ 0.698
    改進後的 FL 給出的 Loss 會是: (-1) * (1-p)^gamma * log(p) ~ 0.559

    在高信心度分類正確情況下,FL 的 Loss 會更低,
    在低信心度分類正確情況下,FL 的 Loss 會更低,
    這代表 FL 比 CE 更好對嗎?

    如果妳到目前為止覺得我說的超對!
    身高又超過 160、長髮過肩,麻煩聯絡我: wuyiulin@gmail.com

    無論在哪個城市,我總是知道哪間牛排館最好吃。
    只差一位無條件支持我的另一半!



    分類網路分錯且低信心度(i.e. 難分類樣本)的情況下
      ( assume y = 1 , p = 0.2 , gamma = 1 )
    原始的 CE 給出的 Loss 會是: -log(p) ~ 0.698
    改進後的 FL 給出的 Loss 會是: (-1) * (1-p)^gamma * log(p) ~ 0.559

    哇靠,怎麼 FL 給出的 Loss 比較低?
    難分類的就算了,如果好分類的分錯怎麼辦?
    分類網路分錯且高信心度(i.e. 好分類樣本)的情況下
      ( assume y = 1 , p = 0.8 , gamma = 1 )
    原始的 CE 給出的 Loss 會是: -log(p) ~ 0.096
    改進後的 FL 給出的 Loss 會是: (-1) * (1-p)^gamma * log(p) ~ 0.019

    將近四倍的 Loss 值,超級優秀。


    原論文中 gamma 值是 Hyperparameter
    參照下所畫的曲線。 



    結論:

    個人覺得 FL 的 Gamma 部分比較適合在精確度已經 push 到很極端的模型。
    但是 Alpha vector 看起來倒是通用沒問題。


    如果本篇數學部分推導有任何錯誤,
    歡迎聯絡:wuyiulin@gmail.com




    References







  • [論文筆記] 三維點雲的 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  的論文理解,

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

  • OpenCV AI Kit 1 (OAK-1)從零開始的傻瓜式教學

     

    起因是因為主管塞了兩盒工程機包裝的東西給我,

    叫我趕快做點東西出來。

    :大勾請問這兩盒是什麼?

    "窩也不是很清楚,應該是攝影機吧?"

    "上禮拜才送來的,就交給你好好幹了!(瞇眼。"

    回到座位拆開包裝,奇妙的字眼映入眼簾 – OAK-1?橡樹一號?

    乖乖隆叮咚?

    我的業務範圍上從先進飛彈制導,下至林業技術輔導了嗎?

    看來下一任臺灣隊長就是我了對吧?

    現在應該抓緊時間去曬太陽之類的?

    Anyway 這的確是攝影機,不是什麼先進的橡樹、農業技術輔導。

    OAK-1 的全名是 OpneCV AI Kit

    會出現這東西,我猜是 OpenCV 覺得大家用的環境太混帳了,

    導致沒辦法發揮我們程式的實力,所以自己跳出來賣攝影機的概念。

    (我看過學弟拿沒 GPU 的文書機配 WEBCAM 在那邊掃口罩偵測,FPS 著實感人。)

    做影像辨識是這個樣子:

    影像辨識是需要算的,就算你模型都訓練好,

    還是要有一個地方可以判斷(計算),像是我學弟那個例子就是把影像丟回電腦用 CPU 算,

    結果就是出來的影像 FPS 感人。

    這麼感人的 FPS 肯定是不行的,畢竟未來要用在載具上,

    任務時間來到毫秒級,FPS 必須提高,下游任務的準確度才會提高。

    (才不會上演街頭人肉保齡球。)

    但是 OpenCV 左想右想,總不可能在每臺載具上面塞一張很貴的 GPU 對吧?

    為了教育我們這些只用 CPU 算的弱智兒童(X)

    為了讓貪財產業鏈侵入學生生活(O)

    (OpenCV 後面是 Intel,Intel 最近重新出了自己的 GPU 你知道的。)

    就出了 OAK 系列,裡面幫你塞了一張 VPU。

    VPU 是一種介於 CPU 與 GPU 中的東西,

    可以想像成沒那麼強的 GPU ,但是可以負責簡單的判斷。

    總之有這張 VPU 塞進去以後捏,好處有兩個:

    1.後端(伺服器端)可以不用塞 GPU,這種 Camera 又比 GPU 便宜很多,省錢!

    2.判斷直接在 Camera 直接做完,理論上比較省傳輸的 latency。

    好,前面廢話那麼多,來裝環境。

    首先這篇環境是 for Windows 10 ,因為我在公司被分配到 Windows 10 的機子,

    順便做個紀錄,聽起來以後要交報告的,多塞點廢話(X)。

    首先用管理員權限打開你的 Windows Shell (藍底白字的那個)

    Windows Shell

    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
    

    如果你沒有喜歡的編輯器 加上 還沒有安裝 Python 

    就下這行,幫你裝 PyCharm + Python-least:

    choco install cmake git python pycharm-community -y
    

    然後你可能會發現阿幹怎麼 GIT 裝失敗?

    下這行:

    winget install --id Git.Git -e --source winget

    然後就裝起來了,一整個正確!

    去載這包:

    https://github.com/luxonis/depthai-python

    啟動 example/Yolo/tiny_yolo.py

    偵測結果

    好欸!

    你也可以說自己會偵測物件了(ㄍ。

    之後應該會做其他東西吧?(望天。

    Ref. 

    官網教學:https://docs.luxonis.com/projects/api/en/latest/install/#installation

    輔助影片教學:https://www.youtube.com/watch?v=ekopKJfcWiE&ab_channel=BrandonGilles

  • [論文筆記] 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

    哇,如此厚顏無恥之人!
    好總之,晚安。
  • [名詞筆記] Channel-wise

     Channel-wise 

    之前在 【論文筆記】Squeeze-and-Excitation Networks 那篇 遇到過,

    這次來很淺的解釋一下 Channel-wise 大概在做什麼?

    就我的解釋來看:

    Channel-wise 在做 "base on Channel 的分組連接",

    目的是減少計算量。

    以 H x W x C 為尺寸 2 x 2 x 9 為例,三個分成一組。

    以 【論文筆記】Squeeze-and-Excitation Networks 那篇 來說

    我們要使用一顆 H x W x C 的 Feature 來做 Channel-wise,

    總共有 C 個 Channel 每個 Channel 自己一組。

    分組後的 Channel 再去做 Cov。

    大概就是這樣<3

  • 【論文筆記】Squeeze-and-Excitation Networks


    簡介:

    Squeeze-and-Excitation Networks(以下簡稱 SENet)是一種類似於 plugin 的概念,

    獲得對於 C 個特徵(frature)間的關係,進而提升整體模型的準確率。


    方法概要:


    Step1

    先拿一組 H’ x W’ x C’ 的 feature ,經過 Ftr 後 得到標準輸入 U 。


    Step2

    想像一下把 U 這顆像生吐司的東西整個壓縮,經過 Fsq 後 變成 1 x 1 x C 的濃縮生吐司資料。

    然後這裡做了 channel-wise 的運算,也就是分組 base on C 的概念。

    做了以後會得到 C 組的 1 x 1 資料


    channel-wise 的概念請點這篇


    Step3

    因為濃縮生吐司資料的尺寸是 1 x 1 x C ,所以可以想像成有 C 片小土司。

    為了減少計算量 + 得到每片吐司 裡面模型的互相關係,所以做 Fex。

    得到權重序列 (1 x 1 x C)


    其中 W1,W2 的維度變換是因為 Activation Function 的緣故。


    Step4

    把權重序列 乘上生吐司 U (標準輸入 feature),

    讓你的生吐司成為威力加強版!


    想像一下,如果拿去做二維邊緣偵測,經過這個 SENet 之後的輪廓理論上會加深。



    解釋計算方程式:


    Ftr():

    Ftr 就是在做捲積運算,算到想要到生吐司尺寸。


    Faq():



    Zc 就是上文所提到的濃縮生吐司資料,這邊在幹的事情很簡單。

    把 H x W 這個二維平面上的每一個點做平均得到一個純量,總共有 C 個純量。

    正經且學術上的講法是 Global Average Pooling


    Fex():


    Fex() 是本文核心重點,利用 Fex() 獲得 Channel feature map 間的關係。

    首先要說明 σ  δ 的特殊性關係(#

    σ = sigmoid ; δ = ReLU

    z 則是等效上面的 Zc


    從右邊看起 維度 C 的 濃縮生吐司資料 左乘 W1 出來的資料維度是 1 x 1 x C/r ,

    這筆資料做 Sigmoid 後 左乘 W2 又變回 1 x 1 x C 的資料。



    最後 ReLU 運算後,得到權重序列 S


    Fscale():



    核心概念概念就是把這串權重序列 S 分配給傻傻的並聯生吐司 U,

    這樣你的 生吐司 U 就會變成擁有 Channel feature 間關係 的威力加強版 tilde X。



    文章的 Reference 來自於這兩篇:

    (深度學習)SENet(Squeeze-and-Excitation Networks)

    SENet(Squeeze-and-Excitation Networks)算法笔记


    如果小弟我有寫錯,或是有更好的想法歡迎來信討論~

    信箱地址:wuyiulin@gmail.com