2018년 4월 12일 목요일

축약형 ILSVRC2012_img_train_t3.tar를 이용한 LMDB 포맷 파일

지난 편에 이어서 이번에는 축약형 ILSVRC2012_img_train_t3.tar를 caffe 테스트용 lmdb로 포맷하는 방법을 정리했습니다.

일단 training용 raw image는 지난 편에서 풀어놓은 ~/ilsvrc2012/raw-data/train 속의 것을 그대로 이용하면 됩니다.  그러나 validation용 dataset은 따로 속아내야 합니다.

[user1@ac922 raw-data]$ mkdir val && cd val

[user1@ac922 val]$ tar -xf ~/files/ILSVRC2012_img_val.tar

[user1@ac922 val]$ ls *.JPEG | wc -l
50000

먼저 아래와 같이 caffe에 기본 포함되어 있는 get_ilsvrc_aux.sh를 이용하여 각종 label 파일들을 download 받습니다.

[user1@ac922 ~]$ cd ~/caffe/data/ilsvrc12/

[user1@ac922 ilsvrc12]$ ./get_ilsvrc_aux.sh

Download 받은 val.txt와 train.txt 등을 아래와 같이 ILSVRC2012_img_train_t3.tar에 맞게 편집합니다.

[user1@ac922 ilsvrc12]$ head val.txt
ILSVRC2012_val_00000001.JPEG 65
ILSVRC2012_val_00000002.JPEG 970
ILSVRC2012_val_00000003.JPEG 230
ILSVRC2012_val_00000004.JPEG 809
ILSVRC2012_val_00000005.JPEG 516
ILSVRC2012_val_00000006.JPEG 57
ILSVRC2012_val_00000007.JPEG 334
ILSVRC2012_val_00000008.JPEG 415
ILSVRC2012_val_00000009.JPEG 674
ILSVRC2012_val_00000010.JPEG 332

[user1@ac922 ilsvrc12]$ wc -l val.txt
50000 val.txt

[user1@ac922 ilsvrc12]$ head train.txt
n01440764/n01440764_10026.JPEG 0
n01440764/n01440764_10027.JPEG 0
n01440764/n01440764_10029.JPEG 0
n01440764/n01440764_10040.JPEG 0
n01440764/n01440764_10042.JPEG 0
n01440764/n01440764_10043.JPEG 0
n01440764/n01440764_10048.JPEG 0
n01440764/n01440764_10066.JPEG 0
n01440764/n01440764_10074.JPEG 0
n01440764/n01440764_1009.JPEG 0

[user1@ac922 ilsvrc12]$ wc -l train.txt
1281167 train.txt

[user1@ac922 ilsvrc12]$ cat train.txt | cut -d"/" -f 1 | sort -u | wc -l
1000

[user1@ac922 ilsvrc12]$ cp train.txt train.txt.org

[user1@ac922 ilsvrc12]$ cp val.txt val.txt.org

[user1@ac922 ilsvrc12]$ for i in `ls -R ~/ilsvrc2012/raw-data/train/*`
> do
> grep ${i} train.txt >> train.txt.new
> done

위와 같이 해서 train.txt.new에 축약형 멍멍이 사진 list인 20580장의 list만 따로 뽑았습니다.

[user1@ac922 ilsvrc12]$ wc -l train.txt.new
20580 train.txt.new

[user1@ac922 ilsvrc12]$ cp train.txt.new train.txt

기타 synsets.txt나 synset_words.txt 등의 label에도 같은 작업을 해줍니다.

[user1@ac922 ilsvrc12]$ wc -l synsets.txt
1000 synsets.txt

[user1@ac922 ilsvrc12]$ head synsets.txt
n01440764
n01443537
n01484850
n01491361
n01494475
n01496331
n01498041
n01514668
n01514859
n01518878

[user1@ac922 ilsvrc12]$ cp synsets.txt synsets.txt.org

[user1@ac922 ilsvrc12]$ for i in `ls ~/ilsvrc2012/raw-data/train`
> do
> grep ${i} synsets.txt >> synsets.txt.new
> done

[user1@ac922 ilsvrc12]$ wc -l synsets.txt.new
120 synsets.txt.new

[user1@ac922 ilsvrc12]$ cp synsets.txt.new synsets.txt

[user1@ac922 ilsvrc12]$ head 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
n01518878 ostrich, Struthio camelus

[user1@ac922 ilsvrc12]$ cp synset_words.txt synset_words.txt.org

[user1@ac922 ilsvrc12]$ wc -l synset_words.txt
1000 synset_words.txt

[user1@ac922 ilsvrc12]$ for i in `ls ~/ilsvrc2012/raw-data/train`
> do
> grep ${i} synset_words.txt >> synset_words.txt.new
> done

[user1@ac922 ilsvrc12]$ wc -l synset_words.txt.new
120 synset_words.txt.new

[user1@ac922 ilsvrc12]$ head synset_words.txt.new
n02085620 Chihuahua
n02085782 Japanese spaniel
n02085936 Maltese dog, Maltese terrier, Maltese
n02086079 Pekinese, Pekingese, Peke
n02086240 Shih-Tzu
n02086646 Blenheim spaniel
n02086910 papillon
n02087046 toy terrier
n02087394 Rhodesian ridgeback
n02088094 Afghan hound, Afghan

