實戰 | 一行命令訓練你的圖像分類模型

1.項目介紹

這次給大家介紹一個很方便的訓練自己圖像識別模型的一個程序。可以通過一行命令實現訓練自己的圖像識別模型,並且訓練的速度很快,效果也不錯。

圖像分類有三種訓練方式:

  • 構建一個新的模型並從頭開始訓練,稱爲scrach

  • 在已經訓練好的模型基礎上,修改模型的最後的全連接層,並重新訓練全連接層稱爲bottleneck

  • 在已經訓練好的模型基礎上,修改模型的最後的全連接層,並重新訓練全連接層同時微調模型的卷積層,稱爲finetune

我們這次項目的名稱爲bottleneck,所以我們要介紹的是第二種訓練圖像分類的方法。使用bottleneck的方式來訓練自己的數據,優點是訓練速度比較快,訓練週期數比較少就可以得到比較好的結果。

這次訓練模型使用的代碼是tensorflow官方提供的圖像重新訓練的程序:
https://github.com/tensorflow/hub/tree/master/examples/image_retraining
該程序使用了一個已經訓練好的inception-v3的模型來作爲基礎模型,inception-v3是使用imagenet比賽的數據集訓練出來的一個可以識別1000種生活中常見物體的模型。

v3表示它的第三個版本,inception模型的使用是可以參考:
https://github.com/Qinbf/Tensorflow/tree/master/Tensorflow基礎使用與圖像識別應用/程序

項目所需環境:
Python
Tensorflow

2.Inception的bottleneck介紹

下圖爲inception模型的結構圖:

實戰 | 一行命令訓練你的圖像分類模型

如果把這個模型看成是一個花瓶的話,那麼bottleneck瓶頸就是圖中全連接FC(fully connected)的部分。

inception的模型本來是爲了imagenet比賽而創建的,所以有1000個分類,全連接層有1000個輸出。我們訓練自己的數據集通常沒有這麼多分類,而且imagenet比賽中分類也不一定是我們想要的分類。

所以模型的全連接層的部分需要全部丟棄,然後創建新的全連接層並重新訓練。比如我們要訓練5個分類的圖片,那麼就創建一個有5個輸出的全連接層來訓練。

模型中的卷積層部分因爲是經過大量訓練得到的,所以已經具備了非常良好的特徵提取的能力,所以就不需要重新訓練了,可以不做修改直接使用。

訓練流程:

  1. 先把數據集傳入已經訓練好的inception模型,得到FC層的前一層AveragePool層的輸出,這個輸出值相當於是從這張圖片提取出的圖像特徵。然後把這個圖像特徵以文本形式保存到本地文件夾中。

  2. 根據圖片類別數量重新構建全連接層,比如一共有5個類別的圖片那麼就會創建5個輸出的全連接層。

  3. 把每張圖片的特徵輸出傳到新的全連接層中做訓練,只訓練全連接層。

  4. 把inception中的卷積層再加上後面訓練好的全連接層就得到了新的模型,可以識別我們自己特定的數據集。

3.Inception模型準備

Inception-v3的模型比較大,所以我上傳了百度雲盤:

鏈接:百度雲地址
密碼:i5jw

在程序根目錄創建一個inception_model的文件夾,然後把模型的壓縮包下載到inception_model的文件夾中,然後解壓。如圖所示:

實戰 | 一行命令訓練你的圖像分類模型

4.項目文件介紹

實戰 | 一行命令訓練你的圖像分類模型

4.1 retrain.py爲訓練模型的程序

4.2 Inception_model爲之前訓練好的inception模型存放路徑

4.3 data爲需要訓練的圖片存放位置
實戰 | 一行命令訓練你的圖像分類模型

圖片存放的方式必須如上圖所示,一個種類的圖片放在一個文件夾下面。圖片文件夾的名字就是圖片類別的名字,名字要用英文。

4.4 bottleneck爲inception卷積層提取出來的特徵,以txt的格式保存在bottleneck文件夾中
實戰 | 一行命令訓練你的圖像分類模型

4.5Linux和mac用戶執行retrain.sh可以開始訓練模型;windows用戶執行retrain.bat可以開始訓練模型)

retrain.bat內容如下:
python retrain.py ^
--bottleneck_dir bottleneck ^
--how_many_training_steps 200 ^
--model_dir inception_model ^
--output_graph output_graph.pb ^
--output_labels output_labels.txt ^
--image_dir data
pause

注:
bottleneck_dir :圖片特徵文件存放路徑
how_many_training_steps :訓練次數
model_dir:之前訓練好的inception模型存放路徑
output_graph:新訓練的模型存放路徑和名稱
output_labels:生成的標籤文件存放路徑和名稱
image_dir:訓練數據存放路徑

4.6 test_images爲測試圖片存放位置

4.7 predict.ipynb和predict.py爲新訓練好的模型的測試程序,執行這兩個文件可以載入訓練好的新的模型預測test_images文件夾中的圖片類型。

5.訓練和測試結果

我訓練了5個種類的圖片:'flower','guitar','house','animal','plane'

每個種類500張,特徵提取的時間會比較長,我使用mac筆記本大概要二三十分鐘,訓練的時間很快,不到1分鐘。

訓練速度比較快的原因是訓練次數我設置比較少只有200次,並且只訓練了全連接層。訓練結束後可以看到測試集準確率:

INFO:tensorflow:Final test accuracy = 99.6% (N=247)

幾乎達到100%的準確率!

準確率之所以可以這麼高主要原因有兩個

第一是由於inception模型本身比較優秀,我們在一個優秀的模型上進行進一步訓練所以得到的結果也很好;

第二是由於我使用的圖像分類難度比較低,因爲,花,吉他,房子,動物,飛機這幾個種類之間的相似度非常低,所以很容易分辨。

如果是做狗的品種識別,比如狗有100個品種,因爲狗與狗之間的相似度很高,那麼準確率就不可能達到這麼高了。

predict文件的部分測試效果
實戰 | 一行命令訓練你的圖像分類模型

實戰 | 一行命令訓練你的圖像分類模型

實戰 | 一行命令訓練你的圖像分類模型

6.項目打包

大家可以去我的Github下載源代碼:
qbf的Github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章