クイックスタート: Custom Vision クライアント ライブラリまたは REST API を使って画像分類プロジェクトを作成する

.NET 用 Custom Vision クライアント ライブラリの使用を開始します。 以下の手順に従って、パッケージをインストールし、画像分類モデルを構築するためのコード例を試してみましょう。 プロジェクトの作成、タグの追加、プロジェクトのトレーニングを行った後、プロジェクトの予測エンドポイント URL を使用して、プログラムでプロジェクトをテストします。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

コードを記述 "せずに" 分類モデルの構築とトレーニングを行う場合は、ブラウザーベースのガイダンスを参照してください。

リファレンス ドキュメント | ライブラリのソース コード (トレーニング)(予測) | パッケージ (NuGet) (トレーニング)(予測) | サンプル

前提条件

環境変数を作成する

この例では、アプリケーションを実行しているローカル コンピューター上の環境変数に資格情報を書き込みます。

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースの [キー] および [エンドポイント] ページの [リソース管理] にあります。 API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象の予測リソースの [プロパティ] タブに、リソース ID として表示されます。

ヒント

https://www.customvision.ai/ を使用してもこれらの値を取得できます。 サインインしたら、右上にある [設定] アイコンを選択します。 [設定] ページで、すべてのキー、リソース ID、エンドポイントを表示できます。

注意

キーは、コードに直接含めないようにし、公開しないでください。 Azure Key Vault などのその他の認証オプションについては、Azure AI サービスのセキュリティに関する記事を参照してください。

環境変数を設定するには、コンソール ウィンドウを開き、オペレーティング システムと開発環境の指示に従います。

  1. VISION_TRAINING KEY 環境変数を設定するには、your-training-key をトレーニング用のリソースのキーの 1 つに置き換えます。
  2. VISION_TRAINING_ENDPOINT 環境変数を設定するには、your-training-endpoint をトレーニング用のリソースのエンドポイントに置き換えます。
  3. VISION_PREDICTION_KEY 環境変数を設定するには、your-prediction-key を予測リソースのキーの 1 つに置き換えます。
  4. VISION_PREDICTION_ENDPOINT 環境変数を設定するには、your-prediction-endpoint を予測リソースのエンドポイントに置き換えます。
  5. VISION_PREDICTION_RESOURCE_ID 環境変数を設定するには、your-resource-id を予測リソースのリソース ID に置き換えます。
setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

実行中のプログラムのうち、環境変数の読み取りを必要とするプログラム (コンソール ウィンドウを含む) については、環境変数を読み込む再起動が必要となる場合があります。

設定

新しい C# アプリケーションを作成する

Visual Studio を使用して、新しい .NET Core アプリケーションを作成します。

クライアント ライブラリをインストールする

新しいプロジェクトを作成したら、ソリューション エクスプローラーでプロジェクト ソリューションを右クリックし、 [NuGet パッケージの管理] を選択して、クライアント ライブラリをインストールします。 パッケージ マネージャーが開いたら、[参照] を選択し、[プレリリースを含める] をオンにして、Microsoft.Azure.CognitiveServices.Vision.CustomVision.TrainingMicrosoft.Azure.CognitiveServices.Vision.CustomVision.Prediction を検索します。 最新バージョンを選択し、 [インストール] を選択します。

ヒント

クイックスタートのコード ファイル全体を一度にご覧いただけます。 これは GitHub にあり、このクイックスタートのコード例が含まれています。

プロジェクト ディレクトリから program.cs ファイルを開いて、次の using ディレクティブを追加します。

using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;

アプリケーションの Main メソッドで、環境変数からリソースのキーとエンドポイントを取得する変数を作成します。 さらに、後で使用するいくつかの基本的なオブジェクトを宣言します。

// Retrieve the environment variables for your credentials:
private static string trainingEndpoint = Environment.GetEnvironmentVariable("VISION_TRAINING_ENDPOINT");

private static string trainingKey = Environment.GetEnvironmentVariable("VISION_TRAINING_KEY");
private static string predictionEndpoint = Environment.GetEnvironmentVariable("VISION_PREDICTION_ENDPOINT");
private static string predictionKey = Environment.GetEnvironmentVariable("VISION_PREDICTION_KEY");

private static string predictionResourceId = Environment.GetEnvironmentVariable("VISION_PREDICTION_RESOURCE_ID");

private static List<string> hemlockImages;
private static List<string> japaneseCherryImages;
private static Tag hemlockTag;
private static Tag japaneseCherryTag;
private static Iteration iteration;
private static string publishedModelName = "treeClassModel";
private static MemoryStream testImage;

アプリケーションの Main メソッドで、このクイックスタートで使用するメソッドの呼び出しを追加します。 これらは後で実装します。

CustomVisionTrainingClient trainingApi = AuthenticateTraining(trainingEndpoint, trainingKey);
CustomVisionPredictionClient predictionApi = AuthenticatePrediction(predictionEndpoint, predictionKey);

Project project = CreateProject(trainingApi);
AddTags(trainingApi, project);
UploadImages(trainingApi, project);
TrainProject(trainingApi, project);
PublishIteration(trainingApi, project);
TestIteration(predictionApi, project);
DeleteProject(trainingApi, project);

クライアントを認証する

新しいメソッドで、エンドポイントとキーを使用してトレーニング クライアントと予測クライアントをインスタンス化します。

private static CustomVisionTrainingClient AuthenticateTraining(string endpoint, string trainingKey)
{
    // Create the Api, passing in the training key
    CustomVisionTrainingClient trainingApi = new CustomVisionTrainingClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.ApiKeyServiceClientCredentials(trainingKey))
    {
        Endpoint = endpoint
    };
    return trainingApi;
}
private static CustomVisionPredictionClient AuthenticatePrediction(string endpoint, string predictionKey)
{
    // Create a prediction endpoint, passing in the obtained prediction key
    CustomVisionPredictionClient predictionApi = new CustomVisionPredictionClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.ApiKeyServiceClientCredentials(predictionKey))
    {
        Endpoint = endpoint
    };
    return predictionApi;
}

新しい Custom Vision プロジェクトを作成する

次のコードでは、画像分類プロジェクトを作成します。 作成したプロジェクトは、Custom Vision Web サイトに表示されます。 プロジェクトを作成するときに他のオプションを指定するには、CreateProject メソッドを参照してください (分類子の構築に関する Web ポータル ガイドで説明されています)。

private static Project CreateProject(CustomVisionTrainingClient trainingApi)
{
    // Create a new project
    Console.WriteLine("Creating new project:");
    return trainingApi.CreateProject("My New Project");
}

プロジェクトにタグを追加する

このメソッドでは、モデルをトレーニングするタグを定義します。

private static void AddTags(CustomVisionTrainingClient trainingApi, Project project)
{
    // Make two tags in the new project
    hemlockTag = trainingApi.CreateTag(project.Id, "Hemlock");
    japaneseCherryTag = trainingApi.CreateTag(project.Id, "Japanese Cherry");
}

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

最初に、このプロジェクト用のサンプル画像をダウンロードします。 サンプル画像フォルダーの内容をお使いのローカル デバイスに保存します。

次に、このディレクトリ内の画像をアップロードするためのヘルパー メソッドを定義します。 画像が保存されている場所を指すように GetFiles 引数を編集する必要がある場合があります。

