接觸機器學習和深度學習時間不短。我看過各種相關知識但從來沒有總結過。在這篇文章之後,我會從工程的角度,從傳統的機器學習算法和傳統的計算機視覺庫算法,到深度學習中常用的算法和論文,以及各種平臺上模型的轉換、量化和服務部署,盡可能詳細的總結。
常用的圖像分割算法大致可以分為以下幾類。由於圖像的能量範數,邊緣跟蹤等方法的效果只能解決具體問題,效果並不理想,這裏就不細說了。當然,二值化本身也可以分割壹些簡單的圖像。但是二值化算法有很多,我就做壹篇文章總結壹下。這裏就不贅述了。
1.基於邊緣的圖像分割算法:
使用圖像梯度傳統算法算子的有sobel,roberts,prewitt,Laplace和canny。
這些算法的基本思想是使用合適的卷積算子對圖像進行卷積。從而獲得對應於該圖像的梯度圖像。(至於為什麽圖像的梯度圖像可以通過算子卷積得到如圖1,請復習下卷積和倒數的概念,自己推導。)因為圖像的邊緣往往是圖像像素差大,梯度大的地方。因此,我們通過適當的卷積核得到圖像的梯度圖像,即得到圖像的邊緣圖像。至於二階算子的推導,和壹階類似。優點:傳統的算子梯度檢測只需用合適的卷積核進行卷積,就能快速獲得相應的邊緣圖像。缺點:圖像的邊緣不壹定準確。復雜圖像的漸變不僅可以出現在圖像的邊緣,還可以出現在圖像內部的顏色和紋理上。
?還有基於深度學習方法的hed和rcf。因為所有這些網絡都有相同的嚴重缺陷,這裏僅舉hed網絡為例。Hed是基於FCN和VGG的改進。同時引入六種損失進行優化訓練,通過多層輸出不同尺度的邊緣,然後通過壹個訓練權重融合每層的邊緣結果。hed網絡結構如下:
可以得到比較完整的漸變圖,可以參考github的hed實現。優點:圖像的梯度細節和邊緣完整性比傳統的邊緣算子好很多。然而,hed不能很好地區分邊緣圖像內部的邊緣。當然,我們可以自己改變損失,嘗試只擬合外部圖像邊緣。但最致命的問題是,基於vgg的hed的網絡表達能力有限,對於圖像與背景接近,或者圖像與背景部分融合的圖片,hed似乎無能為力。
2.基於區域分割的算法;
常用的區域分割方法有傳統算法結合遺傳算法、區域生長算法、區域分裂合並、分水嶺算法等。這裏傳統算法的思路比較簡單,容易理解。如果有不懂的地方,歡迎大家壹起討論學習。這裏不做過多分析。
基於區域和語義的深度學習分割算法是圖像分割和研究的主要方向。比如FCN級數的全卷積網絡,經典醫學圖像分割常用的unet級數,rcnn級數下發展的maskrcnn,18結尾的PAnet。基於語義的圖像分割技術無疑將成為圖像分割技術的主流。
其中,其他基於深度學習語義的相關算法也可以間接或直接應用於圖像分割。例如經典的圖像摳圖問題。18出現了很多優秀的算法和論文。如深度圖像摳圖,麻省理工學院的語義軟分割(sss)效果極佳。
基於語義的圖像分割明顯優於其他傳統算法。我在解決圖像分割問題的時候,第壹次嘗試使用hed網絡。最終效果並不理想。雖然我也參考github對hed做了壹些微調,但是嘗試了很多次之後還是因為上面提到的原因放棄了。切換到FCN系列網絡。但是fcn不能解決圖像和背景融合的問題。融合圖像的分割既需要較大的感受野,又需要壹些未融合的原始圖像細節,因此很難對單個原始FCN網絡進行精確分割。中間測試了很多其他相關網絡,效果都不好。考慮到感受野和原始圖像的細節,嘗試將resnet和densenet作為圖像特征提取的底層。最後,我測試了unet系列網絡:
unet的原始模型如圖所示。通過給自己和爬行動物拍照,我收集了近1000張圖片。刪除質量差的圖片和內容相似的圖片。爬蟲最終收集到160多張圖片。自行拍照,采集200張圖片後,用ps手動更新邊緣圖像,采用圖像增強變換,大概300*24的圖片。原生unet網絡性能相對壹般。將unet的普通卷積層改為resnet後,網絡的表達能力明顯提高。當resnet改為resnet101時,即使是部分融合的圖像,也能很好地分割。然而,unet的模型體積是不可接受的。
最後階段,我們看到maskrcnn的實例分割。Maskrcnn由RCNN rcnn,fasterrcnn發展而來。於是我用maskrcnn加上自己的訓練數據和標簽圖片進行訓練。Maskrcnn的結果不盡如人意,邊緣定位相對於其他算法略顯粗糙。在產品應用上,顯然不適合。?
3.基於圖的分割算法
基於深度學習的Deepgrab並不是很令人滿意。Backbone,deepgrab的git作者,采用了DeepGrab BV2的網絡結構。原紙沒有完全安裝好做。
原始地址參考:https://arxiv.org/pdf/1707.00243.pdf.
整體結構類似於編碼器和解碼器。還沒有進行過太細致的研究,因為基於resent101的結構在deeplab的模型體積、速度、分割精度等方面還不能滿足當前的需求。我之前大致總結過計算機視覺的相關知識點。既然討論了移動終端模型,那就來總結壹下移動終端模型在模塊中的應用。
因為時間真的有限。這裏不詳細解釋每種算法。稍後,我將從基本的機器學習算法開始。