【小白學AI】影象標註Image Caption
Image Caption - im2txt 踩過的坑
學習Image Caption的同學在開始實踐專案時,可以在github上找到一大堆不同的Image Caption Project,有很多專案也都對應的有其實現版本的論文,都很好。但是有一點不太好,大家貌似都不太願意上傳自己的引數檔案,可能因為訓練時間長,過程艱辛,且檔案較大。本文從Google-Tensorflow/models/im2txt開始簡要總結一下在實現期間的各種坑。
模型簡介
Google在im2txt專案中實現自家的論文《Show and Tell: A Neural Image Caption Generator》
關於該框架的細節在這裡不多說,可以去看論文,本文主要說一下在工程實踐時應該注意的問題,畢竟紙上得來終覺淺,絕知此事要恭行。
工程實踐
在實踐Image Caption中,因為大多數工程都不會給出訓練好的引數檔案,Google在tensorflow/im2txt中也一樣,所以需要我們自己進行訓練。在訓練過程中,重點其實在資料準備工作中,這一步完成了後面都會比較順利。
實踐過程中,可以結合本文和im2txt官方文件一起進行。整個訓練在一塊NVIDIA Tesla K20m上需要花費1-2周時間,其中1周可以達到效果,2周達到峰值效果。所以這個工程對硬體和時間的要求還是比較高的。
注意一下,以下所有工程必須建立在Python2.7,否則會發生編碼錯誤。下面詳細介紹實踐過程。
MSCOCO資料準備
資料下載是一個漫長的任務,在工程的第一步我們應該先讓資料下載起來,再去處理其他任務,達到效率最大化。
Image Caption一般都在MSCOCO資料集進行訓練,所以首要任務是下載MSCOCO資料,一共大概20G。
MSCOCO對Image Caption任務來說包含三部分資料:
1)訓練影象:train2014.zip
2)驗證影象:val2014.zip
3)訓練與驗證影象對應的標註caption:captions_train-val2014.zip
這裡有兩種方法下載。
1. 無腦按照Google給出流程(適用於資料和預處理一起的情況)
# Location to save the MSCOCO data.
MSCOCO_DIR="${HOME}/im2txt/data/mscoco"
# Build the preprocessing script.
cd tensorflow-models/im2txt
bazel build //im2txt:download_and_preprocess_mscoco
# Run the preprocessing script.
bazel-bin/im2txt/download_and_preprocess_mscoco "${MSCOCO_DIR}"
但是注意,如果出現編譯不成功,並顯示類似錯誤
ERROR: ...download_and_preprocess.sh is not executive...
是因為被編譯的檔案屬性為不可執行,所以我們需要將im2txt/im2txt/data/download_and_preproces_mscoco.sh
檔案屬於設定為可執行:右鍵-properties-Permissions-Allow executing file as program。
可以用瀏覽器或者迅雷下載,不怕中間斷網。
下載完成後,需要手動解壓縮。同時考慮到Google工程中的路徑問題,我們需要提前建立正確的檔案路徑,並解壓縮到其中。
解壓後資料集路徑:
1)訓練影象:Home/im2txt/data/mscoco/raw-data/train2014/COCO_train2014_000000000009.jpg……
2)驗證影象:Home/im2txt/data/mscoco/raw-data/val2014/COCO_val2014_000000000042.jpg……
3)標註:Home/im2txt/data/mscoco/raw-data/annotations/captions_train2014.json + captions_val2014.json
解壓好資料,並存放於正確路徑後,要進行資料的轉換,將其轉換為TFRecord格式,並存放於Home/im2txt/data/mscoco中。這一步需要我們呼叫tensorflow-models/im2txt/im2txt/data工程中檔案download_and_preprocess_mscoco.sh
。
注意,這個im2txt資料夾和剛才資料解壓的im2txt資料夾不是同一個資料夾。一個是資料資料夾(必須存放在Home/im2txt目錄),一個是工程資料夾(可以存放在任何地方,比如Home/tensorflow-models/im2txt)。
繼續TFRecord格式轉換,這裡有3中方法。
1 . 根據官方文件進行,利用bazel編譯,再執行。(推薦)
# Location to save the MSCOCO data.
MSCOCO_DIR="${HOME}/im2txt/data/mscoco"
# Build the preprocessing script.
cd tensorflow-models/im2txt
bazel build //im2txt:download_and_preprocess_mscoco
# Run the preprocessing script.
bazel-bin/im2txt/download_and_preprocess_mscoco "${MSCOCO_DIR}"
注意,如果出現編譯不成功,並和上述1中出現的同樣錯誤
ERROR: ...download_and_preprocess.sh is not executive...
同樣是因為被編譯的檔案屬性為不可執行,所以我們需要將im2txt/im2txt/data/download_and_preproces_mscoco.sh
檔案屬於設定為可執行:右鍵-properties-Permissions-Allow executing file as program。
2 . 其實也可以直接在terminal中執行download_and_preprocess_mscoco.sh
檔案。
cd tensorflow-models/im2txt/im2txt/data
>>> bash download_and_preprocess_mscoco.sh ${HOME}/im2txt/data/mscoco
3 . 手動執行build_mscoco_data.py
檔案。
不過要更改其中的資料目錄,具體為:將檔案中102-112行替換為:
tf.flags.DEFINE_string("train_image_dir", "/home/server109/im2txt/data/mscoco/raw-data/train2014",
"Training image directory.")
tf.flags.DEFINE_string("val_image_dir", "/home/server109/im2txt/data/mscoco/raw-data/val2014",
"Validation image directory.")
tf.flags.DEFINE_string("train_captions_file", "/home/server109/im2txt/data/mscoco/raw-data/annotations/captions_train2014.json",
"Training captions JSON file.")
tf.flags.DEFINE_string("val_captions_file", "/home/server109/im2txt/data/mscoco/raw-data/annotations/captions_val2014.json",
"Validation captions JSON file.")
tf.flags.DEFINE_string("output_dir", "/home/server109/im2txt/data/mscoco", "Output data directory.")
然後在終端進行執行。
注意,以上所有操作均需要在Python2.7中進行,Python3會出現編碼問題,一定要注意,吃了大虧了,就算2to3.py
也不行。
當TFRecord格式轉換好了時,終端會列印如下資訊:
2016-09-01 16:47:47.296630: Finished processing all 20267 image-caption pairs in data set 'test'.
到這裡,已經成功了一大半了。
Inception-v3模型下載
現在需要下載CNN框架,即Google自家的Inception-v3引數。
在終端輸入如下即可。
# Location to save the Inception v3 checkpoint.
INCEPTION_DIR="${HOME}/im2txt/data"
mkdir -p ${INCEPTION_DIR}
wget "http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz"
tar -xvf "inception_v3_2016_08_28.tar.gz" -C ${INCEPTION_DIR}
rm "inception_v3_2016_08_28.tar.gz"
下載完後,在Home/im2txt/data
中應該出現inception_v3.ckpt
檔案。
訓練與監控
到這裡基本上沒什麼坑了,按部就班的參照im2txt文件進行就好了,不多說了。
最後給一個開始訓練模型的圖,訓練愉快,1-2周,醉了。