1. 程式人生 > >如何利用deeplearning4j中datavec對影象進行處理

如何利用deeplearning4j中datavec對影象進行處理

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))  );