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: データの準備
ossutilを使用して、現在のディレクトリにPascalデータセットをダウンロードします。
ossutil64 cp -r oss:// pai-vision-data-hz/data/voc0712_tfrecord/ data/voc0712_tfrecord
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/rcnn_cls: 分類ロス。
loss/loss/rcnn_reg: 回帰損失。
loss/loss/regularization_loss: 正則化の損失。
loss/loss/rpn_cls: 領域提案ネットワーク (RPN) の分類損失。
loss/loss/rpn_reg: RPNの回帰損失。
テストmAPの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ファイル。 詳細については、「プロトコルドキュメント」をご参照ください。 次のファイルを評価に使用することもできます。
オブジェクト検出用detector_eval.config
テキスト検出用のtext_detector_eval.config
テキスト認識用のtext_recognizer_eval.config
エンドツーエンドのテキスト認識用のtext_spotter_eval.config
ステップ7: モデルをサービスとしてデプロイする
SavedModelファイルをObject Storage Service (OSS) に保存し、そのファイルを使用してElastic Algorithm service (EAS) にサービスをデプロイします。 詳しくは、「サービスの作成」をご参照ください。