Caffe中檔案引數設定(九-1):訓練和測試自己的圖片-linux版本
在caffe中,作者為我們提供了這樣一個檔案:convert_imageset.cpp,存放在根目錄下的tools資料夾下。編譯之後,生成對應的可執行檔案放在 buile/tools/ 下面,這個檔案的作用就是用於將圖片檔案轉換成caffe框架中能直接使用的db檔案。
該檔案的使用格式:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
需要帶四個引數:
FLAGS: 圖片引數組,後面詳細介紹
ROOTFOLDER/: 圖片存放的絕對路徑,從linux系統根目錄開始
LISTFILE: 圖片檔案列表清單,一般為一個txt檔案,一行一張圖片
DB_NAME: 最終生成的db檔案存放目錄
如果圖片已經下載到本地電腦上了,那麼我們首先需要建立一個圖片列表清單,儲存為txt
本文以caffe程式中自帶的圖片為例,進行講解,圖片目錄是 example/images/, 兩張圖片,一張為cat.jpg, 另一張為fish_bike.jpg,表示兩個類別。
我們建立一個sh指令碼檔案,呼叫linux命令來生成圖片清單:
# sudo vi examples/images/create_filelist.sh
編輯這個檔案,輸入下面的程式碼並儲存
# /usr/bin/env sh DATA=examples/images echo "Create train.txt..." rm -rf $DATA/train.txt find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt cat $DATA/tmp.txt>>$DATA/train.txt rm -rf $DATA/tmp.txt echo "Done.."
這個指令碼檔案中,用到了rm,find, cut, sed,cat等linux命令。
rm: 刪除檔案
find: 尋找檔案
cut: 擷取路徑
sed: 在每行的最後面加上標註。本例中將找到的*cat.jpg檔案加入標註為1,找到的*bike.jpg檔案加入標註為2
cat: 將兩個類別合併在一個檔案裡。
最終生成如下的一個train.txt檔案:
cat.jpg 1
fish-bike.jpg 2
當然,圖片很少的時候,手動編寫這個列表清單檔案就行了。但圖片很多的情況,就需要用指令碼檔案來自動生成了。在以後的實際應用中,還需要生成相應的val.txt和test.txt檔案,方法是一樣的。
生成的這個train.txt檔案,就可以作為第三個引數,直接使用了。
接下來,我們來了解一下FLAGS這個引數組,有些什麼內容:
-gray: 是否以灰度圖的方式開啟圖片。程式呼叫opencv庫中的imread()函式來開啟圖片,預設為false
-shuffle: 是否隨機打亂圖片順序。預設為false
-backend:需要轉換成的db檔案格式,可選為leveldb或lmdb,預設為lmdb
-resize_width/resize_height: 改變圖片的大小。在執行中,要求所有圖片的尺寸一致,因此需要改變圖片大小。 程式呼叫opencv庫的resize()函式來對圖片放大縮小,預設為0,不改變
-check_size: 檢查所有的資料是否有相同的尺寸。預設為false,不檢查
-encoded: 是否將原圖片編碼放入最終的資料中,預設為false
-encode_type: 與前一個引數對應,將圖片編碼為哪一個格式:‘png','jpg'......
好了,知道這些引數後,我們就可以呼叫命令來生成最終的lmdb格式資料了
由於引數比較多,因此我們可以編寫一個sh指令碼來執行命令:
首先,建立sh指令碼檔案:
# sudo vi examples/images/create_lmdb.sh
編輯,輸入下面的程式碼並儲存
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/xxx/caffe/examples/images/ $DATA/train.txt $DATA/img_train_lmdb
設定引數-shuffle,打亂圖片順序。設定引數-resize_height和-resize_width將所有圖片尺寸都變為256*256.
/home/xxx/caffe/examples/images/ 為圖片儲存的絕對路徑。
最後,執行這個指令碼檔案
# sudo sh examples/images/create_lmdb.sh
就會在examples/images/ 目錄下生成一個名為 img_train_lmdb的資料夾,裡面的檔案就是我們需要的db檔案了。
上面就將影象資料轉換成db(leveldb/lmdb)檔案了。
===================================================================================================================================
再從自己的原始圖片到lmdb資料,再到訓練和測試模型的整個流程。
一、準備資料
有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。但是我沒有下載,一個原因是註冊賬號的時候,驗證碼始終出不來(聽說是google網站的驗證碼,而我是上不了google的)。第二個原因是資料太大了。。。
我去網上找了一些其它的圖片來代替,共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。需要的同學,可到我的網盤下載:http://pan.baidu.com/s/1nuqlTnN
編號分別以3,4,5,6,7開頭,各為一類。我從其中每類選出20張作為測試,其餘80張作為訓練。因此最終訓練圖片400張,測試圖片100張,共5類。我將圖片放在caffe根目錄下的data資料夾下面。即訓練圖片目錄:data/re/train/ ,測試圖片目錄: data/re/test/
二、轉換為lmdb格式
首先,在examples下面建立一個myfile的資料夾,來用存放配置檔案和指令碼檔案。然後編寫一個指令碼create_filelist.sh,用來生成train.txt和test.txt清單檔案
# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.sh
編輯此檔案,寫入如下程式碼,並儲存
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
done
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
然後,執行此指令碼
# sudo sh examples/myfile/create_filelist.sh
成功的話,就會在examples/myfile/ 資料夾下生成train.txt和test.txt兩個文字檔案,裡面就是圖片的列表清單。
接著再編寫一個指令碼檔案,呼叫convert_imageset命令來轉換資料格式。
# sudo vi examples/myfile/create_lmdb.sh
插入:
#!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/xxx/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/xxx/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
因為圖片大小不一,因此我統一轉換成256*256大小。執行成功後,會在 examples/myfile下面生成兩個資料夾img_train_lmdb和img_test_lmdb,分別用於儲存圖片轉換後的lmdb檔案。
三、計算均值並儲存
圖片減去均值再訓練,會提高訓練速度和精度。因此,一般都會有這個操作。
caffe程式提供了一個計算均值的檔案compute_image_mean.cpp,我們直接使用就可以了
# sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
compute_image_mean帶兩個引數,第一個引數是lmdb訓練資料位置,第二個引數設定均值檔案的名字及儲存路徑。執行成功後,會在 examples/myfile/ 下面生成一個mean.binaryproto的均值檔案。
四、建立模型並編寫配置檔案
模型就用程式自帶的caffenet模型,位置在 models/bvlc_reference_caffenet/資料夾下, 將需要的兩個配置檔案,複製到myfile資料夾內
# sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
# sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
修改其中的solver.prototxt
# sudo vi examples/myfile/solver.prototxt
net: "examples/myfile/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
100個測試資料,batch_size為50,因此test_iter設定為2,就能全cover了。在訓練過程中,調整學習率,逐步變小。修改train_val.protxt,只需要修改兩個階段的data層就可以了,其它可以不用管。
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_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: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_test_lmdb"
batch_size: 50
backend: LMDB
}
}
實際上就是修改兩個data layer的mean_file和source這兩個地方,其它都沒有變化 。
五、訓練和測試
如果前面都沒有問題,資料準備好了,配置檔案也配置好了,這一步就比較簡單了。
# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
執行時間和最後的精確度,會根據機器配置,引數設定的不同而不同。我的是gpu+cudnn執行500次,大約8分鐘,精度為95%。
以上部分轉自:http://www.cnblogs.com/denny402/p/5083300.html
=========================================================================================
下面是我自己寫的一個生成list指令碼
功能就是讀取資料夾下面的資料夾名稱作為類別並且將對應資料夾下面的圖片包括路徑輸出到txt檔案中。
# /usr/bin/env sh
DATA=/home/x/git/data_list/data
TxtPath=$DATA/../txt_list
rm -rf $TxtPath/train.txt
echo "Create train.txt..."
for file_a in ${DATA}/*; do
temp_file=`basename $file_a`
path1=$DATA/${temp_file}
echo $path1
#cd $path1
echo "xxxxxxxxxxxxxxx"
find ${path1} -name q*.png | sed "s/$/ ${temp_file}/">>$TxtPath/train.txt
echo $temp_file
done
echo "Done.."
以上部分轉自:http://blog.csdn.net/langb2014/article/details/50458520相關推薦
Caffe中檔案引數設定(九-1):訓練和測試自己的圖片-linux版本
在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l
Java for Web學習筆記(九十):訊息和叢集(5)利用websocket實現訂閱和釋出(上)
叢集中的訂閱和釋出 利用spring framework在本app內的訂閱和釋出十分簡單。當我們系統越來越複雜的時候,我們需要向其他app釋出訊息。本學習將給出一個通過websocket來實現不同app之間訊息的訂購和釋出。 在小例子中,我們在所有節點之間都建立webSoc
【12】Caffe學習系列:訓練和測試自己的圖片
一、準備資料 有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。驗證碼始終出不來需要翻牆(是google網站的驗證碼)。但是我沒有下載,原因是資料太大了。。。 我去網上找了一些其它的圖片
不要慫,就是GAN (生成式對抗網路) (四):訓練和測試 GAN
在 /home/your_name/TensorFlow/DCGAN/ 下新建檔案 train.py,同時新建資料夾 logs 和資料夾 samples,前者用來儲存訓練過程中的日誌和模型,後者用來儲存訓練過程中取樣器的取樣圖片,在 train.py 中輸入如下程式碼:
Caffe傻瓜系列(9):訓練和測試自己的圖片
在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)檔
javaIO(1):OutputStream和FileOutputStream原始碼分析及“裝飾者模式”在IO中的應用
前言 一,IO體系 從現在起,我們將基於JDK1.8詳細介紹java.io包中的關於輸入輸出有關的類。瞭解過這個包的都知道,裡面的類繼承關係錯綜複雜,光是弄清楚這些類的關係就夠喝一壺的了。說實話,我也沒有什麼好的方法來一下子就能弄清這些類,但是如果你瞭解“裝
跟開濤學SpringMVC(4.1):Controller接口控制器詳解(1)
詳解 shu fix gmv 控制器 input abstract pre pdf http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/5207453
python3網絡爬蟲(2.1):爬取堆糖美女
pre 線程 span 需要 pic ring clas lin chrome 額,明明記得昨晚存了草稿箱,一覺醒來沒了,那就簡寫點(其實是具體怎麽解釋我也不太懂/xk,純屬個人理解,有錯誤還望指正) 環境: 版本:python3 IDE:pycharm201
JavaEE互聯網輕量級框架整合開發(書籍)閱讀筆記(1):Mybatis和Hibernate概念理解
bat 特定 定義 理解 緩存 面向 ont span 等待 一、關鍵字說明: oop:面向對象 aop:面向切面 ioc:控制反轉 orm:對象關系映射 pojo:數據庫表映射的java實體類 二、常識說明:1.hibernate和mybatis都屬於持久層、orm
設計模式中的黃金搭檔(一對活寶):命令模式+觀察者模式
現有場景描述:現在無論是系統自帶的鍵盤還是第三方的鍵盤一般都自帶撤銷和恢復功能,你知道它們是用的什麼模式實現的嗎?它們用的是==命令模式+觀察者模式==,你答對了嗎?簡單科普一下啥是==Command模式==? Command模式:- 模式型別:行為類模式- 定義:將一個操作、一個方法呼叫、一個命令封裝成一個
PE檔案格式學習(十四):繫結匯入表
1.介紹 繫結匯入表的作用是加快程式的啟動速度,一個PE程式在啟動時會去載入匯入表中的dll檔案,並將匯入表的FirstThunk指向的陣列填入函式的真實地址,這需要耗去時間,繫結匯入表中儲存了匯入函式的真實地址,所以當PE在啟動時系統檢測到有繫結匯入表,就會直接將地址填入FirstThunk裡,這樣就省去
PE檔案格式學習(十六):延遲載入表
1.介紹 延遲載入表本質上跟繫結匯入表的目的是一樣的,都是為了加快程式載入檔案的速度,只不過方法不一樣。 延遲載入是指在呼叫某個DLL時才去載入,目的是為了避免在程式啟動之初就載入了不必要的DLL而浪費了時間。微軟建議在兩種情況下使用延遲載入: 程式並非在啟動時就會呼叫D
PE檔案格式學習(十二):TLS表
1.介紹 TLS全稱執行緒區域性儲存器,它用來儲存變數或回撥函式。 TLS裡面的變數和回撥函式都在程式入口點(AddressOfEntry)之前執行,也就是說程式在被除錯時,還沒有在入口點處斷下來之前,TLS中的變數和回撥函式就已經執行完了,所以TLS可以用作反除錯之類的操作。
ORB-SLAM2原始碼解讀(2.1):Tracking
Tracking是SLAM的靈魂,更像是前端里程計VO,這裡Tracking的主要任務兩方面:(1)完成相機位姿估計(2)跟蹤區域性地圖 思路:TrackLocalMap()在當前幀和區域性地圖之間找到儘可能多的對應關係,優化當前幀的位姿。對每一幀都進行跟蹤 第一次接觸這麼大的工程,發現之前
pyspider 爬蟲教程(1):HTML 和 CSS 選擇器
開始之前 由於教程是基於 pyspider 的,你可以安裝一個 pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環境: http://demo.pyspider.org/。 有需要Python學習資料的小夥伴嗎?小編整理【一套Pyt
學習MongoDB--(2-1):MongoDB入門(概念簡介和啟動)
開始進入正式學習使用MongoDB的階段了,首先還是詳細介紹一下MongoDB的一些概念吧: 1》 文件:這個是MongoDB中資料的基本單元,非常類似於關係型資料庫的行,但比傳統行能表示的資訊複雜很多。 2》 集合:這個在MongoDB中代表一組文件,類似於關係型資料庫中
【Ray Tracing in One Weekend】(ch0~1)c++生成的第一張圖片
Chapter 0: Overview 作者講了講自己的教學經驗以及有關光線追蹤的一些事。 作者推薦我們使用c++。 Chapter 1: Output an image 展示瞭如何用程式碼生成第一張圖片。用到了PPM格式。 這裡 有PPM格式的詳
caffe隨記(七)---訓練和測試自己的圖片
前面也介紹了tools工具,今天來試著自己跑一下影象分類的例項 1、下載資料 我沒有用imagenet的資料,因為太大了不想下,而且反正也只是當作例程跑一下而已,所以我用的是另一位博主分享的網盤上的資料,共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類1
ASP.NET Core 中文文件 第四章 MVC(4.1)Controllers, Actions 和 Action Results
Action 和 action result 是開發者使用 ASP.NET MVC 構建應用程式的基礎部分。 什麼是 Controller 在 ASP.NET MVC 中, 控制器( Controller )用於定義和聚合操作(Action)的一個集合。操作( 或操作方法 )是控制器中處理入站請求的一個方
學習MongoDB--(4-1):MongoDB查詢(基本查詢條件操作符介紹)
從前面的學習中,我們得知MongoDB中使用find函式來進行查詢。查詢最終返回的是一個集合中文件的子集,子集合包括0個文件到這個集合中所有的文件。 【第一個查詢引數】 find函式第一個引數是一個文件,其中給出了我們要查詢集合中什麼樣文件的描述。如果我們要查詢所有文件,可