部落格

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

    哇,如此厚顏無恥之人!
    好總之,晚安。
  • [程式碼筆記] 利用程式碼實現 KNN

     因為前陣子在審視架構的時候,亂報(X)沒讀熟(O),

    所以架構被老師質疑,被遣送回實驗室重讀一遍 DGCNN 怎麼刻 KNN 的部分?

    以下的 KNN 程式碼 都是 base on DGCNN 的 model.py 裡面的 KNN function。

    前情提要:

    1. KNN 要幹嘛?

    :拿到兩點的歐式距離。


    2. 歐式距離是什麼?

    吃公式:

    我們塞進 KNN function 的資料 x 會長得像是:

    [ Batch_size, Channel, Number_of_point ]

    其中 Channel 是資料維度的意思,如果是三維的 x, y ,z 座標,

    Channel 就會等於 3。

    接下來來看程式碼:

    inner = -2*torch.matmul(x.transpose(2, 1), x)

    因為 torch.matmul 代表矩陣相乘

    ineer 出來的資料尺寸就會是

    [ Batch_size, Number_of_point , Number_of_point ]

    令 P1 = [ x1, y1, z1], P2 =[ x2, y2, z2]

    ineer 所代表的數學意義為

    [ x1*x2 + y1*y2 + z1*z2]


    再來看第二行程式碼:


    xx = torch.sum(x**2, dim=1, keepdim=True)


    xx 出來的資料尺寸為

    Batch_size1 , Number_of_point ]

    因為 keepdim=True 的關係,所有 sum 起來的資料會存到第一格。


    xx 所代表的數學意義為

    [x1^2 + y1^2 + z1^2, … , xn^2 + yn^2 + zn^2]


    最後一行程式碼就是組合起來,變成歐式距離的平方:


    pairwise_distance = -xx - inner - xx.transpose(2, 1)

    會變成:

    就是歐式距離平方的展開。
    至於負號是為了後面要做 TopK 所以放上的。
    以上 ODO



  • [論文筆記] SE-NET 的威力加強版 – Convolutional Block Attention Module (CBAM)

     

    我為什麼要讀這篇論文?


    這篇論文可以做什麼?


    這篇論文怎麼做?

    首先,因為我的 DGCNN 模型遭遇到了訓練瓶頸,

    所以我到處找論文來 inprove 模型的準確度。

    這篇論文可以加強模型的準確度,前提是 base on ResNet-50。

    裡面提到這種架構可以插在任意的 convolution 層中間,

    是不會消耗太多計算量的輕量型架構。

    這篇論文是從 SE-Net 加強而來,

    最主要的差別在於 SE-Net 只對 Channel 做 Attention Module,

    而 CBAM 對 Spatial 也做了 Attention Module 並且把它加進來。

    整個核心觀念就是用 attention Module 對 CNN 去優化,

    至於 Attention Module 是什麼概念可以參考上一篇 SE-Net

    整個架構會長這樣:

    圖一:CBAM整體架構

    圖二:Channel Attention 架構

    請參照圖一,那顆 Feature 的尺寸是 C x H x W,

    這對解釋接下來的方程式很有幫助。
    想像那顆 Feature 是一顆生吐司,每一片都是不同口味。
    其中有地瓜、甜芋頭、秋葵三種口味,
    我是一個特別喜歡甜芋頭、極度討厭秋葵的人,
    Channel Attention 在做的事情就是找出我喜歡的部分,
    然後想辦法甜芋頭變得更甜、秋葵變得更無味、讓我更喜歡這顆生吐司。
    這顆生吐司(Feature)在我心目中的價值就會越來越高。
    我不知道未來的女朋友會不會閒到來看部落格,
    但是如果妳覺得火鍋裡面一定要放芋頭,
    我會好好思考我們之間的關係。

    會把芋頭放進火鍋都是邪教徒吧?





    從公式來看架構,剛剛(圖一)說過了尺寸很重要。
    這部分會叫 Channel Attention 就是因為它是從 Channel 下去切割的。
    Maxpooling 與 Avgpooling 過後的資料尺寸為 C x 1 x 1 的一條濃縮吐司。
    MC(F) 就是整個做完的特徵圖(資料)、sigma = sigmoid operator;
    W0 與 W1 是結構圖中間進 MLP 的權重,我在 SE-Net 有講過就不贅述了。

    至於最重要的,為什麼要做 Maxpooling + Avgpooling?

    原作者表示:啊這樣可以更精確地分別每個通道的權重…(幹話。

    我自己的觀察:

    從 PointConv 這篇論文提到 PointNet 的問題在於 Maxpooling 只能提供 global 或是 local 的 Feature。

    SE-Net 使用 Avgpooling 能夠促進模型的性能。

    所以小孩子才做選擇,我們兩種混在一起做撒尿牛丸!

    圖三:Spatial Attention 架構
    解釋一下為什麼這個叫 Spatial Attention ,因為他是切 1 x H x W。
    所以得到的特徵是 H x W 在每個通道的值(也就是空間位置)。
    比較需要解釋的是 f 7*7,這顆是 Hyperparameter,試出來最好的 kernel。

    結論:

    根據數據來看 CBAM base on ResNet-50 的時候,
    最差那個圖的錯誤率(Top-1 Error)減少了 1.9%。
    這種 Attention 架構是一定會變好,
    但是我個人猜測要在某些架構的前提下才會變好比較多。
    至於CBAM 加進 DGCNN 會不會變好?
    我還沒嘗試,但是根據上次 SE-NET 的經驗,
    是增加了 萬分之十的準確率。
    這次預估能增加萬分之十五應該就很不錯了(O)
  • [名詞筆記] 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






  • [Python] YAML.dump TypeError: ‘str’ object is not callable 解決辦法

    當出現 TypeError: ‘str’ object is not callable

    但你確定傳進來的變數的確是 str 時?

    別緊張,可能只是命令參數給錯了。

    像是下圖只包到檔案名稱,沒把參數 ‘w’ 用 () 包起來,就會出現這種錯誤。

       

            yaml.dump(‘654’n + ’65’open(‘test.yml’),‘w’)

    修改成

            yaml.dump(‘654’n + ’65’open(‘test.yml’,‘w’))

    就可以囉OAOAOAOAOA

    低級錯誤me,撞豆腐自殺。

  • Andriod一堆app閃退怎麼辦?

     點開 Google Play 商店

    搜尋 Android system webviwer 解除安裝就好了


    Google 在搞


    本文更新於 2021/03/23

    Ref.https://www.ptt.cc/bbs/MobileComm/M.1616455704.A.7D0.html

  • [心得] 破解 Google 雲端下載限制(非建立副本)

    各位紳士們,一定都有碰過下面這張圖的情況吧?


    沒問題,本肥宅今天就來教你們怎麼解決!

    首先先把要下載的檔案加入星號,到自己的雲端硬碟。

    像這樣

    這時如果你直接按下載就會顯示下載次數已經超過
    如果建立副本就會卡死
    但是!
    如果你框住複數個檔案 像下圖

    就可以完美下載啦!

    灑花
    穴穴指交
  • JDS LABS Atom 木耳開箱

    今天來開這臺去年買的 ATOM AMP

    https://imgur.com/fmxXLS6

    紅色的是變壓器,
    大概有 1.5 塊南僑水晶肥皂那麼大。

    https://imgur.com/aiGsjNH


    Sound as science(#

    https://imgur.com/5uAaNcO


    社群連結小卡

    https://imgur.com/Htra5fW


    轉到底就是關機,很方便的旋鈕。

    本體中規中矩,最喜歡這種造型了!
    低調就是讚

    以下是這次廢文(#
         開箱文(O

    所用到的設備:

    系統方面: 電腦 -> 電訊分離HUB -> Foxtex HP-A4 —
    –> 小黑線 -> Atom

    耳機(靈敏度):

    A900XLTD (102dB)

    M50XBL ( 99dB)

    DT990 – 600ohm ( 96dB)

    歌曲:

    我把我的青春給你 – 好樂團

    我們一樣可惜 – 好樂團

    I will survive – Gloria Gaynor

    Peace Sign – 米津玄師

    空に歌えば – amazarashi

    limehouse blues – 30週年紀念版收錄

    都是來自 Spotify 因為我CD沒收那麼多嘿嘿

    正文開始:

    DT990 – 600ohm

    這臺拿去推 DT990 600ohm

    我覺得不行

    音量要大概轉到九點,開 high gain。

    人聲跟樂器的分離度出不來,感覺糊在一起。

    而且很多音出不來,
    像是我把我的青春給你前奏第三個音(?)
    那下撥弦的音就很難聽到,整首歌就不對惹。

    畢…畢竟是 96dB 的難搞傢伙嘛(遭毆

    M50X

    比 DT990 好推兩倍 的 M50X

    我覺得很可以、萬元內組合好聲

    這邊比較 A4 直出 跟 接上 Atom 的狀況

    沒接:

    人聲比較刺、樂器分離度出不來

    有接:

    人聲修飾變圓潤,樂器分離度出來(但不多)
    人聲與樂器會像是被圍了封鎖線一樣,都會後退一點。
    感覺瞬態也被吃了一點

    音場的部分

    有接跟沒接,我覺得是沒差的。

    個人感覺 M50X 的本來音場就不大。
    這應該也是它好控制的原因吧(?)

    A900XLTD

    一樣比較 A4直出

    很明顯感覺到人聲被修得圓潤了一點,
    不過我認為 A4直出、開 low gain 轉到七點半還比較好聽。

    因為我拿這支就喜歡聽比較刺激的人聲

    優點是這臺聲音很乾淨,
    在這麼敏感的耳機上我聽不到雜訊存在。

    結論:

    優點

    1.人聲修飾變圓潤、後退一點

    2.人聲與樂器分離度出來

    3.很便宜(入手價140$上下,關稅174塊臺幣)

    4.體積袖珍、外型平價,適合放辦公室也不會被認為亂花錢。

    缺點

    1.拿來推非雜食耳機還是不太能聽

    2.變壓器有點大顆

    3.使用 youtube 的時候會聽得出糟糕的錄音xD

    我認為適合買這臺的受眾:

    1.想入手第一台擴大機

    2.主力耳機很好處理

    3.想買一台擴放辦公室

    整套系統弄一弄都在萬元內,
    就算再買一支 M50X 我覺得都值得。

    至於想來拿亂搞地球動圈出拜耳的,
    本客家人不建議你亂花錢。

    不過我也只是建議而已啦嘿嘿嘿
    我還不是買了(#
    於是又買了一台 A281(O

    以上就是本木耳不專業開箱

    有什麼說得不對的地方
    麻煩下面指教QQ

    穴穴指交

  • Crontab不會執行、也沒有報錯?你可以這樣做!

    早安,這裡是機掰客家人。

    我早上遇到一個問題
    原因是 crontab 不吃相對路徑搞出來的
    首先我們先打 service cron status
    確定你的 crontab 還活著
    理論上會出現這樣的畫面
    你發現 AutoHeadphoneBot.py 這支程式名義上有啟動,
    但是自己去檢查自己寫的 log檔時 發現什麼屁也沒有?
    見鬼了,你有可能是中了相對路徑的蠱。
    以本文為例,解決這個問題的方法就是把 AutoHeadphoneBot.py 的使用到的路徑全都換成:
    /home/XXX 的絕對路徑
    然後呢?
    然後他就會正常工作了
    結論:
    如果使用 crontab 讓程式罷工,但是手動 call 又沒問題?
    記得把該程式裡面的路徑全部換成絕對路徑試試看。
    穴穴指交