以前看論文沒有記錄的習慣,往往是看完做個ppt,組會上看着ppt上的圖亂講一通就結束了。這樣的話其實看了跟沒看一樣,因為根本沒有從中借鑒到可用的東西。不過有一說一,也是累了,很多論文一看實驗數據好得不得了,我興高采烈clone下來代碼或者自己復現之后發現平平無奇甚至有的還在負優化,久而久之對每篇論文都多少有了點那么不信任。
今天這篇論文其實也是傷了我的心的,因為我復現了很久也做不出來論文里說的那種性能。 作者在論文中說要開源的,但是4個月過去了他的Github倉庫里還是只有一個README.md
沒辦法,我自己按照論文復現了一下,但結果並不是那么好:https://github.com/Dootmaan/DSRL
這篇論文說白了是將超分辨和分割任務通過Multitask Learning一起做了,和普通的Multitask Learning不同的在於通過一個FA module將兩個task連接到一起了。
作者這么做的原因是他們發現超分辨path的特征圖輸出比分割path的輸出包含更多更完整的高頻信息,於是設計出了FA module,是得兩個task最后的特征圖輸出在一定程度上可以盡量相近。當然這個idea一聽就讓人覺得不太合理,因為畢竟是兩個task,這么做不是反而會導致各自做不好自己的本職工作嗎?
不過還真不至於,因為實際上分割path的特征圖在進入到FA module之前還經過了由一層1*1卷積、BN和ReLU組成的feature transform module。除此之外,FA module本身是通過兩個task輸出特征的空間相似度矩陣計算loss的,也就是說它想做的事情其實是讓二者的空間相似度矩陣盡可能相似。
這個空間相似度矩陣可以參考DANet中的空間注意力模塊,如果特征圖大小為W*H的話,則空間相似度矩陣為WH*WH,其中存儲着每一個像素和圖中其他像素的相似度。
沒錯,idea簡單來說就是這樣,還是比較簡單的,而且因為同時做了超分和分割,最后得到的結果是比輸入圖的大小要大2x的,在實際應用中還是很有價值的。不過下面我就要說一下其中隱含的一些問題。
1. feature transform module放在哪?
按照論文的暗示,我覺得它是放在分割path的最后的,也就是最后那個用來和GT做CE Loss的那個19各通道的輸出(Cityscapes19類所以19通道),然后這個module將19通道轉為3通道再去和超分path的輸出計算FA loss,但在我的實驗中這種做法會導致loss很快變成神秘的nan
后來我猜測feature transform module是放在Deeplab v3+的last_conv后面的。這個last_conv是Deeplab v3+最后的有參數層,它之后接了一個upsample把輸出直接放大到原圖大小,所以實際上在這里做feature transform跟放在最后對分割path的影響是一樣的。因此,我又覺得這里的feature transform module是19通道轉19通道或更多的,具體要看對應位置超分的輸出是多少通道的。因此這個實際上是在和超分的中間層輸出做loss,不過實驗起來效果倒還可以。
我其實在issue區問過這個問題,作者也回答了,他就說是放在最后一層卷積之后,我也不知道他到底是放到哪去了,因為從那以后他就再也沒有在issue區出現過。
2. SISR的設計?
論文里說分割path的設計就是backbone后面加一個2x上采樣,但沒明確說超分path的設計。當然,因為二者共用Encoder所以前半部分倒不用擔心,但后半部分具體咋做的只能靠瞎猜 。我目前是也用last_conv做到19通道,然后接三個上采樣、反卷積和卷積去進一步超分,也不知道對不對。