

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Rekognition Custom Labels プロジェクトの管理
<a name="managing-project"></a>

Amazon Rekognition Custom Labels 内では、プロジェクトを使用することにより、特定のユースケースに作成したモデルを管理します。プロジェクトでは、データセット、モデルトレーニング、モデルバージョン、モデル評価、およびプロジェクトのモデルの実行を管理します。

**Topics**
+ [Amazon Rekognition Custom Labels プロジェクトの削除](mp-delete-project.md)
+ [プロジェクトの記述 (SDK)](md-describing-project-sdk.md)
+ [を使用したプロジェクトの作成 AWS CloudFormation](cloudformation.md)

# Amazon Rekognition Custom Labels プロジェクトの削除
<a name="mp-delete-project"></a>

Amazon Rekognition コンソールを使用するか、[DeleteProject](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DeleteProject) API を使用して、プロジェクトを削除できます。プロジェクトを削除するには、最初に関連付けられたモデルをすべて削除する必要があります。削除したプロジェクトを元に戻すことはできません。

**Topics**
+ [Amazon Rekognition Custom Labels プロジェクトの削除 (コンソール)](#mp-delete-project-console)
+ [Amazon Rekognition Custom Labels プロジェクトの削除 (SDK)](#mp-delete-project-sdk)

## Amazon Rekognition Custom Labels プロジェクトの削除 (コンソール)
<a name="mp-delete-project-console"></a>

プロジェクトページから、またはプロジェクトの詳細ページからプロジェクトを削除できます。次の手順では、コンソールを使ってプロジェクトを作成する方法を示しています。

Amazon Rekognition Custom Labels コンソールは、プロジェクトの削除中に関連付けられたモデルとデータセットを削除します。プロジェクトが実行中またはトレーニング中の場合は、プロジェクトを削除できません。実行中のモデルを停止するには、「[Amazon Rekognition Custom Labels モデル (SDK) の停止](rm-stop.md#rm-stop-sdk) 」を参照してください。プロジェクトがトレーニング中の場合は、終了してからプロジェクトを削除してください。

**プロジェクトを削除するには (コンソール)**

1. Amazon Rekognition コンソールを [https://console.aws.amazon.com/rekognition/](https://console.aws.amazon.com/rekognition/) で開きます。

1. **[カスタムラベルを使用]** を選択します。

1. **[開始方法]** を選択します。

1. 左側のナビゲーションペインで、**[プロジェクト]** を選択します。

1. **[プロジェクト]** ページで、削除するプロジェクトのラジオボタンを選択します。echo-devices-project のプロジェクトリストには、2020-03-25 に作成された 1 つのバージョンと、[削除]、[新しいモデルをトレーニングする]、[プロジェクトを作成] のオプションが表示されています。  
![\[echo-devices-project プロジェクトとその詳細を示すプロジェクトリスト。\]](http://docs.aws.amazon.com/ja_jp/rekognition/latest/customlabels-dg/images/delete-projects-page.png)

1. ページの上部で、**[削除]** を選択します。**[プロジェクトを削除]** ダイアログボックスが表示されます。

1. モデルに関連付けられたモデルがない場合:

   1. **[delete]** と入力して、プロジェクトを削除します。

   1. **[削除]** を選択して、プロジェクトを削除します。

1. モデルに関連付けられたモデルがある場合:

   1. **[delete]** と入力して、削除するモデルとモデルを確認します。

   1. モデルにデータセット、モデル、またはその両方が含まれているかどうかに応じて、**[関連付けられたデータセットを削除]**、**[関連付けられたモデルを削除]**、または **[関連付けられたデータセットとモデルを削除]** を選択します。モデルの削除が完了するまでに時間がかかる場合があります。
**注記**  
コンソールでは、トレーニング中または実行中のモデルを削除することはできません。一覧表示されている実行中のモデルを停止してから再試行するか、トレーニングが終了するまで待ちます。  
モデルの削除中にダイアログボックスを**閉じた**場合でも、モデルは削除されます。後で、この手順を繰り返すことにより、プロジェクトを削除できます。

       モデルを削除するためのパネルには、関連モデルを削除するための明確な手順が示されています。  
![\[プロジェクトを削除するためのインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/rekognition/latest/customlabels-dg/images/delete-project-with-models.png)

   1. **[delete]** と入力して、削除するプロジェクトを確認します。

   1. **[削除]** を選択して、プロジェクトを削除します。  
![\[モデルのない「echo-devices-project」プロジェクトの削除を確認するダイアログボックス。\]](http://docs.aws.amazon.com/ja_jp/rekognition/latest/customlabels-dg/images/delete-project.png)

## Amazon Rekognition Custom Labels プロジェクトの削除 (SDK)
<a name="mp-delete-project-sdk"></a>

Amazon Rekognition Custom Labels プロジェクトを削除するには、[DeleteProject](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DeleteProject) を呼び出し、削除するプロジェクトの Amazon リソースネーム (ARN) を指定します。 AWS アカウント内のプロジェクトの ARNs を取得するには、[DescribeProjects](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjects) を呼び出します。レスポンスには [ProjectDescription](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_ProjectDescription) オブジェクトの配列が含まれます。プロジェクト ARN は `ProjectArn` フィールドです。プロジェクト名を使用すると、プロジェクトの ARN を識別できます。例えば、`arn:aws:rekognition:us-east-1:123456789010:project/project name/1234567890123`。

プロジェクトを削除するには、まず、プロジェクト内のすべてのモデルとデータセットを削除する必要があります。詳細については、「[Amazon Rekognition Custom Labels モデルの削除 (SDK)](tm-delete-model.md#tm-delete-model-sdk)」および「[データセットの削除](md-delete-dataset.md)」を参照してください。

プロジェクトの削除にはしばらくかかることがあります。その間は、プロジェクトのステータスは `DELETING` です。その後に [DescribeProjects](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjects) を呼び出したときに、削除したプロジェクトが含まれていない場合は、プロジェクトが削除されます。

**プロジェクトを削除するには (SDK)**

1. まだインストールしていない場合は、 と AWS SDKs をインストール AWS CLI して設定します。詳細については、「[ステップ 4: AWS CLI と AWS SDKsを設定する](su-awscli-sdk.md)」を参照してください。

1. プロジェクトを削除するには、次のコードを使用します。

------
#### [ AWS CLI ]

   `project-arn` の値を削除するプロジェクトの名前に変更します。

   ```
   aws rekognition delete-project --project-arn project_arn \
     --profile custom-labels-access
   ```

------
#### [ Python ]

   次のコードを使用します。次のコマンドラインパラメータを指定します。
   + `project_arn` - 削除するプロジェクトの ARN。

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   Amazon Rekognition Custom Labels project example used in the service documentation:
   https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/mp-delete-project.html
   Shows how to delete an existing Amazon Rekognition Custom Labels project. 
   You must first delete any models and datasets that belong to the project.
   """
   
   import argparse
   import logging
   import time
   import boto3
   
   
   from botocore.exceptions import ClientError
   
   logger = logging.getLogger(__name__)
   
   
   def find_forward_slash(input_string, n):
       """
       Returns the location of '/' after n number of occurences. 
       :param input_string: The string you want to search
       : n: the occurence that you want to find.
       """
       position = input_string.find('/')
       while position >= 0 and n > 1:
           position = input_string.find('/', position + 1)
           n -= 1
       return position
   
   
   def delete_project(rek_client, project_arn):
       """
       Deletes an Amazon Rekognition Custom Labels project.
       :param rek_client: The Amazon Rekognition Custom Labels Boto3 client.
       :param project_arn: The ARN of the project that you want to delete.
       """
   
       try:
           # Delete the project
           logger.info("Deleting project: %s", project_arn)
   
           response = rek_client.delete_project(ProjectArn=project_arn)
   
           logger.info("project status: %s",response['Status'])
   
           deleted = False
   
           logger.info("waiting for project deletion: %s", project_arn)
   
           # Get the project name
           start = find_forward_slash(project_arn, 1) + 1
           end = find_forward_slash(project_arn, 2)
           project_name = project_arn[start:end]
   
           project_names = [project_name]
   
           while deleted is False:
   
               project_descriptions = rek_client.describe_projects(
                   ProjectNames=project_names)['ProjectDescriptions']
   
               if len(project_descriptions) == 0:
                   deleted = True
   
               else:
                   time.sleep(5)
   
           logger.info("project deleted: %s",project_arn)
   
           return True
   
       except ClientError as err:
           logger.exception(
               "Couldn't delete project - %s: %s",
               project_arn, err.response['Error']['Message'])
           raise
   
   
   def add_arguments(parser):
       """
       Adds command line arguments to the parser.
       :param parser: The command line parser.
       """
   
       parser.add_argument(
           "project_arn", help="The ARN of the project that you want to delete."
       )
   
   
   def main():
   
       logging.basicConfig(level=logging.INFO,
                           format="%(levelname)s: %(message)s")
   
       try:
   
           # get command line arguments
           parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
           add_arguments(parser)
           args = parser.parse_args()
   
           print(f"Deleting project: {args.project_arn}")
   
           # Delete the project.
           session = boto3.Session(profile_name='custom-labels-access')
           rekognition_client = session.client("rekognition")
   
           delete_project(rekognition_client,
                          args.project_arn)
   
           print(f"Finished deleting project: {args.project_arn}")
   
       except ClientError as err:
           error_message = f"Problem deleting project: {err}"
           logger.exception(error_message)
           print(error_message)
   
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Java V2 ]

   次のコードを使用します。次のコマンドラインパラメータを指定します。
   + `project_arn` - 削除するプロジェクトの ARN。

   ```
   /*
   Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   SPDX-License-Identifier: Apache-2.0
   */
   
   package com.example.rekognition;
   
   import java.util.List;
   import java.util.Objects;
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
   import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
   import software.amazon.awssdk.regions.Region;
   import software.amazon.awssdk.services.rekognition.RekognitionClient;
   import software.amazon.awssdk.services.rekognition.model.DeleteProjectRequest;
   import software.amazon.awssdk.services.rekognition.model.DeleteProjectResponse;
   import software.amazon.awssdk.services.rekognition.model.DescribeProjectsRequest;
   import software.amazon.awssdk.services.rekognition.model.DescribeProjectsResponse;
   import software.amazon.awssdk.services.rekognition.model.ProjectDescription;
   import software.amazon.awssdk.services.rekognition.model.RekognitionException;
   
   public class DeleteProject {
   
       public static final Logger logger = Logger.getLogger(DeleteProject.class.getName());
   
       public static void deleteMyProject(RekognitionClient rekClient, String projectArn) throws InterruptedException {
   
           try {
   
               logger.log(Level.INFO, "Deleting project: {0}", projectArn);
   
               // Delete the project
   
               DeleteProjectRequest deleteProjectRequest = DeleteProjectRequest.builder().projectArn(projectArn).build();
               DeleteProjectResponse response = rekClient.deleteProject(deleteProjectRequest);
   
               logger.log(Level.INFO, "Status: {0}", response.status());
   
               // Wait until deletion finishes
   
               Boolean deleted = false;
   
               do {
   
   				    DescribeProjectsRequest describeProjectsRequest = DescribeProjectsRequest.builder().build();
                       DescribeProjectsResponse describeResponse = rekClient.describeProjects(describeProjectsRequest);
                       List<ProjectDescription> projectDescriptions = describeResponse.projectDescriptions();
   
                       deleted = true;
   
                       for (ProjectDescription projectDescription : projectDescriptions) {
   
                           if (Objects.equals(projectDescription.projectArn(), projectArn)) {
                               deleted = false;
                               logger.log(Level.INFO, "Not deleted: {0}", projectDescription.projectArn());
                               Thread.sleep(5000);
                               break;
                           }
                       }
   
               } while (Boolean.FALSE.equals(deleted));
   
               logger.log(Level.INFO, "Project deleted: {0} ", projectArn);
   
           } catch (
   
           RekognitionException e) {
               logger.log(Level.SEVERE, "Client error occurred: {0}", e.getMessage());
               throw e;
           }
   
       }
   
       public static void main(String[] args) {
   
           final String USAGE = "\n" + "Usage: " + "<project_arn>\n\n" + "Where:\n"
                + "   project_arn - The ARN of the project that you want to delete.\n\n";
   
           if (args.length != 1) {
                System.out.println(USAGE);
   	         System.exit(1);
           }
   
           String projectArn = args[0];
   
           try {
   
               RekognitionClient rekClient = RekognitionClient.builder()
                   .region(Region.US_WEST_2)
                   .credentialsProvider(ProfileCredentialsProvider.create("custom-labels-access"))
                   .build();
   
               // Delete the project.
               deleteMyProject(rekClient, projectArn);
   
               System.out.println(String.format("Project deleted: %s", projectArn));
   
               rekClient.close();
   
           } catch (RekognitionException rekError) {
               logger.log(Level.SEVERE, "Rekognition client error: {0}", rekError.getMessage());
               System.exit(1);
           }
   
           catch (InterruptedException intError) {
               logger.log(Level.SEVERE, "Exception while sleeping: {0}", intError.getMessage());
               System.exit(1);
           }
       }
   
   }
   ```

------

# プロジェクトの記述 (SDK)
<a name="md-describing-project-sdk"></a>

`DescribeProjects` API を使用すると、プロジェクトに関する情報を取得できます。

**プロジェクトを記述するには (SDK)**

1. まだインストールしていない場合は、 と AWS SDKs をインストール AWS CLI して設定します。詳細については、「[ステップ 4: AWS CLI と AWS SDKsを設定する](su-awscli-sdk.md)」を参照してください。

1. 次のサンプルコードを使用して、プロジェクトを記述します。`project_name` を、記述するプロジェクトの名前に置き換えます。`--project-names` を指定しない場合、すべてのプロジェクトの記述が返されます。

------
#### [ AWS CLI ]

   ```
   aws rekognition describe-projects --project-names project_name \
     --profile custom-labels-access
   ```

------
#### [ Python ]

   次のコードを使用します。次のコマンドラインパラメータを指定します。
   + project\$1name `` - 記述するプロジェクトの名前。名前を指定しない場合、すべてのプロジェクトの記述が返されます。

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   Shows how to describe an Amazon Rekognition Custom Labels project.
   """
   import argparse
   import logging
   import json
   import boto3
   from botocore.exceptions import ClientError
   
   logger = logging.getLogger(__name__)
   
   
   def display_project_info(project):
       """
       Displays information about a Custom Labels project.
       :param project: The project that you want to display information about.
       """
       print(f"Arn: {project['ProjectArn']}")
       print(f"Status: {project['Status']}")
   
       if len(project['Datasets']) == 0:
           print("Datasets: None")
       else:
           print("Datasets:")
   
       for dataset in project['Datasets']:
           print(f"\tCreated: {str(dataset['CreationTimestamp'])}")
           print(f"\tType: {dataset['DatasetType']}")
           print(f"\tARN: {dataset['DatasetArn']}")
           print(f"\tStatus: {dataset['Status']}")
           print(f"\tStatus message: {dataset['StatusMessage']}")
           print(f"\tStatus code: {dataset['StatusMessageCode']}")
           print()
       print()
   
   
   def describe_projects(rek_client, project_name):
       """
       Describes an Amazon Rekognition Custom Labels project, or all projects.
       :param rek_client: The Amazon Rekognition Custom Labels Boto3 client.
       :param project_name: The project you want to describe. Pass None to describe all projects.
       """
   
       try:
           # Describe the project
           if project_name is None:
               logger.info("Describing all projects.")
           else:
               logger.info("Describing project: %s.",project_name)
   
           if project_name is None:
               response = rek_client.describe_projects()
           else:
               project_names = json.loads('["' + project_name + '"]')
               response = rek_client.describe_projects(ProjectNames=project_names)
   
           print('Projects\n--------')
           if len(response['ProjectDescriptions']) == 0:
               print("Project(s) not found.")
           else:
               for project in response['ProjectDescriptions']:
                   display_project_info(project)
   
           logger.info("Finished project description.")
   
       except ClientError as err:
           logger.exception(
               "Couldn't describe project - %s: %s",
               project_name,err.response['Error']['Message'] )
           raise
   
   
   def add_arguments(parser):
       """
       Adds command line arguments to the parser.
       :param parser: The command line parser.
       """
   
       parser.add_argument(
           "--project_name",  help="The name of the project that you want to describe.", required=False
       )
   
   
   def main():
   
       logging.basicConfig(level=logging.INFO,
                           format="%(levelname)s: %(message)s")
   
       try:
   
           # Get command line arguments.
           parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
           add_arguments(parser)
   
           args = parser.parse_args()
   
           print(f"Describing projects: {args.project_name}")
   
           # Describe the project.
           session = boto3.Session(profile_name='custom-labels-access')
           rekognition_client = session.client("rekognition")
   
           describe_projects(rekognition_client,
                             args.project_name)
   
           if args.project_name is None:
               print("Finished describing all projects.")
           else:
               print("Finished describing project %s.", args.project_name)
   
       except ClientError as err:
           error_message = f"Problem describing project: {err}"
           logger.exception(error_message)
           print(error_message)
   
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Java V2 ]

   次のコードを使用します。次のコマンドラインパラメータを指定します。
   + `project_name` - 記述するプロジェクトの ARN。名前を指定しない場合、すべてのプロジェクトの記述が返されます。

   ```
   /*
      Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
      SPDX-License-Identifier: Apache-2.0
   */
   
   package com.example.rekognition;
   
   import java.util.ArrayList;
   import java.util.List;
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
   import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
   import software.amazon.awssdk.services.rekognition.RekognitionClient;
   import software.amazon.awssdk.services.rekognition.model.DatasetMetadata;
   import software.amazon.awssdk.services.rekognition.model.DescribeProjectsRequest;
   import software.amazon.awssdk.services.rekognition.model.DescribeProjectsResponse;
   import software.amazon.awssdk.services.rekognition.model.ProjectDescription;
   import software.amazon.awssdk.services.rekognition.model.RekognitionException;
   
   public class DescribeProjects {
   
       public static final Logger logger = Logger.getLogger(DescribeProjects.class.getName());
   
       public static void describeMyProjects(RekognitionClient rekClient, String projectName) {
   
           DescribeProjectsRequest descProjects = null;
   
           // If a single project name is supplied, build projectNames argument
   
           List<String> projectNames = new ArrayList<String>();
   
           if (projectName == null) {
               descProjects = DescribeProjectsRequest.builder().build();
           } else {
               projectNames.add(projectName);
               descProjects = DescribeProjectsRequest.builder().projectNames(projectNames).build();
           }
   
           // Display useful information for each project.
   
           DescribeProjectsResponse resp = rekClient.describeProjects(descProjects);
   
           for (ProjectDescription projectDescription : resp.projectDescriptions()) {
   
               System.out.println("ARN: " + projectDescription.projectArn());
               System.out.println("Status: " + projectDescription.statusAsString());
               if (projectDescription.hasDatasets()) {
                   for (DatasetMetadata datasetDescription : projectDescription.datasets()) {
                       System.out.println("\tdataset Type: " + datasetDescription.datasetTypeAsString());
                       System.out.println("\tdataset ARN: " + datasetDescription.datasetArn());
                       System.out.println("\tdataset Status: " + datasetDescription.statusAsString());
                   }
               }
               System.out.println();
           }
   
       }
   
       public static void main(String[] args) {
   
           String projectArn = null;
   
           // Get command line arguments
   
           final String USAGE = "\n" + "Usage: " + "<project_name>\n\n" + "Where:\n"
                   + "   project_name - (Optional) The name of the project that you want to describe. If not specified, all projects "
                   + "are described.\n\n";
   
           if (args.length > 1) {
               System.out.println(USAGE);
               System.exit(1);
           }
   
           if (args.length == 1) {
               projectArn = args[0];
           }
   
           try {
   
               // Get the Rekognition client
               RekognitionClient rekClient = RekognitionClient.builder()
                   .credentialsProvider(ProfileCredentialsProvider.create("custom-labels-access"))
                   .region(Region.US_WEST_2)
                   .build();
               
               // Describe projects
   
               describeMyProjects(rekClient, projectArn);
   
               rekClient.close();
   
           } catch (RekognitionException rekError) {
               logger.log(Level.SEVERE, "Rekognition client error: {0}", rekError.getMessage());
               System.exit(1);
           }
   
       }
   
   }
   ```

------

# を使用したプロジェクトの作成 AWS CloudFormation
<a name="cloudformation"></a>

Amazon Rekognition Custom Labels は AWS CloudFormation、 AWS リソースとインフラストラクチャの作成と管理に費やす時間を短縮できるように、リソースのモデル化とセットアップに役立つサービスである と統合されています。必要なすべての AWS リソースを記述するテンプレートを作成し、 CloudFormation がそれらのリソースのプロビジョニングと設定を行います。

を使用して CloudFormation 、Amazon Rekognition Custom Labels プロジェクトをプロビジョニングおよび設定できます。

を使用すると CloudFormation、テンプレートを再利用して Amazon Rekognition Custom Labels プロジェクトを一貫して繰り返しセットアップできます。プロジェクトを一度記述するだけで、同じプロジェクトを複数の AWS アカウントとリージョンで何度もプロビジョニングできます。

## Amazon Rekognition カスタムラベルと CloudFormation テンプレート
<a name="working-with-templates"></a>

Amazon Rekognition Custom Labels と関連サービスのためのプロジェクトをプロビジョニングし、設定するためには、[CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)を理解する必要があります。テンプレートは、JSON や YAML でフォーマットされたテキストファイルです。これらのテンプレートは、 CloudFormation スタックにプロビジョニングするリソースを記述します。JSON または YAML に慣れていない場合は、デザイナー を使用して CloudFormation CloudFormation テンプレートの使用を開始できます。詳細については、「*AWS CloudFormation ユーザーガイド*」の「[CloudFormation Designer とは](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)」を参照してください。

 JSON テンプレートと YAML テンプレートの例を含む Amazon Rekognition Custom Labels プロジェクトのリファレンス情報については、「[Rekognition リソースタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_Rekognition.html)」を参照してください。

## の詳細 CloudFormation
<a name="learn-more-cloudformation"></a>

詳細については CloudFormation、次のリソースを参照してください。
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)
+ [AWS CloudFormation ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)
+ [CloudFormation API リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/Welcome.html)
+ [AWS CloudFormation コマンドラインインターフェイスユーザーガイド](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html)