1.Caltech-UCSD Birds200 鳥類圖像數(shù)據(jù)
Caltech-UCSD Birds200 是一個鳥類圖片數(shù)據(jù)集登疗,包含 200 不同種鳥類,共計 11788 張圖片
此處下載該數(shù)據(jù)集Caltech-UCSD Birds200 鳥類圖像數(shù)據(jù)
文件夾images內(nèi)包含200個文件夾,其中每一個文件夾包含一個分類.(由于都是一一對應的關(guān)系卵慰,所以我們可以直接利用word中表格欄選項中的文本轉(zhuǎn)換為表格的方法缩歪,將其暫時轉(zhuǎn)換為表格形式,然后再copy到excel中做進一步處理)
- README.txt是該數(shù)據(jù)集的解釋文件
- images.txt是該數(shù)據(jù)集內(nèi)images內(nèi)圖片的目錄文件 每一行代表一個子文件夾內(nèi)的一個圖片文件
id | content |
---|---|
1 | 001.Black_footed_Albatross/Black_Footed_Albatross_0046_18.jpg |
2 | 001.Black_footed_Albatross/Black_Footed_Albatross_0009_34.jpg |
3 | 001.Black_footed_Albatross/Black_Footed_Albatross_0002_55.jpg |
4 | 001.Black_footed_Albatross/Black_Footed_Albatross_0074_59.jpg |
5 | 001.Black_footed_Albatross/Black_Footed_Albatross_0014_89.jpg |
6 | 001.Black_footed_Albatross/Black_Footed_Albatross_0085_92.jpg |
7 | 001.Black_footed_Albatross/Black_Footed_Albatross_0031_100.jpg |
.... | .... |
- classes.txt是標簽文件 代表200個種類的200個標簽
id | label |
---|---|
1 | 001.Black_footed_Albatross |
2 | 002.Laysan_Albatross |
3 | 003.Sooty_Albatross |
4 | 004.Groove_billed_Ani |
5 | 005.Crested_Auklet |
6 | 006.Least_Auklet |
7 | 007.Parakeet_Auklet |
.... | .... |
- image_class_labels.txt對應于images.txt文件 表示每一個圖片的標簽
id | label |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 1 |
5 | 1 |
6 | 1 |
7 | 1 |
.... | .... |
- train_test_split.txt對應于images.txt中分割train和test圖片罩句,其中1表示train圖片而0表示test圖片
id | train/test |
---|---|
1 | 0 |
2 | 1 |
3 | 0 |
4 | 1 |
5 | 1 |
6 | 0 |
7 | 1 |
.... | .... |
通過以上的簡單轉(zhuǎn)換就可以變成excel表格形式焚刺,然后將其全部copy到一個excel文件中,再做簡單的處理將重復的id欄去掉门烂,可以得到如下表格:
id | image | lable | train/test |
---|---|---|---|
1 | 001.Black_footed_Albatross/Black_Footed_Albatross_0046_18.jpg | 1 | 0 |
2 | 001.Black_footed_Albatross/Black_Footed_Albatross_0009_34.jpg | 1 | 1 |
3 | 001.Black_footed_Albatross/Black_Footed_Albatross_0002_55.jpg | 1 | 0 |
4 | 001.Black_footed_Albatross/Black_Footed_Albatross_0074_59.jpg | 1 | 1 |
5 | 001.Black_footed_Albatross/Black_Footed_Albatross_0014_89.jpg | 1 | 1 |
6 | 001.Black_footed_Albatross/Black_Footed_Albatross_0085_92.jpg | 1 | 0 |
7 | 001.Black_footed_Albatross/Black_Footed_Albatross_0031_100.jpg | 1 | 1 |
8 | 001.Black_footed_Albatross/Black_Footed_Albatross_0051_796103.jpg | 1 | 1 |
9 | 001.Black_footed_Albatross/Black_Footed_Albatross_0010_796097.jpg | 1 | 1 |
10 | 001.Black_footed_Albatross/Black_Footed_Albatross_0025_796057.jpg | 1 | 0 |
.... | .... | .... | .... |
所以通過train/test的選擇乳愉,我們就可以將其分成訓練集和測試集兄淫。再將其copy回word文檔,就可以產(chǎn)生兩個需要用到的文件train.txt和val.txt蔓姚。這就是參考文檔中的filelist文件捕虽,所以可以跳過參考文檔中的做法。
- train.txt
001.Black_footed_Albatross/Black_Footed_Albatross_0009_34.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0074_59.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0014_89.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0031_100.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0051_796103.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0010_796097.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0023_796059.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0040_796066.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0089_796069.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0067_170.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0060_796076.jpg 1
.... - val.txt
001.Black_footed_Albatross/Black_Footed_Albatross_0046_18.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0002_55.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0085_92.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0025_796057.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0086_796062.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0049_796063.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0006_796065.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0016_796067.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0065_796068.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0042_796071.jpg 1
001.Black_footed_Albatross/Black_Footed_Albatross_0090_796077.jpg 1
....
接下來我們將圖片和用到的文件放到一個文件夾mydata下
train.txt
val.txt
images
在caffe中坡脐,作者為我們提供了這樣一個文件:convert_imageset.cpp泄私,存放在根目錄下的tools文件夾下。編譯之后备闲,生成對應的可執(zhí)行文件放在 $cafferoot/tools/ 下面晌端,這個文件的作用就是用于將圖片文件轉(zhuǎn)換成caffe框架中能直接使用的db文件。
error:
./include/caffe/util/cudnn.hpp:8:34: fatal error: caffe/proto/caffe.pb.h: No such file or directory
#include "caffe/proto/caffe.pb.h"
解決方法:fatal error: caffe/proto/caffe.pb.h: No such file or directory
$ protoc src/caffe/proto/caffe.proto --cpp_out=.
$ mkdir include/caffe/proto
$ mv src/caffe/proto/caffe.pb.h include/caffe/proto
$ cp -r include/caffe/proto ./
執(zhí)行下面的命令恬砂,編譯convert_imageset.cpp文件斩松,執(zhí)行不成功,顯示proto的錯誤觉既,此時我們改變方法惧盹,利用自帶的example/imagenet下的文件來生成所需的文件。由于image的大小不一樣瞪讼,所以最好在開始的時候就將所有圖片轉(zhuǎn)換成為同樣大小钧椰,利用以下命令轉(zhuǎn)換:
find ./ -name '*.jpg' -exec convert -resize 600x480 {} {} \;
在image文件夾的目錄內(nèi)執(zhí)行此命令后就將所有的圖片都轉(zhuǎn)換成為320x240大小的圖片了。copy example/imagenet下的文件到mydata文件夾下符欠,修改create_imagenet.sh文件(該文件內(nèi)也有resize的選項)
在運行create_imagenet.sh時出現(xiàn)E0425 14:24:29.828167 5561 io.cpp:80] Could not open or find file /home/hypervision/work/caffe/mydata/images/val//home/hypervision/work/caffe/mydata/images/val/001.Black_footed_Albatross/Black_Footed_Albatross_0006_796065.jpg
找不到圖片的現(xiàn)象是因為txt文件中image和對應的label之間只能有一個空格(只能是英文輸入環(huán)境下的空格5障肌!希柿!)诊沪,這用excel轉(zhuǎn)word的時候會在這里產(chǎn)生中文環(huán)境下的空格而產(chǎn)生錯誤!T贰端姚!caffe訓練自己的模型步驟 要改正此錯誤也很好改:
#用查找和替換方式
.jpg (中文輸入環(huán)境下的空格)
.jpg (英文輸入環(huán)境下的空格)
這時運行該文件就可以生成在次數(shù)據(jù)集上的lmdb格式的數(shù)據(jù)文件了。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
#全部的文件(包含數(shù)據(jù))都放在/caffe/mydata文件夾內(nèi)
EXAMPLE=../mydata #存放輸出lmdb文件的文件夾
DATA=../mydata #存放train.txt和val.txt文件的文件夾
TOOLS=../build/tools #調(diào)用convert_imageset程序
TRAIN_DATA_ROOT=/home/hypervision/work/caffe/mydata/images/train/ #train數(shù)據(jù)存放目錄(可包含子文件夾)
VAL_DATA_ROOT=/home/hypervision/work/caffe/mydata/images/val/ #val數(shù)據(jù)存放目錄(可包含子文件夾)
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=false
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..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--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 \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/ilsvrc12_val_lmdb
echo "Done."
在當前目錄開啟terminal挤悉,執(zhí)行create_imagenet.sh:
hypervision@hypervision-700:~/work/caffe/mydata$ ./create_imagenet.sh
Creating train lmdb...
I0425 14:33:11.755530 5941 convert_imageset.cpp:86] Shuffling data
I0425 14:33:11.995342 5941 convert_imageset.cpp:89] A total of 5994 images.
I0425 14:33:11.995568 5941 db_lmdb.cpp:35] Opened lmdb ../mydata/ilsvrc12_train_lmdb
I0425 14:33:16.814551 5941 convert_imageset.cpp:147] Processed 1000 files.
I0425 14:33:21.675709 5941 convert_imageset.cpp:147] Processed 2000 files.
I0425 14:33:26.373101 5941 convert_imageset.cpp:147] Processed 3000 files.
I0425 14:33:31.185261 5941 convert_imageset.cpp:147] Processed 4000 files.
I0425 14:33:36.626116 5941 convert_imageset.cpp:147] Processed 5000 files.
I0425 14:33:41.590888 5941 convert_imageset.cpp:153] Processed 5994 files.
Creating val lmdb...
I0425 14:33:42.242558 5971 convert_imageset.cpp:86] Shuffling data
I0425 14:33:42.513573 5971 convert_imageset.cpp:89] A total of 5794 images.
I0425 14:33:42.513809 5971 db_lmdb.cpp:35] Opened lmdb ../mydata/ilsvrc12_val_lmdb
I0425 14:33:47.492820 5971 convert_imageset.cpp:147] Processed 1000 files.
I0425 14:33:58.676864 5971 convert_imageset.cpp:147] Processed 2000 files.
I0425 14:34:16.156783 5971 convert_imageset.cpp:147] Processed 3000 files.
I0425 14:34:36.846071 5971 convert_imageset.cpp:147] Processed 4000 files.
I0425 14:34:56.638617 5971 convert_imageset.cpp:147] Processed 5000 files.
I0425 14:35:11.903795 5971 convert_imageset.cpp:153] Processed 5794 files.
Done.
在當前目錄可以看到生成了兩個文件夾ilsvrc12_train_lmdb和ilsvrc12_val_lmdb分別存放訓練和驗證所需的數(shù)據(jù)渐裸。
然后利用 make_imagenet_mean.sh 生成所需要的 mean file,和create_imagenet.sh同樣的設置:
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=../mydata
DATA=../mydata
TOOLS=../build/tools
$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
$DATA/imagenet_mean.binaryproto
echo "Done."
在運行過程中如果出現(xiàn)如下錯誤:
I0425 14:46:16.075706 6398 db_lmdb.cpp:35] Opened lmdb ../mydata/ilsvrc12_train_lmdb
I0425 14:46:16.076617 6398 compute_image_mean.cpp:70] Starting iteration
F0425 14:46:16.076819 6398 compute_image_mean.cpp:79] Check failed: size_in_datum == data_size (230400 vs. 144720) Incorrect data field size 230400
*** Check failure stack trace: ***
@ 0x7fb05aca25cd google::LogMessage::Fail()
@ 0x7fb05aca4433 google::LogMessage::SendToLog()
@ 0x7fb05aca215b google::LogMessage::Flush()
@ 0x7fb05aca4e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x4025d8 main
@ 0x7fb059c13830 __libc_start_main
@ 0x402bb9 _start
@ (nil) (unknown)
Aborted (core dumped)
Done.
檢查圖片大小在之前的resize過程中是否都設置一樣了装悲,如果存在不一樣則會出現(xiàn)上訴錯誤昏鹃,利用create_imagenet.sh中的resize再次生成一下lmdb文件,并再次運行此mean文件就可以得到imagenet_mean.binaryproto文件:
hypervision@hypervision-700:~/work/caffe/mydata$ sh ./make_imagenet_mean.sh
I0425 14:51:12.212188 6553 db_lmdb.cpp:35] Opened lmdb ../mydata/ilsvrc12_train_lmdb
I0425 14:51:12.213258 6553 compute_image_mean.cpp:70] Starting iteration
I0425 14:51:13.346879 6553 compute_image_mean.cpp:101] Processed 5994 files.
I0425 14:51:13.347925 6553 compute_image_mean.cpp:108] Write to ../mydata/imagenet_mean.binaryproto
I0425 14:51:13.349079 6553 compute_image_mean.cpp:114] Number of channels: 3
I0425 14:51:13.349189 6553 compute_image_mean.cpp:119] mean_value channel [0]: 110.145
I0425 14:51:13.349315 6553 compute_image_mean.cpp:119] mean_value channel [1]: 127.242
I0425 14:51:13.349419 6553 compute_image_mean.cpp:119] mean_value channel [2]: 123.707
Done.
我們利用caffe官方給出的文本定義網(wǎng)絡結(jié)構(gòu)和solver文件來訓練一個神經(jīng)網(wǎng)絡诀诊,選擇/caffe/models/bvlc_alexnet,查看solver.prototxt洞渤,可以不用修改該文件:
net: "../models/bvlc_alexnet/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "../models/bvlc_alexnet/caffe_alexnet_train"
solver_mode: GPU
查看train_val.prototxt文件,我們需要修改的是輸入端的各種數(shù)據(jù)及mean file属瓣,如下:
name: "AlexNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "../mydata/imagenet_mean.binaryproto" #此處需要修改
}
data_param {
source: "../mydata/ilsvrc12_train_lmdb" #此處需要修改
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "../mydata/imagenet_mean.binaryproto" #此處需要修改
}
data_param {
source: "../mydata/ilsvrc12_val_lmdb" #此處需要修改
batch_size: 50
backend: LMDB
}
}
接著由于我們copy的是imagenet內(nèi)的訓練文件载迄,里面對應的是models/bvlc_reference_caffenet內(nèi)的文件奈懒,而我們需要訓練的是bvlc_alexnet內(nèi)的文件,所以還需要修改/mydata目錄下的train_caffenet.sh:
#!/usr/bin/env sh
set -e
../build/tools/caffe train \
--solver=../models/bvlc_alexnet/solver.prototxt $@
和resume_training.sh:
#!/usr/bin/env sh
set -e
../build/tools/caffe train \
--solver=../models/bvlc_alexnet/solver.prototxt \
--snapshot=../models/bvlc_alexnet/caffenet_train_10000.solverstate.h5 \
$@
好了宪巨,準備工作已經(jīng)全部完成,只需要執(zhí)行train_caffenet.sh即可溜畅。(注意以上各種文件的路徑是否加載正確捏卓,要以當前目錄為準,不要單純的安裝文件的形式去修改慈格,否則會找不到需要加載的各種文件而報錯5∏纭!浴捆!)
訓練過程中如果出現(xiàn)
Check failed: error == cudaSuccess (2 vs. 0) out of memory
的問題證明在train_val.prototxt文件中train和val的batch_size太大了蒜田,一次性讀入的圖片超出了顯存,所以適當?shù)男薷腷atch_size的值选泻。
caffe跑試驗遇到錯誤:Check failed: error == cudaSuccess (2 vs. 0) out of memory