使用Python製作Caffe的資料來源hdf5
阿新 • • 發佈:2018-11-16
把所要進行迴歸的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的程式如下所示: