微調
圖像識別是人工智能領域的Hello World,小白的第一個人工智能項目,應該是手寫識別的MNIST。
話說,圖像識別已經有了很多知名的demo,CIFAR-10也好,ImageNet也罷,那都是前人的經驗,也是後來人的資源。
如果你想要搭建自己的圖像識別程序,比如識別你院子裏的雞,鴨子,還有大白鵝,或者你的女朋友,那麼歸根到底,都是圖像識別,區別只是拿誰的照片去教人工智能框架。它和知名的圖像識別demo一樣,都要提取特徵,然後總結經驗,最後得出結論。
所以,簡單的圖像識別,我們最好是在知名demo上進行微調。
圖像識別有個知名的ImageNet數據集,我們可以在他的基礎上進行微調。
VGG16
VGG16的結構是卷積層+全連接層,卷積層5個部分總共13層,然後還有3層全連接層,總共13+3=16,所以叫VGG16。
我們微調就拿它開刀。
ImageNet是讀取被打上標籤的數千萬張圖片(大約1000個種類的事物),訓練而成。它最後達到一種神功,看到一張圖片,就會得出是1000箇中的哪個。
那麼,我們只微調最後不輸出1000個分類,我們只識別三種:雞鴨鵝,最後輸出3個分類。給一張圖片,它可以告訴我是屬於哪一個分類。這樣也是達到我們的小目的了。
圖片準備
你要在人家的demo上微調,那麼就得遵循他們的格式。
首先,我們要做的就是將你的數據按照他們的格式整理好。
你要新建一個pic文件夾。
下面有兩個文件夾,一個叫train,一個叫validation。
pic
------train 訓練用
------validation 驗證訓練結果用
然後,你把你準備好的圖片分好類,放到文件夾裏,上面兩個都放一些,訓練的多,驗證的少。
pic
------train 訓練用
------------chicken 雞
--------------------- 001.jpg 某隻小雞的照片
--------------------- 002.jpg 另只小雞的照片
------------duck 鴨
------------goose 鵝
------validation 驗證訓練結果用
tensorflow訓練數據是需要使用tfrecord格式的數據,這種數據可以讓tensorflow比較好地操作裏面的信息。
因此,我們需要把我們費心整理的圖片轉化爲tfrecord格式的數據。
tfrecord轉換
轉換的代碼文件如下。
---pic 我們準備的圖片
------train 訓練用
------validation 驗證訓練結果用
---data_convert.py 將我們準備的圖片,轉換爲tfrecord
---src 資源工具代碼
------tfrecord.py tfrecord的轉換類
代碼可以下載 點擊下載
其中,data_convert.py是我們轉換的主要代碼。
使用方法:
在文件夾下,運行:
python data_convert.py -t pic/ \
--train-shards 2 \
--validation-shards 2 \
--num-threads 2 \
--dataset-name satellite
解釋這裏參數的含義:
- -t pic:表示轉換 pic文件夾中的數據。 pic 文件夾中必須有一個train目錄和一個validation目錄,分別代表訓練和驗證數據集每個目錄下按類別存放了圖像數據。
- --train-shards:將訓練數據集分爲兩塊,即最後的訓練數據就是兩個tfrecord 格式的文件。
- --validation-shards:將驗證數據集分爲兩塊。
- --num-threads:採用兩個線程產生數據。注意線程數必須要能整除train-shards validation-shards ,來保證每個線程處理的數據塊數是相同的。
- --dataset-name:給生成的數據集起一個名字。這裏將數據集起名叫satellite,最後生成文件的開頭就是 satellite_train、satellite_validation。
運行完畢後,在pic文件夾下就會生成4個tfrecord文件和1個label.txt文件。
其中tfrecord結尾的就是我們最終生成的tfrecord格式數據,因爲我們指定了--train-shards 2 和 --validation-shards 2,所以訓練數據和驗證數據都分爲了2部分。
另外的label.txt是分類。就是我們整理存放圖片的種類。
chicken
duck
goose
這樣,圖片有了,分類標籤也有了,下一步就交給tensorflow去訓練數據了。