1. 程式人生 > >使用Python製作Caffe的資料來源hdf5

使用Python製作Caffe的資料來源hdf5

把所要進行迴歸的Caffe影象放在/home/pcb/caffe/examples/Caffe_DataMaker_hdh5資料夾的image資料夾中,然後有一個hdf5.txt,文件中的第一列為影象的名稱,後面的是影象5個特徵的位置(這裡的5個特徵只是舉個栗子,或許有別的吧,只是這個txt怎麼生成還不知道,如果影象多的話肯定要寫程式的,後面會繼續更新的!),具體如下圖所示:
這裡寫圖片描述
然後生成hdf5的python的程式如下所示:


# -*- coding: utf-8 -*-
'''
hdf5資料來源
'''
import math
import
numpy as np import random import re import os import h5py import cv2 #圖片路徑 root_path = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/image' with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/hdf5.txt','r') as f: lins = f.readlines() num = len(lins) #資料長度 random.shuffle(lins) #把資料洗牌
imgAccu = 0 #圖片輸入 # #製作Data,造一個224*224*3*圖片個數的矩陣 imgs = np.zeros([num , 3 , 224 ,224]) # 製作label,造一個10(每個影象的標籤數)×圖片個數的矩陣 labels = np.zeros([num , 10]) for i in range(num): line = lins[i] #使用正則表示式把串給分割開來,取第一個圖片的名字 \s就是一個回車或者空格 segment = re.split('\s+',line) #找到圖片 image = cv2.imread(os.path.join(root_path , segment[0
])) #把圖片進行縮小 把圖片縮小到224 輸入的大小就是224x224的 image = cv2.resize(image , (224,224)) #普通圖片輸入是h w c 而caffe要求是c h w,所以要轉回來 image = image.transpose(2 , 0 , 1) #轉型別,float32 #把資料都存在imge裡面 imgs[i , : , : , :] = image.astype(np.float32) #因為圖片縮小了,所以要吧label也要縮小 for j in range(10): labels[i , j] = float(segment[j + 1])*224/256 #每個hdf5檔案裡存放的個數,一般每個.h5裡面放8000個 #這裡就3個,每個.h5裡面放一個 batchSize = 1 #取多少次 batchNum = int(math.ceil(1.0 * num/batchSize)) #減去均值操作,目的是以0為中心化 #在初始階段減去均值後,最後預測的時候要加上 imgsMean = np.mean(imgs , axis = 0) labelsMean = np.mean(labels , axis = 0) labels = (labels - labelsMean)/10 #移除之前存在的檔案 if os.path.exists('trainlist.txt'): os.remove('trainlist.txt') if os.path.exists('testlist.txt'): os.remove('testlist.txt') comp_kwargs = {'compression': 'gzip', 'compression_opts': 1} for i in range(batchNum): start = i * batchSize end = min((i+1)*batchSize , num) #前面的幾個bacthsize做為一個訓練資料 if i < batchNum - 1: fileName = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/train{0}.h5'.format(i) #後面的一個作為測試集 else: fileName = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/test{0}.h5'.format(i - batchNum + 1) #往h5檔案裡面新增進資料 with h5py.File(fileName , 'w') as f: f.create_dataset('data' , data=np.array((imgs[start : end] - imgsMean)/255.0).astype(np.float32) , **comp_kwargs) f.create_dataset('label' , data=np.array(labels[start : end]).astype(np.float32) , **comp_kwargs) pass if i < batchNum - 1: with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/trainlist.txt' , 'a') as f: f.write(("/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/train{0}.h5").format(i) + '\n') else: with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/testlist.txt' , 'a') as f: f.write(("/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/test{0}.h5").format(i - batchNum + 1) + '\n')
  • 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

這樣就會在Caffe_DataMaker_hdh5資料夾下h5生成以下幾個檔案:
這裡寫圖片描述
trainlist.txt裡面為train0.h5和train1.h5的路徑,如下圖所示:
這裡寫圖片描述
testlist.txt裡面為test0.h的路徑,如下圖所示:
這裡寫圖片描述
然後把所要使用的hdf5資料層的source路徑設為trainlist所在的路徑即可。

把所要進行迴歸的Caffe影象放在/home/pcb/caffe/examples/Caffe_DataMaker_hdh5資料夾的image資料夾中,然後有一個hdf5.txt,文件中的第一列為影象的名稱,後面的是影象5個特徵的位置(這裡的5個特徵只是舉個栗子,或許有別的吧,只是這個txt怎麼生成還不知道,如果影象多的話肯定要寫程式的,後面會繼續更新的!),具體如下圖所示:
這裡寫圖片描述
然後生成hdf5的python的程式如下所示: