這些年來,參與或瞭解了不少模式識別技術相關項目的誕生、成長與死亡。項目會死亡,但是知識不會,人的精力是有限的,如果不記錄一下,多年後參與者也會變得和路人一樣,忘了那些技術是咋實現的,用來幹嘛的。所以這裏零散的記錄一下吧,不成體系,只做備忘索引。

特徵

不管人還是計算機,識別圖像都是依據圖像整體和細節的一些特徵。那麼計算機如何識別圖像呢,有很多特徵提取的算法來找出圖像的特徵。

傳統圖像特徵

是幹啥的

傳統算法根據圖像的像素數據,用設計好的公式來檢測圖像的特徵,包括角點、輪廓、顏色梯度等等。不同算法在檢測這些特徵的準確性不同,各個流派實驗法也各有擅長特特徵。現代的、更先進的算法在某些方面或者整體的準確性方面優於更老的算法。

當相同的圖像發生一些線性或者非線性的變換時,會對特徵提取造成一些干擾,例如縮放、旋轉、平移、仿射變換、變形等等。

不同算法應對這些變換的能力也不同,應對能力越強稱之魯棒性越好。一般稱尺度不變性、旋轉不變性、仿射不變性等。

有哪些

  • Susan算子 邊緣和角點特徵檢測
  • FAST算子 邊緣和角點檢測,基於Susan改進
  • BRIEF 特徵描述子
  • ORB
  • DoG
  • RANSC特徵點
  • Harris角點檢測
  • SIFT特徵

如何選擇

如果要用到這些特徵檢測算法,需要在理解各個算法特點的基礎上 ,根據實際業務場景,對各個檢測算法做對比試驗,最終選擇最合適的算法。

檢測的結果是什麼

一般都能輸出特徵角點、輪廓的位置座標;帶特徵描述的算法還能輸出特徵描述向量。

怎麼用

AR跟蹤

有的特徵檢測算法對線性變換的支持很好,這樣對於同一個圖像,其位置和姿態發生線性變化時,各個特徵點的位置和姿態也會發生一致的線性變化。通過各個特徵點的變化,使用姿態求解的算法,可以計算出圖片的變換矩陣 —— 描述圖片的平移、旋轉、縮放特徵。Marker based AR跟蹤算法就是用這個做的。

圖像檢索

在一堆圖片中檢索一張圖片, 將所有圖片的特徵點描述向量提取出來。待檢索圖用相同的特徵提取算法提出來特徵,用knn或者faiss等檢索算法找出最相近的特徵,計算特徵匹配數目最多的幾個圖片,在加上特徵點直接的幾何關係校驗,給出最相似的圖片。

深度學習特徵

理解

神經網絡這塊,目前我對分類網絡瞭解的多一點,定位網絡只是用過ssd和faster rcnn,沒有學習其細節原理,這裏先只記一下分類網絡吧。

神經網絡對輸入數據,經過卷積層、激活函數、池化層、全連層,以及中間可能有的dropout、殘差模塊等等各種騷操作,最後得到一組輸出的數據,這個過程稱爲前向運算;爲了把輸出結果映射到類別上,一般會在最後一層搞一個全連層,輸出與類別數一樣維度的向量,然後計算這一層的結果與標註結果的差異(loss),將loss的結果沿前向運算相反的方向一層層傳遞,每一層都會根據loss結果,向梯度下降最快的方向(求偏導)更新自己的參數,這個過程稱爲反向傳播。

之前看過一些 說人話的CNN文章 ,這裏也簡單記錄一下說人話系列理解吧。

  • 卷積層:用隨機初始化的一個卷積核(濾波器),滑動窗口對輸入數據做一次卷積(濾波)操作,輸出的結果稱爲feature map
  • 激活函數:激活函數有很多種,引入一些非線性的操作,將feature map的每個元素過一遍激活函數,得到一個新的feature map
  • 池化層:減少數據量,突出重點特徵,如將3*3的數據變成1*1,求均值或者取最大值
  • 全連層:將數據輸出爲一層1*k維度的數據,k可以是任意維度,而這k個維度上每一個點都與輸出數據的每一個數據相關,即所謂的”全連接“
  • loss函數:對一通騷操作之後,得出的結果與真實標註結果之間的差距做一個量化的評估值,loss函數有很多種,可以根據場景選擇,例如 人臉識別loss函數評估
  • 反向傳播:拿着loss函數輸出的差距值,反向傳遞給上一層,並且對上一層各個參數對loss的影響求偏導,找到梯度下降最快的方向更新參數

極簡分類網絡例子

假如我要實現一個10000個類別的分類網絡,大致可以這樣:

  1. 輸入圖:100*100*3
  2. 卷積層:3*3*3卷積核,隨機初始化參數,輸出100*100*3的feature map
  3. 激活函數:對100*100*3的每個元素用激活函數做處理,還是輸出 100*100*3的feature map
  4. 池化層:均值/最大值池化,減少數據量提出突出特徵,輸出34*34*3的feature map
  5. 全連層:34*34*3*10000維度的參數向量,對上一層輸入的每個數據做一次計算,輸出1*10000的向量
  6. softmax:對上層1*10000的輸出做softmax計算,將向量轉換爲類別概率分佈,輸出1*10000維度的概率分佈
  7. softmax loss: 假如輸入圖是第237個類別,則正確的1*10000概率分佈向量是[0,0,…1,…0,0,0],與上一步輸出的概率分佈結果計算交叉熵
  8. 上一層結果反向傳播,更新卷積層、全連層參數