private static void LoadImagesFromDisk()
{
    // this loads the images to be uploaded from disk into memory
    hemlockImages = Directory.GetFiles(Path.Combine("Images", "Hemlock")).ToList();
    japaneseCherryImages = Directory.GetFiles(Path.Combine("Images", "Japanese_Cherry")).ToList();
    testImage = new MemoryStream(File.ReadAllBytes(Path.Combine("Images", "Test", "test_image.jpg")));
}

次に、画像をアップロードするためのメソッドを定義し、フォルダーの場所に従ってタグを適用します (画像は既に並べ替えられています)。 画像のアップロードとタグ付けは、反復的に実行することも、バッチで実行することもできます (バッチあたり最大 64 個)。 このコード スニペットには、両方の例が含まれています。

private static void UploadImages(CustomVisionTrainingClient trainingApi, Project project)
{
    // Add some images to the tags
    Console.WriteLine("\tUploading images");
    LoadImagesFromDisk();

    // Images can be uploaded one at a time
    foreach (var image in hemlockImages)
    {
        using (var stream = new MemoryStream(File.ReadAllBytes(image)))
        {
            trainingApi.CreateImagesFromData(project.Id, stream, new List<Guid>() { hemlockTag.Id });
        }
    }

    // Or uploaded in a single batch 
    var imageFiles = japaneseCherryImages.Select(img => new ImageFileCreateEntry(Path.GetFileName(img), File.ReadAllBytes(img))).ToList();
    trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFiles, new List<Guid>() { japaneseCherryTag.Id }));

}

プロジェクトをトレーニングする

このメソッドは、プロジェクトにおけるトレーニングの初回イテレーションを作成するものです。 トレーニングが完了するまで、サービスに対してクエリが実行されます。

private static void TrainProject(CustomVisionTrainingClient trainingApi, Project project)
{
    // Now there are images with tags start training the project
    Console.WriteLine("\tTraining");
    iteration = trainingApi.TrainProject(project.Id);

    // The returned iteration will be in progress, and can be queried periodically to see when it has completed
    while (iteration.Status == "Training")
    {
        Console.WriteLine("Waiting 10 seconds for training to complete...");
        Thread.Sleep(10000);

        // Re-query the iteration to get it's updated status
        iteration = trainingApi.GetIteration(project.Id, iteration.Id);
    }
}

ヒント

選択したタグでトレーニングする

必要に応じて、適用したタグのサブセットのみでトレーニングできます。 ある特定のタグが十分に適用されていないが、他のタグが十分に適用されている場合に、これを行うことができます。 TrainProject 呼び出しで、trainingParameters パラメーターを使用します。 TrainingParameters を構築し、その SelectedTags プロパティを、使用するタグの ID の一覧に設定します。 モデルは、そのリストのタグのみを認識するようにトレーニングします。

現在のイテレーションを公開する

このメソッドでは、モデルの現在のイテレーションをクエリの実行に使用できるようにします。 モデル名は、予測要求を送信するための参照として使用できます。 predictionResourceId には、独自の値を入力する必要があります。 予測リソース ID は、Azure portal の対象のリソースの [プロパティ] タブに、リソース ID として表示されます。

private static void PublishIteration(CustomVisionTrainingClient trainingApi, Project project)
{
    trainingApi.PublishIteration(project.Id, iteration.Id, publishedModelName, predictionResourceId);
    Console.WriteLine("Done!\n");

    // Now there is a trained endpoint, it can be used to make a prediction
}

予測エンドポイントをテストする

この部分のスクリプトでは、テスト画像を読み込み、モデル エンドポイントを照会して、予測データをコンソールに出力します。

private static void TestIteration(CustomVisionPredictionClient predictionApi, Project project)
{

    // Make a prediction against the new project
    Console.WriteLine("Making a prediction:");
    var result = predictionApi.ClassifyImage(project.Id, publishedModelName, testImage);

    // Loop over each prediction and write out the results
    foreach (var c in result.Predictions)
    {
        Console.WriteLine($"\t{c.TagName}: {c.Probability:P1}");
    }
}

アプリケーションの実行

IDE ウィンドウの上部にある [デバッグ] ボタンをクリックして、アプリケーションを実行します。

アプリケーションを実行すると、コンソール ウィンドウが開いて、次の出力が書き込まれます。

Creating new project:
        Uploading images
        Training
Done!

Making a prediction:
        Hemlock: 95.0%
        Japanese Cherry: 0.0%

Images/Test/ 内のテスト画像にタグが適切に付けられていることを確認してください。 任意のキーを押してアプリケーションを終了します。 Custom Vision Web サイトに戻って、新しく作成されたプロジェクトの現在の状態を確認してもかまいません。

リソースをクリーンアップする

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

これで、コードでの画像分類処理の各ステップが完了しました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。

このガイドでは、Go 用の Custom Vision クライアント ライブラリを使用して画像分類モデルを構築する際の足がかりとして役立つ手順とサンプル コードを紹介します。 プロジェクトを作成し、タグを追加し、プロジェクトをトレーニングして、プロジェクトの予測エンドポイント URL を使用してプログラムでテストします。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

コードを記述 "せずに" 分類モデルの構築とトレーニングを行う場合は、ブラウザーベースのガイダンスを参照してください。

Go 用 Custom Vision クライアント ライブラリを使用すると、次のことができます。

  • 新しい Custom Vision プロジェクトを作成する
  • プロジェクトにタグを追加する
  • 画像をアップロードし、タグ付けする
  • プロジェクトをトレーニングする
  • 現在のイテレーションを公開する
  • 予測エンドポイントをテストする

リファレンス ドキュメント (トレーニング)(予測)

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • Go 1.8+
  • Azure サブスクリプションを入手したら、Azure portal で Custom Vision リソースを作成し、トレーニングおよび予測リソースを作成します。
    • Free 価格レベル (F0) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。

環境変数を作成する

この例では、アプリケーションを実行しているローカル コンピューター上の環境変数に資格情報を書き込みます。

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースの [キー] および [エンドポイント] ページの [リソース管理] にあります。 API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象の予測リソースの [プロパティ] タブに、リソース ID として表示されます。

ヒント

https://www.customvision.ai/ を使用してもこれらの値を取得できます。 サインインしたら、右上にある [設定] アイコンを選択します。 [設定] ページで、すべてのキー、リソース ID、エンドポイントを表示できます。

注意

キーは、コードに直接含めないようにし、公開しないでください。 Azure Key Vault などのその他の認証オプションについては、Azure AI サービスのセキュリティに関する記事を参照してください。

環境変数を設定するには、コンソール ウィンドウを開き、オペレーティング システムと開発環境の指示に従います。

  1. VISION_TRAINING KEY 環境変数を設定するには、your-training-key をトレーニング用のリソースのキーの 1 つに置き換えます。
  2. VISION_TRAINING_ENDPOINT 環境変数を設定するには、your-training-endpoint をトレーニング用のリソースのエンドポイントに置き換えます。
  3. VISION_PREDICTION_KEY 環境変数を設定するには、your-prediction-key を予測リソースのキーの 1 つに置き換えます。
  4. VISION_PREDICTION_ENDPOINT 環境変数を設定するには、your-prediction-endpoint を予測リソースのエンドポイントに置き換えます。
  5. VISION_PREDICTION_RESOURCE_ID 環境変数を設定するには、your-resource-id を予測リソースのリソース ID に置き換えます。
setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

実行中のプログラムのうち、環境変数の読み取りを必要とするプログラム (コンソール ウィンドウを含む) については、環境変数を読み込む再起動が必要となる場合があります。

設定

Custom Vision クライアント ライブラリをインストールする

