1. 程式人生 > >caffe訓練自己的資料集——1. 資料準備

caffe訓練自己的資料集——1. 資料準備

一、重新命名資料

1. 引數說明:

  1. rootPath:指定根目錄,default=”J:/datasets/car/”,僅對於存在二級目錄的時候生效
  2. inputPath:輸入目錄,default=”J:/datasets/carPlate/test/”,是核心函式singleFileRename的第一個引數
  3. outputPath:輸出目錄,default=”J:/datasets/carPlate/test/”,設定輸出目錄與輸出目錄相同,即重新命名會覆蓋原始檔。也是核心函式singleFileRename的引數之一
  4. prefix:檔名的字首,default=”,預設不指定字首,僅用數字進行重新命名
  5. suffix:檔名的字尾,default=”,預設不指定字尾,僅用數字進行重新命名
  6. digit:數字形式的檔名所用到的位數,default=6,即用6位數對資料進行重新命名
  7. picFormat:一般是圖片資料,default=’.jpg’

2. 使用方法

  1. 對於單個資料夾:執行python rename.py 呼叫rename.singleFileRename(args.inputPath,args.outputPath)
    a. 如果inputPath和outputPath均為單個檔案,則直接將inputPath重新命名成outputPath
    b. 否則,如果均為資料夾,則將該資料夾下所有檔案或資料夾,按照digit的長度進行重新命名。
    c. rootPath對於單個資料夾不起作用

  2. 對於第二級目錄:執行python rename.py呼叫rename._2_recursiveRename(args.rootPath)

rootPath = "J:/datasets/carPlate/test/"
    test/no:
        1.jpg
        2.jpg
    test/has:
        11.jpg
        22.jpg
a. rootPath="J:/datasets/carPlate/test/",inputPath和outputPath會自動查詢到,不需要賦值。
b. 次函式作用是將第二級目錄下,所有資料夾所包含的圖片重新命名。

3. 對於第三級目錄:執行python rename.py

呼叫rename._3_recursiveRename(args.rootPath)

rootPath = "J:/datasets/carPlate/"
    carPlate/train:
                no:
                    1.jpg
                    2.jpg
                has:
                    11.jpg
                    22.jpg  
    carPlate/test:
                no:
                    1.jpg
                has:
                    2.jpg
a. rootPath="J:/datasets/carPlate/",inputPath和outputPath會自動查詢到,不需要賦值。
b. 此函式作用是將第三級目錄下的第二級目錄中所包含的圖片重新命名。

3. 程式碼如下

#coding: UTF-8
import os
import argparse

class rename:
    def __init__(self, rootPath, inputPath, outputPath, prefix='', suffix='', digit=5, picFormat = '.jpg'):
        self.rootPath  = rootPath
        self.inputPath = inputPath
        self.outputPath = outputPath
        self.prefix = prefix
        self.suffix = suffix
        self.digit = digit
        self.picFormat = picFormat

    def singleFileRename(self,inputPath,outputPath):
        #獲取該目錄下所有檔案,存入列表中
        if os.path.isfile(inputPath):   #如果是已存在的圖片
            os.rename(inputPath, outputPath)
            print(inputPath, '========>', outputPath)
        else:   #如果是路徑
            files = os.listdir(inputPath)
            num = 0
            for file in files:
                oldname = inputPath + files[num]
                ex = os.path.splitext(file)
                newname = outputPath + '{0}{1:0{3}d}{2}'.format(self.prefix, num, self.suffix, self.digit) + self.picFormat
                os.rename(oldname,newname)
                print(oldname,'========>',newname)
                num+=1

    #二級目錄重新命名
    def _2_recursiveRename(self,rootPath):
        rootPath = self.rootPath
        #獲取該路徑下所有的目錄,存入列表
        dirs = os.listdir(rootPath)
        for name in dirs:
            inputPath = os.path.join(rootPath, name) + "/"
            if (name[0] == '.'):    #排除隱藏檔案
                pass
            else:
                if os.path.isdir(inputPath):    #判斷是否是目錄
                    outputPath = inputPath
                    self.singleFileRename(inputPath,outputPath)
    #三級目錄重新命名
    def _3_recursiveRename(self,rootPath):
        rootPath = self.rootPath
        # 獲取該路徑下所有的目錄,存入列表
        dirs = os.listdir(rootPath)
        for _name in dirs:
            _rootPath = os.path.join(rootPath, _name) + "/"
            if (_name[0] == '.'):  # 排除隱藏檔案
                pass
            else:
                if os.path.isdir(_rootPath):
                    self.rootPath = _rootPath
                    self._2_recursiveRename(self.rootPath)

