Ubuntu16.04下 用Caffe訓練自己的網路和模型並測試
1.準備圖片(訓練太久就不放那麼多圖片了)
在caffe根目錄下data中新建資料夾6class(意思是6類),在6class資料夾下新建兩個資料夾train和val。
train用來存放訓練的圖片,在train資料夾下新建6個資料夾0-5 。圖片有6類,杯子(資料夾0)、書包(資料夾1)、電腦(資料夾2)、貓(3)、狗(4)、鴨子(5),每類10種。
網上下載下來的圖片名字都很亂 所以三步大法:
開啟圖片資料夾終端
c=0;for i in *.jpg;do mv -f $i $((c+=1)).jpg;done #將圖片重新命名1.jpg-10.jpg
rename 's/\.jpg/.jpeg/' ./* #改圖片字尾名
rename 's/^/bag/' * #在圖片上加類的名字
然後就這樣了:
val 用來放訓練過程中用來驗證的圖片(來計算準確率),val中的圖片和train中的不一樣,我裡面放了6張一樣一張。
2. 將圖片路徑寫入txt
在data/6class/中新建train.txt 和val.txt
需要將圖片的路徑以及標籤都寫進去,杯子標籤為0,包標籤為1,等等...
寫入路徑
find -name *jpeg | grep train | cut -d / -f 3-4 > train.txt
find -name *jpeg | grep val | cut -d / -f 3 > val.txt
寫入標籤
sed -i "1,10s/.*/& 1/" train.txt # 1~10是杯子,標籤為0
sed -i "11,20s/.*/& 0/" train.txt # 11~20是包包,標籤為1,後面省略...
轉換資料
在caffe/examples目錄下新建目錄6class。建立空白文件create_(網路名).sh 我這裡是alexnet。裡面寫入:
#!/usr/bin/env sh # Create the imagenet lmdb inputs # N.B. set the path to the imagenet train + val data dirs set -e EXAMPLE=examples/6class #改成自己的路徑 DATA=data/6class #改成自己的路徑 TOOLS=build/tools #改成自己的路徑 TRAIN_DATA_ROOT=/home/xc/caffe/data/6class/train/ #改成自己的路徑 VAL_DATA_ROOT=/home/xc/caffe/data/6class/val/ #改成自己的路徑 # Set RESIZE=true to resize the images to 256x256. Leave as false if images have # already been resized using another tool. RESIZE=true if $RESIZE; then RESIZE_HEIGHT=227 RESIZE_WIDTH=227 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/6class_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/6class_val_lmdb #可以改名字 echo "Done."
返回caffe根目錄 執行 sh ./examples/6class/create_alexnet.sh
接下來就會生成倆檔案
3.訓練資料
一般caffe的網路模型有三個檔案deploy.prototxt(在模型訓練好後用的)、train_val.prototxt(訓練資料時用的)、solver.prototxt(訓練時的各種引數)我們用Alexnet網路的模型,github可以找到 放在examples/6class下
(1)修改train_val.prototxt
第一步把data/ilsvrc12下的imagenet_mean.binaryproto複製到該資料夾下,data/6class資料夾下myimagenet_mean.binaryproto沒有這個檔案,並重命名為6class_mean.binaryproto 。
name: "AlexNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "data/6class/6class_mean.binaryproto" #改路徑
}
data_param {
source: "examples/6class/6class_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: "data/6class/6class_mean.binaryproto" #這裡也是
}
data_param {
source: "examples/6class/6class_train_lmdb" #這裡
batch_size: 50
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
後面
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 6 #有幾類就填幾
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
(2)修改solver.prototxt
test_iter: 1000是指測試的批次,我們就10張照片,設定10就可以了。 test_interval: 1000是指每1000次迭代測試一次,我改成了10。 base_lr: 0.01是基礎學習率,因為資料量小,0.01就會下降太快了,因此改成0.001 lr_policy: “step”學習率變化 gamma: 0.1學習率變化的比率 stepsize: 100000每100000次迭代減少學習率 display: 20每20層顯示一次 max_iter: 1000最大迭代次數, momentum: 0.9學習的引數,不用變 weight_decay: 0.0005學習的引數,不用變 snapshot: 10000每迭代10000次顯示狀態,這裡改為1000次 solver_mode: GPU末尾加一行,代表用GPU進行
net: "/home/xc/caffe/examples/6class/train_val.prototxt"
test_iter: 10
test_interval: 10
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 1000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "/home/xc/caffe/examples/6class/caffe_alexnet_train"
solver_mode: GPU
(3)影象均值
減去影象均值會獲得更好的效果,所以我們使用tools/compute_image_mean.cpp實現,這個cpp是一個很好的例子去熟悉如何操作多個組建,例如協議的緩衝區,leveldbs,登入等。在examples/6class下建立make_alexnet_mean.sh內容如下
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=/home/xc/caffe/examples/6class #自己的地址
DATA=/home/xc/caffe/data/6class
TOOLS=/home/xc/caffe/build/tools
$TOOLS/compute_image_mean $EXAMPLE/6class_train_lmdb \ #自己的檔名字
$DATA/alexnet_mean.binaryproto
echo "Done."
(4)執行
建立train_Alexnet.sh檔案到example/myself目錄下。內容如下:
#!/usr/bin/env sh
set -e
./build/tools/caffe train \
--solver=/home/xc/caffe/examples/6class/solver.prototxt [email protected]
在caffe的主目錄下輸入命令:./examples/6class/train_Alexnet.sh開始訓練網路。
可能遇到CUDAunsuccess這樣的問題 把batch_size弄小就ok 原因是視訊記憶體不足。
5 . 測試資料
找一個你要測試的圖片。
修改deploy.prototxt 並編寫一個labels.txt
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 6 #改成6
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "fc8"
top: "prob"
}
labels.txt的內容如下:
cup
bag
computer
cat
dog
duck
開啟data/6class 將6class_mean.binaryproto 轉換成 6classmean.npy 寫個python小程式:
import caffe
import numpy as np
proto_path='6class_mean.binaryproto'
npy_path='6classmean.npy'
blob=caffe.proto.caffe_pb2.BlobProto()
data=open(proto_path,'rb').read()
blob.ParseFromString(data)
array=np.array(caffe.io.blobproto_to_array(blob))
mean_npy=array[0]
np.save(npy_path,mean_npy)
把生成的6classmean.npy複製到examples/6class下 再用Python寫程式碼對圖片進行分類:
import caffe
import sys
import numpy as np
import time
import cv2
caffe_root='/home/xc/caffe/'
sys.path.insert(0,caffe_root+'python')
caffe.set_mode_gpu()
deploy=caffe_root+'examples/6class/deploy.prototxt'
caffe_model=caffe_root+'examples/6class/caffe_alexnet_train_iter_1000.caffemodel'
img=caffe_root+'examples/6class/1.jpeg'
labels_name=caffe_root+'examples/6class/labels.txt'
mean_file=caffe_root+'examples/6class/6classmean.npy'
net=caffe.Net(deploy,caffe_model,caffe.TEST)
transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,1))
transformer.set_mean('data',np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data',255)
transformer.set_channel_swap('data',(2,1,0))
image=caffe.io.load_image(img)
net.blobs['data'].data[...]=transformer.preprocess('data',image)
start =time.clock()
out=net.forward()
end=time.clock()
print('classification time: %f s' % (end - start))
labels=np.loadtxt(labels_name,str,delimiter='\t')
prob=net.blobs['prob'].data[0].flatten()
top_k=net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
for i in np.arange(top_k.size):
print top_k[i],labels[top_k[i]],prob[top_k[i]]
'''
class_name=caffe_root+'example/myself/labels.txt'
category = net.blobs['prob'].data[0].argmax()
class_str = labels[int(category)].split(',')
class_str = labels[int(category)].split(',')
cv2.putText(img, class_name, (0, img.shape[0]), cv2.cv.CV_FONT_HERSHEY_SIMPLEX, 1, (55, 255, 155), 2)
'''
這段程式是自己參考多方面自己寫的 可能有些不足
結果:還可以~~~
相關推薦
Ubuntu16.04下 用Caffe訓練自己的網路和模型並測試
1.準備圖片(訓練太久就不放那麼多圖片了)在caffe根目錄下data中新建資料夾6class(意思是6類),在6class資料夾下新建兩個資料夾train和val。train用來存放訓練的圖片,在train資料夾下新建6個資料夾0-5 。圖片有6類,杯子(資料夾0)、書包(
用caffe訓練自己的資料集(三)
本文主要參考了:https://blog.csdn.net/heimu24/article/details/53581362 https://blog.csd
用caffe訓練自己的資料集(二)
本文主要參考了:https://blog.csdn.net/heimu24/article/details/53581362 https://blog.c
用caffe訓練自己的資料集(一)
本文主要參考了:https://blog.csdn.net/heimu24/article/details/53581362 https://blog.csd
ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的問題
人工智慧/機器學習/深度學習交流QQ群:811460433 程式設計師深度學習微信公眾號: ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的
安裝caffe遇到的各種bug 總結(Ubuntu16.04下配置caffe(僅CPU))
這是caffe安裝過程 中間遇到的問題下面總結: https://blog.csdn.net/zt_1995/article/details/56283249 下面這個連結是處理這個問題填寫下面語句 LIBRARIES += glog gflags protobuf boost_syst
Ubuntu16.04下安裝Caffe(CPU版)
第一步:安裝Caffe依賴 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
Ubuntu16.04下安裝Caffe(GPU)
說明: 我這裡主要是參考第一篇和第二篇的詳細講解過程,下面我就是對自己遇到的問題作出一些解決: 這是在最後的編譯階段出現的問題,(一)嘗試了在本地新增libcudart.so.8.0的路徑,更新路徑後,我又輸入命令sudo make runtest -j8結果
ubuntu16.04下安裝caffe,遇到的系列問題,純小白犯得錯誤,勿噴
—>安裝opencv時 出現cmake error at 3rdparty/ippicv/downloader.cmake:73 (file) 這是因為我的這個ippicv_linux_20141027.tgz安裝包出現的問題, 在opencv-3.1.0
ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...的問題
----------------------------------------------------------------------------------------------為什麼會出現undefined reference to 'xxxxx'錯誤?首先這是連
Ubuntu16.04下安裝caffe的方法(踩坑無數後的吐血總結)
平常較少接觸linux系統,因專案需要使用linux下的caffe。為了這一次安裝探索了兩天,踩了無數的坑,參考了網上很多教程,發現百度裡的答案不是內容有錯誤,就是描述的問題和自己無關
用caffe訓練LeNet網路的步驟
以mnist手寫體資料為例1.準備資料cd $CAFFE_ROOT./data/mnist/get_mnist.sh./examples/mnist/create_mnist.sh2.定義Net$CAFFE_ROOT/examples/mnist/lenet_train_te
Ubuntu16.04下配置caffe(僅CPU)
第二次配置caffe環境,依舊把之前犯過的錯誤重新走了一遍,不會配置的地方還是忘了,所以打算通過部落格記錄下來,方便以後學習使用。 1.安裝依賴包 $ sudo apt-get install libprotobuf-dev libleveldb-dev
深度學習(一)學會用CAFFE訓練自己的模型
利用caffe訓練手寫圖片資料集 bat批處理命令的書寫 在windows平臺學習caffe必須要學會寫批處理檔案,這樣就減少了在CMD命令列下操作檔案的麻煩。bat檔案類似於Linux下的sh指令碼檔案,作用都是簡化命令列操作,筆者目前主要在win
caffe 訓練自己的分類模型
學習caffe的最終目的,是可以利用自己的資料集,訓練模型,並解決實際問題。 所以在前面跑通了mnist和cifar-10例程的基礎上,嘗試訓練自己的模型,從頭到尾走一遍所有的流程。準備資料、訓練並得到模型,利用模型進行分類預測。 一、準備資料 1、在網上找了一些圖片,分
ubuntu16.04下好用的markdown軟體typora安裝
sudo wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add - sudo add-apt-repository 'deb https://typora.io/linux ./' sudo apt-get up
Ubuntu16.04 下的網易雲出現網路異常、無法播放,介面無響應等問題的統一解決
能夠在Linux系統下體驗到原生介面的網易雲音樂是件不錯的事情,但是它總是經常性的出現網路異常,介面無響應的問題 我為了聽歌,進行深入探究: 首先通過終端啟用網易雲音樂:sudo netease-cloud-music 會得到網易雲音樂執行時的資訊,比如一些出錯的資訊 其實我已經解決了首要的問題(QSslS
ubuntu16.04下安裝anaconda3+caffe+cuda8.0+cudnnv5.1+matlab R2015b以及出現的錯誤
一、安裝順序 我是先安裝anaconda3(python3.6.6),然後安裝cuda9.0+cudnnv7,最後從官網下載caffe(linux版)進行caffe編譯的,最後安裝matlabR2015b ubuntu16.04截圖快捷鍵:對整個螢幕 Pr Scrn ,對
Windows下基於Caffe的SSD網路學習(一)配置加生成自己的資料集
最近準備要做畢業設計了,所以從頭又配了一遍Caffe,學了一遍SSD,看了Caffe的原始碼,準備對SSD網路做一些改進。由於這已經是第n遍配置Caffe了,但是還是費了不少時間,所以意識到,總結還是很重要的,所以寫下部落格記錄這一路如何走來,同時也希望可以給有需
多圖超詳細Ubuntu16.04下配置CUDA8.0+cuDNN5.1+Caffe+OpenPose
前言:參加英特爾杯需要配置Caffe(Intel Caffe的安裝這裡就沒寫了)和OpenPose,網上找到的Ubuntu下配置的教程比較少,踩了一天的坑之後決定還是把它寫下來,方便後來的人配置開發環境。下面的教程裡面預設是N卡,且已經安裝好驅動了。 0.安裝依賴 因為對l