Ubuntu16.04下caffe CPU版の画像トレーニングとテスト
20718 ワード
データの準備
二、lmdbフォーマットに変換
1、まずexamplesの下にmyfileのフォルダを作成し、プロファイルとスクリプトファイルを保存します.スクリプトcreate_を作成しますfilelist.shは、trainを生成するために用いる.txtとtest.txtインベントリファイル(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples# mkdir myfile
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# vim create_filelist.sh
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
done
echo “done”
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
次に、このスクリプトを実行します(caffeルートディレクトリの下にあることに注意してください).(caffe_src) root@ranxf-TEST:/workdisk/caffe# sh examples/myfile/create_filelist.sh
Create train.txt...
done
Create test.txt...
All done
成功するとexamples/myfile/フォルダの下でtrainが生成されます.txtとtest.txtの2つのテキストファイルは、画像のリストです.
2、次にスクリプトファイルを作成しconvert_を呼び出すimagesetコマンドを使用して、データフォーマットを変換します.sudo vi examples/myfile/create_lmdb.sh #!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/workdisk/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "done"
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/workdisk/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
(caffe_src) root@ranxf-TEST:/workdisk/caffe# ./examples/myfile/create_lmdb.sh
Create train lmdb..
I0910 15:49:20.354158 7404 convert_imageset.cpp:86] Shuffling data
I0910 15:49:20.354992 7404 convert_imageset.cpp:89] A total of 400 images.
I0910 15:49:20.355206 7404 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_train_lmdb
I0910 15:49:21.807344 7404 convert_imageset.cpp:153] Processed 400 files.
done
Create test lmdb..
I0910 15:49:21.852502 7407 convert_imageset.cpp:86] Shuffling data
I0910 15:49:21.852725 7407 convert_imageset.cpp:89] A total of 100 images.
I0910 15:49:21.852886 7407 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_test_lmdb
I0910 15:49:22.201551 7407 convert_imageset.cpp:153] Processed 100 files.
All Done..
画像のサイズが異なるため、256*256サイズに統一的に変換されます.実行に成功すると、examples/myfileの下に2つのフォルダimg_が生成されます.train_lmdbとimg_test_lmdbは、ピクチャ変換後のlmdbファイルをそれぞれ保存するために使用されます.(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# ls
create_filelist.sh create_lmdb.sh img_test_lmdb img_train_lmdb test.txt train.txt
三、平均値を計算して保存する
画像から平均値を引いてから訓練すると、訓練速度と精度が向上します.そのため、一般的にこの操作があります.
Caffeプログラムは平均値を計算するファイルcomputeを提供します.image_mean.cpp、そのまま使えばいいです(caffe_src) root@ranxf-TEST:/workdisk/caffe# build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
I0910 15:56:26.287912 7824 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_train_lmdb
I0910 15:56:26.288938 7824 compute_image_mean.cpp:70] Starting iteration
I0910 15:56:26.352404 7824 compute_image_mean.cpp:101] Processed 400 files.
I0910 15:56:26.352833 7824 compute_image_mean.cpp:108] Write to examples/myfile/mean.binaryproto
I0910 15:56:26.354002 7824 compute_image_mean.cpp:114] Number of channels: 3
I0910 15:56:26.354115 7824 compute_image_mean.cpp:119] mean_value channel [0]: 100.254
I0910 15:56:26.365298 7824 compute_image_mean.cpp:119] mean_value channel [1]: 114.454
I0910 15:56:26.365384 7824 compute_image_mean.cpp:119] mean_value channel [2]: 121.707
(caffe_src) root@ranxf-TEST:/workdisk/caffe#
compute_image_mean , lmdb , 。
, examples/myfile/ mean.binaryproto 。
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# ls
create_filelist.sh create_lmdb.sh img_test_lmdb img_train_lmdb mean.binaryproto test.txt train.txt
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile#
四、モデルを作成し、プロファイルを作成する
モデルはプログラムが持参したcaffenetモデルで、models/bvlc_に位置しています.reference_caffenet/フォルダの下で、必要な2つのプロファイルをmyfileフォルダにコピーします.(caffe_src) root@ranxf-TEST:/workdisk/caffe# cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
(caffe_src) root@ranxf-TEST:/workdisk/caffe#
(caffe_src) root@ranxf-TEST:/workdisk/caffe# cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
その中のsolverを変更します.prototxt net: "examples/myfile/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.0005
solver_mode: CPU
元のプロファイルの内容は次のとおりです.net: "models/bvlc_reference_caffenet/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_reference_caffenet/caffenet_train"
solver_mode: GPU
100個のテストデータ、batch_sizeは50なのでtest_iterを2に設定すると、全coverになります.訓練の過程で、学習率を調整し、徐々に小さくなる.
train_の変更val.protxtは、2段階のdataレイヤを変更するだけでいいので、他は気にしなくてもいいです.2つのdata layerを修正するmeanですfileとsourceの2つの場所は、他には変わりません.name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: true
# }
data_param {
source: "examples/myfile/img_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: "examples/myfile/mean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: false
# }
data_param {
source: "examples/myfile/img_train_lmdb"
batch_size: 50
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
……………………
前に問題がなければ、データの準備ができていて、プロファイルも構成されているので、このステップは簡単です.
運転時間と最後の精度は、マシン構成、パラメータ設定によって異なります.私のはCPUが500回運行して10時間20分で、正確性は69%で、機械の配置に突っ込みます.I0911 02:42:50.312186 9113 solver.cpp:464] Snapshotting to binary proto file examples/myfile/solver_iter_500.caffemodel
I0911 02:42:52.477775 9113 sgd_solver.cpp:284] Snapshotting solver state to binary proto file examples/myfile/solver_iter_500.solverstate
I0911 02:42:53.719158 9116 data_layer.cpp:73] Restarting data prefetching from start.
I0911 02:43:23.561343 9113 solver.cpp:327] Iteration 500, loss = 0.689866
I0911 02:43:23.648788 9113 solver.cpp:347] Iteration 500, Testing net (#0)
I0911 02:43:23.693032 9119 data_layer.cpp:73] Restarting data prefetching from start.
I0911 02:43:35.412401 9113 solver.cpp:414] Test net output #0: accuracy = 0.69
I0911 02:43:35.412444 9113 solver.cpp:414] Test net output #1: loss = 0.66485 (* 1 = 0.66485 loss)
I0911 02:43:35.412451 9113 solver.cpp:332] Optimization Done.
I0911 02:43:35.425511 9113 caffe.cpp:250] Optimization Done.
参考文章:Caffe学習:モデルの訓練とテストを最初から最後まで走る
Caffe学習シリーズ(12):自分の画像を訓練し、テストする
1、まずexamplesの下にmyfileのフォルダを作成し、プロファイルとスクリプトファイルを保存します.スクリプトcreate_を作成しますfilelist.shは、trainを生成するために用いる.txtとtest.txtインベントリファイル
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples# mkdir myfile
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# vim create_filelist.sh
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
done
echo “done”
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
次に、このスクリプトを実行します(caffeルートディレクトリの下にあることに注意してください).
(caffe_src) root@ranxf-TEST:/workdisk/caffe# sh examples/myfile/create_filelist.sh
Create train.txt...
done
Create test.txt...
All done
成功するとexamples/myfile/フォルダの下でtrainが生成されます.txtとtest.txtの2つのテキストファイルは、画像のリストです.
2、次にスクリプトファイルを作成しconvert_を呼び出すimagesetコマンドを使用して、データフォーマットを変換します.sudo vi examples/myfile/create_lmdb.sh
#!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/workdisk/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "done"
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/workdisk/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
(caffe_src) root@ranxf-TEST:/workdisk/caffe# ./examples/myfile/create_lmdb.sh
Create train lmdb..
I0910 15:49:20.354158 7404 convert_imageset.cpp:86] Shuffling data
I0910 15:49:20.354992 7404 convert_imageset.cpp:89] A total of 400 images.
I0910 15:49:20.355206 7404 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_train_lmdb
I0910 15:49:21.807344 7404 convert_imageset.cpp:153] Processed 400 files.
done
Create test lmdb..
I0910 15:49:21.852502 7407 convert_imageset.cpp:86] Shuffling data
I0910 15:49:21.852725 7407 convert_imageset.cpp:89] A total of 100 images.
I0910 15:49:21.852886 7407 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_test_lmdb
I0910 15:49:22.201551 7407 convert_imageset.cpp:153] Processed 100 files.
All Done..
画像のサイズが異なるため、256*256サイズに統一的に変換されます.実行に成功すると、examples/myfileの下に2つのフォルダimg_が生成されます.train_lmdbとimg_test_lmdbは、ピクチャ変換後のlmdbファイルをそれぞれ保存するために使用されます.
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# ls
create_filelist.sh create_lmdb.sh img_test_lmdb img_train_lmdb test.txt train.txt
三、平均値を計算して保存する
画像から平均値を引いてから訓練すると、訓練速度と精度が向上します.そのため、一般的にこの操作があります.
Caffeプログラムは平均値を計算するファイルcomputeを提供します.image_mean.cpp、そのまま使えばいいです
(caffe_src) root@ranxf-TEST:/workdisk/caffe# build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
I0910 15:56:26.287912 7824 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_train_lmdb
I0910 15:56:26.288938 7824 compute_image_mean.cpp:70] Starting iteration
I0910 15:56:26.352404 7824 compute_image_mean.cpp:101] Processed 400 files.
I0910 15:56:26.352833 7824 compute_image_mean.cpp:108] Write to examples/myfile/mean.binaryproto
I0910 15:56:26.354002 7824 compute_image_mean.cpp:114] Number of channels: 3
I0910 15:56:26.354115 7824 compute_image_mean.cpp:119] mean_value channel [0]: 100.254
I0910 15:56:26.365298 7824 compute_image_mean.cpp:119] mean_value channel [1]: 114.454
I0910 15:56:26.365384 7824 compute_image_mean.cpp:119] mean_value channel [2]: 121.707
(caffe_src) root@ranxf-TEST:/workdisk/caffe#
compute_image_mean , lmdb , 。
, examples/myfile/ mean.binaryproto 。
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile# ls
create_filelist.sh create_lmdb.sh img_test_lmdb img_train_lmdb mean.binaryproto test.txt train.txt
(caffe_src) root@ranxf-TEST:/workdisk/caffe/examples/myfile#
四、モデルを作成し、プロファイルを作成する
モデルはプログラムが持参したcaffenetモデルで、models/bvlc_に位置しています.reference_caffenet/フォルダの下で、必要な2つのプロファイルをmyfileフォルダにコピーします.
(caffe_src) root@ranxf-TEST:/workdisk/caffe# cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
(caffe_src) root@ranxf-TEST:/workdisk/caffe#
(caffe_src) root@ranxf-TEST:/workdisk/caffe# cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
その中のsolverを変更します.prototxt
net: "examples/myfile/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.0005
solver_mode: CPU
元のプロファイルの内容は次のとおりです.
net: "models/bvlc_reference_caffenet/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_reference_caffenet/caffenet_train"
solver_mode: GPU
100個のテストデータ、batch_sizeは50なのでtest_iterを2に設定すると、全coverになります.訓練の過程で、学習率を調整し、徐々に小さくなる.
train_の変更val.protxtは、2段階のdataレイヤを変更するだけでいいので、他は気にしなくてもいいです.2つのdata layerを修正するmeanですfileとsourceの2つの場所は、他には変わりません.
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: true
# }
data_param {
source: "examples/myfile/img_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: "examples/myfile/mean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: false
# }
data_param {
source: "examples/myfile/img_train_lmdb"
batch_size: 50
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
……………………
前に問題がなければ、データの準備ができていて、プロファイルも構成されているので、このステップは簡単です.
運転時間と最後の精度は、マシン構成、パラメータ設定によって異なります.私のはCPUが500回運行して10時間20分で、正確性は69%で、機械の配置に突っ込みます.
I0911 02:42:50.312186 9113 solver.cpp:464] Snapshotting to binary proto file examples/myfile/solver_iter_500.caffemodel
I0911 02:42:52.477775 9113 sgd_solver.cpp:284] Snapshotting solver state to binary proto file examples/myfile/solver_iter_500.solverstate
I0911 02:42:53.719158 9116 data_layer.cpp:73] Restarting data prefetching from start.
I0911 02:43:23.561343 9113 solver.cpp:327] Iteration 500, loss = 0.689866
I0911 02:43:23.648788 9113 solver.cpp:347] Iteration 500, Testing net (#0)
I0911 02:43:23.693032 9119 data_layer.cpp:73] Restarting data prefetching from start.
I0911 02:43:35.412401 9113 solver.cpp:414] Test net output #0: accuracy = 0.69
I0911 02:43:35.412444 9113 solver.cpp:414] Test net output #1: loss = 0.66485 (* 1 = 0.66485 loss)
I0911 02:43:35.412451 9113 solver.cpp:332] Optimization Done.
I0911 02:43:35.425511 9113 caffe.cpp:250] Optimization Done.
参考文章:Caffe学習:モデルの訓練とテストを最初から最後まで走る
Caffe学習シリーズ(12):自分の画像を訓練し、テストする