1. 程式人生 > >caffe 學習系列之生成txt 和lmdb(2)

caffe 學習系列之生成txt 和lmdb(2)

    在上個筆記中,已經學會了如何使用Caffe利用作者給的指令碼訓練CIFAR-10資料集,得到訓練好的CNN模型。但是在上個筆記中,使用的都是作者提供好的指令碼檔案,完全就是按照教程跑了一下提供的demo。對於自己手裡的一些圖片資料集,如何轉換圖片格式、如何計算圖片資料的均值、如何編寫prototxt配置檔案是接下來筆記的主要內容。本篇筆記主要記錄如何將圖片資料轉換成db檔案,圖片均值的計算、prototxt配置檔案的編寫會後續進行講解。

一、Caffe訓練學習步驟回顧

    1.準備資料集(訓練集和測試集)

    2.圖片資料轉換成db(leveldb/lmdb)檔案

    3.計算圖片資料的均值

    4.prototxt配置檔案

    5.訓練模型

    注意:還有一種不需要db檔案和計算圖片資料的均值的訓練方法,而是隻需要一個txt列表清單,另一種訓練步驟在講完此種學習方法後進行講解。

二、圖片資料轉換成db(leveldb/lmdb)檔案

1.概述

    在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)檔案?

    在caffe中,作者為我們提供了這樣一個檔案:convert_imageset.cpp,存放在caffe根目錄下的tools目錄下。編譯好caffe之後,會生成對應的可執行檔案放在 build/tools/目錄下,這個可執行檔案convert_imageset的作用就是用於將圖片檔案轉換成caffe框架中能直接使用的db檔案。

    該檔案的使用格式如下所示:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
  • 1
    需要帶四個引數: - FLAGS: 圖片引數組,後面詳細介紹 - ROOTFOLDER/: 圖片存放的絕對路徑,從linux系統根目錄開始 - LISTFILE: 圖片檔案列表清單,一般為一個txt檔案,一行一張圖片 - DB_NAME: 最終生成的db檔案存放目錄     因此如果想使用convert_imageset這個工具生成我們需要的db檔案,就需要先得到圖片檔案列表清單txt檔案。     在caffe根目錄的/examples/image目錄下,有兩張共我們測試的圖片,它們是cat.jpg和fish-bike.jpg。我們可以使用eog命令在終端檢視這兩個圖片(遠端登入ssh不行,vnc可以,當然不是遠端登入是可以使用的),它們分別如下:

    我們可以使用這兩圖片學習如何製作圖片檔案列表清單txt檔案。這個圖片列表清單txt檔案 格式如下:

圖片檔名 標籤

    以cat.jpg和fish-bike.jpg為例,那麼這兩個圖片的列表清單txt檔案即為:

cat.jpg 1
fish-bike.jpg 2

    依此類推,一行一張圖片標籤。我們定義1標籤是貓的標籤,2標籤是自行車的標籤。很顯然,如果就這麼兩個圖片我們手寫一個圖片列表清單txt檔案即可,但是如果是很多圖片,我們又該如何處理呢?

    顯然,我們可以使用指令碼,有很多方法可供選擇shell指令碼,python指令碼等。而我採用的方式是使用python指令碼處理這些檔案,生成最終的圖片列表清單txt檔案。

2.利用python指令碼編寫圖片列表清單txt檔案

(1)在caffe根目錄下建立一個我們的工程目錄my-caffe-project,使用如下指令:

cd /home/Jack-Cui/caffe-master && mkdir my-caffe-project
  • 1

(2)建立並編輯create_db.py檔案,使用如下指令:

vim create_db.py
  • 1

檔案編輯內容如下:

# -*- coding: UTF-8 -*-
import os
import re

