深度學(xué)習(xí)框架用的是caffe吊宋;網(wǎng)絡(luò)模型是CaffeNet(AlexNet的變形)澳盐。
1.準(zhǔn)備數(shù)據(jù)
我用的是Fish4knowledge數(shù)據(jù)集曙寡,數(shù)據(jù)集內(nèi)總共有27370張圖片,23類轧邪,每一類的數(shù)量不等且差異大刽脖。將其按照5:1:1的比例分為訓(xùn)練集、驗(yàn)證集忌愚、測(cè)試集曲管。(記住由于每類的數(shù)據(jù)不均衡,所以一定要隨機(jī)分配)
- 訓(xùn)練集:19550張圖片
- 驗(yàn)證集:3910張圖片
- 測(cè)試集:3910張圖片
2.生成filelist的txt文件
接下來(lái)要生成三個(gè)文件列表菜循,train.txt翘地、val.txt、test.txt癌幕。文件中的每一行存放的是一張圖片的文件名(包含相對(duì)路徑)和類別號(hào)衙耕,中間用空格隔開。我的類別號(hào)從1開始勺远,到23橙喘。
可以用python\matlab\shell,任意挑一種你熟練的語(yǔ)言遍歷整個(gè)數(shù)據(jù)集胶逢,獲取文件名列表以及每個(gè)文件的類別厅瞎。
3.轉(zhuǎn)換為lmdb格式
在深度學(xué)習(xí)的實(shí)際應(yīng)用中,我們經(jīng)常用到的原始數(shù)據(jù)是圖片文件初坠,如jpg,jpeg,png,tif等格式的和簸,而且有可能圖片的大小還不一致。因此我們可以調(diào)用caffe里的convert_imageset工具來(lái)將圖片文件轉(zhuǎn)換成caffe框架中能直接使用的db文件碟刺。create_lmdb.sh 且數(shù)據(jù)集中的圖片大小根據(jù)情況統(tǒng)一成47*47锁保。
#!/usr/bin/en sh
rm -rf img_lmdb_train
/home/zh/caffe/build/tools/convert_imageset --shuffle \ # "\" 是另起一行的意思
--resize_height=47 --resize_width=47 \
Image/train/ \
ImageSets/train.txt img_lmdb_train
rm -rf img_lmdb_val
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/val/ \
ImageSets/val.txt img_lmdb_val
rm -rf img_lmdb_test
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/test/ \
ImageSets/test.txt img_lmdb_test
convert_imageset的使用格式:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
FLAGS: 圖片參數(shù) # --shuffle是打亂數(shù)據(jù)順序,--backend設(shè)置生成的數(shù)據(jù)形式:lmdb或者leveldb半沽,默認(rèn)生成lmdb爽柒。
ROOTFOLDER/: 圖片存放路徑
LISTFILE: 圖片文件列表清單
DB_NAME: 最終生成的db文件存放目錄
4.計(jì)算均值并保存
圖片減去均值再訓(xùn)練,會(huì)提高訓(xùn)練速度和精度者填。因此浩村,一般都會(huì)有這個(gè)操作。
caffe程序提供了一個(gè)計(jì)算均值的可執(zhí)行文件compute_image_mean占哟,我們直接使用就可以了心墅。
compute_image_mean帶兩個(gè)參數(shù),第一個(gè)參數(shù)是lmdb訓(xùn)練數(shù)據(jù)位置榨乎,第二個(gè)參數(shù)設(shè)定均值文件的名字及保存路徑嗓化。
運(yùn)行成功后,會(huì)在 設(shè)定的保存路徑下面生成一個(gè)mean.binaryproto的均值文件谬哀。
5.創(chuàng)建模型并編寫配置文件
模型就用caffe自帶的"CaffeNet"模型( AlexNet的一個(gè)變體)刺覆,位置在 models/bvlc_reference_caffenet/文件夾下, 將需要的兩個(gè)配置文件solver.prototxt,train_val.prototxt 復(fù)制到自己的工程文件夾下;在models/文件夾下史煎,除了CaffeNet還有AlexNet谦屑、GoogleNet、R-CNN等網(wǎng)絡(luò)篇梭。
- 修改solver.prototxt
3910個(gè)測(cè)試數(shù)據(jù)氢橙,測(cè)試集的batch_size為50,因此test_iter設(shè)置為80恬偷,就能全cover了悍手。
net: "/home/zh/data/fish4knowledge/Fish_species_recognition/train_val.prototxt"
test_iter: 80 # 測(cè)試集的迭代次數(shù)
test_interval: 80 #訓(xùn)練的時(shí)候,每迭代test_interval次就進(jìn)行一次測(cè)試,得到準(zhǔn)確率值坦康。
base_lr: 0.01 #初始的學(xué)習(xí)率
lr_policy: "step"
gamma: 0.1
stepsize: 5000 #每隔stepsize次竣付,學(xué)習(xí)率降低gamma倍
display: 20 #每隔20次打印一次loss
max_iter: 25000 #訓(xùn)練的最大迭代次數(shù)
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000 #每迭代10000次備份一次中間caffemodel
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" #中間模型的保存地址和命名前綴
solver_mode: GPU
2.修改train_val.prototx
只需要修改train和test的data層就可以了,其它可以不用管滞欠。
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN #這個(gè)層僅在train階段
}
transform_param { #數(shù)據(jù)的預(yù)處理
mirror: true
crop_size: 47 ##change
mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto" ##change
}
data_param {
source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_train" ##change
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST #這個(gè)層僅在test階段
}
transform_param {
mirror: false
crop_size: 47 ##change
mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto" ##change
}
data_param {
source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_test" ##change
batch_size: 50 #測(cè)試集的batch_size
backend: LMDB
}
}
6.訓(xùn)練和測(cè)試
如果前面都沒(méi)有問(wèn)題古胆,數(shù)據(jù)準(zhǔn)備好了,配置文件也配置好了筛璧,這一步就比較簡(jiǎn)單了逸绎。
build/tools/caffe train -solver 絕對(duì)路徑/solver.prototxt