caffe將各種原始圖片數(shù)據(jù)集轉(zhuǎn)換為lmdb格式并訓(xùn)練網(wǎng)絡(luò)

1.Caltech-UCSD Birds200 鳥類圖像數(shù)據(jù)

Caltech-UCSD Birds200 是一個(gè)鳥類圖片數(shù)據(jù)集,包含 200 不同種鳥類,共計(jì) 11788 張圖片
此處下載該數(shù)據(jù)集Caltech-UCSD Birds200 鳥類圖像數(shù)據(jù)

文件夾images內(nèi)包含200個(gè)文件夾,其中每一個(gè)文件夾包含一個(gè)分類.(由于都是一一對(duì)應(yīng)的關(guān)系,所以我們可以直接利用word中表格欄選項(xiàng)中的文本轉(zhuǎn)換為表格的方法,將其暫時(shí)轉(zhuǎn)換為表格形式,然后再copy到excel中做進(jìn)一步處理)

  • README.txt是該數(shù)據(jù)集的解釋文件
  • images.txt是該數(shù)據(jù)集內(nèi)images內(nèi)圖片的目錄文件 每一行代表一個(gè)子文件夾內(nèi)的一個(gè)圖片文件
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是標(biāo)簽文件 代表200個(gè)種類的200個(gè)標(biāo)簽
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對(duì)應(yīng)于images.txt文件 表示每一個(gè)圖片的標(biāo)簽
id label
1 1
2 1
3 1
4 1
5 1
6 1
7 1
.... ....
  • train_test_split.txt對(duì)應(yīng)于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
.... ....

通過(guò)以上的簡(jiǎn)單轉(zhuǎn)換就可以變成excel表格形式,然后將其全部copy到一個(gè)excel文件中,再做簡(jiǎn)單的處理將重復(fù)的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
.... .... .... ....

所以通過(guò)train/test的選擇,我們就可以將其分成訓(xùn)練集和測(cè)試集。再將其copy回word文檔,就可以產(chǎn)生兩個(gè)需要用到的文件train.txt和val.txt。這就是參考文檔中的filelist文件,所以可以跳過(guò)參考文檔中的做法。

  • 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
    ....

接下來(lái)我們將圖片和用到的文件放到一個(gè)文件夾mydata下

train.txt
val.txt
images

在caffe中,作者為我們提供了這樣一個(gè)文件:convert_imageset.cpp,存放在根目錄下的tools文件夾下。編譯之后,生成對(duì)應(yīng)的可執(zhí)行文件放在 $cafferoot/tools/ 下面,這個(gè)文件的作用就是用于將圖片文件轉(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的錯(cuò)誤,此時(shí)我們改變方法,利用自帶的example/imagenet下的文件來(lái)生成所需的文件。由于image的大小不一樣,所以最好在開始的時(shí)候就將所有圖片轉(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的選項(xiàng))
在運(yùn)行create_imagenet.sh時(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)象是因?yàn)閠xt文件中image和對(duì)應(yīng)的label之間只能有一個(gè)空格(只能是英文輸入環(huán)境下的空格?。?!),這用excel轉(zhuǎn)word的時(shí)候會(huì)在這里產(chǎn)生中文環(huán)境下的空格而產(chǎn)生錯(cuò)誤?。?!caffe訓(xùn)練自己的模型步驟 要改正此錯(cuò)誤也很好改:

#用查找和替換方式
.jpg (中文輸入環(huán)境下的空格)
.jpg (英文輸入環(huán)境下的空格)

這時(shí)運(yù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."

在當(dāng)前目錄開啟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.

在當(dāng)前目錄可以看到生成了兩個(gè)文件夾ilsvrc12_train_lmdb和ilsvrc12_val_lmdb分別存放訓(xùn)練和驗(yàn)證所需的數(shù)據(jù)。
然后利用 make_imagenet_mean.sh 生成所需要的 mean file,和create_imagenet.sh同樣的設(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."

在運(yùn)行過(guò)程中如果出現(xiàn)如下錯(cuò)誤:

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過(guò)程中是否都設(shè)置一樣了,如果存在不一樣則會(huì)出現(xiàn)上訴錯(cuò)誤,利用create_imagenet.sh中的resize再次生成一下lmdb文件,并再次運(yùn)行此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)絡(luò)結(jié)構(gòu)和solver文件來(lái)訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),選擇/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)的訓(xùn)練文件,里面對(duì)應(yīng)的是models/bvlc_reference_caffenet內(nèi)的文件,而我們需要訓(xùn)練的是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 \
    $@

好了,準(zhǔn)備工作已經(jīng)全部完成,只需要執(zhí)行train_caffenet.sh即可。(注意以上各種文件的路徑是否加載正確,要以當(dāng)前目錄為準(zhǔn),不要單純的安裝文件的形式去修改,否則會(huì)找不到需要加載的各種文件而報(bào)錯(cuò)?。?!)

訓(xùn)練過(guò)程中如果出現(xiàn)Check failed: error == cudaSuccess (2 vs. 0) out of memory的問(wèn)題證明在train_val.prototxt文件中train和val的batch_size太大了,一次性讀入的圖片超出了顯存,所以適當(dāng)?shù)男薷腷atch_size的值。
caffe跑試驗(yàn)遇到錯(cuò)誤:Check failed: error == cudaSuccess (2 vs. 0) out of memory

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Caffe訓(xùn)練自己的數(shù)據(jù)集并用Python接口預(yù)測(cè) 本教程作者是清華大學(xué)在讀碩士金天童鞋,在當(dāng)?shù)剌^為英俊的男子,大...
    LucasJin閱讀 8,876評(píng)論 4 6
  • 雖然買之前,沒(méi)有怎么做過(guò)功課呢,覺(jué)得就是這個(gè)簡(jiǎn)單的東西,但是最終還是相信小米,買的小米的機(jī)械鍵盤,這個(gè)鍵盤使用起來(lái)...
    echozx閱讀 317評(píng)論 0 0
  • 我不是本地人,畢業(yè)之后先后在北京,天津,杭州,上海因工作停留過(guò)半年到三年不等。也許是有了寶寶想安定了,最終想...
    斜陽(yáng)巷裏閱讀 845評(píng)論 0 0
  • 滿足需求的創(chuàng)新分為兩種: 不連續(xù)性創(chuàng)新:需要改變用戶一貫的行為模式 連續(xù)性創(chuàng)新:產(chǎn)品的正常升級(jí) 普適的用戶群劃分:...
    我偏笑_NSNirvana閱讀 1,288評(píng)論 0 1
  • godzilla_2019閱讀 230評(píng)論 0 0

友情鏈接更多精彩內(nèi)容