Go 用の Custom Vision で画像分析アプリを作成するには、Custom Vision のサービス クライアント ライブラリが必要です。 PowerShell で次のコマンドを実行します。

go get -u github.com/Azure/azure-sdk-for-go/...

または、dep を使用している場合は、リポジトリ内で次を実行します。

dep ensure -add github.com/Azure/azure-sdk-for-go

サンプル画像を取得する

この例では、GitHub の Azure AI サービス Python SDK サンプル リポジトリにある画像を使用します。 このリポジトリをお使いの開発環境に複製またはダウンロードしてください。 後の手順のために、フォルダーの場所を覚えておいてください。

Custom Vision プロジェクトを作成する

任意のプロジェクト ディレクトリに sample.go という新しいファイルを作成し、任意のコード エディターで開きます。

新しい Custom Vision Service プロジェクトを作成するための次のコードをスクリプトに追加します。

プロジェクトを作成するときに他のオプションを指定するには、CreateProject メソッドを参照してください (分類子の構築に関する Web ポータル ガイドで説明されています)。

import(
    "context"
    "bytes"
    "fmt"
    "io/ioutil"
    "path"
    "log"
    "time"
    "github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v3.0/customvision/training"
    "github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v3.0/customvision/prediction"
)

var (
    training_key string = os.Getenv("VISION_TRAINING_KEY")
    prediction_key string = os.Getenv("VISION_PREDICTION_KEY")
    prediction_resource_id = os.Getenv("VISION_PREDICTION_RESOURCE_ID")
    endpoint string = os.Getenv("VISION_ENDPOINT")    

    project_name string = "Go Sample Project"
    iteration_publish_name = "classifyModel"
    sampleDataDirectory = "<path to sample images>"
)

func main() {
    fmt.Println("Creating project...")

    ctx = context.Background()

    trainer := training.New(training_key, endpoint)

    project, err := trainer.CreateProject(ctx, project_name, "sample project", nil, string(training.Multilabel))
    if (err != nil) {
        log.Fatal(err)
    }

プロジェクトにタグを作成する

プロジェクトに分類タグを作成するため、sample.go の最後に次のコードを追加します。

// Make two tags in the new project
hemlockTag, _ := trainer.CreateTag(ctx, *project.ID, "Hemlock", "Hemlock tree tag", string(training.Regular))
cherryTag, _ := trainer.CreateTag(ctx, *project.ID, "Japanese Cherry", "Japanese cherry tree tag", string(training.Regular))

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

サンプルの画像をプロジェクトに追加するには、タグ作成後、次のコードを挿入します。 このコードでは、それぞれの画像を対応するタグと共にアップロードします。 1 回のバッチで最大 64 個の画像をアップロードできます。

Note

画像のパスは、事前に Azure AI サービス Go SDK サンプル プロジェクトをダウンロードした場所に応じて変更する必要があります。

fmt.Println("Adding images...")
japaneseCherryImages, err := ioutil.ReadDir(path.Join(sampleDataDirectory, "Japanese Cherry"))
if err != nil {
    fmt.Println("Error finding Sample images")
}

hemLockImages, err := ioutil.ReadDir(path.Join(sampleDataDirectory, "Hemlock"))
if err != nil {
    fmt.Println("Error finding Sample images")
}

for _, file := range hemLockImages {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Hemlock", file.Name()))
    imageData := ioutil.NopCloser(bytes.NewReader(imageFile))

    trainer.CreateImagesFromData(ctx, *project.ID, imageData, []string{ hemlockTag.ID.String() })
}

for _, file := range japaneseCherryImages {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Japanese Cherry", file.Name()))
    imageData := ioutil.NopCloser(bytes.NewReader(imageFile))
    trainer.CreateImagesFromData(ctx, *project.ID, imageData, []string{ cherryTag.ID.String() })
}

プロジェクトをトレーニングして公開する

このコードにより、予測モデルの最初のイテレーションが作成され、そのイテレーションが予測エンドポイントに公開されます。 公開されたイテレーションに付けられた名前は、予測要求を送信するために使用できます。 イテレーションは、公開されるまで予測エンドポイントで利用できません。

fmt.Println("Training...")
iteration, _ := trainer.TrainProject(ctx, *project.ID)
for {
    if *iteration.Status != "Training" {
        break
    }
    fmt.Println("Training status: " + *iteration.Status)
    time.Sleep(1 * time.Second)
    iteration, _ = trainer.GetIteration(ctx, *project.ID, *iteration.ID)
}
fmt.Println("Training status: " + *iteration.Status)

trainer.PublishIteration(ctx, *project.ID, *iteration.ID, iteration_publish_name, prediction_resource_id))

予測エンドポイントを使用する

画像を予測エンドポイントに送信し、予測を取得するには、ファイルの末尾に以下のコードを追加します。

    fmt.Println("Predicting...")
    predictor := prediction.New(prediction_key, endpoint)

    testImageData, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Test", "test_image.jpg"))
    results, _ := predictor.ClassifyImage(ctx, *project.ID, iteration_publish_name, ioutil.NopCloser(bytes.NewReader(testImageData)), "")

    for _, prediction := range *results.Predictions    {
        fmt.Printf("\t%s: %.2f%%", *prediction.TagName, *prediction.Probability * 100)
        fmt.Println("")
    }
}

アプリケーションの実行

sample.go を実行します。

go run sample.go

アプリケーションの出力は次のテキストのようになります。

Creating project...
Adding images...
Training...
Training status: Training
Training status: Training
Training status: Training
Training status: Completed
Done!
        Hemlock: 93.53%
        Japanese Cherry: 0.01%

<base_image_url>/Images/Test/ 内のテスト画像にタグが適切に付けられていることを確認してください。 Custom Vision Web サイトに戻って、新しく作成されたプロジェクトの現在の状態を確認してもかまいません。

リソースをクリーンアップする

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

物体検出処理の各ステップをコードでどのように実装するかを見てきました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。

Java 用の Custom Vision クライアント ライブラリを使用して画像分類モデルを構築してみましょう。 以下の手順に従って、パッケージをインストールし、基本タスクのコード例を試してみましょう。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

コードを記述 "せずに" 分類モデルの構築とトレーニングを行いたい場合は、代わりにブラウザーベースのガイダンスを参照してください。

Java 用 Custom Vision クライアント ライブラリを使用すると、次のことができます。

  • 新しい Custom Vision プロジェクトを作成する
  • プロジェクトにタグを追加する
  • 画像をアップロードし、タグ付けする
  • プロジェクトをトレーニングする
  • 現在のイテレーションを公開する
  • 予測エンドポイントをテストする

リファレンス ドキュメント | ライブラリのソース コード (トレーニング)(予測)| 成果物 (Maven) (トレーニング)(予測) | サンプル

前提条件

環境変数を作成する

この例では、アプリケーションを実行しているローカル コンピューター上の環境変数に資格情報を書き込みます。

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースの [キー] および [エンドポイント] ページの [リソース管理] にあります。 API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象の予測リソースの [プロパティ] タブに、リソース ID として表示されます。

ヒント

https://www.customvision.ai/ を使用してもこれらの値を取得できます。 サインインしたら、右上にある [設定] アイコンを選択します。 [設定] ページで、すべてのキー、リソース ID、エンドポイントを表示できます。

注意

キーは、コードに直接含めないようにし、公開しないでください。 Azure Key Vault などのその他の認証オプションについては、Azure AI サービスのセキュリティに関する記事を参照してください。

