NativeImageLoader Labelloader = new NativeImageLoader(112, 112, 3,new FlipImageTransform(-1));
一、导读
众所周知图像是有红绿蓝三种颜色堆叠而成,利用deeplearning对图像处理,必须把图像转化为张量,每一张图片由有三维张量组成,三维分别是[depth、height、width],直观来讲,就是用三个矩阵堆叠起来,每一个矩阵代表一个通道,如下图。有时候需要对图片进行旋转、缩放、裁剪、缩小填充等等复杂的操作,没有一个好用的工具,整个操作过程是非常繁琐的。今天我们就来聊一聊DL4J的datavec对图像的处理。
二、datavec-data-image代码架构
datavec-data-image是dl4j基于opencv封装的图像处理库,可以非常方便的把图片处理为张量。代码分三个重要部分,loader(图片加载器)、transform(转化器)。
1、loader:图片加载器,主要用于将图片加载并转化为张量。整个类结构如下图
2、transform转化器,主要用于对图片张量的旋转、缩放、裁剪等操作,这里列出几个比较重要的转化器。
ResizeImageTransform:缩放图片
FlipImageTransform:翻转图片,例如上线左右颠倒
CropImageTransform:裁剪图片
BoxImageTransform:将图片固定到一个固定大小,如果图片大于该范围,则裁剪,如果小于该范围,则用0填充
PipelineImageTransform:链式转化器,可以把图像经过一个流水线进行处理,例如:先缩放、在旋转、在翻转等等
RotateImageTransform:旋转图片,例如旋转30、60等角度
三、代码示例
1、NativeImageLoader读取图片,转为4维张量,这里之所以是四维,是因为加了minibatch维,如果只读取一张图片,minibatch维度为1
NativeImageLoader originalLoad = new NativeImageLoader(112, 112, 3); INDArray image = loader.asMatrix(new File("/root/1.jpg"));
2、上下左右颠倒
NativeImageLoader Labelloader = new NativeImageLoader(112, 112, 3,new FlipImageTransform(-1));//上下,左右颠倒
3、缩放图片
NativeImageLoader smallLoader = new NativeImageLoader(112, 112, 3, new ResizeImageTransform(80, 80));
4、旋转图片,60度、90度、120度
NativeImageLoader loader60 = new NativeImageLoader(112, 112, 3,new RotateImageTransform(60)); NativeImageLoader loader90 = new NativeImageLoader(112, 112, 3,new RotateImageTransform(90)); NativeImageLoader loader120 = new NativeImageLoader(112, 112, 3,new RotateImageTransform(120));
5、链式处理,先旋转60度,在固定到224*224的中心
NativeImageLoader pipeline = new NativeImageLoader(112, 112, 3,new PipelineImageTransform(new RotateImageTransform(60),new BoxImageTransform(224,224)) );