在线上业务的内容生产过程中,为了及时识别其中的高风险内容,PAI提供了图像内容风控解决方案。本文介绍如何基于人工智能算法,快速构建符合业务场景的风控模型,助力您快速识别高风险内容,进而对其进行拦截。

背景信息

在诸多生产内容的场景(例如使用图像进行评论、发布短视频、直播等)中,由于生产内容的范围不受限,因此难免出现高风险内容,您需要识别这些高风险内容,并及时拦截。针对该问题,阿里云机器学习PAI提出了如下解决方案,借助人工智能算法,帮助您快速判断风险内容:
  • 解决方案
    1. 基于智能标注(iTAG)平台和PAI数据集管理,对目标场景的图像进行快捷标注和样本管理。
    2. 基于PAI提供的预训练模型,针对自己的图像风控场景,在可视化建模平台PAI-Studio上进行模型Fine-Tune,从而基于Resnet50构建图像分类模型或基于YoloV5构建目标检测模型。
    3. 将模型进行PAI-EAS在线部署,形成完整的端到端流程,从而自动识别生产过程中的风险内容。
  • 方案架构
    图像内容风控解决方案的架构图如下所示。解决方案架构图

前提条件

  • 已开通PAI(Studio、DSW、EAS)后付费,详情请参见开通
  • 已开通AI工作空间,并添加MaxCompute计算资源或DLC计算资源,详情请参见AI工作空间
  • 已开通MaxCompute,用于存储预测数据。关于如何开通MaxCompute,请参见通过查询编辑器使用MaxCompute
  • 已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间
  • 已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组

使用限制

由于OSS不能跨地域访问数据,因此存储数据的OSS Bucket与构建模型的PAI-Studio实验必须在同一地域。

操作流程

基于阿里云机器学习PAI平台,构建图像内容风控解决方案的流程如下:
  1. 准备数据

    首先将原始图片数据存储在OSS,然后利用PAI数据集管理将原始数据扫描生成索引文件,最后通过智能标注(iTAG)进行数据标注,从而获得标注结果数据集,用于后续的模型训练。

    PAI提供了原始数据集,您可以直接使用它进行数据准备。关于数据集的下载方式,请参见内容风控领域的图像分类数据集内容风控领域的目标检测数据集

  2. 构建用于图像内容风控的模型。
    在可视化建模平台PAI-Studio中,基于预训练模型,您可以构建Resnet50图像分类模型或YoloV5目标检测模型进行风险识别。实际应用中,您需要结合业务场景选择构建合适的模型:
    • 构建图像分类模型

      如果您的业务场景是将图像整体进行风险类别分类,则构建图像分类模型。

    • 构建目标检测模型

      如果您的业务场景是将图像中的某些高风险的实体进行框选检测,则构建目标检测模型。

  3. 部署及调用模型服务

    通过模型在线服务PAI-EAS,您可以将训练好的内容风控模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。

准备数据

  1. 将原始图片分为训练数据集和测试数据集,分别上传至已创建的OSS Bucket。关于如何将文件上传至OSS,请参见上传文件
  2. 利用PAI数据集管理将原始数据扫描生成.manifest索引文件,详情请参见通过扫描文件夹的方式注册数据集
  3. 通过智能标注(iTAG)管理员控制台,创建标注任务,详情请参见创建标注任务
  4. 通过智能标注(iTAG)标注员控制台,进行数据标注,详情请参见标注图像(打标、质检及验收)
  5. 智能标注(iTAG)页面的任务中心页签,单击标注完成的任务操作列下的获取标注结果,得到存放在指定OSS目录下的标注结果数据集。