環境変数を設定するには、コンソール ウィンドウを開き、オペレーティング システムと開発環境の指示に従います。

  1. VISION_TRAINING KEY 環境変数を設定するには、your-training-key をトレーニング用のリソースのキーの 1 つに置き換えます。
  2. VISION_TRAINING_ENDPOINT 環境変数を設定するには、your-training-endpoint をトレーニング用のリソースのエンドポイントに置き換えます。
  3. VISION_PREDICTION_KEY 環境変数を設定するには、your-prediction-key を予測リソースのキーの 1 つに置き換えます。
  4. VISION_PREDICTION_ENDPOINT 環境変数を設定するには、your-prediction-endpoint を予測リソースのエンドポイントに置き換えます。
  5. VISION_PREDICTION_RESOURCE_ID 環境変数を設定するには、your-resource-id を予測リソースのリソース ID に置き換えます。
setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

実行中のプログラムのうち、環境変数の読み取りを必要とするプログラム (コンソール ウィンドウを含む) については、環境変数を読み込む再起動が必要となる場合があります。

設定

新しい Gradle プロジェクトを作成する

コンソール ウィンドウ (cmd、PowerShell、Bash など) で、ご利用のアプリ用に新しいディレクトリを作成し、そこに移動します。

mkdir myapp && cd myapp

作業ディレクトリから gradle init コマンドを実行します。 次のコマンドを実行すると、build.gradle.kts を含む、Gradle 用の重要なビルド ファイルが作成されます。これは、アプリケーションを作成して構成するために、実行時に使用されます。

gradle init --type basic

DSL を選択するよう求められたら、Kotlin を選択します。

クライアント ライブラリをインストールする

build.gradle.kts を検索し、任意の IDE またはテキスト エディターで開きます。 その後、次のビルド構成をコピーします。 この構成では、エントリ ポイントが CustomVisionQuickstart クラスである Java アプリケーションとしてプロジェクトを定義します。 これによって、Custom Vision ライブラリがインポートされます。

plugins {
    java
    application
}
application { 
    mainClassName = "CustomVisionQuickstart"
}
repositories {
    mavenCentral()
}
dependencies {
    compile(group = "com.azure", name = "azure-cognitiveservices-customvision-training", version = "1.1.0-preview.2")
    compile(group = "com.azure", name = "azure-cognitiveservices-customvision-prediction", version = "1.1.0-preview.2")
}

Java ファイルを作成する

作業ディレクトリから次のコマンドを実行し、プロジェクト ソース フォルダーを作成します。

mkdir -p src/main/java

新しいフォルダーに移動し、CustomVisionQuickstart.java という名前のファイルを作成します。 それを任意のエディターまたは IDE で開き、以下の import ステートメントを追加します。

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import com.google.common.io.ByteStreams;

import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Classifier;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Domain;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.DomainType;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.ImageFileCreateBatch;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.ImageFileCreateEntry;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Iteration;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Project;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Region;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.TrainProjectOptionalParameter;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.CustomVisionTrainingClient;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.Trainings;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.CustomVisionTrainingManager;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.models.ImagePrediction;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.models.Prediction;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.CustomVisionPredictionClient;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.CustomVisionPredictionManager;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Tag;

ヒント

クイックスタートのコード ファイル全体を一度にご覧いただけます。 これは GitHub にあり、このクイックスタートのコード例が含まれています。

アプリケーションの CustomVisionQuickstart クラスで、環境変数からリソースのキーとエンドポイントを取得する変数を作成します。

// retrieve environment variables
final static String trainingApiKey = System.getenv("VISION_TRAINING_KEY");
final static String trainingEndpoint = System.getenv("VISION_TRAINING_ENDPOINT");
final static String predictionApiKey = System.getenv("VISION_PREDICTION_KEY");
final static String predictionEndpoint = System.getenv("VISION_PREDICTION_ENDPOINT");
final static String predictionResourceId = System.getenv("VISION_PREDICTION_RESOURCE_ID");

重要

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースのキーとエンドポイントのページにあります。 トレーニング リソース用の API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象のリソースの [プロパティ] タブに、リソース ID として表示されます。

重要

終わったらコードからキーを削除し、公開しないよう注意してください。 運用環境では、Azure Key Vault などの資格情報を格納してアクセスする安全な方法を使用します。 詳細については、Azure AI サービスのセキュリティに関する記事を参照してください。

アプリケーションの main メソッドで、このクイックスタートで使用するメソッドの呼び出しを追加します。 その定義は後から行います。

Project project = createProject(trainClient);
addTags(trainClient, project);
uploadImages(trainClient, project);
trainProject(trainClient, project);
publishIteration(trainClient, project);
testProject(predictor, project);

オブジェクト モデル

以下のクラスとインターフェイスにより、Custom Vision Java クライアント ライブラリの主要な機能の一部が処理されます。

名前 説明
CustomVisionTrainingClient このクラスでは、モデルの作成、トレーニング、および公開を処理します。
CustomVisionPredictionClient このクラスでは、画像分類予測のために、モデルに対するクエリ実行を処理します。
ImagePrediction このクラスでは、単一の画像に対して単一の予測を定義します。 これには、オブジェクト ID と名前、および信頼度スコアのプロパティが含まれます。

コード例

これらのコード スニペットでは、Java 用 Custom Vision クライアント ライブラリを使用して次のタスクを実行する方法を示します。

クライアントを認証する

main メソッドで、エンドポイントとキーを使用してトレーニング クライアントと予測クライアントをインスタンス化します。

// Authenticate
CustomVisionTrainingClient trainClient = CustomVisionTrainingManager
        .authenticate(trainingEndpoint, trainingApiKey)
        .withEndpoint(trainingEndpoint);
CustomVisionPredictionClient predictor = CustomVisionPredictionManager
        .authenticate(predictionEndpoint, predictionApiKey)
        .withEndpoint(predictionEndpoint);

Custom Vision プロジェクトを作成する

T## 新しい Custom Vision プロジェクトを作成する

次のメソッドでは、画像分類プロジェクトを作成します。 作成したプロジェクトは、先ほどアクセスした Custom Vision Web サイトに表示されます。 プロジェクトを作成するときに他のオプションを指定するには、CreateProject メソッドのオーバーロードを参照してください (検出器の構築に関する Web ポータル ガイドで説明されています)。

public static Project createProject(CustomVisionTrainingClient trainClient) {
    System.out.println("ImageClassification Sample");
    Trainings trainer = trainClient.trainings();

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

    return project;
}

タグをプロジェクトに追加する

このメソッドでは、モデルをトレーニングするタグを定義します。

public static void addTags(CustomVisionTrainingClient trainClient, Project project) {

    Trainings trainer = trainClient.trainings();

    // 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();
}

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

最初に、このプロジェクト用のサンプル画像をダウンロードします。 サンプル画像フォルダーの内容をお使いのローカル デバイスに保存します。

public static void uploadImages(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    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 個の画像をアップロードできます)。

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

プロジェクトをトレーニングする

このメソッドは、プロジェクトにおけるトレーニングの初回イテレーションを作成するものです。 トレーニングが完了するまで、サービスに対してクエリが実行されます。