def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--rootPath", type=str, default="J:/datasets/car/",help="rootPath with '/' at the end")
    parser.add_argument("--inputPath", type = str, default="J:/datasets/carPlate/test/",
                                                    help="inputPath with '/' at the end or ‘J:/datasets/carPlate/test/0000000.jpg’")
    parser.add_argument("--outputPath", type = str, default="J:/datasets/carPlate/test/",
                                                    help= "outputPath with '/' at the end or 'J:/datasets/carPlate/test/aaaaaa.jpg'")
    parser.add_argument("--prefix", default='', help="檔名的字首")
    parser.add_argument("--suffix", default='', help="檔名的字尾")
    parser.add_argument("--digit",  default= 6 ,  help="檔名的數字總長度: [1,~]")
    parser.add_argument("--picFormat", default='.jpg',help="圖片的格式")
    args = parser.parse_args()
    return args

if __name__== '__main__':
    args = get_args()
    rename = rename(args.rootPath, args.inputPath,args.outputPath,args.prefix,args.suffix,args.digit,args.picFormat)
    #rename.singleFileRename(args.inputPath,args.outputPath)
    #rename._2_recursiveRename(args.rootPath)
    rename._3_recursiveRename(args.rootPath)

二、製作資料

I. 準備原始資料

1. 批量複製

  1. 管道法
for i in `ls`; do fn=`echo $i | awk -F'.' '{print $1}'`; cp $fn.txt $fn"_bak.jpg"; done
  1. 傻瓜式
#!/bin/bash
cd /home/hsy/datasets/carPlate/train/3
for file in $(ls *)
do
    echo $file
    echo ${file%.*}"_back.jpg"
    cp $file ./${file%.*}"_back.jpg"
done
  1. 複製多次
#!/bin/bash
curPath=pwd
cd /home/hsy/datasets/carPlate/test/a
for file in $(ls *)
do
    echo $file
    echo ${file%.*}"_back.jpg"
    fn=`echo $file | awk -F'.' '{print $1}'`
    cp $file ./$fn"_back_1.jpg"
    cp $file ./$fn"_bach_2.jpg"
#cp $file ./${file%.*}"_back_1.jpg"

done

2. 備份資料

tar -zcvf carPlate_train.tar.gz train

II. 製作標籤

1. 引數介紹:

  1. root為根目錄,可以是直接包含圖片資料的一級目錄,也可以是包含資料夾的二級目錄。default=”M:/datasets/carPlate/train/”注意斜槓
  2. prefix為train.txt檔案的存放目錄,default=”M:/datasets/carPlate/train/”注意斜槓
  3. exts用於判斷讀取到的檔案是否是圖片格式,default=[‘.bmp’, ‘.jpg’]
  4. chunks表示將一組資料分成多少個小段,help=’number of chunks.例如100個數據集,分成4個chunks,每個chunks25個數據’)
  5. train_ratio:如果小於1,則會設定train_ratio比例的資料集作為訓練集,其餘作為測試集,分別存放在_train.txt_val.txt中,如果chunks不等於1,’例如4個chunks,對於每個chunks會按照train_ratio分成兩組,生髮到成_0_train.txt和_1_val_txt,一共生成8個檔案’,)
  6. recursive,default=True, help=’If true recursively walk through subdirs and assign an unique label\
    to images in each folder. Otherwise only include images in the root folder and give them label 0.’
  7. 程式這條語句random.shuffle(image_list)設定了資料打亂機制,並未作為引數寫出來,是為了將來對資料本身進行有針對性的資料增廣

2. 使用說明

a. 目錄結構如下:可以將root和prefix設定為相同路徑,train.txt會儲存在這個路徑,但是在執行程式之前請確保這個檔案不存在於這個路徑,因為會重新建立。

    J:\datasets\carPlate\test
            a:
                1.jpg
                2.jpg
            b:
                1.jpg
                2.jpg

b. 執行python make_list_linux.py,在程式碼中開啟image_list.append((os.path.relpath(fpath, root), cat[path]))可以生成如下格式的相對路徑:

    /home/hsy/datasets/carPlate/test/a/000000.jpg 1
    /home/hsy/datasets/carPlate/test/b/000001.jpg 0
    /home/hsy/datasets/carPlate/test/b/000003.jpg 0
    /home/hsy/datasets/carPlate/test/b/000004.jpg 0
    /home/hsy/datasets/carPlate/test/a/000001.jpg 1
    /home/hsy/datasets/carPlate/test/a/000004.jpg 1
    /home/hsy/datasets/carPlate/test/b/000002.jpg 0
    /home/hsy/datasets/carPlate/test/a/000002.jpg 1
    /home/hsy/datasets/carPlate/test/a/000003.jpg 1
    /home/hsy/datasets/carPlate/test/b/000000.jpg 0

c. 使用train_ratio引數,可以先選出一小部分資料集用於預訓練,但如果shuffle之後,可能出現正負樣本失衡且不可控的情況,所以選擇小樣本時,最好不要shuffle或者將正負樣本分開

  1. 程式碼如下
#coding: UTF-8
import fnmatch, os
import random
import numpy as np
import argparse


def list_image(root, recursive, exts):
    image_list = []
    if recursive:
        cat = {}
        for path, subdirs, files in os.walk(root):
            print path
            # print subdirs #註釋掉
            for fname in files:
                fpath = os.path.join(path, fname)
                suffix = os.path.splitext(fname)[1].lower()
                if os.path.isfile(fpath) and (suffix in exts):
                    if path not in cat:
                        cat[path] = len(cat) #表示第n個資料夾
                print cat[path]
                # os.path.relpath(fpath, root)返回從root到fpath的相對路徑
                #image_list.append((os.path.relpath(fpath, root), cat[path]))
                #將圖片的絕對路徑寫入到train.txt,但有時候還會報奇怪的unexpected indent錯誤,應該是空格問題
                image_list.append((os.path.relpath(fpath, root), cat[path]))
                print fpath #註釋掉
                print (cat[path]) #註釋掉
    else:
        for fname in os.listdir(root):
            fpath = os.path.join(root, fname)
            suffix = os.path.splitext(fname)[1].lower()
            if os.path.isfile(fpath) and (suffix in exts):
                image_list.append((os.path.relpath(fpath, root), 0))
    return image_list


def write_list(path_out, image_list):
    with open(path_out, 'w') as fout:
        for i in xrange(len(image_list)):
            # fout.write('%d \t %d \t %s\n'%(i, image_list[i][1], image_list[i][0]))
            fout.write('%s %d\n' % (image_list[i][0], image_list[i][1]))  #改為這樣的格式


def make_list(prefix_out, root, recursive, exts, num_chunks, train_ratio):
    image_list = list_image(root, recursive, exts)
    random.shuffle(image_list)
    N = len(image_list)
    # num_chunks表示資料的段數,chunk_size表示每段資料的個數
    # N+ (num_chunks-1)是為了保證所有資料都被用上,如果不加,最後計算得到的餘數個數據就不會被計算進去
    chunk_size = (N + num_chunks - 1) / num_chunks
    for i in xrange(num_chunks):
        chunk = image_list[i * chunk_size:(i + 1) * chunk_size]
        if num_chunks > 1:
            str_chunk = '_%d' % i
        else:
            str_chunk = ''
        if train_ratio < 1:
            sep = int(chunk_size * train_ratio)
            write_list(prefix_out + str_chunk + '_train.txt', chunk[:sep])  # 輸出檔案更改為txt
            write_list(prefix_out + str_chunk + '_val.txt', chunk[sep:])
        else:
            write_list(prefix_out + str_chunk + 'train.txt', chunk)


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description='Make image list files that are required by im2rec')
    parser.add_argument('--root', default="M:/datasets/carPlate/train/", help='path to folder that contain images.')
    parser.add_argument('--prefix',default="M:/datasets/carPlate/train/", help='prefix of output list files.')
    parser.add_argument('--exts', type=list, default=['.bmp', '.jpg'],
                        help='list of acceptable image extensions.')  # 注意圖片的格式 我這裡是bmp  根據實際更改
    parser.add_argument('--chunks', type=int, default=1, help='number of chunks.例如100個數據集,分成4個chunks,每個chunks25個數據')
    parser.add_argument('--train_ratio', type=float, default=1, help='Percent of images to use for training.'
                        '例如4個chunks,對於每個chunks會按照train_ratio分成兩組,生髮到成_0_train.txt和_1_val_txt,一共生成8個檔案',)
    parser.add_argument('--recursive', type=bool, default=True,
                        help='If true recursively walk through subdirs and assign an unique label\
    to images in each folder. Otherwise only include images in the root folder \
                                                                        and give them label 0.')
    args = parser.parse_args()

    make_list(args.prefix, args.root, args.recursive,
              args.exts, args.chunks, args.train_ratio)

