EasyVision(視覺智能增強演算法包)提供多種模型的訓練及預測功能,旨在協助電腦視覺應用開發人員方便快捷地構建視覺模型並應用於生產。本文以目標檢測為例,為您介紹如何在DSW中使用EasyVision。
前提條件
需要準備如下安裝環境:
Python版本:Python 2.7或Python 3.4及以上版本。
TensorFlow社區版本:TensorFlow 1.8及以上版本或PAI-TF。
說明如果您使用的是DSW執行個體,建議選擇TensorFlow1.12版本作為鏡像,且執行個體規格大於16 GB。
已下載並安裝了ossutil工具,詳情請參見安裝ossutil。
重要下載完ossutil工具設定設定檔時,Endpoint需要設定為
https://oss-cn-zhangjiakou.aliyuncs.com
。
步驟一:準備資料
使用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
步驟二:啟動訓練任務(在目前的目錄)
單機模式
import easy_vision easy_vision.train_and_evaluate(easy_vision.RFCN_SAMPLE_CONFIG)
訓練過程中,每隔5000輪進行一次評估。
多機模式
在具有至少兩張GPU卡的伺服器中才能運行,需要啟動如下3個子進程:
ps:parameter server。
master:訓練過程,負責寫Summary、儲存Checkpoint及定期進行Evaluation。
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 # cluster spec 叢集配置。 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)
步驟三:使用TensorBoard觀察訓練過程
在pascal_resnet50_rfcn_model下儲存了模型的Checkpoint和Event File,執行如下命令擷取登入連結後,使用瀏覽器開啟TensorBoard。在TensorBoard頁面查看loss及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/loss/rcnn_cls:表示分類loss。
loss/loss/rcnn_reg:表示迴歸loss。
loss/loss/regularization_loss:表示正則loss。
loss/loss/rpn_cls:表示RPN(Region Proposal Network)的分類loss。
loss/loss/rpn_reg:表示RPN(Region Proposal Network)的迴歸loss。
測試mAP上圖中分別使用了PascalBoxes07和PascalBoxes作為Metric,其中PascalBoxes07是論文中常用的Metric。
步驟四:評估及測試
訓練完成後,您可以測試或評估訓練結果:
首先,執行以下命令安裝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 a image file path detect_results = easy_vision.predict(easy_vision.RFCN_SAMPLE_CONFIG, test_filelist=test_filelist)
其中
filelist.txt
檔案包含了圖片的本地存放路徑,每個路徑獨佔一行。detect_results
包含了eval_data中每張圖片的測試結果,格式為[detection_boxes, box_probability, box_class],分別指檢測到的物體位置、Probability及類別。評估結果。
import easy_vision eval_metrics = easy_vision.evaluate(easy_vision.RFCN_SAMPLE_CONFIG)
其中
eval_metrics
包含了PascalBoxes07 Metric、PascalBoxes Metric、global_step及訓練loss(loss、loss/loss/rcnn_cls、loss/loss/rcnn_reg、 loss/loss/rpn_cls、loss/loss/rpn_reg及loss/loss/total_loss)。具體如下:PascalBoxes07 Metric
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 Metric
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和loss
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
步驟五:匯出模型
通過如下指令碼將模型匯出為SaveModel格式。
import easy_vision
easy_vision.export(export_dir, pipeline_config_path, checkpoint_path)
該程式會在export_dir路徑下,以當前Unix時間戳記建立模型目錄,並將Checkpoint匯出為SaveModel儲存在該目錄。
步驟六:評估SaveModel
評估已匯出的SavedModel,Metric會列印在控制台中。
from easy_vision.python.main import predictor_evaluate
predictor_evaluate(predictor_eval_config)
其中predictor_eval_config
表示Proto文檔,詳情請參見Protocol Documentation,您也可以參考以下範例:
步驟七:搭建服務
將匯出的SaveModel模型存放至OSS,並將其部署為服務,詳情請參見建立服務。