DJL初探

潘力豪 2020/05/28 18:20:49
1184

現今在深度學習領域中主要的開發語言還是以Python為主,在目前熱門的深度學習框架如TensorFlow、PyTorch、mxnet也是對Python有較大的支持。儘管Java也是目前流行的程式語言,但卻缺乏深度學習相關支持的lib。

在2019/12由Amazon發布的DJL(Deep Java Library)的深度學習開發工具包,可以讓Java開發者更容易的開發及應用原生的機器學習及深度學習的模型。

DJL在既有的深度學習框架上提供了一套基於Java的API,並簡化API的定義以降低深度學習開發的難度,通過簡化的API以及DJL事先訓練好的模型,使開發者可以在短時間內建制一套深度學習的應用。

DJL使用案例

在此範例中使用了DJL Model-Zoo提供的SSD(Single Shot Detector)模型,建立了一個人物的檢測。專案由IntelliJ IDEA建立一個Gradle專案,詳細build.gradle內容如下

plugins {
    id 'java'
}

repositories {                           
    jcenter()
}

dependencies {
    compile "org.apache.logging.log4j:log4j-slf4j-impl:2.12.1"
    compile "ai.djl.mxnet:mxnet-model-zoo:0.2.1"
    runtime "ai.djl.mxnet:mxnet-native-mkl:1.6.0-b:linux-x86_64"
    // Comment above line for Windows/Mac and un-comment line below
    //runtime "ai.djl.mxnet:mxnet-native-mkl:1.6.0-b:osx-x86_64" // For macOS
    //runtime "ai.djl.mxnet:mxnet-native-mkl:1.6.0-b:win-x86_64" // For Windows
} 

此範例將利用以下圖片進行檢測

來源:Offered under Apache-2.0 license on Gluon-CV

以下程式碼顯示了DJL檢測圖片的流程。首先先載入Model Zoo提供的SSD模型,之後建立該模型提供的Predictor,最後使用predict方法對圖片進行檢測。DJL還提供了圖片視覺化的工具方便展示檢測的結果。

import ai.djl.modality.cv.DetectedObjects;
import ai.djl.modality.cv.ImageVisualization;
import ai.djl.modality.cv.util.BufferedImageUtils;
import ai.djl.mxnet.zoo.MxModelZoo;
import ai.djl.repository.zoo.ZooModel;
import ai.djl.training.util.ProgressBar;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class SimpleSSDExample {
    public static void main(String[] args) throws Exception{
        // Get image file path
        BufferedImage img = BufferedImageUtils
                .fromUrl("https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/pose/soccer.png");

        //Get resnet model from model zoo.
        ZooModel<BufferedImage, DetectedObjects> model = 
                MxModelZoo.SSD.loadModel(new ProgressBar());
        //Create a new predictor from model and predict on image.
        DetectedObjects predictResult = model.newPredictor().predict(img);
        // Draw Bounding boxes on image
        ImageVisualization.drawBoundingBoxes(img, predictResult);
        //Save result
        ImageIO.write(img, "png", new File("ssd.png"));
        model.close();
    }
}

以上程式碼檢測出圖片中有三位運動員並將結果輸出至當前工作目錄的ssd.png檔案

以上為簡單的範例,Model-Zoo 還提供其他事先處理完成的模型可以在你的Java應用中快速整合深度學習應用。

對深度學習有興趣的Java開發人員透過DJL會是很好的入門方式,其官方文件還有其他的開發案例

潘力豪