クイック スタート:Custom Vision SDK for Java を使用して画像分類プロジェクトを作成するQuickstart: Create an image classification project with the Custom Vision SDK for Java

この記事では、Custom Vision Java SDK を使用して画像分類モデルを構築する基本的な方法について説明します。This article shows you how to get started using the Custom Vision Java SDK to build an image classification model. 作成後、タグを追加し、イメージをアップロードし、プロジェクトをトレーニングし、プロジェクトの既定の予測エンドポイント URL を取得し、エンドポイントを使用してイメージをプログラミングでテストできます。After it's created, you can add tags, upload images, train the project, obtain the project's default prediction endpoint URL, and use the endpoint to programmatically test an image. この例は、独自の Java アプリケーションを構築するためのテンプレートとしてご利用ください。Use this example as a template for building your own Java application. 分類モデルの構築と使用のプロセスをコード "なし" で行う場合は、ブラウザー ベースのガイダンスを参照してください。If you wish to go through the process of building and using a classification model without code, see the browser-based guidance instead.

前提条件Prerequisites

  • 任意の Java IDEA Java IDE of your choice
  • JDK 7 または 8 がインストールされていること。JDK 7 or 8 installed.
  • Maven がインストールされていることMaven installed
  • Custom Vision サービスを使用するには、Azure で Custom Vision Training リソースと Prediction リソースを作成する必要があります。To use the Custom Vision Service you will need to create Custom Vision Training and Prediction resources in Azure. Azure portal でこれを行うには、[Create Custom Vision](Custom Vision の作成) ページのダイアログ ウィンドウに入力し、Training リソースと Prediction リソースの両方を作成します。To do so in the Azure portal, fill out the dialog window on the Create Custom Vision page to create both a Training and Prediction resource.

Custom Vision SDK とサンプル コードを入手するGet the Custom Vision SDK and sample code

Custom Vision を使用する Java アプリを作成するには、Custom Vision maven パッケージが必要となります。To write a Java app that uses Custom Vision, you'll need the Custom Vision maven packages. これらのパッケージは、これからダウンロードするサンプル プロジェクトに含まれていますが、ここから個別にアクセスすることもできます。These packages are included in the sample project you'll download, but you can access them individually here.

Maven Central Repository から Custom Vision SDK をインストールできます。You can install the Custom Vision SDK from maven central repository:

Cognitive Services Java SDK サンプル プロジェクトを複製またはダウンロードします。Clone or download the Cognitive Services Java SDK Samples project. Vision/CustomVision/ フォルダーに移動します。Navigate to the Vision/CustomVision/ folder.

この Java プロジェクトは、Sample Java Project という名前の新しい Custom Vision 画像分類プロジェクトを作成します。作成したプロジェクトには、Custom Vision Web サイトからアクセスすることができます。This Java project creates a new Custom Vision image classification project named Sample Java Project, which can be accessed through the Custom Vision website. その後、イメージをアップロードして分類子のトレーニングおよびテストを行います。It then uploads images to train and test a classifier. このプロジェクトでは、木が Hemlock (ドクニンジン) であるか Japanese Cherry (桜) であるかを判別することが、分類子の目的となります。In this project, the classifier is intended to determine whether a tree is a Hemlock or a Japanese Cherry.

トレーニング キーと予測キーを取得するGet the training and prediction keys

プロジェクトでサービスと対話するには、有効な一連のサブスクリプション キーが必要です。The project needs a valid set of subscription keys to interact with the service. 項目については、Custom Vision Web サイトを参照してください。You can find the items at the Custom Vision website. Custom Vision リソースの作成に使用した Azure アカウントに関連付けられているアカウントでサインインします。Sign in with the account associated with the Azure account used to create your Custom Vision resources. ホーム ページ (新しいプロジェクトを追加するオプションがあるページ) で、右上にある__歯車アイコン__を選択します。On the home page (the page with the option to add a new project), select the gear icon in the upper right. 一覧でトレーニングおよび予測リソースを検索し、展開します。Find your training and prediction resources in the list and expand them. ここでは、トレーニング キー、予測キー、予測リソース ID の値を見つけることができます。Here you can find your training key, prediction key, and prediction resource ID values. これらの値を一時的な場所に保存します。Save these values to a temporary location.

キー UI の画像

または、これらのキーと ID は、Azure portal から、Custom Vision トレーニングと予測のリソースを表示し、 [キー] タブに移動して取得することもできます。そこでは、トレーニング キーと予測キーが見つかります。Or, you can obtain these keys and ID from the Azure portal by viewing your Custom Vision Training and Prediction resources and navigating to the Keys tab. There you'll find your training key and prediction key. 予測リソースの [プロパティ] タブに移動し、予測リソース ID を取得します。Navigate to the Properties tab of your Prediction resource to get your prediction resource ID.