public static void trainProject(CustomVisionTrainingClient trainClient, Project project) {
    System.out.println("Training...");
    Trainings trainer = trainClient.trainings();

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

現在のイテレーションを公開する

このメソッドでは、モデルの現在のイテレーションをクエリの実行に使用できるようにします。 モデル名は、予測要求を送信するための参照として使用できます。 predictionResourceId には、独自の値を入力する必要があります。 予測リソース ID は、Azure portal の対象のリソースの [プロパティ] タブに、リソース ID として表示されます。

public static String publishIteration(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    // The iteration is now trained. Publish it to the prediction endpoint.
    String publishedModelName = "myModel";
    trainer.publishIteration(project.id(), iteration.id(), publishedModelName, predictionResourceId);
}

予測エンドポイントをテストする

このメソッドでは、テスト画像を読み込み、モデル エンドポイントを照会して、予測データをコンソールに出力します。

// load test image
public static void testProject(CustomVisionPredictionClient predictor, Project project) {

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

アプリケーションの実行

次を使用してアプリをビルドできます。

gradle build

gradle run コマンドを使用してアプリケーションを実行します。

gradle run

リソースをクリーンアップする

Azure AI サービス サブスクリプションをクリーンアップして削除したい場合は、リソースまたはリソース グループを削除することができます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

以上、画像の分類処理の各ステップをコードでどのように実装するかを見てきました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。

  • Custom Vision とは
  • このサンプルのソース コードは、GitHub にあります。

このガイドでは、Node.js 用の Custom Vision クライアント ライブラリを使用して画像分類モデルを構築する際の足がかりとして役立つ手順とサンプル コードを紹介します。 プロジェクトを作成し、タグを追加し、プロジェクトをトレーニングして、プロジェクトの予測エンドポイント URL を使用してプログラムでテストします。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

コードを記述 "せずに" 分類モデルの構築とトレーニングを行う場合は、ブラウザーベースのガイダンスを参照してください。

.NET 用 Custom Vision クライアント ライブラリを使用すると、次のことができます。

  • 新しい Custom Vision プロジェクトを作成する
  • プロジェクトにタグを追加する
  • 画像をアップロードし、タグ付けする
  • プロジェクトをトレーニングする
  • 現在のイテレーションを公開する
  • 予測エンドポイントをテストする

リファレンス ドキュメント (トレーニング)(予測) | ライブラリのソース コード (トレーニング)(予測) | パッケージ (npm) (トレーニング)(予測) | サンプル

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • 最新バージョンの Node.js
  • Azure サブスクリプションを入手したら、Azure portal で Custom Vision リソースを作成し、トレーニングおよび予測リソースを作成します。
    • Free 価格レベル (F0) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。

環境変数を作成する

この例では、アプリケーションを実行しているローカル コンピューター上の環境変数に資格情報を書き込みます。

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースの [キー] および [エンドポイント] ページの [リソース管理] にあります。 API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象の予測リソースの [プロパティ] タブに、リソース ID として表示されます。

ヒント

https://www.customvision.ai/ を使用してもこれらの値を取得できます。 サインインしたら、右上にある [設定] アイコンを選択します。 [設定] ページで、すべてのキー、リソース ID、エンドポイントを表示できます。

注意

キーは、コードに直接含めないようにし、公開しないでください。 Azure Key Vault などのその他の認証オプションについては、Azure AI サービスのセキュリティに関する記事を参照してください。

環境変数を設定するには、コンソール ウィンドウを開き、オペレーティング システムと開発環境の指示に従います。

  1. VISION_TRAINING KEY 環境変数を設定するには、your-training-key をトレーニング用のリソースのキーの 1 つに置き換えます。
  2. VISION_TRAINING_ENDPOINT 環境変数を設定するには、your-training-endpoint をトレーニング用のリソースのエンドポイントに置き換えます。
  3. VISION_PREDICTION_KEY 環境変数を設定するには、your-prediction-key を予測リソースのキーの 1 つに置き換えます。
  4. VISION_PREDICTION_ENDPOINT 環境変数を設定するには、your-prediction-endpoint を予測リソースのエンドポイントに置き換えます。
  5. VISION_PREDICTION_RESOURCE_ID 環境変数を設定するには、your-resource-id を予測リソースのリソース ID に置き換えます。
setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

実行中のプログラムのうち、環境変数の読み取りを必要とするプログラム (コンソール ウィンドウを含む) については、環境変数を読み込む再起動が必要となる場合があります。

設定

新しい Node.js アプリケーションを作成する

コンソール ウィンドウ (cmd、PowerShell、Bash など) で、ご利用のアプリ用に新しいディレクトリを作成し、そこに移動します。

mkdir myapp && cd myapp

npm init コマンドを実行し、package.json ファイルを使用して node アプリケーションを作成します。

npm init

クライアント ライブラリをインストールする

Node.js 用の Custom Vision で画像分析アプリを作成するには、Custom Vision の NPM パッケージが必要です。 これをインストールするには、PowerShell で次のコマンドを実行します。

npm install @azure/cognitiveservices-customvision-training
npm install @azure/cognitiveservices-customvision-prediction

アプリの package.json ファイルが依存関係によって更新されます。

index.js という名前のファイルを作成して次のライブラリをインポートします。

const util = require('util');
const fs = require('fs');
const TrainingApi = require("@azure/cognitiveservices-customvision-training");
const PredictionApi = require("@azure/cognitiveservices-customvision-prediction");
const msRest = require("@azure/ms-rest-js");

ヒント

クイックスタートのコード ファイル全体を一度にご覧いただけます。 これは GitHub にあり、このクイックスタートのコード例が含まれています。

自分のリソースの Azure エンドポイントおよびキー用の変数を作成します。

// retrieve environment variables
const trainingKey = process.env["VISION_TRAINING_KEY"];
const trainingEndpoint = process.env["VISION_TRAINING_ENDPOINT"];

const predictionKey = process.env["VISION_PREDICTION_KEY"];
const predictionResourceId = process.env["VISION_PREDICTION_RESOURCE_ID"];
const predictionEndpoint = process.env["VISION_PREDICTION_ENDPOINT"];

また、プロジェクト名と、非同期呼び出しのタイムアウト パラメーターのフィールドも追加します。

const publishIterationName = "classifyModel";
const setTimeoutPromise = util.promisify(setTimeout);

オブジェクト モデル

名前 説明
TrainingAPIClient このクラスでは、モデルの作成、トレーニング、および公開を処理します。
PredictionAPIClient このクラスでは、画像分類予測のために、モデルに対するクエリ実行を処理します。
予測 このインターフェイスでは、単一の画像に対して単一の予測を定義します。 これには、オブジェクト ID と名前、および信頼度スコアのプロパティが含まれます。

コード例

これらのコード スニペットでは、JavaScript 用 Custom Vision クライアント ライブラリを使用して次のタスクを実行する方法を示します。

クライアントを認証する

実際のエンドポイントとキーを使用して、クライアント オブジェクトをインスタンス化します。 自分のキーを使用して ApiKeyCredentials オブジェクトを作成し、それを自分のエンドポイントと共に使用して、TrainingAPIClient および PredictionAPIClient オブジェクトを作成します。

const credentials = new msRest.ApiKeyCredentials({ inHeader: { "Training-key": trainingKey } });
const trainer = new TrainingApi.TrainingAPIClient(credentials, trainingEndpoint);
const predictor_credentials = new msRest.ApiKeyCredentials({ inHeader: { "Prediction-key": predictionKey } });
const predictor = new PredictionApi.PredictionAPIClient(predictor_credentials, predictionEndpoint);

新しい Custom Vision プロジェクトを作成する

すべての Custom Vision 関数呼び出しを含む新しい関数を開始します。 新しい Custom Vision Service プロジェクトを作成するための次のコードを追加します。

(async () => {
    console.log("Creating project...");
    const sampleProject = await trainer.createProject("Sample Project");

プロジェクトにタグを追加する

プロジェクトに分類タグを作成するには、関数に次のコードを追加します。

const hemlockTag = await trainer.createTag(sampleProject.id, "Hemlock");
const cherryTag = await trainer.createTag(sampleProject.id, "Japanese Cherry");

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

最初に、このプロジェクト用のサンプル画像をダウンロードします。 サンプル画像フォルダーの内容をお使いのローカル デバイスに保存します。

サンプルの画像をプロジェクトに追加するには、タグ作成後、次のコードを挿入します。 このコードでは、それぞれの画像を対応するタグと共にアップロードします。

const sampleDataRoot = "Images";

console.log("Adding images...");
let fileUploadPromises = [];

const hemlockDir = `${sampleDataRoot}/Hemlock`;
const hemlockFiles = fs.readdirSync(hemlockDir);
hemlockFiles.forEach(file => {
    fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${hemlockDir}/${file}`), { tagIds: [hemlockTag.id] }));
});

const cherryDir = `${sampleDataRoot}/Japanese_Cherry`;
const japaneseCherryFiles = fs.readdirSync(cherryDir);
japaneseCherryFiles.forEach(file => {
    fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${cherryDir}/${file}`), { tagIds: [cherryTag.id] }));
});

await Promise.all(fileUploadPromises);

重要

画像のパス (sampleDataRoot) は、Azure AI サービス Python SDK サンプル リポジトリをダウンロードした場所に応じて変更する必要があります。

プロジェクトをトレーニングする

このコードにより、予測モデルの最初のイテレーションが作成されます。

console.log("Training...");
let trainingIteration = await trainer.trainProject(sampleProject.id);

// Wait for training to complete
console.log("Training started...");
while (trainingIteration.status == "Training") {
    console.log("Training status: " + trainingIteration.status);
    await setTimeoutPromise(1000, null);
    trainingIteration = await trainer.getIteration(sampleProject.id, trainingIteration.id)
}
console.log("Training status: " + trainingIteration.status);

現在のイテレーションを公開する

このコードにより、トレーニング済みのイテレーションを予測エンドポイントに公開します。 公開されたイテレーションに付けられた名前は、予測要求を送信するために使用できます。 イテレーションは、公開されるまで予測エンドポイントで利用できません。

// Publish the iteration to the end point
await trainer.publishIteration(sampleProject.id, trainingIteration.id, publishIterationName, predictionResourceId);

予測エンドポイントをテストする

画像を予測エンドポイントに送信し、予測を取得するには、以下のコードを関数に追加します。

const testFile = fs.readFileSync(`${sampleDataRoot}/Test/test_image.jpg`);

const results = await predictor.classifyImage(sampleProject.id, publishIterationName, testFile);

// Show results
console.log("Results:");
results.predictions.forEach(predictedResult => {
    console.log(`\t ${predictedResult.tagName}: ${(predictedResult.probability * 100.0).toFixed(2)}%`);
});

次に、Custom Vision 関数を閉じて呼び出します。

})()