if __name__ == '__main__':
    main()

III. 生成標籤

0. 資料說明

這裡的資料集來自於:
N:\項\車牌專案\唐佩君師姐的資料\training(clib,6.26號,準確度95%)
N:\項\車牌專案\唐佩君師姐的資料\testing

黃色:2000 藍色:2000 白色:2000 非車牌:13438 
正樣本一共6000張
負樣本一共13438張
總共19438張
藍:0 黃:1 白:2 非:3

1. 重新命名

這個步驟速度還挺快的

a. 利用第一部分程式碼(名為```rename_linux.py```)中的rename._2_recursiveRename(args.rootPath)函式,
b. 設定位數digit=6,rootPath="/home/hsy/datasets/carPlate/train/",inputPath和outputPath不用設定
c. 執行python rename_linux.py即可對train下的多個資料夾下的圖片進行重新命名。

2. 生成樣本標籤

分三批生成樣本,分別佔總樣本數量的10%,30%,100%,每次都利用程式碼中random.shuffle(image_list)打亂資料

a. 設定路徑:root=prefix="/home/hsy/datasets/carPlate/train/"
b. 設定chunks=1, train_ratio=0.1,生成第一批,並改名為train_10.txt
c. 設定chunks=1, train_ratio=0.3,生成第二批,並改名為train_30.txt
d. 設定chunks=1, train_ratio=1.0,生成第三批,並改名為train_100.txt
每兩次之間,記得把生成的train_xx.txt移動到其他資料夾,否則會報錯。

IV 資料轉換

1. 示例說明

/opt/caffe/build/tools/convert_imageset \
--resize_height=32 \
--resize_width=32 \
/home/datasets/carPlate/train/  #訓練檔案的根目錄
/home/datasets/carPlate/train/train_10.txt #標籤所在目錄
/home/datasets/carPlate/train_test_labels/train_10 #生成的lmdb存放目錄,必須是未存在過的目錄
#--gray=ture #生成灰度圖
#--shuffle #隨機排序

執行之後會在“/home/datasets/carPlate/train_test_labels/train_10 ”路徑下生成data.mdblock.mdb兩個檔案

2. 批量轉換

/opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/train/ /home/datasets/carPlate/train_test_labels/train_10.txt /home/datasets/carPlate/train_test_labels/train_10
 1381  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/train/ /home/datasets/carPlate/train_test_labels/train_50.txt /home/datasets/carPlate/train_test_labels/train_50
 1382  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/train/ /home/datasets/carPlate/train_test_labels/train_30.txt /home/datasets/carPlate/train_test_labels/train_30
 1383  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/train/ /home/datasets/carPlate/train_test_labels/train_100.txt /home/datasets/carPlate/train_test_labels/train_100
 1384  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/test/G1-5/G1/ /home/datasets/carPlate/train_test_labels/val_G1.txt /home/datasets/carPlate/train_test_labels/val_G1
 1385  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/test/G1-5/G2/ /home/datasets/carPlate/train_test_labels/val_G2.txt /home/datasets/carPlate/train_test_labels/val_G2
 1386  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/test/G1-5/G3/ /home/datasets/carPlate/train_test_labels/val_G3.txt /home/datasets/carPlate/train_test_labels/val_G3
 1387  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/test/G1-5/G4/ /home/datasets/carPlate/train_test_labels/val_G4.txt /home/datasets/carPlate/train_test_labels/val_G4
 1388  /opt/caffe/build/tools/convert_imageset --resize_height=32 --resize_width=32 /home/datasets/carPlate/test/G1-5/G5/ /home/datasets/carPlate/train_test_labels/val_G5.txt /home/datasets/carPlate/train_test_labels/val_G5

3. 求取均值

#訓練集
/opt/caffe/build/tools/compute_image_mean \
/home/datasets/carPlate/train_test_labels/train_10 \    #lmdb檔案所在路徑
/home/datasets/carPlate/train_test_labels/train_10/train_10_mean.binaryproto\ #生成的均值檔案所在路徑
 #測試集
/opt/caffe/build/tools/compute_image_mean \
/home/datasets/carPlate/train_test_labels/val_G1 \
/home/datasets/carPlate/train_test_labels/val_G1/val_G1_mean.binaryproto

V. 訓練及測試

參見我寫的另一篇部落格

相關推薦

caffe訓練自己資料——1. 資料準備

一、重新命名資料 1. 引數說明: rootPath:指定根目錄,default=”J:/datasets/car/”,僅對於存在二級目錄的時候生效 inputPath:輸入目錄,default=”J:/datasets/carPlate/test/”

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