[user1@ac922 ilsvrc12]$ cp synset_words.txt.new synset_words.txt

이제 ~/ilsvrc2012/raw-data/val 속에 들어있는 6만장의 validation용 JPEG 파일 중에서 축약형 training dataset에 맞는 카테고리의 파일들만 걸러내는 작업을 아래와 같이 합니다.

[user1@ac922 ilsvrc12]$ cat train.txt | awk '{print $2}' | sort -u | wc -l
120

[user1@ac922 ilsvrc12]$ cat train.txt | awk '{print $2}' | sort -u > train.id

[user1@ac922 ilsvrc12]$ cat train.id | head
151
152
153
154
155
156
157
158
159
160

[user1@ac922 ilsvrc12]$ cat train.id | tail
262
263
264
265
266
267
268
273
274
275

[user1@ac922 ilsvrc12]$ sed 's/ /@/' val.txt > val.imsi

[user1@ac922 ilsvrc12]$ for i in `cat val.imsi`
> do
> j=`echo ${i} | cut -d'@' -f2`
> if [[ $j -gt 150 && $j -lt 276 ]]
> then
> echo ${i} >> val.txt.new
> fi
> done

[user1@ac922 ilsvrc12]$ sed 's/@/ /' val.txt.new > val.txt

[user1@ac922 ilsvrc12]$ wc -l val.txt
6250 val.txt

[user1@ac922 ilsvrc12]$ for i in `ls ~/ilsvrc2012/raw-data/val`
> do
> grep ${i} val.txt > /dev/null
> if [[ $? -ne 0 ]]
> then
> rm ~/ilsvrc2012/raw-data/val/${i}
> fi
> done

일부 겹치는 것이 있어서 아래와 같이 6250장이 걸러졌습니다.

[user1@ac922 ilsvrc12]$ ls ~/ilsvrc2012/raw-data/val | wc -l
6250

이제 이것으로 아래와 같이 create_imagenet.sh을 수행하여 lmdb 파일들을 만듭니다.   저희 AC922에 좀 문제가 있어서 부득이 POWER8 Minsky 서버로 옮겨서 작업을 수행했습니다.

그리고 inception v3에 맞도록 RESIZE_HEIGHT와 RESIZE_WIDTH를 default인 256 x 256 대신 320 x 320으로 바꾸어 lmdb를 생성하겠습니다.

minsky@minsky:/opt/DL/caffe-nv$ vi ./examples/imagenet/create_imagenet.sh
...
RESIZE=true
if $RESIZE; then
  RESIZE_HEIGHT=320
  RESIZE_WIDTH=320

minsky@minsky:/opt/DL/caffe-nv$ ./examples/imagenet/create_imagenet.sh
Creating train lmdb...
I0412 01:31:48.584789 44556 convert_imageset.cpp:83] Shuffling data
I0412 01:31:49.089481 44556 convert_imageset.cpp:86] A total of 20580 images.
I0412 01:31:49.089962 44556 db_lmdb.cpp:35] Opened lmdb examples/imagenet/ilsvrc12_train_lmdb
...
Creating val lmdb...
...
I0412 01:33:47.749966 44599 convert_imageset.cpp:150] Processed 6250 files.
Done.

그리고 이렇게 새로 만들어진 lmdb 파일들에 대해 새로 imagenet_mean.binaryproto을 만들어야 합니다.  이것도 이미 주어진 script를 이용합니다.

minsky@minsky:/opt/DL/caffe-nv$ ./examples/imagenet/make_imagenet_mean.sh
Done.

minsky@minsky:/opt/DL/caffe-nv/data/ilsvrc12$ ls -l imagenet_mean.binaryproto
-rw-rw-r-- 1 minsky minsky 1228814 Apr 13 08:51 imagenet_mean.binaryproto


이렇게 만들어진 ilsvrc12_lmdb  파일들과 각종 label 및 imagenet_mean.binaryproto가 들어있는 data/ilsvrc12 디렉토리 전체를 아래와 같은 파일 이름으로 묶어서 아래 URL의 구글 드라이브에 올려놓았습니다.

minsky@minsky:/opt/DL/caffe-nv/examples/imagenet$ ls -l *.tgz
-rw-rw-r-- 1 minsky minsky 6806226325 Apr 13 08:48 ilsvrc12_lmdb_small_320.tgz

minsky@minsky:/opt/DL/caffe-nv/data$ tar -zcf ilsvrc12_320.tgz ilsvrc12

ilsvrc12_lmdb_small_320.tgz :
https://drive.google.com/open?id=12LqkuqCChOjK9zz1ZNGJa_YVXglgPUuB

ilsvrc12_320.tgz :
https://drive.google.com/open?id=1cugEHL2zm5UuvOy0MGSFJAPFAHg-KBEP

그리고 아래 URL은 caffe로 inception v1을 수행하기 위한 script 묶음입니다.

https://drive.google.com/open?id=17M9CcZFyHIKBx3Hv4EXAWXlG7bmKd6HO

댓글 없음:

댓글 쓰기