このプログラムは、キー データを環境変数として格納するように構成されています。The program is configured to store your key data as environment variables. これらの変数は、PowerShell で Vision/CustomVision フォルダーに移動することによって設定します。Set these variables by navigating to the Vision/CustomVision folder in PowerShell. 次のコマンドを入力してください。Then enter the commands:

$env:AZURE_CUSTOMVISION_TRAINING_API_KEY ="<your training api key>"
$env:AZURE_CUSTOMVISION_PREDICTION_API_KEY ="<your prediction api key>"

コードの理解Understand the code

Java IDE で Vision/CustomVision プロジェクトを読み込み、CustomVisionSamples.java ファイルを開きます。Load the Vision/CustomVision project in your Java IDE and open the CustomVisionSamples.java file. runSample メソッドを探して、ObjectDetection_Sample メソッド呼び出しをコメント アウトしてください—このメソッドで物体検出のシナリオが実行されますが、このガイドの対象外となります。Find the runSample method and comment out the ObjectDetection_Sample method call—this method executes the object detection scenario, which is not covered in this guide. この例の主な機能は、ImageClassification_Sample メソッドに実装されます。このメソッドの定義に移動し、コードを詳しく調べてみましょう。The ImageClassification_Sample method implements the primary functionality of this example; navigate to its definition and inspect the code.

Custom Vision Service プロジェクトを作成するCreate a Custom Vision Service project

画像分類プロジェクトは、この最初の数行のコードで作成されます。This first bit of code creates an image classification project. 作成したプロジェクトは、先ほどアクセスした Custom Vision Web サイトに表示されます。The created project will show up on the Custom Vision website that you visited earlier. プロジェクトを作成するときに他のオプションを指定するには、CreateProject メソッドのオーバーロードを参照してください (分類子の構築に関する Web ポータル ガイドで説明されています)。See the CreateProject method overloads to specify other options when you create your project (explained in the Build a classifier web portal guide).

System.out.println("ImageClassification Sample");
Trainings trainer = trainClient.trainings();

System.out.println("Creating project...");
Project project = trainer.createProject()
    .withName("Sample Java Project")
    .execute();

プロジェクトにタグを作成するCreate tags in the project

// create hemlock tag
Tag hemlockTag = trainer.createTag()
    .withProjectId(project.id())
    .withName("Hemlock")
    .execute();
// create cherry tag
Tag cherryTag = trainer.createTag()
    .withProjectId(project.id())
    .withName("Japanese Cherry")
    .execute();

画像をアップロードし、タグ付けするUpload and tag images

サンプル画像は、プロジェクトの src/main/resources フォルダーに格納されています。The sample images are included in the src/main/resources folder of the project. そこから読み取られて、それぞれの適切なタグと共にサービスにアップロードされます。They are read from there and uploaded to the service with their appropriate tags.

System.out.println("Adding images...");
for (int i = 1; i <= 10; i++) {
    String fileName = "hemlock_" + i + ".jpg";
    byte[] contents = GetImage("/Hemlock", fileName);
    AddImageToProject(trainer, project, fileName, contents, hemlockTag.id(), null);
}

for (int i = 1; i <= 10; i++) {
    String fileName = "japanese_cherry_" + i + ".jpg";
    byte[] contents = GetImage("/Japanese Cherry", fileName);
    AddImageToProject(trainer, project, fileName, contents, cherryTag.id(), null);
}

前のコード スニペットでは、リソース ストリームとして画像を取得してサービスにアップロードする 2 つのヘルパー関数を使用しています (1 回のバッチで最大 64 個の画像をアップロードできます)。The previous code snippet makes use of two helper functions that retrieve the images as resource streams and upload them to the service (you can upload up to 64 images in a single batch).

private static void AddImageToProject(Trainings trainer, Project project, String fileName, byte[] contents, UUID tag, double[] regionValues)
{
    System.out.println("Adding image: " + fileName);
    ImageFileCreateEntry file = new ImageFileCreateEntry()
        .withName(fileName)
        .withContents(contents);

    ImageFileCreateBatch batch = new ImageFileCreateBatch()
        .withImages(Collections.singletonList(file));

    // If Optional region is specified, tack it on and place the tag there, otherwise
    // add it to the batch.
    if (regionValues != null)
    {
        Region region = new Region()
            .withTagId(tag)
            .withLeft(regionValues[0])
            .withTop(regionValues[1])
            .withWidth(regionValues[2])
            .withHeight(regionValues[3]);
        file = file.withRegions(Collections.singletonList(region));
    } else {
        batch = batch.withTagIds(Collections.singletonList(tag));
    }

    trainer.createImagesFromFiles(project.id(), batch);
}

