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