Javaで機械学習!
~Deep Java Library(DJL)で手軽に画像認識をしてみる編 ~

  • SmartBee
  • Java
  • システム開発

最終更新⽇:

掲載⽇:

はじめに

今回は、手軽にできる機械学習ライブラリのDeep Java Library(以降DJL)を用いて、動物の画像認識を紹介します。
パラメータのチューニングや機械学習モデルの作成は行わず、既に用意されたモデルを利用して手軽に試せるため、機械学習に興味がある方は入門用としてぜひお試しください。

本記事の流れ

1. DJLとは?
2. Maveの設定
3. サンプルソースコード

1. DJLとは?

DJLは、Amazonが発表したJava向けのオープンソースのディープラーニングライブラリになります。
これまで機械学習のモデルを作成し、使用する場合、Python言語が選ばれることが多かったのですが、DJLによりJavaでも簡単にできるようになりました。
公式サイトはこちらになります。

2. Mavenの設定

 <dependencies>

    <dependency>

      <groupId>ai.djl</groupId>

      <artifactId>api</artifactId>

      <version>0.28.0</version>

    </dependency>

    <dependency>

       <groupId>ai.djl.pytorch</groupId>

      <artifactId>pytorch-engine</artifactId>

      <version>0.28.0</version>

    <dependency>

    <dependency>

      <groupId>ai.djl.pytorch</groupId>

      <artifactId>pytorch-model-zoo</artifactId>

      <version>0.28.0</version>

    </dependency>

    <dependency>

      <groupId>org.slf4j</groupId>

      <artifactId>slf4j-api</artifactId>

      <version>1.7.32</version>

    </dependency>

    <dependency>

      <groupId>org.slf4j</groupId>

      <artifactId>slf4j-simple</artifactId>

      <version>1.7.32</version>

    </dependency>

 </dependencies>

上記では必要なライブラリのみを記述しています。

以下のエラーが出ている場合、「ai.djl.pytorch」のライブラリが取り込めていない可能性があります。

ai.djl.repository.zoo.ModelNotFoundException: No model with the specified URI or the matching Input/Output type is found.

他にもMaveに設定する必要がありましたら、こちらからご確認ください。

3. サンプルコード

import java.io.IOException;

import java.nio.file.Paths;


import ai.djl.Application;

import ai.djl.ModelException;

import ai.djl.inference.Predictor;

import ai.djl.modality.Classifications;

import ai.djl.modality.cv.Image;

import ai.djl.modality.cv.ImageFactory;

import ai.djl.modality.cv.output.DetectedObjects;

import ai.djl.repository.zoo.Criteria;

import ai.djl.repository.zoo.ModelZoo;

import ai.djl.repository.zoo.ZooModel;

import ai.djl.translate.TranslateException;


public class Sample001 {

  public static void main(String[] args) throws IOException {

    Image img = ImageFactory.getInstance().fromFile(

          Paths.get("猫.jpg"));


    // 画像分類用のモデルを作成

    Criteria<Image, DetectedObjects> criteria = Criteria.builder().optApplication(Application.CV.OBJECT_DETECTION)

      .setTypes(Image.class, DetectedObjects.class)

      .optFilter("backbone", "resnet50")

      .build();


    try (ZooModel<Image, DetectedObjects> model = ModelZoo.loadModel(criteria)) {

      try (Predictor<Image, DetectedObjects> predictor = model.newPredictor()) {

        Classifications detection = predictor.predict(img);

        System.out.println(detection);

      }

    } catch (IOException | ModelException | TranslateException e) {

      e.printStackTrace();

    }

  }

}

結果

[

{"class": "cat", "probability": 0.99147, "bounds": {"x"=0.285, "y"=0.108, "width"=0.543, "height"=0.893}}

]

出力結果の見方

・class:判定結果

・probability:検出された結果が正しいクラスである確率

・bounds:検出対象の位置とサイズ

結果を確認すると、99%以上の確率で猫の画像だと判定されています。
実際に使用している画像は猫であるため、結果としては正しいです。

本ソースの画像分類用のモデルの設定は

Criteria<Image, DetectedObjects> criteria

にあたります。

また、以下の「optFilter」を編集、及び新たにoptFilterを追加することで画像分類のフィルタリング条件を変更することができます。

.optFilter("backbone", "resnet50")

フィルタリング条件を色々と変更しながら、動物の判定を試してみると面白いかと思います。 ぜひ、さまざまな設定で試してみてください。

感想

本記事を通して、簡単に機械学習を始められることを知って頂ければ幸いです。
また紹介はしませんでしたが、自身でもモデルを作成することができるため、時間がある方は挑戦してみて下さい。
SmartBeeにも画像分類モデルを取り入れて、作業結果の写真から危険予測やチェックの自動化ができれば面白いと思って、今回は記事を作成致しました。

今後もSmartBeeチームでは、開発に関する幅広い情報を提供しています。
他にも多彩な記事を用意していますので、ぜひチェックしてみてください。