アプリケーションの実行

クイック スタート ファイルで node コマンドを使用して、アプリケーションを実行します。

node index.js

アプリケーションの出力は次のテキストのようになります。

Creating project...
Adding images...
Training...
Training started...
Training status: Training
Training status: Training
Training status: Training
Training status: Completed
Results:
         Hemlock: 94.97%
         Japanese Cherry: 0.01%

<sampleDataRoot>/Test/ 内のテスト画像にタグが適切に付けられていることを確認してください。 Custom Vision Web サイトに戻って、新しく作成されたプロジェクトの現在の状態を確認してもかまいません。

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

物体検出処理の各ステップをコードでどのように実装するかを見てきました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。

Python 用 Custom Vision クライアント ライブラリの使用を開始します。 以下の手順に従って、パッケージをインストールし、画像分類モデルを構築するためのコード例を試してみましょう。 プロジェクトを作成し、タグを追加し、プロジェクトをトレーニングして、プロジェクトの予測エンドポイント URL を使用してプログラムでテストします。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

コードを記述 "せずに" 分類モデルの構築とトレーニングを行う場合は、ブラウザーベースのガイダンスを参照してください。

Python 用 Custom Vision クライアント ライブラリを使用すると、次のことができます。

  • 新しい Custom Vision プロジェクトを作成する
  • プロジェクトにタグを追加する
  • 画像をアップロードし、タグ付けする
  • プロジェクトをトレーニングする
  • 現在のイテレーションを公開する
  • 予測エンドポイントをテストする

リファレンス ドキュメント | ライブラリのソース コード | パッケージ (PyPI) | サンプル

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • Python 3.x
    • Python のインストールには、pip が含まれている必要があります。 pip がインストールされているかどうかを確認するには、コマンド ラインで pip --version を実行します。 最新バージョンの Python をインストールして pip を入手してください。
  • Azure サブスクリプションを入手したら、Azure portal で Custom Vision リソースを作成し、トレーニングおよび予測リソースを作成します。
    • Free 価格レベル (F0) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。

環境変数を作成する

この例では、アプリケーションを実行しているローカル コンピューター上の環境変数に資格情報を書き込みます。

Azure Portal にアクセスします。 「前提条件」セクションで作成した Custom Vision リソースが正常にデプロイされたら、[次の手順][リソースに移動] ボタンを選択します。 キーとエンドポイントは、リソースの [キー] および [エンドポイント] ページの [リソース管理] にあります。 API エンドポイントに加え、トレーニング リソース用と予測リソース用の両方のキーを取得する必要があります。

予測リソース ID は、Azure portal の対象の予測リソースの [プロパティ] タブに、リソース ID として表示されます。

ヒント

https://www.customvision.ai/ を使用してもこれらの値を取得できます。 サインインしたら、右上にある [設定] アイコンを選択します。 [設定] ページで、すべてのキー、リソース ID、エンドポイントを表示できます。

注意

キーは、コードに直接含めないようにし、公開しないでください。 Azure Key Vault などのその他の認証オプションについては、Azure AI サービスのセキュリティに関する記事を参照してください。

環境変数を設定するには、コンソール ウィンドウを開き、オペレーティング システムと開発環境の指示に従います。

  1. VISION_TRAINING KEY 環境変数を設定するには、your-training-key をトレーニング用のリソースのキーの 1 つに置き換えます。
  2. VISION_TRAINING_ENDPOINT 環境変数を設定するには、your-training-endpoint をトレーニング用のリソースのエンドポイントに置き換えます。
  3. VISION_PREDICTION_KEY 環境変数を設定するには、your-prediction-key を予測リソースのキーの 1 つに置き換えます。
  4. VISION_PREDICTION_ENDPOINT 環境変数を設定するには、your-prediction-endpoint を予測リソースのエンドポイントに置き換えます。
  5. VISION_PREDICTION_RESOURCE_ID 環境変数を設定するには、your-resource-id を予測リソースのリソース ID に置き換えます。
setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

実行中のプログラムのうち、環境変数の読み取りを必要とするプログラム (コンソール ウィンドウを含む) については、環境変数を読み込む再起動が必要となる場合があります。

設定

クライアント ライブラリをインストールする

Python 用の Custom Vision で画像分析アプリを作成するには、Custom Vision のクライアント ライブラリが必要です。 Python のインストール後、PowerShell またはコンソール ウィンドウで次のコマンドを実行します。

pip install azure-cognitiveservices-vision-customvision

新しい Python アプリケーションを作成する

新しい Python ファイルを作成して次のライブラリをインポートします。

from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch, ImageFileCreateEntry, Region
from msrest.authentication import ApiKeyCredentials
import os, time, uuid