构建图像分类模型

  1. 进入可视化建模(Studio)页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择模型开发和训练 > 可视化建模(Studio2.0)
  2. 基于实验模板,创建图像分类实验。
    1. 可视化建模(Studio)页面,单击实验模板页签。
    2. 单击CV页签。
    3. 图像分类区域,单击创建创建图像分类实验
    4. 新建模板对话框,先输入实验名称描述、选择绑定的AI工作空间和实验存放的位置,再单击确定即可创建实验。
  3. 进入实验,并配置组件参数。
    1. 可视化建模(Studio)页面,单击实验列表页签。
    2. 实验列表页面,选中刚才创建好的模板实验,并单击进入实验
    3. 系统根据预置的模板,自动构建实验,如下图所示。
      图像分类实验模板
      区域 描述
      配置实验的数据集,即配置读OSS数据组件的OSS数据路径参数为标注结果数据集的OSS路径。例如oss://pai-online-shanghai.oss-cn-shanghai.aliyuncs.com/ev_demo/图像智能审核检测标注_1626960686929.manifest,该数据集是PAI在华东2(上海)提供的标注好的数据集,您可以直接使用。
      说明 由于OSS不能跨地域访问,因此使用该数据集构建模型时,您必须在华东2(上海)构建相关实验。
      将数据集拆分为图像分类所需的训练集和测试集。数据转tfrecord组件的配置详情请参见下文的表 1
      配置图像分类模型训练的参数。图像分类训练组件的配置详情请参见下文的表 2
      配置用于模型预测的输入数据集。
      您需要先通过MaxCompute客户端的Tunnel命令将预测的输入数据集上传至MaxCompute,再将读数据表组件的表名参数配置为该MaxCompute表。关于MaxCompute客户端的安装及配置请参见MaxCompute客户端(odpscmd),关于Tunnel命令详情请参见Tunnel命令。本案例使用的示例命令如下所示。
      # 建表语句。
      CREATE TABLE cv_risk_train(url STRING);
      # 上传语句。
      tunnel upload /Users/tongxin/xxx/cv_risk_train.csv cv_risk_train;
      PAI提供了公开可访问的预测数据表pai_online_project.pascal_predict_hz,您可以直接使用。该预测数据集的内容如下图所示。预测数据表
      使用训练好的图像分类模型对预测数据集进行预测。对于通用图片预测组件,您需要配置如下参数,其他参数使用实验模板中配置的默认值即可:
      • 选择数据来源Table
      • 选择模型类型classifier
      • 选择图片列名为区域④中MaxCompute表中存储图片地址的列,本案例选择为url列。
      • 选择保留列名图片列名,便于展示预测结果。
      将预测的结果写入数据表中。例如写入test_image_inspection_cls中,即将写数据表组件的数据表名参数配置为test_image_inspection_cls
      表 1. 数据转tfrecord组件配置
      页签 参数 描述 本案例的示例值
      字段设置 转换配置文件路径 转化配置文件的OSS路径。在PAI-Studio中无需使用该配置文件。 无需填写
      输出tfrecord路径 组件运行成功后,系统会自动在该路径下生成训练集和测试集。 oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/test/convert_img_inspect_cls
      输出tfrecord前缀 自定义输出TFRecord文件名称的前缀。 img_cls
      参数设置 转换数据用于何种模型训练 数据转tfrecord组件的输出数据可以用于以下类型的模型训练:
      • CLASSIFICATION :图像分类或多标签分类
      • DETECTION:物体检测
      • SEGMENTATION:语义分割
      • POLYGON_SEGMENTATION:多边形语义分割
      • INSTANCE_SEGMENTATION:实体分割
      • TEXT_END2END:端到端OCR
      • TEXT_RECOGNITION:单行文字识别
      • TEXT_DETECTION :文字检测
      • VIDEO_CLASSIFICATION :视频分类
      CLASSIFICATION
      类别列表文件路径 类别列表文件的OSS路径,类别列表文件的示例请参见图像分类类别列表文件 oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/ev_demo/图像审核-分类标注_class.txt
      测试数据分割比例 测试数据分割比例。如果设置为0,则所有数据转换为训练数据。示例值0.1表示10%的数据作为验证集。 0.1
      图片最大边限制 如果配置了该参数,则大图片会被Resize后存入TFRecord,从而节省存储、提高数据读取速度。 无需填写
      测试图片最大边限制 图片最大边限制,用于配置测试数据。 无需填写
      默认类别名称 默认类别名称。对于在类别列表文件中未找到的类别,系统将其映射到默认类别。 无需填写
      错误类别名称 含有该类别的物体和Box会被过滤,不参与训练。 无需填写
      忽略类别名称 仅用于检测模型,含有该类别的Box会在训练中被忽略。 无需填写
      转换类名称 标注数据的来源类型,支持以下取值:
      • PAI标注格式
      • 亲测标注格式
      • 自监督标注格式
      PAI标注格式
      分隔符 用于标记内容的分隔符。 无需填写
      图片编码方式 TFRecord中图片的编码方式。 jpg
      执行调优 读取并发数 训练过程读取并发数。 10
      写tfrecord并发数 训练过程写TFRecord并发数。 1
      每个tfrecord保存图片数 训练过程每个TFRecord保存的图片数量。 256
      worker个数 训练过程中的Worker数量。 3
      CPU Core个数 训练过程中的CPU Core数量。 800
      memory大小 训练过程中的内存大小,单位为MB。 20000
      表 2. 图像分类组件配置
      页签 参数 描述 本案例的示例值
      字段设置 训练所用oss目录 存储训练模型的OSS目录。 oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/test/test_image_inspection
      训练数据文件oss路径 训练数据集的OSS路径。如果通过上游组件传递训练数据,则无需指定该参数。 无需填写
      评估数据oss路径 评估数据文件的OSS路径。如果通过上游组件传递评估数据,则无需指定该参数。 无需填写
      label_map_path文件oss路径 如果不指定类别列表文件,则使用TFRecords自动识别的类别。 无需填写
      是否使用预训练的模型 建议使用预训练模型,以提高训练模型的精度。
      预训练模型oss路径 如果有自己的预训练模型,则将该参数配置为自己预训练模型的OSS路径。

      如果没有配置该参数,则使用PAI提供的默认预训练模型。

      无需填写
      参数设置 识别模型网络 识别模型的网络名称,系统支持如下主流的识别模型:
      • vgg_16
      • vgg_19
      • inception_v1
      • inception_v2
      • inception_v3
      • inception_v4
      • mobilenet_v1
      • mobilenet_v2
      • resnet_v1_50
      • resnet_v1_101
      • resnet_v1_152
      resnet_v1_50
      分类类别数目 类别标签的数量。 4
      图片resize大小 图片Resize后的大小。 224
      是否使用crop进行数据增强 是否对输入图片进行裁剪。通常建议进行裁剪,以提升模型的训练精度和效率。
      是否针对每个类别单独做评估 在日志中,是否对每个类别进行单独评估,不影响训练结果。
      学习率调整策略 系统支持以下调整策略:
      • exponential_decay:指数衰减,详细请参见exponential_decay
      • polynomial_decay:多项式衰减,详情请参见polynomial_decay。其中num_steps自动设置为总的训练迭代次数,end_learning_rateinitial_learning_rate的千分之一。
      • manual_step:人工指定各阶段的学习率,建议进阶用户使用。通过decay_epochs指定需要调整学习率的迭代轮数,通过learning_rates指定对应迭代轮数使用的学习率。
      exponential_decay
      初始学习率 初始学习率。 0.001
      decay_epoches 学习率迭代过程中,连续两次衰减之间的间隔轮数。 10
      decay_factor 学习率迭代过程的衰减比率。 0.9
      staircase 如果选中该复选框,则按照离散间隔进行学习率衰减,否则按照连续间隔进行学习率衰减。
      训练batch_size 训练的批大小,即单次模型迭代或训练过程中使用的样本数量。 32
      评估batch_size 评估的批大小,即评估时单次模型迭代或训练过程中使用的样本数量。 32
      训练迭代轮数 训练的迭代轮数。 80
      评估数据条目数 训练过程中评估数据条目数。 200
      评估过程可视化显示的样本数目 评估过程可视化显示的样本数量。 64
      保存checkpoint的频率 保存Checkpoint的频率,以Epoch为单位。取值为1表示每完成一次训练就保存一次Checkpoint。 5
      执行调优 优化方法 模型训练的优化方法,支持以下取值:
      • momentum:指sgd
      • adam
      momentum
      读取训练数据线程数 读取训练数据的线程数量。 4
      单机或分布式
      组件运行的引擎,您可以结合实际情况选择。系统支持以下计算引擎:
      结合对训练模型的单机或分布式要求,系统支持以下取值:
      • 单机maxCompute
      • 分布式maxCompute
      • 单机DLC
      • 分布式DLC
      单机maxCompute
      是否使用GPU 训练使用GPU卡的数量,取值100表示使用1张GPU卡。 100

构建目标检测模型

  1. 进入可视化建模(Studio)页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择模型开发和训练 > 可视化建模(Studio2.0)
  2. 基于实验模板,创建目标检测实验。
    1. 可视化建模(Studio)页面,单击实验模板页签。
    2. 单击CV页签。
    3. 基于Yolov5模型的目标检测区域,单击创建。目标检测实验模板
    4. 新建模板对话框,先输入实验名称描述、选择绑定的AI工作空间和实验存放的位置,再单击确定即可创建实验。
  3. 进入实验,并配置组件参数。
    1. 可视化建模(Studio)页面,单击实验列表页签。
    2. 实验列表页面,选中刚才创建好的模板实验,并单击进入实验
    3. 系统根据预置的模板,自动构建实验。您查看的实验如下图所示。
      目标检测实验
      区域 描述
      配置实验的训练数据集,即配置读OSS数据-训练集组件的OSS数据路径参数为标注结果数据集中训练集的OSS路径。例如oss://pai-online-shanghai.oss-cn-shanghai.aliyuncs.com/ev_demo/risk_det_train.manifest,该数据集是PAI在华东2(上海)提供的标注好的训练集,您可以直接使用。
      说明 由于OSS不能跨地域访问,因此使用该数据集构建模型时,您必须在华东2(上海)构建相关实验。
      配置实验的评估数据集,即配置读OSS数据-评估集组件的OSS数据路径参数为标注结果数据集中评估集的OSS路径。例如oss://pai-online-shanghai.oss-cn-shanghai.aliyuncs.com/ev_demo/risk_det_dev.manifest,该数据集是PAI在华东2(上海)提供的标注好的评估集,您可以直接使用。
      说明 由于OSS不能跨地域访问,因此使用该数据集构建模型时,您必须在华东2(上海)构建相关实验。
      配置实验数据的标签列表文件,即配置读OSS数据-标签列表组件的OSS数据路径参数为标签列表文件的OSS路径。例如oss://pai-online-shanghai.oss-cn-shanghai.aliyuncs.com/ev_demo/图像审核-检测标注_class.txt。您可以参考示例标签列表文件(下载图像检测的标签列表文件示例),构建自己的标签列表文件,
      配置目标检测模型训练的参数。图像检测训练组件的配置详情请参见下文的表 3
      配置模型预测需要的输入数据集。
      您需要先通过MaxCompute客户端的Tunnel命令将预测的输入数据集上传至MaxCompute,再将读数据表组件的表名参数配置为该MaxCompute表。关于MaxCompute客户端的安装及配置请参见MaxCompute客户端(odpscmd),关于Tunnel命令详情请参见Tunnel命令。本案例使用的示例命令如下所示。
      # 建表语句。
      CREATE TABLE cv_risk_train(url STRING);
      # 上传语句。
      tunnel upload /Users/tongxin/xxx/cv_risk_train.csv cv_risk_train;
      PAI提供了公开可访问的预测数据表pai_online_project.pascal_predict_hz,您可以直接使用。该预测数据集的内容如下图所示。预测数据表
      使用训练好的图像分类模型对预测数据集进行预测。对于通用图片预测组件,您需要配置如下参数,其他参数使用实验模板中配置的默认值即可:
      • 选择数据来源Table
      • 选择模型类型yolo5预测
      • 选择图片列名为区域⑤中MaxCompute表中存储图片地址的列,本案例选择为url列。
      • 选择保留列名图片列名,便于展示预测结果。
      将预测的结果写入数据表中。例如写入yolov5_predict中,即将写数据表组件的数据表名参数配置为yolov5_predict
      表 3. 图像检测组件配置
      页签 参数 描述 本案例的示例值
      字段设置 训练模型类型 训练所选的模型类型,支持以下取值:
      • SSD
      • FasterRCNN
      • RFCN
      • YOLOV5:最新推出的模型网络,拥有精度高、训练快的优势。
      YOLOV5
      训练所用oss目录 存储训练模型的OSS目录。 oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/test/risk_det_yolov5/ckpt/
      训练数据文件oss路径 训练数据文件的OSS路径。如果通过上游组件传递训练数据,则无需指定该参数。 无需填写
      评估数据oss路径 评估数据文件的OSS路径。如果通过上游组件传递评估数据,则无需指定该参数。 无需填写
      类别列表文件OSS路径 如果不指定类别列表文件,则使用TFRecords自动识别的类别。 无需填写
      YOLOV5数据源格式 标注数据的来源类型,支持PAI标注格式Pascal VOC格式YOLOV5原生格式三种检测数据,您需要结合实际情况选择。 PAI标注格式
      预训练模型oss路径 如果您有自己的预训练模型,则填入预训练模型的OSS路径,以提高训练模型的精度。 无需填写
      参数设置 YOLOV5检测模型使用的模型大小 选择YOLOV5检测模型使用的模型大小和网络结构。 yolov5s
      检测类别数目 数据中类别标签的数目。如果没有配置该参数,则默认从数据集中分析得到类别数量。 3
      yolov5输入图片大小 图片大小等于图片的高度乘以宽度,取值为整数。 640
      初始学习率 网络训练的学习率。 0.01
      训练batch_size 训练的批大小,即单次模型迭代或训练过程中使用的样本数量。目 32
      评估batch_size 评估的批大小,即单次模型迭代或训练过程中使用的样本数量。 30
      总的训练迭代epoch轮数 总的训练迭代轮数。 50
      保存checkpoint的频率 保存模型文件的频率。取值1表示对所有训练数据都进行一次迭代。 1
      执行调优 读取训练数据线程数 读取训练数据的线程数。 4
      单机或分布式(maxCompute/DLC) 运行模式,YOLOV5模型仅支持分布式DLC 分布式DLC
      worker个数 用于计算的Worker数量。 1
      cpu机型选择 计算资源的CPU机型。 32vCPU+128GB Mem-ecs.g6.8xlarge
      gpu机型选择 计算资源的GPU机型。 48vCPU+368GB Mem+4xv100-ecs.gn6e-c12g1.12xlarge

