本文是對論文的解讀與思考
論文: Towards End-to-End Lane Detection: an Instance Segmentation Approach
introduction
該論文提出了一種 端到端 的 實例分割方法,用於車道線檢測;
論文包含 LaneNet + H-Net 兩個模型網絡,其中 LaneNet 是一種將 語義分割 和 像素矢量化 結合起來的多任務模型,語義分割用來分割車道線與背景,像素矢量化 用於把屬於同一條車道線的像素 聚類 在一起,
H-Net 是個小網絡,用於預測 轉換矩陣 H,使用 H 對同一條車道線的所有像素點進行重新建模(論文中是使用 y 預測 x)

LaneNet
之前提到大部分 圖像分割 的網絡都包含 encode 和 decode 兩部分,LaneNet 也不例外,不同的是 LaneNet 包含了兩個分支,如下圖

下面的分支 Segmentation branch 是常規的 語義分割,用於 分割 車道線 和 背景,實現的是 二分類;
上面的分支 Embedding branch 用於 像素的矢量化,把每個 像素 用一個高維向量表示(類似於 word embedding),使得 像素 可以通過 聚類 把 不同車道線分開;
后面那個 X 不必在意,只是結合的意思;
網絡結構
LaneNet 是 基於 ENet 的 Encode-Decode 網絡結構,ENet 網絡如下圖

如圖所示,ENet 由 5 個 stage 組成, stage 1 2 3 屬於 Encode,stage 4 5 屬於 Decode;
LaneNet 中 語義分割 和 Embedding 兩個任務共用 stage 1 2,將 stage 3 和 后面 的 Decode 部分作為各自分支結構;
語義分割 的 輸出為 W*H*2,[2 分類],Embedding 的輸出為 W*H*Dim,Dim 為自定義的向量長度;
論文中兩個分支 權重相同;
Segmentation
語義分割目的是區分 車道線和背景,其中作者主要考慮兩點:
1. 在構建 label 時,為了處理遮擋問題,論文對 被車輛遮擋的車道線和虛線進行了還原;
2. 由於 類別 不均衡,作者進行了加權

Pclass 為 每個類別 出現的概率, C 為 常數,是個超參數,(ENet論文中是1.02,使得權重的取值區間為[1,50])
個人理解:首先,由於 類別分布可能會相差很大, 取 log 縮放了這個差距,加個 常數 C 防止 log 取 負數,然后再取 倒 是把出現多的權重變小,出現少的權重變大;
Embedding
像素 Embedding 是對 像素進行 矢量化,用於區分 每個像素 屬於哪條車道線;
它的思想如下:類似於聚類,同一條車道線(根據 label 可知) 的像素要靠近 矢量化 的中心,不同車道線的像素的 矢量化 中心要遠離,即 類內距離盡可能小,類間距離盡可能大;
它的 loss 設計很巧妙,分為兩部分

C 代表 車道線的條數,由 label 可知;
Nc 代表 每條車道線的 像素點;
μc 代表每條車道線的像素矢量 均值,注意是 預測值的 mean,即 網絡輸出 預測矢量 后,再計算均值,然后 計算 loss;
δv 代表 像素 離 μc 的距離,大於 該距離時,要進行 pull,即 拉近到 聚類中心;
// 試想一下普通的距離方法,每個樣本分布在其聚類中心周圍,並不是 和 聚類中心 重合,
μca μcb 代表 不同車道線的 像素矢量 均值,也是 預測值的 mean;
δd 代表不同車道線 聚類中心 間 的距離,小於該距離時,要進行 push,使得 聚類中心遠離;
||x|| 代表 L2 范數;
[x]+ 代表 max(0, x);
聚類
聚類只 發生在 預測部分;
即 模型完成 分割 和 矢量化 后,對矢量 進行 聚類,區分不同車道線;
為了 方便 聚類,在 Embedding 時 設定 δd > 6*δv;
聚類 方法使用的是 mean shift,不再贅述;
H-Net
LaneNet 的輸出是 每條車道線的像素集合,我們還需要把 這些 像素 擬合成一條車道線;
傳統做法是將 圖片 投影到 鳥瞰圖 中,然后用 二階或者三階 多項式進行擬合,這種方案 轉換矩陣 H 只算一次,但不同地形如 丘陵、山地 的轉換是略有不同的;
為了解決這個問題,論文訓練了一個 預測 轉換矩陣 H 的 神經網絡,輸入是一張圖片,輸出是 轉換矩陣 H;
H 長這樣

通過置 0 對轉換矩陣進行約束,即水平線在轉換下保持水平,即 坐標 y 的變換不受 x 的影響;

y' = dy + e,與 x 無關;
網絡結構
上述轉換矩陣只有 6 個參數,故 H-Net 模型的輸出是一個 6 維向量,網絡包含 6 個卷積層和 1 一個 全連接;

loss function
懶得寫了,是個圖片

思路如下: H-Net 輸出 H 后,與 真實像素 相乘 做轉換,得到一堆轉換后的點,然后用 最小二乘法 得到 擬合系數 w,注意 至此 H w 都是瞎猜的,是預測的,
然后我們在 y’ 處 計算對應的 x’,也是瞎猜哦 ,最后用 H-1 把 x’ 還原回去,得到 x*,至此都是瞎猜,然后求 誤差;
具體可以看 參考資料 3
我這里有個疑問:用 x’ y' 算出了 w,然后 做 wy' 竟然和 x' 完全不一樣,有些費解,糾結啊
curve fitting
曲線擬合只發生在 預測 部分;

思考
laneNet 為什么沒有 類似於 skip connection 的操作?
我的理解是 識別車道線的任務 太過簡單了
參考資料:
https://www.jianshu.com/p/c6d38d648509
https://www.cnblogs.com/xuanyuyt/p/11523192.html
https://github.com/stesha2016/lanenet-enet-hnet 代碼
