すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:EasyVisionを使用してオブジェクトを検出する

最終更新日:Jul 22, 2024

Platform for AI (PAI) はEasyVisionを提供します。EasyVisionは、モデルのトレーニングと予測のためのさまざまな機能を提供する視覚インテリジェンス用の拡張アルゴリズムフレームワークです。 EasyVisionを使用して、コンピュータビジョンアプリケーションのコンピュータビジョンモデルをトレーニングおよび適用できます。 このトピックでは、Data Science Workshop (DSW) でEasyVisionを使用してオブジェクトを検出する方法について説明します。

前提条件

次のバージョンのソフトウェアを使用する開発環境を用意します。

  • Python 2.7またはPython 3.4以降

  • PAI-TensorFlowまたはTensorFlow 1.8またはそれ以降

    説明

    DSWインスタンスを使用する場合は、TensorFlow 1.12のイメージと、メモリが16 GBを超えるインスタンスタイプを選択することを推奨します。

  • ossutilがダウンロードされ、インストールされます。 詳細については、「ossutilのインストール」をご参照ください。

    重要

    ossutilをダウンロードした後、設定ファイルでendpointパラメーターを https://oss-cn-zhangjiakou.aliyuncs.com に設定する必要があります。

ステップ1: データの準備

  1. ossutilを使用して、現在のディレクトリにPascalデータセットをダウンロードします。

    ossutil64 cp -r oss:// pai-vision-data-hz/data/voc0712_tfrecord/ data/voc0712_tfrecord
  2. ResNet50事前トレーニング済みモデルを現在のディレクトリにダウンロードします。

    mkdir -p pretrained_models /
    ossutil64 cp -r oss:// pai-vision-data-hz/pretrained_models/resnet_v1d_50/ pretrained_models/resnet_v1d_50 

ステップ2: 現在のディレクトリでトレーニングタスクを開始する

  • 単一機械モード

    import easy_vision
    easy_vision.train_and_evaluate(easy_vision.RFCN_SAMPLE_CONFIG)

    トレーニングプロセスでは、5,000ラウンドのトレーニングごとにモデルが評価されます。

  • マルチマシンモード

    複数のサーバーを使用してモデルをトレーニングできます。 各サーバーに少なくとも2つのGPUがあることを確認します。 マルチマシンモードでは、次の子プロセスを開始する必要があります。

    • ps: パラメーターサーバー。

    • master: 概要を書き込み、チェックポイントを保存し、モデルを定期的に評価するマスターノード。

    • worker: 特定のデータを処理するワーカーノード。

    次のコードを実行して、トレーニングタスクを開始します。

    #-*- encoding:utf-8 -*-
    import multiprocessing
    import sys
    import os
    import easy_vision
    import json
    import logging
    import subprocess
    import time
    
    # train config under distributed settings
    config=easy_vision.RFCN_DISTRIBUTE_SAMPLE_CONFIG
    
    # The configuration of the cluster. 
    TF_CONFIG={'cluster':{
                 'ps': ['localhost:12921'],
                 'master': ['localhost:12922'],
                 'worker': ['localhost:12923']
                }
              }
    
    def job(task, gpu):
      task_name = task['type']
      # redirect python log and tf log to log_file_name
      # [logs/master.log, logs/worker.log, logs/ps.log]
      log_file_name = "logs/%s.log" % task_name
    
      TF_CONFIG['task'] = task
      os.environ['TF_CONFIG'] = json.dumps(TF_CONFIG)
      os.environ['CUDA_VISIBLE_DEVICES'] = gpu
      train_cmd = 'python -m easy_vision.python.train_eval --pipeline_config_path %s' % config
      logging.info('%s > %s 2>&1 ' % (train_cmd, log_file_name))
      with open(log_file_name, 'w') as lfile:
        return subprocess.Popen(train_cmd.split(' '), stdout= lfile, stderr=subprocess.STDOUT)
    
    
    if __name__ == '__main__':
      procs = {}
      # start ps job on cpu
      task = {'type':'ps', 'index':0}
      procs['ps'] = job(task, '')
      # start master job on gpu 0
      task = {'type':'master', 'index':0}
      procs['master'] = job(task, '0')
      # start worker job on gpu 1
      task = {'type':'worker', 'index':0}
      procs['worker'] = job(task, '1')
    
      num_worker = 2
      for k, proc in procs.items():
        logging.info('%s pid: %d' %(k, proc.pid))
    
      task_failed = None
      task_finish_cnt = 0
      task_has_finished = {k:False for k in procs.keys()}
      while True:
        for k, proc in procs.items():
          if proc.poll() is None:
            if task_failed is not None:
              logging.error('task %s failed, %s quit' % (task_failed, k))
              proc.terminate()
              if k != 'ps':
                task_has_finished[k] = True
                task_finish_cnt += 1
              logging.info('task_finish_cnt %d' % task_finish_cnt)
          else:
            if not task_has_finished[k]:
              #process quit by itself
              if k != 'ps':
                task_finish_cnt += 1
                task_has_finished[k] = True
              logging.info('task_finish_cnt %d' % task_finish_cnt)
              if proc.returncode != 0:
                logging.error('%s failed' %k)
                task_failed = k
              else:
                logging.info('%s run successfully' % k)
    
        if task_finish_cnt >= num_worker:
          break
        time.sleep(1)

ステップ3: TensorBoardを使用してトレーニングタスクを監視する

モデルのチェックポイントとイベントファイルは、pascal_resnet50_rfcn_modelが存在するディレクトリに保存されます。 次のコマンドを実行して、TensorBoardのログインリンクを取得します。 次に、ブラウザでTensorBoardを開きます。 トレーニングタスクの損失と平均平均精度 (mAP) を表示できます。