部署及调用模型服务

通过模型在线服务PAI-EAS,您可以将训练好的内容风控模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。

  1. 进入PAI EAS模型在线服务页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择模型部署 > 模型在线服务(EAS)
  2. 部署模型服务。
    1. PAI EAS模型在线服务页面,单击模型上传部署
    2. 资源和模型面板,配置参数(此处仅介绍与本案例相关的核心参数配置方法,其他参数的解释请参见控制台上传部署),并单击下一步
      参数 描述
      自定义模型名称 模型的名称,建议结合实际业务进行命名,以区分不同的模型服务。
      资源组种类 建议使用专属资源组部署模型服务,从而避免公共资源组资源有限时导致的服务排队。关于如何创建专属资源组,请参见专属资源组
      资源种类 如果您选择资源组种类公共资源组,则需要选择资源种类GPU
      Processor种类 选择EasyVision
      模型类型 如果部署图像分类模型,则选择图像分类

      如果部署目标检测模型,则选择目标检测和实例分割

      模型文件 本案例中训练好的模型均存储在OSS中,因此选择OSS文件导入
      如果部署图像分类模型,则选择训练所用oss目录export文件夹中的模型文件夹(其中包含assets文件夹、variables文件夹及saved_model.pb)。例如,对于下图中的模型目录结构,您需要将OSS路径选择到/1627044625/目录。模型文件

      如果部署目标检测模型,则选择训练所用oss目录下的模型文件即可。例如选择epoch_50_export.pt

    3. 部署详情及配置确认面板,配置模型服务占用资源的相关参数。
      参数 描述
      实例数 本案例配置为1。实际应用时建议配置多个服务实例,以避免单点部署带来的风险。
      卡数 本案例配置为1。实际应用时根据情况配置。
      核数 本案例配置为1。实际应用时根据情况配置。
      内存数(M) 本案例配置为16384 MB。实际应用时根据情况配置。
    4. 单击部署,等待一段时间即可完成模型部署。
  3. 查看模型服务的公网地址和访问Token。
    1. PAI EAS模型在线服务页面,单击目标服务服务方式列下的调用信息
    2. 调用信息对话框的公网地址调用页签,查看公网调用的访问地址Token
  4. 使用脚本进行批量调用。
    1. 创建调用模型服务的Python脚本。
      • 图像分类的Python脚本cv_risk_cls.py
        import requests
        import base64
        import sys
        import json
        resp = requests.get('https://tongxin-lly.oss-cn-hangzhou.aliyuncs.com/iTAG/pic_public/1.jpg')
        ENCODING = 'utf-8'
        datas = json.dumps( {
                    "image": base64.b64encode(resp.content).decode(ENCODING),
                    })
        head = {
           "Authorization": "YjdhYWRhYWZhYzNjZTFlMDZlNjAxxxxxxxxxxxxxxxxxxxx" # 服务的访问Token需要替换为实际值。
        }
        for x in range(0,1):
            # 下面的服务公网访问地址需要替换为实际值。
            resp = requests.post("http://1664081855183111.cn-shanghai.pai-eas.aliyuncs.com/api/predict/cv_risk_cls001", data=datas, headers=head)
            print(resp.text)
        print("test endding")
      • 目标检测的Python脚本cv_risk_det.py
        import requests
        import base64
        import sys
        import json
        img_file = './xxx.jpg'
        ENCODING = 'utf-8'
        datas = json.dumps( {
                    "image": base64.b64encode(open(img_file, 'rb').read()).decode(ENCODING),
                    })
        head = {
           "Authorization": "NGVkMTVmZjNlNzA3ZGVlNWIzxxxxxxxxxxxxxx" # 服务的访问Token需要替换为实际值。
        }
        # 下面的服务公网访问地址需要替换为实际值。
        r = requests.post("http://1664081xxxxxxxxx.cn-shanghai.pai-eas.aliyuncs.com/api/predict/cv_risk_obj001", data=datas, headers=head)
        print(r.text)
    2. 将图像分类或目标检测的Python脚本上传至您的任意环境,并在脚本上传后的当前目录执行如下调用命令。
      $ python3 <cv_risk_xxx.py>
      其中<cv_risk_xxx.py>需要替换为实际的Python脚本名称。
      调用服务后,得到的预测结果示例如下图所示。预测结果示例
  5. 监控服务指标。
    调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。
    1. PAI EAS模型在线服务页面,单击已调用服务服务监控列下的服务监控图标图标。
    2. 服务监控页签,即可查看模型调用的指标水位。
      从下面的服务监控水位图中可以看到,本案例部署的模型时延在50 ms左右。您自己的模型时延以实际为准。模型时延