private static byte[] GetImage(String folder, String fileName)
{
    try {
        return ByteStreams.toByteArray(CustomVisionSamples.class.getResourceAsStream(folder + "/" + fileName));
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
    return null;
}

分類器をトレーニングしてする公開するTrain the classifier and publish

このコードにより、予測モデルの最初のイテレーションが作成され、そのイテレーションが予測エンドポイントに公開されます。This code creates the first iteration of the prediction model and then publishes that iteration to the prediction endpoint. 公開されたイテレーションに付けられた名前は、予測要求を送信するために使用できます。The name given to the published iteration can be used to send prediction requests. イテレーションは、公開されるまで予測エンドポイントで利用できません。An iteration is not available in the prediction endpoint until it is published.

System.out.println("Training...");
Iteration iteration = trainer.trainProject(project.id(), new TrainProjectOptionalParameter());

while (iteration.status().equals("Training"))
{
    System.out.println("Training Status: "+ iteration.status());
    Thread.sleep(1000);
    iteration = trainer.getIteration(project.id(), iteration.id());
}
System.out.println("Training Status: "+ iteration.status());

// The iteration is now trained. Publish it to the prediction endpoint.
String publishedModelName = "myModel";
String predictionResourceId = System.getenv("AZURE_CUSTOMVISION_PREDICTION_ID");
trainer.publishIteration(project.id(), iteration.id(), publishedModelName, predictionResourceId);

予測エンドポイントを使用するUse the prediction endpoint

予測エンドポイントは、現在のモデルに画像を送信して分類予測を取得する際に使用できる参照で、ここでは predictor で表されます。The prediction endpoint, represented by the predictor object here, is the reference that you use to submit an image to the current model and get a classification prediction. このサンプルでは、どこか他の場所で、予測キーの環境変数を使用して predictor が定義されています。In this sample, predictor is defined elsewhere using the prediction key environment variable.

// load test image
byte[] testImage = GetImage("/Test", "test_image.jpg");

// predict
ImagePrediction results = predictor.predictions().classifyImage()
    .withProjectId(project.id())
    .withPublishedName(publishedModelName)
    .withImageData(testImage)
    .execute();

for (Prediction prediction: results.predictions())
{
    System.out.println(String.format("\t%s: %.2f%%", prediction.tagName(), prediction.probability() * 100.0f));
}

アプリケーションの実行Run the application

Maven を使用してソリューションをコンパイルおよび実行するには、PowerShell でプロジェクト ディレクトリから次のコマンドを実行します。To compile and run the solution using maven, run the following command in the project directory in PowerShell:

mvn compile exec:java

アプリケーションのコンソール出力は次のテキストのようになります。The console output of the application should look similar to the following text:

Creating project...
Adding images...
Adding image: hemlock_1.jpg
Adding image: hemlock_2.jpg
Adding image: hemlock_3.jpg
Adding image: hemlock_4.jpg
Adding image: hemlock_5.jpg
Adding image: hemlock_6.jpg
Adding image: hemlock_7.jpg
Adding image: hemlock_8.jpg
Adding image: hemlock_9.jpg
Adding image: hemlock_10.jpg
Adding image: japanese_cherry_1.jpg
Adding image: japanese_cherry_2.jpg
Adding image: japanese_cherry_3.jpg
Adding image: japanese_cherry_4.jpg
Adding image: japanese_cherry_5.jpg
Adding image: japanese_cherry_6.jpg
Adding image: japanese_cherry_7.jpg
Adding image: japanese_cherry_8.jpg
Adding image: japanese_cherry_9.jpg
Adding image: japanese_cherry_10.jpg
Training...
Training status: Training
Training status: Training
Training status: Completed
Done!
        Hemlock: 93.53%
        Japanese Cherry: 0.01%

テスト画像の予測結果 (最後の数行の出力) が正しいことを確認してください。You can then verify that the test image prediction (the last few lines of output) is correct.

リソースのクリーンアップClean up resources

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。If you wish to implement your own image classification project (or try an object detection project instead), you may want to delete the tree identification project from this example. 無料試用版では、2 つの Custom Vision プロジェクトを利用できます。A free trial allows for two Custom Vision projects.

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。On the Custom Vision website, navigate to Projects and select the trash can under My New Project.

"My New Project" とごみ箱アイコンが表示されたパネルのスクリーンショット

次のステップNext steps

以上、画像の分類処理の各ステップをコードでどのように実装するかを見てきました。Now you have seen how every step of the image classification process can be done in code. このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。This sample executes a single training iteration, but often you will need to train and test your model multiple times in order to make it more accurate.