ヒント

クイックスタートのコード ファイル全体を一度にご覧いただけます。 これは GitHub にあり、このクイックスタートのコード例が含まれています。

自分のリソースの Azure エンドポイントおよびキー用の変数を作成します。

# retrieve environment variables
ENDPOINT = os.environ["VISION_TRAINING_ENDPOINT"]
training_key = os.environ["VISION_TRAINING_KEY"]
prediction_key = os.environ["VISION_PREDICTION_KEY"]
prediction_resource_id = os.environ["VISION_PREDICTION_RESOURCE_ID"]

オブジェクト モデル

名前 説明
CustomVisionTrainingClient このクラスでは、モデルの作成、トレーニング、および公開を処理します。
CustomVisionPredictionClient このクラスでは、画像分類予測のために、モデルに対するクエリ実行を処理します。
ImagePrediction このクラスでは、単一の画像に対して単一の物体予測を定義します。 これには、オブジェクト ID と名前、オブジェクトの境界ボックスの位置、および信頼度スコアのプロパティが含まれます。

コード例

これらのコード スニペットでは、Python 用 Custom Vision クライアント ライブラリを使用して次のことを実行する方法を示します。

クライアントを認証する

エンドポイントとキーを使用してトレーニングと予測のクライアントをインスタンス化します。 自分のキーを指定して ApiKeyServiceClientCredentials オブジェクトを作成し、それを自分のエンドポイントと共に使用して CustomVisionTrainingClient および CustomVisionPredictionClient オブジェクトを作成します。

credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)

新しい Custom Vision プロジェクトを作成する

新しい Custom Vision Service プロジェクトを作成するための次のコードをスクリプトに追加します。

プロジェクトを作成するときに他のオプションを指定するには、create_project メソッドを参照してください (分類子の構築に関する Web ポータル ガイドで説明されています)。

publish_iteration_name = "classifyModel"

credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)

# Create a new project
print ("Creating project...")
project_name = uuid.uuid4()
project = trainer.create_project(project_name)

プロジェクトにタグを追加する

プロジェクトに分類タグを追加するには、次のコードを追加します。

# Make two tags in the new project
hemlock_tag = trainer.create_tag(project.id, "Hemlock")
cherry_tag = trainer.create_tag(project.id, "Japanese Cherry")

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

最初に、このプロジェクト用のサンプル画像をダウンロードします。 サンプル画像フォルダーの内容をお使いのローカル デバイスに保存します。

サンプルの画像をプロジェクトに追加するには、タグ作成後、次のコードを挿入します。 このコードでは、それぞれの画像を対応するタグと共にアップロードします。 1 回のバッチで最大 64 個の画像をアップロードできます。

base_image_location = os.path.join (os.path.dirname(__file__), "Images")

print("Adding images...")

image_list = []

for image_num in range(1, 11):
    file_name = "hemlock_{}.jpg".format(image_num)
    with open(os.path.join (base_image_location, "Hemlock", file_name), "rb") as image_contents:
        image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[hemlock_tag.id]))

for image_num in range(1, 11):
    file_name = "japanese_cherry_{}.jpg".format(image_num)
    with open(os.path.join (base_image_location, "Japanese_Cherry", file_name), "rb") as image_contents:
        image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[cherry_tag.id]))

upload_result = trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=image_list))
if not upload_result.is_batch_successful:
    print("Image batch upload failed.")
    for image in upload_result.images:
        print("Image status: ", image.status)
    exit(-1)

Note

画像のパスは、Azure AI サービス Python SDK サンプル リポジトリをダウンロードした場所に応じて変更する必要があります。

プロジェクトをトレーニングする

このコードにより、予測モデルの最初のイテレーションが作成されます。

print ("Training...")
iteration = trainer.train_project(project.id)
while (iteration.status != "Completed"):
    iteration = trainer.get_iteration(project.id, iteration.id)
    print ("Training status: " + iteration.status)
    print ("Waiting 10 seconds...")
    time.sleep(10)

ヒント

選択したタグでトレーニングする

必要に応じて、適用したタグのサブセットのみでトレーニングできます。 ある特定のタグが十分に適用されていないが、他のタグが十分に適用されている場合に、これを行うことができます。 train_project 呼び出しで、使用するタグの ID 文字列の一覧に、オプションのパラメーター selected_tags を設定します。 モデルは、そのリストのタグのみを認識するようにトレーニングします。

現在のイテレーションを公開する

イテレーションは、公開されるまで予測エンドポイントで利用できません。 次のコードでは、モデルの現在のイテレーションをクエリの実行に使用できるようにします。

# The iteration is now trained. Publish it to the project endpoint
trainer.publish_iteration(project.id, iteration.id, publish_iteration_name, prediction_resource_id)
print ("Done!")

予測エンドポイントをテストする

画像を予測エンドポイントに送信し、予測を取得するには、ファイルの末尾に以下のコードを追加します。

# Now there is a trained endpoint that can be used to make a prediction
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)

with open(os.path.join (base_image_location, "Test/test_image.jpg"), "rb") as image_contents:
    results = predictor.classify_image(
        project.id, publish_iteration_name, image_contents.read())

    # Display the results.
    for prediction in results.predictions:
        print("\t" + prediction.tag_name +
              ": {0:.2f}%".format(prediction.probability * 100))

アプリケーションの実行

CustomVisionQuickstart.py を実行します。

python CustomVisionQuickstart.py

アプリケーションの出力は次のテキストのようになります。

Creating project...
Adding images...
Training...
Training status: Training
Training status: Completed
Done!
        Hemlock: 93.53%
        Japanese Cherry: 0.01%

<base_image_location>/images/Test/ 内のテスト画像にタグが適切に付けられていることを確認してください。 Custom Vision Web サイトに戻って、新しく作成されたプロジェクトの現在の状態を確認してもかまいません。

リソースをクリーンアップする

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

以上、画像の分類処理の各ステップをコードでどのように実装するかを見てきました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。

Custom Vision REST API の使用を開始します。 API を呼び出し、画像分類モデルを構築するには、これらの手順に従います。 プロジェクトを作成し、タグを追加し、プロジェクトをトレーニングして、プロジェクトの予測エンドポイント URL を使用してプログラムでテストします。 この例は、独自の画像認識アプリを構築するためのテンプレートとしてご利用ください。

Note

Custom Vision は、クライアント ライブラリ SDK またはブラウザーベースのガイダンスを通じて最も簡単に使用できます。

.NET 用 Custom Vision クライアント ライブラリを使用すると、次のことができます。

  • 新しい Custom Vision プロジェクトを作成する
  • プロジェクトにタグを追加する
  • 画像をアップロードし、タグ付けする
  • プロジェクトをトレーニングする
  • 現在のイテレーションを公開する
  • 予測エンドポイントをテストする

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • Azure サブスクリプションを入手したら、Azure portal で Custom Vision リソースを作成し、トレーニングおよび予測リソースを作成し、キーとエンドポイントを取得します。 デプロイするまで待ち、 [リソースに移動] ボタンをクリックします。
    • 対象のアプリケーションを Custom Vision に接続するには、作成したリソースのキーとエンドポイントが必要です。 このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。
    • Free 価格レベル (F0) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。
  • PowerShell バージョン 6.0 以降、または同様のコマンド ライン アプリケーション。

新しい Custom Vision プロジェクトを作成する

画像分類プロジェクトを作成するには、次のようなコマンドを使用します。 作成したプロジェクトは、Custom Vision Web サイトに表示されます。

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects?name={name}"