重要

Linuxでコマンドを実行する必要があります。 コマンドを実行するには、pascal_resnet50_rfcn_modelが存在するディレクトリに切り替えるか、コマンドの -- logdirに続くパスをpascal_resnet50_rfcn_modelの実際のパスに置き換えます。 それ以外の場合、コマンドの実行に失敗します。

tensorboard -- port 6006 -- logdir pascal_resnet50_rfcn_model [ -- host 0.0.0.0 ]

TensorBoardで次の情報を表示します。

  • トレーニング損失训练lossの指標:

    • loss: トレーニングタスクの総損失。

    • loss/loss/rcnn_cls: 分類ロス。

    • loss/loss/rcnn_reg: 回帰損失。

    • loss/loss/regularization_loss: 正則化の損失。

    • loss/loss/rpn_cls: 領域提案ネットワーク (RPN) の分類損失。

    • loss/loss/rpn_reg: RPNの回帰損失。

  • テストmAPimageのPascalBoxes07とPascalBoxesは、前の図に示すように、テストmAPを計算するためのメトリックとして使用されます。 PascalBoxes07は、関連研究で一般的に使用されます。

ステップ4: モデルのテストと評価

トレーニングタスクが完了したら、トレーニング済みモデルをテストおよび評価できます。

次のコマンドを実行して、easy_visionパッケージをインストールします。

pip install https://pai-vision-data-hz.oss-accelerate.aliyuncs.com/release/easy_vision-1.12.4.1-py2.py3-none-any.whl
  • 他のデータセットを使用してモデルをテストします。 次に、各画像の検出結果を確認します。

    import easy_vision
    test_filelist = 'path/to/filelist.txt' # each line is an image file path
    detect_results = easy_vision.predict(easy_vision.RFCN_SAMPLE_CONFIG, test_filelist=test_filelist)

    filelist.txtファイルには、イメージのオンプレミスパスが含まれています。 各行は画像ファイルパスです。 eval_dataの各イメージの検出結果は、[detection_boxes, box_probability, box_class] 形式のdetect_resultsパラメーターで返されます。 detection_boxesは検出されたオブジェクトの位置を示し、box_classはオブジェクトのカテゴリを示し、box_probabilityは検出結果の信頼度を示します。

  • トレーニングされたモデルを評価します。

    import easy_vision
    eval_metrics = easy_vision.evaluate(easy_vision.RFCN_SAMPLE_CONFIG)

    eval_metricsパラメーターは、PascalBoxes07、PascalBoxes、global_step、および損失メトリック: loss、loss/loss/rcnn_cls、loss/loss/rcnn_reg、loss/loss/rpn_cls、loss/loss/total_lossを含む評価メトリックを示します。 次の例は、メトリックを示しています。

    • PascalBoxes07メトリック

      PascalBoxes07_PerformanceByCategory/AP@0.5IOU/aeroplane = 0.74028647
      PascalBoxes07_PerformanceByCategory/AP@0.5IOU/bicycle = 0.77216494
      ......
      PascalBoxes07_PerformanceByCategory/AP@0.5IOU/train = 0.771075
      PascalBoxes07_PerformanceByCategory/AP@0.5IOU/tvmonitor = 0.70221454
      PascalBoxes07_Precision/mAP@0.5IOU = 0.6975172
    • PascalBoxesメトリック

      PascalBoxes_PerformanceByCategory/AP@0.5IOU/aeroplane = 0.7697732
      PascalBoxes_PerformanceByCategory/AP@0.5IOU/bicycle = 0.80088705
      ......
      PascalBoxes_PerformanceByCategory/AP@0.5IOU/train = 0.8002225
      PascalBoxes_PerformanceByCategory/AP@0.5IOU/tvmonitor = 0.72775906
      PascalBoxes_Precision/mAP@0.5IOU = 0.7182514
    • global_stepと損失

      global_step = 75000
      loss = 0.51076376
      loss/loss/rcnn_cls = 0.23392382
      loss/loss/rcnn_reg = 0.12589474
      loss/loss/rpn_cls = 0.13748208
      loss/loss/rpn_reg = 0.013463326
      loss/loss/total_loss = 0.51076376

ステップ5: モデルをエクスポートする

次のコードを実行して、モデルをSavedModelファイルとしてエクスポートします。

import easy_vision
easy_vision.export(export_dir, pipeline_config_path, checkpoint_path)

上記のコードを実行すると、export_dirディレクトリにmodelディレクトリが作成されます。 モデルディレクトリの名前には、ディレクトリが作成された時刻を示すUNIXタイムスタンプが含まれます。 モデルのすべてのチェックポイントは、モデルディレクトリ内のSavedModelファイルにエクスポートされます。

ステップ6: SavedModelファイルを評価する

次のコードを実行して、エクスポートされたSavedModelファイルを評価します。 モデルのすべてのメトリックは、評価結果ファイルとログに含まれます。

easy_vision.python.main import predictor_evaluateからの

from easy_vision.python.main import predictor_evaluate
predictor_evaluate(predictor_eval_config)

上記のコードでは、predictor_eval_configは 評価に使用されるprotoファイル。 詳細については、「プロトコルドキュメント」をご参照ください。 次のファイルを評価に使用することもできます。

ステップ7: モデルをサービスとしてデプロイする

SavedModelファイルをObject Storage Service (OSS) に保存し、そのファイルを使用してElastic Algorithm service (EAS) にサービスをデプロイします。 詳しくは、「サービスの作成」をご参照ください。