"""
函式說明:生成圖片列表清單txt檔案

Parameters:
    images_path - 圖片存放目錄
    txt_save_path - 圖片列表清單txt檔案的儲存目錄
Returns:
    無
Author:
    Jack Cui
Modify:
    2017-03-29
"""
defcreateFileList(images_path, txt_save_path):
    #開啟圖片列表清單txt檔案
    fw = open(txt_save_path,"w")
    #檢視圖片目錄下的檔案,相當於shell指令ls
    images_name = os.listdir(images_path)
    #遍歷所有檔名
    for eachname in images_name:
        #正則表示式這裡可以根據情況進行更改
        #正則表示式規則:找以cat開頭,緊跟0到10個數字,並以jpg結尾的圖片檔案
        pattern_cat = r'(^cat\d{0,10}.jpg$)'
        #正則表示式規則:找以fish-bike開頭,緊跟0到10個數字,以jpg結尾的圖片檔案
        pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'
        #正則表示式匹配
        cat_name = re.search(pattern_cat, eachname)
        bike_name = re.search(pattern_bike, eachname)
        #按照規則將內容寫入txt檔案中
        if cat_name != None:
            fw.write(cat_name.group(0) + ' 1\n')
        if bike_name != None:
            fw.write(bike_name.group(0) + ' 2\n')
    #列印成功資訊
    print "生成txt檔案成功"
    #關閉fw
    fw.close()

if __name__ == '__main__':
    #caffe_root目錄
    caffe_root = '/home/Jack-Cui/caffe-master/'
    #my-caffe-project目錄
    my_caffe_project = caffe_root + 'my-caffe-project/'
    #圖片存放目錄
    images_path = caffe_root + 'examples/images/'
    #生成的圖片列表清單txt檔名
    txt_name = 'filelist.txt'
    #生成的圖片列表清單txt檔案的儲存目錄
    txt_save_path = my_caffe_project + txt_name
    #生成txt檔案
    createFileList(images_path, txt_save_path)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

(3)執行create_db.py指令碼檔案,使用如下指令:

python create_db.py
  • 1

(4)使用指令cat create_filelist.py,檢視結果如下:

!=

3.利用python指令碼執行convert_imageset檔案生成db檔案

    生成的這個filelist.txt檔案,就可以作為第三個引數,直接使用了。

    接下來,我們來了解一下FLAGS這個引數組,有些什麼內容:

  • gray: 是否以灰度圖的方式開啟圖片。程式呼叫opencv庫中的imread()函式來開啟圖片,預設為false

  • backend:需要轉換成的db檔案格式,可選為leveldb或lmdb,預設為lmdb

  • resize_width/resize_height: 改變圖片的大小。在執行中,要求所有圖片的尺寸一致,因此需要改變圖片大小。 程式呼叫opencv庫的resize()函式來對圖片放大縮小,預設為0,不改變

  • check_size: 檢查所有的資料是否有相同的尺寸。預設為false,不檢查

  • encoded: 是否將原圖片編碼放入最終的資料中,預設為false

  • encode_type: 與前一個引數對應,將圖片編碼為哪一個格式:‘png’,’jpg’……

    好了,知道這些引數後,我們就可以呼叫命令來生成最終的lmdb格式資料了。

(1)繼續編寫create_db.py檔案,使用如下指令:

vim create_db.py
  • 1

檔案新增內容如下:

# -*- coding: UTF-8 -*-
import commands
import os
import re

"""
函式說明:生成圖片列表清單txt檔案

Parameters:
    images_path - 圖片存放目錄
    txt_save_path - 圖片列表清單txt檔案的儲存目錄
Returns:
    無
Author:
    Jack Cui
Modify:
    2017-03-29
"""
defcreateFileList(images_path, txt_save_path):
    #開啟圖片列表清單txt檔案
    fw = open(txt_save_path,"w")
    #檢視圖片目錄下的檔案,相當於shell指令ls
    images_name = os.listdir(images_path)
    #遍歷所有檔名
    for eachname in images_name:
        #正則表示式這裡可以根據情況進行更改
        #正則表示式規則:找以cat開頭,緊跟0到10個數字,並以jpg結尾的圖片檔案
        pattern_cat = r'(^cat\d{0,10}.jpg$)'
        #正則表示式規則:找以fish-bike開頭,緊跟0到10個數字,以jpg結尾的圖片檔案
        pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'
        #正則表示式匹配
        cat_name = re.search(pattern_cat, eachname)
        bike_name = re.search(pattern_bike, eachname)
        #按照規則將內容寫入txt檔案中
        if cat_name != None:
            fw.write(cat_name.group(0) + ' 1\n')
        if bike_name != None:
            fw.write(bike_name.group(0) + ' 2\n')
    #列印成功資訊
    print "生成txt檔案成功"
    #關閉fw
    fw.close()