コマンドをテキスト エディターにコピーし、次の変更を行います。

  • {subscription key} を、有効な Face キーに置き換えます。
  • {endpoint} を、自分のキーに対応するエンドポイントに置き換えます。

    Note

    2019 年 7 月 1 日より後に作成された新しいリソースには、カスタム サブドメイン名が使用されます。 リージョンのエンドポイントの詳細および完全な一覧については、「Azure AI サービスのカスタム サブドメイン名」を参照してください。

  • {name} を自分のプロジェクト名に置き換えます。
  • 必要に応じて、他の URL パラメーターを設定して、自分のプロジェクトで使用するモデルの種類を構成します。 オプションについては、CreatProject API を参照してください。

次のような JSON 応答が返されます。 プロジェクトの "id" 値を一時的な場所に保存します。

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "description": "string",
  "settings": {
    "domainId": "00000000-0000-0000-0000-000000000000",
    "classificationType": "Multiclass",
    "targetExportPlatforms": [
      "CoreML"
    ],
    "useNegativeSet": true,
    "detectionParameters": "string",
    "imageProcessingSettings": {
      "augmentationMethods": {}
    }
  },
  "created": "string",
  "lastModified": "string",
  "thumbnailUri": "string",
  "drModeEnabled": true,
  "status": "Succeeded"
}

プロジェクトにタグを追加する

モデルをトレーニングするタグを定義するには、次のコマンドを使用します。

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/tags?name={name}"
  • 再度、独自のキーとエンドポイント URL を挿入します。
  • {projectId} を独自のプロジェクト ID に置き換えます。
  • {name} を、使用するタグの名前に置き換えます。

自分がプロジェクトで使用するすべてのタグについて、この手順を繰り返します。 提供されている画像の例を使用している場合は、タグ "Hemlock""Japanese Cherry" を追加します。

次のような JSON 応答が得られます。 各タグの "id" 値を一時的な場所に保存します。

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "description": "string",
  "type": "Regular",
  "imageCount": 0
}

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

次に、このプロジェクト用のサンプル画像をダウンロードします。 サンプル画像フォルダーの内容をお使いのローカル デバイスに保存します。

次のコマンドを使用して、画像をアップロードし、タグを適用します。この操作を "Hemlock" 画像に対して 1 回行い、"Japanese Cherry" 画像に対しても別途行います。 その他のオプションについては、Create Images From Data API を参照してください。

curl -v -X POST -H "Content-Type: multipart/form-data" -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/images?tagIds={tagArray}"
--data-ascii "{binary data}"
  • 再度、独自のキーとエンドポイント URL を挿入します。
  • {projectId} を独自のプロジェクト ID に置き換えます。
  • {tagArray} をタグの ID に置き換えます。
  • 次に、タグを付ける画像のバイナリ データを要求の本文に設定します。

プロジェクトをトレーニングする

この方法では、アップロードしたタグ付き画像でモデルがトレーニングされ、現在のプロジェクト イテレーションの ID が返されます。

curl -v -X POST -H "Content-Type: application/json" -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/train"
  • 再度、独自のキーとエンドポイント URL を挿入します。
  • {projectId} を独自のプロジェクト ID に置き換えます。
  • {tagArray} をタグの ID に置き換えます。
  • 次に、タグを付ける画像のバイナリ データを要求の本文に設定します。
  • 必要に応じて、他の URL パラメーターを使用します。 オプションについては、Train Project API を参照してください。

ヒント

選択したタグでトレーニングする

必要に応じて、適用したタグのサブセットのみでトレーニングできます。 ある特定のタグが十分に適用されていないが、他のタグが十分に適用されている場合に、これを行うことができます。 オプションの JSON コンテンツを要求の本文に追加します。 "selectedTags" 配列に、使用するタグの ID を設定します。

{
  "selectedTags": [
    "00000000-0000-0000-0000-000000000000"
  ]
}

JSON 応答には、イテレーション ID ("id") など、トレーニング済みのプロジェクトに関する情報が含まれています。 次の手順で使用するため、この値を保存します。

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "status": "string",
  "created": "string",
  "lastModified": "string",
  "trainedAt": "string",
  "projectId": "00000000-0000-0000-0000-000000000000",
  "exportable": true,
  "exportableTo": [
    "CoreML"
  ],
  "domainId": "00000000-0000-0000-0000-000000000000",
  "classificationType": "Multiclass",
  "trainingType": "Regular",
  "reservedBudgetInHours": 0,
  "trainingTimeInMinutes": 0,
  "publishName": "string",
  "originalPublishResourceId": "string"
}

現在のイテレーションを公開する

このメソッドでは、モデルの現在のイテレーションをクエリの実行に使用できるようにします。 返されたモデル名は、予測要求を送信するための参照として使用します。

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/iterations/{iterationId}/publish?publishName={publishName}&predictionId={predictionId}"
  • 再度、独自のキーとエンドポイント URL を挿入します。
  • {projectId} を独自のプロジェクト ID に置き換えます。
  • {iterationId} を前の手順で返された ID に置き換えます。
  • {publishedName} を、自分の予測モデルに割り当てる名前に置き換えます。
  • {predictionId} を独自の予測リソース ID に置き換えます。 予測リソース ID は、Azure portal の対象のリソースの [プロパティ] タブに、リソース ID として表示されます。
  • 必要に応じて、他の URL パラメーターを使用します。 Publish Iteration API を参照してください。

予測エンドポイントをテストする

最後に、このコマンドを使用して、タグで分類するための新しい画像をアップロードし、トレーニング済みのモデルをテストします。 前にダウンロードしたサンプル ファイルの "Test" フォルダーの画像を使用できます。

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/iterations/{iterationId}/publish?publishName={publishName}&predictionId={predictionId}"
  • 再度、独自のキーとエンドポイント URL を挿入します。
  • {projectId} を独自のプロジェクト ID に置き換えます。
  • {publishedName} は、前のステップで使用した名前に置き換えてください。
  • ローカル画像のバイナリ データを要求本文に追加します。
  • 必要に応じて、他の URL パラメーターを使用します。 Classify Image API を参照してください。

返された JSON 応答には、モデルによって画像に適用された各タグと、各タグの確率スコアが一覧表示されます。

{
  "id": "00000000-0000-0000-0000-000000000000",
  "project": "00000000-0000-0000-0000-000000000000",
  "iteration": "00000000-0000-0000-0000-000000000000",
  "created": "string",
  "predictions": [
    {
      "probability": 0.0,
      "tagId": "00000000-0000-0000-0000-000000000000",
      "tagName": "string",
      "boundingBox": {
        "left": 0.0,
        "top": 0.0,
        "width": 0.0,
        "height": 0.0
      },
      "tagType": "Regular"
    }
  ]
}

独自の画像分類プロジェクトを実装したい (または物体検出プロジェクトを試したい) 場合、この例で使用した木の識別プロジェクトは削除してかまいません。 無料サブスクリプションでは、2 つの Custom Vision プロジェクトを利用できます。

Custom Vision Web サイトで、 [Projects](プロジェクト) に移動し、[My New Project](自分用の新しいプロジェクト) のごみ箱アイコンを選択します。

Screenshot of a panel labeled My New Project with a trash can icon.

次のステップ

これで、REST API を使用した画像分類処理のすべての手順が完了しました。 このサンプルで実行したトレーニングのイテレーションは 1 回だけですが、多くの場合、精度を高めるために、モデルのトレーニングとテストは複数回行う必要があります。