NativeImageLoader Labelloader = new NativeImageLoader(112, 112, 3,new FlipImageTransform(-1));

一、导读

    众所周知图像是有红绿蓝三种颜色堆叠而成,利用deeplearning对图像处理,必须把图像转化为张量,每一张图片由有三维张量组成,三维分别是[depth、height、width],直观来讲,就是用三个矩阵堆叠起来,每一个矩阵代表一个通道,如下图。有时候需要对图片进行旋转、缩放、裁剪、缩小填充等等复杂的操作,没有一个好用的工具,整个操作过程是非常繁琐的。今天我们就来聊一聊DL4J的datavec对图像的处理。

                                     如何利用deeplearning4j中datavec对图像进行处理-LMLPHP

二、datavec-data-image代码架构

    datavec-data-image是dl4j基于opencv封装的图像处理库,可以非常方便的把图片处理为张量。代码分三个重要部分,loader(图片加载器)、transform(转化器)。

    1、loader:图片加载器,主要用于将图片加载并转化为张量。整个类结构如下图

如何利用deeplearning4j中datavec对图像进行处理-LMLPHP

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))  );
		
09-23 05:56