1importos#路径组合2importtorch#is_tensor3importpandasaspd#读取csv4importnumpyasnp#ndarray,reshape,5fromtorch.utils.dataimportDataset,DataLoader#实现数据集和数据集的分组6fromskimageimportio#forimageio7importmatplotlib.pyplotasplt#forplotting8fromtorchvisionimporttransforms,utils#transforms.compose,utils.make_grid()9fromskimageimportio,transform#读取图片,transform.resize10importwarnings
panda:用于解析csv文件
scikit-iamge:读取图像和图像转换
os.path.join():把不同路径部分拼接在一起,并用/隔开,如果最后一个组分是“”,会在最后的路径名后加上/
自己的数据集类继承与dataset,必须满足
landmark的x,y与image的h,w顺序相反
numpy和torch的image的尺寸顺序不一样transpsoe(())要会用
magicmethod:__init__,__call__
fromsysimportargv
argvandinput()
thedifferencehastodowithwheretheuserisreuqiredtogiveinput.oneincommand,onewhenthisscriptisrunning
tensor.tolist(),tensor仅含一个值时,同item(),返回一个python数字,否则返回一个list
dict.items()返回的是key和value
pandas.DataFrame.as_matrix()返回ndarray
np.arrray()返回ndarray
assertisinstance(output_size,(int,tuple))
enumerate()返回的是一个iterableenumerate对象,参数必须是sequence或者iterable,里面是tuples
.transpose()numpy
whattodo:
处理csv文件,得到landmarks
landmarks与image结合,并进行transform,得到transformed_sample
用data_loader分成batch
howtodo:
sci什么的读取一下文件,转换成ndarray,把名字截掉,然后transpose为68by2(2为x,y坐标)
转换为sample需要一个class,继承data,class需要包含__init__(memoryefficient)和__getitem__,还要传一个transform对象,传参时根据路径读取一下图片,把image和landmark放到词典里,执行transform
python语法
classSingleton(object):_instance=Nonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instance=object.__new__(cls,*args,**kwargs)returncls._instances1=Singleton()s2=Singleton()print(s1)print(s2)cls代表需要被实例化的类
输出:
<__main__.Singletonobjectat0x7fdef58b1190><__main__.Singletonobjectat0x7fdef58b1190>还有工厂化,用到再说吧,留坑
torchvision.utils.make_grid(images_batch),把图片放到格子里,此时的image_batch是(B,C,W,H)的tensor,或者是相同尺寸图片的list,padding默认为2,pad_value默认为0
导入一张图片并输出:io.imread(img_name)和scipy.misc.face()
导入sci文件,输出{‘image':image,'sample':sample},pd.read_csv,frame.iloc,frame.as_matrix():
FaceLandmarkDataset
1、继承Dataset
2、实现__init__和__getitem__和__len__
3、__init__的参数为csv_file,root_dir,transform(可选),局部变量为landmarks_frame,root_dir,transform实现读取csv_file
4、__len__返回landmarks_frame的长度
5、__getitem__参数为idx,实现读取图片,截取对应的landmarks的坐标,转换为ndarray并转置,返回landmarks和image组成的词典。在getitem内实现数据的转变,而不是一次性读取所有的照片,节省内存
返回的landmarks是ndarray,图片也是ndarray
Transform
1、实现__init__和__call__,init设置变量,__call__传递样本
2、__init__的参数为int或者(int,int)计算output.size,call进行对sample进行对应的操作,并返回output(词典)
torchvision.transforms.Compose(transforms)将多个transform组合起来使用,transforms用[]括起来
transform里还要实现一个ToTensor的操作,把landmarks和images转换为Tensor
划分Batch,使用DataLoader,输入DataSet对象:
DataLoader,实现数据集的划分,传入dataset
fromtorch.utils.dataimportDataset,DataLoader
DataLoader可以迭代,支持map-style和iterable-style两种DataSet
对于map-style的dataset,每个batch也是一个词典,使用Key获得imagebatch和labelbatch
输出图片和landmarks
torchvison.utils.make_grid(),接收tensor,plt.imshow(grid),图片全框,padding默认为2
plt.scatter()接受的numpyarray
plt.需要的是np.ndarray,torchvison.utils.make_grid(),接收tensor
practice实现,读取faces图片和相应的csv保存的label,制作出DataSet,数据格式为tensor,transform使用torchvision里已经做好的
用到的画图:
plt.figure()
plt.imshow()
plt.scatter
plt.subpltot()至少3个参数,前两个控制几行几列,第三个控制子图位置
plt.tight_layout()
plt.title()
plt.axi()
plt.ioff
torchvsion.utils.make_grid,传进去的是n张tensor表示的图片,返回的仍然是tensor,用plt画图时需要先转换为numpy,并注意调整维度顺序。