"""
函式說明:生成lmdb檔案

Parameters:
    caffe_root - caffe根目錄
    images_path - 圖片存放目錄
    txt_save_path - 圖片列表清單txt檔案的儲存目錄
Returns:
    無
Author:
    Jack Cui
Modify:
    2017-03-29
"""
defcreate_db(caffe_root, images_path, txt_save_path):
    #lmdb檔名字
    lmdb_name = 'img_train.lmdb'
    #生成的db檔案的儲存目錄
    lmdb_save_path = caffe_root + 'my-caffe-project/' + lmdb_name
    #convert_imageset工具路徑
    convert_imageset_path = caffe_root + 'build/tools/convert_imageset'
    cmd = """%s --shuffle --resize_height=256 --resize_width=256 %s %s %s"""
    status, output = commands.getstatusoutput(cmd % (convert_imageset_path, images_path, 
        txt_save_path, lmdb_save_path))
    print output
    if(status == 0):
        print "lmbd檔案生成成功"


if __name__ == '__main__':
    #caffe_root目錄
    caffe_root = '/home/Jack-Cui/caffe-master/'
    #my-caffe-project目錄
    my_caffe_project = caffe_root + 'my-caffe-project/'
    #圖片存放目錄
    images_path = caffe_root + 'examples/images/'
    #生成的圖片列表清單txt檔名
    txt_name = 'filelist.txt'
    #生成的圖片列表清單txt檔案的儲存目錄
    txt_save_path = my_caffe_project + txt_name
    #生成txt檔案
    createFileList(images_path, txt_save_path)
    #生成lmdb檔案
    create_db(caffe_root, images_path, txt_save_path)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

    設定引數-shuffle,打亂圖片順序。設定引數-resize_height和-resize_width將所有圖片尺寸都變為256*256。

    ./home/xxx/caffe-master/examples/images/ 為圖片儲存的絕對路徑,我的caffe放在了/home/Jack-Cui目錄下。

    最終結果執行如下,大功告成!

一顆行走的大白菜

相關推薦

caffe 學習系列生成txt lmdb2

    在上個筆記中,已經學會了如何使用Caffe利用作者給的指令碼訓練CIFAR-10資料集,得到訓練好的CNN模型。但是在上個筆記中,使用的都是作者提供好的指令碼檔案,完全就是按照教程跑了一下提供的demo。對於自己手裡的一些圖片資料集,如何轉換圖片格式、如何計算圖片資料的均值、如何編寫protot

java多執行緒併發系列閉鎖(Latch)柵欄CyclicBarrier

-閉鎖(Latch) 閉鎖(Latch):一種同步方法,可以延遲執行緒的進度直到執行緒到達某個終點狀態。通俗的講就是,一個閉鎖相當於一扇大門,在大門開啟之前所有執行緒都被阻斷,一旦大門開啟所有執行緒都將通過,但是一旦大門開啟,所有執行緒都通過了,那麼這個閉鎖的狀態就失效了,門

《Linux學習並不難》歸檔壓縮2:tar包的使用管理

linux tar 壓縮 22.2 《Linux學習並不難》歸檔和壓縮(2):tar包的使用和管理使用tar命令可以將許多文件一起保存到一個單獨的磁帶或磁盤歸檔,並能從歸檔中單獨還原所需文件。命令語法:tar [選項] [文件|目錄]命令中各選項的含義如表所示。選項 選項含義 -c 創建新的

React學習筆記react進階篇2

-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信   組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信  

cocos2dx學習原始碼介面iOS事件分發2

今天看看事件是如何分發的。程式碼版本:cocos2dx-3.9 上次說到GLView接手touch事件:handleTouchesBegin。 原始碼: void GLView::handleTou

深入理解系列JAVA多執行緒2——synchronized同步原理

多執行緒中為了解決執行緒安全問題,一個重要的手段就是同步!所謂同步其實就是使得原本各個執行緒交叉執行(非同步),變成排隊執行(同步)。同步策略使得不同執行緒操作共享資料遵循“先來後到“,從而避免某個執行緒沒有處理完資料就被另一執行緒搶佔操作出現資料被覆蓋或

caffe 學習系列finetuning

在安裝好caffe之後,下一步自然就是執行一些demo 來玩下。 在caffe 的官網的notebook 中已經介紹瞭如何對caffe 提供的demo 的資料集進行finetuning, 這裡就不過多的介紹了。caffe finetuning 的demo 這

FineBI學習系列FineBI新建儀表板圖文詳解

