1. 程式人生 > >caffe訓練自己的資料

caffe訓練自己的資料

1。準備資料 參:學習筆記3 用自己的資料訓練和測試-薛開宇

2。調整影象大小到256×256

3。生成leveldb 資料。將 create_imagenet.sh檔案從imagenet資料夾中拷過去,修改路徑。

4。生成mean資料。將 make_imagenet_mean.sh 從imagenet資料夾中拷過去,修改路徑。

5。修改網路定義。將 imagenet_train.prototxt 和  imagenet_val.prototxt 還有 imagenet_solver.prototxt 從imagenet資料夾中拷過去,修改 source, mean_file路徑。

( 由於caffe官網github上下載的caffe/examples/imagenet 中並沒有這幾個網路定義,所以需要從網上其他地方下載,修改完以後一般不能直接用,因為版本不一致,需要修改版本。 caffe_ROOT路徑下,./build/tools/upgrade_net_proto_text  myself/imagenet_train.prototxt new_version_train.prototxt , val也類似)

還有最後一層的num_output改為2,因為我只有兩類

6。訓練資料。sh train_imagenet.sh

7。

//==================

需要從網上下載imagenet_train.prototxt 和  imagenet_val.prototxt 還有 imagenet_solver.prototxt這幾個檔案,如果三layers{layer{ 這種格式的,需要對其進行update,

build/tools/upgrade_net_proto_text  path/to/imagenet_train.prototxt  new_version_train.prototxt

更新之後開啟該檔案,新增語句:BACKEND : lmdb

//===========以下為轉載===========

簡單記錄一下自己使用caffe的過程和遇到的一些問題。

下載caffe以及安裝不詳細敘述了, 可參照 。

下面準備資料集和訓練的過程參照imagenet的過程:可參考  

1. 將資料集分為train和validate, 分別寫到train.txt和val.txt中。 格式每一行檔名+ 空格 + label (label 是從0開始, 並連續)

00001.jpg 0

00002.jpg 1

00004.jpg 1

00003.jpg 2

2. 將準備好的兩個txt, 放到caffe_root/data/myfile/    (caffe_root是caffe的根目錄, myfile自己命名)。

3. 進入caffe_root/examples/imagenet/ 目錄中, 修改create_imagenet.sh

DATA=data/myfile

TRAIN_DATA_ROOT=/img_full_dir1(img_full_dir1 存放訓練圖片的目錄)

VAL_DATA_ROOT=/img_full_dir2 (img_full_dir2 存放測試圖片的目錄)

在caffe_root 下執行 ./examples/imagenet/create_imagenet.sh , 可以在examples/imagenet 目錄下找到, ilsvrc12_train_lmdb  ilsvrc12_val_lmdb兩個目錄

4.  在caffe_root 下執行 ./examples/imagenet/make_imagenet_mean.sh , 結果儲存在data/ilsvrc12/imagenet_mean.binaryproto

5.  修改models/bvlc_reference_caffenet 下的solver.prototxt和 train_val.prototxt, 如果不修改網路的結構, 只需修改圖片的大小crop_size <imagewidth。

6. 在caffe_root 下執行 ./examples/imagenet/train_caffenet.sh, 進行訓練,訓練好的模型放在models/bvlc_reference_caffenet

測試網路及模型

1. 在python下執行, 需要先在根目錄下執行make all    make pycaffe     make distribute

2. 將data/ilsvrc12/imagenet_mean.binaryproto 轉為numpy格式, 在caffe_root 建立一個mycode的資料夾,建立一個convertmean.py,,內容如下:

#!/usr/bin/pythonimport numpy as npimport syssys.path.append('/caffe_root/python')<span style="white-space:pre"> </span>#caffe_root is your caffe root dir need changeimport caffeif len(sys.argv) != 3:print "Usage: python convert_protomean.py proto.mean out.npy"sys.exit()blob = caffe.proto.caffe_pb2.BlobProto()data = open( sys.argv[1] , 'rb' ).read()blob.ParseFromString(data)arr = np.array( caffe.io.blobproto_to_array(blob) )out = arr[0]np.save( sys.argv[2] , out )

3. 執行 python convertmean.py /caffe_root/data/ilsvrc12/imagenet_mean.binaryproto mean.npy

4. 將一張圖片放到mycode的目錄下,vim testcode.py

#!/usr/bin/pythonimport numpy as npcaffe_root = '/caffe_root/'<span style="white-space:pre"></span>#<span style="font-family: Arial, Helvetica, sans-serif;">caffe_root is your caffe root dir need change</span>import syssys.path.insert(0,caffe_root+'python')import caffeMODEL_FILE = caffe_root + '/models/bvlc_reference_caffenet/deploy.prototxt'<span style="white-space:pre"> </span>#your netPRETRAINED = caffe_root + '/models/bvlc_reference_caffenet/caffenet_train.caffemodel'<span style="white-space:pre"> </span>#your model IMAGE_FILE = caffe_root + 'mycode/imagename.jpg'<span style="white-space:pre"></span>#your imageimport osif not os.path.isfile(PRETRAINED):print("Downloading pre-trained CaffeNet model...")caffe.set_mode_cpu()#net = caffe.Classifier(MODEL_FILE, PRETRAINED,# mean=np.load(caffe_root + 'mycode/mean.npy').mean(1).mean(1),# channel_swap=(2,1,0),# raw_scale=255,# image_dims=(256, 256))net = caffe.Classifier(MODEL_FILE, PRETRAINED)net.set_raw_scale('data',255)net.set_channel_swap('data',(2,1,0))net.set_mean('data',np.load(caffe_root + 'mycode/mean.npy'))input_image = caffe.io.load_image(IMAGE_FILE)prediction = net.predict([input_image])print 'prediction shape:', prediction[0].shapeprint 'predicted class:', prediction[0].argmax()

//=========以下為轉載==========

在使用caffe時,我們希望使用自己的資料進行訓練,以下給出如何製作自己的資料。所有的資料製作都是基於imagenet的。

1.資料準備,我們需要一個train和valid資料夾,一個train.txt和val.txt(圖片資料夾的位置可以任意,但是這兩個txt檔案的位置在data/mydata/目錄下)

train和valid資料夾自然就存放著待訓練的圖片,train.txt和val.txt的資料格式如下

複製程式碼
train_example/1.jpg 0
train_example/2.jpg 0
train_example/3.jpg 0
train_example/4.jpg 0
train_example/5.jpg 0
train_example/6.jpg 0
train_example/7.jpg 0
train_example/8.jpg 0
train_example/9.jpg 0
複製程式碼

前邊是圖片路徑,後便是label,注意label是從0開始的。

2. 在example目錄下建立自己的資料夾mytask,將imagenet中所有的檔案烤過來,然後進行修改。

create_imagenet.sh

複製程式碼
//當前路徑
EXAMPLE=/home/kongtao/caffe-master/examples/voc2007_test1
//存放train.txt和val.txt的路徑,就是data/mydata
DATA=/home/kongtao/caffe-master/data/voc2007_data1
//不變
TOOLS=/home/kongtao/caffe-master/build/tools

//存放train和val圖片資料夾的主目錄(這裡與txt檔案中的目錄合起來才是圖片目錄)
TRAIN_DATA_ROOT=/home/kongtao/learn/cnn_learn/VOC2007_research/VOCdevkit/
VAL_DATA_ROOT=/home/kongtao/learn/cnn_learn/VOC2007_research/VOCdevkit/
複製程式碼

執行create_imagenet.sh,生成兩個資料檔案lmdb

make_image_mean.sh 也是修改相應的路徑

最後需要修改的是model中prototxt檔案,只需要修改路徑

執行

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

這樣就可以了。

以上完成了一個數據檔案的建立和訓練的過程,對於我們來說,其實網路架構顯得更重要,因此不僅僅是調通,更重要的是調整網路架構和改進,這也是最難得部分。

多chanel,需要對資料進行提前白化

複製程式碼
import numpy as np
import caffe
import lmdb

# obviously load your own inputs here -- this is just by way of example
# to show the data can have any channel dimension
# as the dimensions are N x K x H x W
inputs = np.zeros((10, 5, 227, 227))

in_db = lmdb.open('input-lmdb', map_size=int(1e12))
with in_db.begin(write=True) as in_txn:
    for in_idx, in_ in enumerate(inputs):
        in_dat = caffe.io.array_to_datum(in_)
        in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())
in_db.close()
複製程式碼

記錄一下別人製作的東東

http://deepdish.io/2015/04/28/creating-lmdb-in-python/

還有一個

http://blog.csdn.net/ayst123/article/details/44077903

原創文章,轉載請註明出處,謝謝!

http://www.cnblogs.com/taokongcn/p/4341371.html