1 前言
Caffe对于像我这样的初学者来说是一款非常容易上手的深度学习框架。关于用Caffe跑自己的数据这样的博客已经非常多,感谢前辈们为我们提供的这么好的学习资源。这里我主要结合我所在的行业,说下如何对跑通具有多通道多格式的遥感数据。
2 数据准备
Caffe封装的非常好,要想将我们的数据运用于Caffe上,我们唯一要做的工作就是准备好Caffe支持的数据输入格式(leveldb/lmdb)。
Caffe解决方案下有一个工程convert_imageset为我们提供了接口,主要是将图像文件转化为 Caffe支持的两种数据格式。工程实现数据格式转换主要经过以下几个步骤:
在细读这个工程文件是会发现,其数据读取函数用的是OpenCV 的imread函数,在io.cpp。关于OpenCV的imread函数,这里不做详细介绍,只说出其存在的问题:
1 对于图像文件,imread不能读取多波段数据(遥感图像),超过4个波段的;
2 读取的数据格式默认是CV_8UC(n),遥感数据明显不符合要求。
因此,要想通过Caffe自带的数据集转换接口将多波段多数据类型的遥感图像输出为Caffe支持的leveldb和lmdb格式存在明显的不合理问题。
关于遥感图像的读取,我想大家第一反应就是GDAL库。因此,我尝试在Caffe的解决方案下重写数据转换接口,利用GDAL库来读图像,并将读取的数据转换为OpenCV的Mat数据格式,从而和图1中流程的第二步接轨(GDAL数据读取转换为Mat格式可参看前面的博客)。但是后来一想,感觉这样做有点多余,为啥不通过GDAL读取的数据直接写入到Caffe::Datum中呢。
后来仔细看了Caffe::Datum类,发现其存储数据目前只支持uchar和float,如果读者愿意,我想还可以给Datum类添加其他的支持数据格式。但是,我觉得float格式已经满足我的要求了。因此,我写了一个简单的函数,实现从GDAL读取的数据到Datum的转化,其代码如下:
