Keras Xception Multi loss 細粒度圖像分類


作者: 夢里茶

如果覺得我的工作對你有幫助,就點個star

關於

這是百度舉辦的一個關於狗的細粒度分類比賽,比賽鏈接: http://js.baidu.com/

框架

硬件

  • Geforce GTX 1060 6G
  • Intel® Core™ i7-6700 CPU
  • Memory 8G

模型

Xception結構圖

  • 這篇Person Re-id論文的啟發,在多分類基礎上增加一個樣本是否相同判斷的二分類loss,增加類間距離,減小類內距離

Keras實現

  • 去掉Xception最后用於imagenet分類的全連接層,獲取圖像深度特征
  • 輸入兩張圖片,可能屬於相同類也可能屬於不同類
  • 根據特征和標簽進行多分類訓練
  • 同時以兩圖是否屬於同一類作為二分類標簽訓練

數據預處理

  • 從Baidu雲下載數據
  • 按類別把圖片放在不同的目錄下,方便ImageDataGenerator的使用
  • 因為先前我把圖片命名為這種格式"typeid_randhash.jpg"了, 所以我寫了這段代碼來做圖片移動的工作img2keras.py
  • 數據預處理還有許多細節要處理,遇到問題的話可以先查看keras的文檔,如果還有問題,可以提issue.

訓練

  • 使用Keras的ImageDataGenerator接口進行數據增廣
  • 同時使用ImageDataGenerator做數據增廣並進行正負樣本對采樣是一個難點.因為從ImageDataGenerator獲得的圖片被打亂了.
    遍歷數據集找同類樣本作為正樣本效率很低,幸運的是,在每個batch中,存在同類的樣本,所以我們可以通過在同一個batch中交換同類樣本的位置,構造出包含正樣本對的另一個輸入.
  • 凍結Xception的卷積層,采用ADMM訓練多分類和二分類模型.
  • 解凍Xception卷積層的最后兩個block(總共有12個block,最后兩個block從Xception的105層開始)繼續使用SGD訓練
  • 去掉數據增廣,再訓練直至收斂

代碼

一些測試結果

  • InceptionV3,多分類模型: 0.2502
  • Xception,多分類模型: 0.2235
  • Xception, 混合模型: 0.211
  • Xception, 混合模型,最后去掉數據增廣再訓練: 0.2045

如果發現代碼里有bug,麻煩開個issue告訴我或者來個PR修復一下,萬分感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM