Image Dataset (1) ILSVRC12

本文主要是解釋 Caffe 對 ILSVRC12 的訓練預處理過程,如果有興趣的話可以安裝 Caffe 玩玩看。

1. 去 ImageNet 下載圖片庫:

下載 ILSVRC2012_img_train.tar 和 ILSVRC2012_img_val.tar,個別解壓縮到 train 和 val 資料夾。ILSVRC2012_img_train.tar 超大的 (大約 100 多 gb),下載和解壓縮需要大空間。

我們還需要對 ILSVRC2012_img_train.tar 內的檔案再解壓縮一次。在 train/ 寫個簡單的腳本 unzip_ILSVRC.sh,解壓縮到相對應的目錄。

#/usr/bin/sh

for item in `ls *.tar`
do
  filename=`basename $item .tar`
  mkdir $filename
  tar -xvf $item -C ./$filename
done
$ sudo chmod +x unzip_ILSVRC.sh
$ ./unzip_ILSVRC.sh

來看看 n01440764_5763 資料夾中的圖片,n01440764 是丁鱖的相關圖 (下面會介紹如何查詢資料夾和其相應名稱)。

n01440764_5763.JPEG

n01440764_9981.JPEG

由此可知 ILSVRC2012 中的圖片大小不同,標示的東西也不一定是畫面中的主要成份 (n01440764_9981.JPEG 中人比魚還大增加了辨識的難度)。


2.下載 ILSVRC2012 的相關資料:

直接執行 script 就可以了。

$ cd $CAFFE_ROOT/data/ilsvrc12/
$./get_ilsvrc_aux.sh

簡單看看載了些什麼

打開 synset_words.txt:

n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri
n01494475 hammerhead, hammerhead shark
n01496331 electric ray, crampfish, numbfish, torpedo
n01498041 stingray
n01514668 cock
n01514859 hen
...............

synset_words.txt 紀錄了資料夾名稱,父類和標籤。前面提過 n01440764 是 Tinca 就是這樣查出來的。


3. Caffe 訓練前的 data 預處理:

使用 $CAFFE_HOME/examples/imagenet/create_imagenet.sh 進行預處理。

改了一堆路徑,依照個人喜好即可。

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e

#[start-20180531-cooper-mod]#
EXAMPLE=/usr/image/ILSVRC
DATA=$CAFFE_HOME/data/ilsvrc12
TOOLS=$CAFFE_HOME/build/tools
#[end-20180531-cooper-mod]#

#[start-20180531-cooper-mod]#
TRAIN_DATA_ROOT=/usr/image/ILSVRC/train/
VAL_DATA_ROOT=/usr/image/ILSVRC/val/
#[end-20180531-cooper-mod]#

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.

#[start-20180531-cooper-mod]#
RESIZE=true
#[end-20180531-cooper-mod]#
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi

if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet training data is stored."
  exit 1
fi

if [ ! -d "$VAL_DATA_ROOT" ]; then
  echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet validation data is stored."
  exit 1
fi

echo "Creating train lmdb..."

#[start-20180531-ben-mod]#
GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/ilsvrc12_train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/val.txt \
    $EXAMPLE/ilsvrc12_val_lmdb
#[end-20180531-ben-mod]#

echo "Done."

好了就可以執行腳本,執行這隻腳本需要點時間。

$ ./create_imagenet.sh

留言

熱門文章