1. 程式人生 > >【小白學AI】影象標註Image Caption

【小白學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》

,採用經典CNN+RNN框架。其中CNN為Inception-v3結構,RNN為LSTM結構。具體結構如下

關於該框架的細節在這裡不多說,可以去看論文,本文主要說一下在工程實踐時應該注意的問題,畢竟紙上得來終覺淺,絕知此事要恭行。

工程實踐

在實踐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周,醉了。