功能 過程 平臺 tps RM 獲取數據 esc 表格 學習     不多說,直接上幹貨!   這是來自FineBI官網提供的幫助文檔 http://help.finebi.com/ 目錄: 1、描述 2、新建

【13】Caffe學習系列:資料視覺化環境python介面)配置

caffe程式是由c++語言寫的,本身是不帶資料視覺化功能的。只能藉助其它的庫或介面,如opencv, python或matlab。更多人會使用python介面來進行視覺化,因為python出了個比較強大的東西:ipython notebook, 現在的最新版本改名叫jupyter notebook

caffe學習系列:訓練自己的圖片集超詳細教程

    學習的caffe的目的,不是簡單的做幾個練習,而是最終落實到自己的專案或科研中去。因此,本文介紹一下,從自己的原始圖片到lmdb資料,再到訓練和測試的整個流程。 一、資料的準備     有條件的同學,可以去ImageNet的官網點選開啟連結,下載ImageNet圖片

oracle 10g 學習客戶端安裝配置2

概述 Oracle 資料庫是一種網路上的資料庫, 它在網路上支援多使用者, 支援伺服器/客戶機等部署(或配置) 伺服器與客戶機是軟體概念, 它們與計算機硬體不存在一一對應的關係. 即: 同一臺計算機既可以充當伺服器又可以充當客戶機, 或者, 一臺計算機只充當伺服器或只充當充當客戶機. Oracle 資料庫

Caffe學習系列:資料視覺化環境python介面)配置

caffe程式是由c++語言寫的,本身是不帶資料視覺化功能的。只能藉助其它的庫或介面,如opencv, Python或matlab。大部分人使用python介面來進行視覺化,因為python出了個比較強大的東西:ipython notebook, 現在的最新版本改名叫ju

Java for Web學習筆記一三八篇外資料庫的ACIDJPA2JPA

在測試中,我們發現在一個JPA事務中: Spring Data的寫SQL是在最後commit前發出,這最大程度地縮短了寫操作和commit之間的時間。 對相同的ID的讀,JPA只從資料庫中讀取一次。 從資料庫中獲取entity,修改entity的資料,即使最後沒有執行s

MQTT的學習Mosquitto發布-訂閱2

creat 訂閱模式 pub 測試 方法 ssa clientm art ble 在《MQTT的學習之Mosquitto安裝&使用(1)》一文末尾,我已經模擬了發布-訂閱模式,只是那時在服務器直接模擬的,並不是java代碼模擬的。下面貼出Java代碼 1、首先引入依

集成學習算法總結----BoostingBagging

原理 過程 訓練 嚴重 oos 機器學習 ppr 次數 error 1、集成學習概述 1.1 集成學習概述 集成學習在機器學習算法中具有較高的準去率,不足之處就是模型的訓練過程可能比較復雜,效率不是很高。目前接觸較多的集成學習主要有2種:基於Boosting的和基於Bagg

Python基礎數據類型運算2——字符串

創建 options 生成 quotes 字符串 表達 ngs 字符串格式化 lib 字符串基礎 Python 也提供了可以通過幾種不同方式表示的字符串。它們可以用單引號 (‘...‘) 或雙引號 ("...") 標識 。\ 可以用來轉義引號: >>>

硬件系列超聲波模塊介紹

返回 精度 就是 包括 發送 平時 自動 距離 c-s HC-SR04模塊可提供2cm-40cm的非接觸式距離感測功能,測距精度可達3mm: 模塊包括超聲波發生器,接收器與控制器,檢測角度30度。 控制方式: 采用IO口TRIG觸發測距,給最少10us的高電平信號 模塊自動

Python學習【第2篇】:Python數據類型2

append 但是 iss 代碼 key 常用方法 uber ner ces 元組 #為何要有元組,存放多個值,元組不可變,更多的是用來做查詢 t=(1,[1,3],‘sss‘,(1,2)) #t=tuple((1,[1,3],‘sss‘,(1,2))) #

定時調度系列Quartz.Net詳解

mys quic win 代碼 但是 提醒 tps 官網 etc 出處:https://www.cnblogs.com/yaopengfei/p/9216229.html 一. 背景   我們在日常開發中,可能你會遇到這樣的需求:"每個月的3號給用戶發信息,提醒用戶XX

React學習筆記react進階篇1

ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state   state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示