訓練網絡,即是用大量標註樣本訓練網絡中的參數,使其對特徵的表達能力達到最優,這個過程叫監督學習。

訓練完成得到該網絡最優的參數後,將待預測樣本走一遍上面前向運算的過程,得到第6步輸出來的結果,然後按概率排個序,得到topK,即是置信度最高的K個類別。

說到分類網絡,就不得不說大名鼎鼎的ImageNet和resnet殘差網絡,各種高大上的操作使得現在神經網絡在很多場景下的泛化特徵的表達能力方面已經超越傳統特徵了(親測,牛逼的很)。

細節的詳細介紹,各種高大上的網絡結構和優化策略理解: CNN 入門講解專欄閱讀順序以及論文研讀視頻集合

深度學習特徵

說了半天是不是跑題了? 說好的特徵呢?

深度學習也是可以表達特徵的,不過它能高度抽象對象的特徵描述,得到一個對象的特徵描述向量,而不是基於圖像像素分佈特點來描述一個個細節的特徵。

那麼假如想用上面的分類網絡來提取對象的特徵,咋搞呢?

假設我們想用一個1*128維度的向量來描述對象特徵,那麼改一下網絡結構:

  1. 輸入圖:100*100*3
  2. 卷積層:3*3*3卷積核,隨機初始化參數,輸出100*100*3的feature map
  3. 激活函數:對100*100*3的每個元素用激活函數做處理,還是輸出 100*100*3的feature map
  4. 池化層:均值/最大值池化,減少數據量提出突出特徵,輸出34*34*3的feature map
  5. 全連層:34*34*3*128參數向量維度的,輸出1*128維度的向量(即我們要的特徵向量)
  6. 全連層:1*128*10000維度的向量,對上一層輸入的每個數據做一次計算,輸出1*10000的向量
  7. softmax:對上層1*10000的輸出做softmax計算,將向量轉換爲類別概率分佈,輸出1*10000維度的概率分佈
  8. softmax loss: 假如輸入圖是第237個類別,則正確的1*10000概率分佈向量是[0,0,…1,…0,0,0],與上一步輸出的概率分佈結果計算交叉熵
  9. 上一層結果反向傳播,更新卷積層、全連層參數

一般特徵向量維度越高,描述性能會越強,不過效果隨維度增加會有個極限;而維度越高,訓練難度就越大,特徵大小也會越大(在工程實現裏邊往往還需要考慮特徵大小問題)

假設已經訓練好了10000類的分類網絡,又來了50個類別要識別,咋辦呢?再訓練一個10050類別的網絡?可能要哭,數據量大的話,訓練一次得好久。

這個時候特徵層就派上用場了。如果模型的特徵描述能力夠好,把新增的50類整一批標註過的數據,標好,提好128維的特徵,存起來。有數據過來的時候,也用模型提一個128維的特徵,先分類跑一把,然後拿去和之前提好的50類的特徵們做knn,找出最大的幾個類,就能快速上線了。

後面的過程,至於用分類的結果,還是用knn的結果,就看閾值怎麼設置了。等到10050新分類模型訓練好,就可以去掉這50類的特徵匹配了。

分類從0到1的一般步驟

  1. 確定分類類別(SKU)
  2. 檢測&定位方案確定,有的領域已經有比較成熟的網絡和模型,如文本檢測定位的CTPN,人臉檢測定位的mtcnn等;更多的領域的需要自己構造網絡或者使用開源的ssd/faster-rcnn訓練定位模型。
  3. 大力整語料,通過線上數據收集、爬蟲爬取、瀏覽器插件、尋找開源數據集等手段,弄到大量原始數據
  4. 預處理,對上一步弄到的數據,做比如檢測定位分割、聚類、現有模型初篩、外包標註、數據增強等手段,將數據調整到最佳狀態
  5. 訓練網絡
  6. 用獨立數據集測試出準確率、召回率等
  7. 模型滿足要求後,發佈上線

聚類算法

給一組混合起來的向量,按參數把距離相近的分成N類,當擁有了良好的特徵提取器,能比較好的描述一個對象的特徵時,用聚類算法可以快速的將不同特徵類型的對象區分開來。

深度學習項目中需要收集大量語料時,可以用聚類算法預處理,分成多類後再人工接入,或者用後續的算法接入,提高效率。

數據科學家需要了解的5種聚類算法

特徵檢索

特徵相似性評估

機器學習樣本特徵之間的相似性度量總結

knn k近鄰算法

《機器學習實戰》學習總結(一)——k近鄰算法(kNN)

開源項目faiss

github-faiss

開源項目、應用原理等

mtcnn

一個效果很好的人臉檢測定位開源項目

聲紋識別

怎麼識別聲紋呢?

其實經過一通騷操作,識別聲紋和識別圖像還挺像的。

把聲音的時域信息通過傅里葉變換轉換爲頻域信息,頻域信息輸入分類網絡來訓練,和訓練圖像分類是一個道理。

相關文章