如何利用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)) );