最近想用caffe做自己的模型文件,因为不会使用matlab,所以用python生成matlab的文件
首先有了cithscape的数据集,目的是转成包含name 和 data 两个属性的mat文件。其中,name是指类别名,data是和图片同等大小的矩阵,其中图片像素被改写成类别所对应的序号。举例说吧:如 1:person 2:car 3:road 那么data矩阵中的person的像素值是1,car 的像素值是2,road的像素值是3
看代码
#coding=utf-8
'''
Created on 2016年11月24日
@author: 密码是1234567
'''
from PIL import Image
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
import glob
data=[0, 117, 153, 70, 119, 194, 16, 76, 84, 45, 210, 90, 177, 164, 108, 33, 26, 192, 46, 114, 12, 125, 10, 7, 171, 172, 58] #这个list存放的是所有类别的原始灰度像素值
dict_label={90:'road',76:'rider',70:'building',119:'vegetation',210:'terrain',16:'car',117:'sky',194:'traffic sign',153:'pole',0:'unknown',45:'bicycle',84:'person',164:'wall',177:'traffic light',108:'fence',33:'sidewalk',26:'caravan',192:'parking',46:'truck',114:'bridge',58:'on rails',7:'trailer',12:'caravan',10:'bus',172: 'rail track',125:'tunnel',171:'guard rail'}
size=range(1,len(data)+1)
data_new = sorted(data) # 排序 注意sort和sorted的区别
data_label_seq={item:i for item ,i in zip(data_new,size)} # 组成{类别号:序号}的字典
data_label={item:dict_label[i] for item,i in zip(size,data_new) } # 组成{序号:类别名}的字典
obj_arr = np.zeros((27,),dtype=np.object) #用于输出为matlab 的cell
for i in range(27):
obj_arr[i]=data_label[i+1]
data_tuple=['unknown','trailer','bus', 'caravan', 'car', 'caravan', 'sidewalk', 'bicycle', 'truck', 'on rails', 'building', 'rider', 'person', 'road', 'fence', 'bridge', 'sky', 'vegetation', 'tunnel', 'pole', 'wall', 'guard rail', 'rail track', 'traffic light', 'parking', 'traffic sign', 'terrain']
filenames = glob.glob(r'F:/gvFile/gtFine/train/*/*105_*_gtFine_color.png') # 获取所有的类似这个结构下的图片
for filename in filenames:
im = Image.open(filename).convert("L")
im_array_mat = np.array(im)
new_image=np.zeros(im_array_mat.shape)
for m in range(im_array_mat.shape[0]):
for n in range(im_array_mat.shape[1]):
new_image[m,n]=data_label_seq[im_array_mat[m,n]] #新图是编码后的结果
#============================================================================
# 这部分代码是用来制作dict使用的 十字定位处就是所求的像素值的位置
# if im_array_mat[m,n] in data:
# print m,n,im_array_mat[m,n]
# print filename
# plt.imshow(im_array_mat)
# data.remove(im_array_mat[m,n])
# ax=plt.gca()
# ax.spines['top'].set_position(('data',m))
# ax.spines['right'].set_position(('data',n))
# plt.show()
# plt.subplot(121)
# plt.imshow(new_image)
# plt.subplot(122)
# plt.imshow(im_array_mat)
# print new_image
#============================================================================
plt.imshow(new_image)
sio.savemat("1.mat",{"S":new_image,'name':obj_arr}) #保存为mat文件
plt.show()
好吧,说一下几处新学的知识:
1.首先python获取某个路径下的所有文件名
import glob
filenames = glob.glob(r'F:/gvFile/gtFine/train/*/*105_*_gtFine_color.png')
2.python 中sort和sorted 的区别
sort不会返回任何东西,排序后list的结构改变
sorted 返回一个新的排序完成的list,原list的结构不改变
3.从python的元组到matlab 的cell
我们都知道python的元祖可以随意存储结构,同理cell也可以随意存储不同的结构
import scipy.io as sio
sio.loadmat # 加载.mat 文件
sio.savemat # 保存为.mat 文件
sio.whosmat # 可以列出.mat 文件中的内容
import numpy as np
import scipy.io as sio
obj_arr = np.zeros((2,),dtype=np.object)
obj_arr[0] = 1
obj_arr[1] = 'a string'
sio.savemat('np_cell_mat',{'obj_arr':obj_arr})
注意点: obj_arr必须定义类型为object,如果不定义类型,matlab 会认为你的obj_arr 是一个len(obj_arr)*max(len(obj)) 的char类型的矩阵
多阅读官方文档,虽然很难,但是能节省很多时间。。