PAI-EasyVision(视觉智能增强算法包)提供多种模型的训练及预测功能,旨在帮助计算机视觉应用开发者方便快捷地构建视觉模型并应用于生产。本文以目标检测为例,为您介绍如何在PAI-DSW中使用PAI-EasyVision。

前提条件

需要准备如下安装环境:
  • Python版本:Python 2.7或Python 3.4及其以上版本。
  • TensorFlow社区版本:TensorFlow 1.8及其以上版本或PAI-TF。

步骤一:准备数据

  1. 通过如下任何一种方式,下载Pascal数据集(在当前目录)。
    #方法一:使用OSSCMD命令下载数据集。
    osscmd downloadallobject oss://pai-vision-data-hz/data/voc0712_tfrecord/ data/voc0712_tfrecord --host=oss-cn-zhangjiakou.aliyuncs.com
    
    #方法二:使用ossutil工具下载数据集,需要在配置文件中设置host为oss-cn-zhangjiakou.aliyuncs.com。
    ossutil  cp -r  oss://pai-vision-data-hz/data/voc0712_tfrecord/ data/voc0712_tfrecord
  2. 下载resnet50预训练模型(在当前目录)。
    mkdir -p pretrained_models/
    ossutil 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 successfuly' % k)
    
        if task_finish_cnt >= num_worker:
          break
        time.sleep(1)

步骤三:使用TensorBoard观察训练过程

在pascal_resnet50_rfcn_model下保存了模型的Checkpoint和Event File,通过TensorBoard可以查看loss及mAP等相关信息,示例如下。
tensorboard --port 6006 --logdir pascal_resnet50_rfcn_model  [ --host 0.0.0.0 ]
TensorBoard查看的相关信息如下:
  • 训练loss训练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测试mAP上图中分别使用了PascalBoxes07和PascalBoxes作为Metric,其中PascalBoxes07是论文中常用的Metric。

步骤四:评估及测试

训练完成后,您可以测试或评估训练结果:
  • 在其它数据集上进行测试,得到每张图的检测结果。
    import easy_vision
    detect_results = easy_vision.test(easy_vision.RFCN_SAMPLE_CONFIG)
    其中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,并将其部署为服务,详情请参见部署模型