caffe訓練自己資料

https://www.cnblogs.com/wktwj/p/6715110.html 預設caffe已經編譯好了,並且編譯好了pycaffe 1 資料準備 首先準備訓練和測試資料集,這裡準備兩類資料,分別放在資料夾0和資料夾1中(之所以使用0和1命名資料類別,是因為方便標註資料類別,直接用資料夾的名

Fast RCNN 訓練自己資料 (1編譯配置)

FastRCNN 訓練自己資料集 (1編譯配置) FastRCNN是Ross Girshick在RCNN的基礎上增加了Multi task training整個的訓練過程和測試過程比RCNN快了許多。別的一些細節不展開,過幾天會上傳Fast RCNN的論文筆記。FastRCNN mAP效能上略有上升。Fa

實踐二:caffe環境配置以及使用ssd-caffe訓練自己資料

1:環境配置 首先,我們把專案程式碼clone下來, 然後編譯: git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd 檢視有沒有安裝opencv pkg-co

如何利用caffe訓練自己資料

這篇博文主要參考了另一位博主https://blog.csdn.net/hellohaibo,在此向他表示感謝 首先,博主今天的caffe崩了,毫無徵兆的崩了,具體表現為博主想做一個更大的資料集,但是在生成lmbd檔案時永遠生成的是一個沒有名字的資料夾,可是博主已經在指定的example目錄裡寫了

caffe訓練自己資料——2. 開始訓練

一、配置檔案 1. 網路結構 henet_car_train_test.prototxt #name: "LeNet" layer { name: "mnist" type: "Data" top: "data" top: "lab

FPN訓練自己的小目標資料爬坑日誌(1

遇到了一個糾結了很久得問題就是: Traceback (most recent call last):   File "./tools/demo.py", line 138, in <module>     _, _= im_detect(net,

Pytorch打怪路(三)Pytorch建立自己資料1

之前講的例子,程式都是呼叫的datasets方法,下載的torchvision本身就提供的資料,那麼如果想匯入自己的資料應該怎麼辦呢? 本篇就講解一下如何建立自己的資料集。 1.用於分類的資料集 以mnist資料集為例 這裡的mnist資料集並不是torchv

利用faster rcnn 訓練自己資料——kitti資料

前言:非常感謝https://blog.csdn.net/flztiii/article/details/73881954,這篇部落格,本文主要參考這篇文章kitti資料集是一個車輛檢測的資料集資料集的準備Kitti資料集的下載只需要第一個圖片集(12G)和標註檔案即可【第一

caffe】使用caffe訓練自己資料

1.生成lmdb caffe在安裝包裡提供了用於生成lmdb資料的指令碼,在使用時只需修改其中幾個引數。 開啟create_imagenet.sh 需要修改的引數有以下幾個: EXAMPLE=examples/imagenet/project#工作資料夾的路徑 DATA=exampl

caffe訓練自己資料時的錯誤

  [email protected]:/home/wzy/caffe-master# sh examples/wzy/create_meanfile.sh F0821 16:03:04.561220 17469 db_lmdb.hpp:15] Check fa

ubuntu caffe 訓練自己資料(簡單)

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

caffe訓練自己資料

1。準備資料 參:學習筆記3 用自己的資料訓練和測試-薛開宇 2。調整影象大小到256×256 3。生成leveldb 資料。將 create_imagenet.sh檔案從imagenet資料夾中拷過去,修改路徑。 4。生成mean資料。將 make_imagenet_me

自己的dcm資料製作成LUNA16資料提供資料樣式之程式碼整理

1.獲取mhd和raw import cv2 import os import pydicom import numpy import SimpleITK # 路徑和列表宣告 rootpath="E:/DcmData/xlc/Fracture_data/Me/" PathDicom = "E:

自己的dcm資料製作成LUNA16資料提供資料樣式。

1.先說下luna資料樣式。一個CT序列在LUNA16資料集主要是由一個mhd檔案一個raw檔案以及一個或多個csv檔案(以一個為例不做那麼多區分(3mm以下不做處理等))。以下為LUNA16資料集的csv格式: seriesuid,coordX,coordY,coordZ,class 1.3.

FPN訓練自己的小目標資料爬坑日誌(2)

錯誤:RcnnLossBBox = 0   I0625 20:40:38.710259 18430 sgd_solver.cpp:107] Iteration 2640, lr = 0.001 I0625 20:40:50.785377 18430 solver.cp