1. 程式人生 > >Ubuntu16.04下 用Caffe訓練自己的網路和模型並測試

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