本文为您介绍如何使用深度学习框架TensorFlow,快速搭架图像识别的预测模型。

前提条件

背景信息

随着互联网发展,产生了大量图片及语音数据。如何有效利用这些非结构化数据,一直是困扰数据挖掘工程师的一道难题。主要原因包括:
  • 通常需要使用深度学习算法,上手门槛高。
  • 通常需要依赖GPU计算引擎,计算资源费用高。

PAI-Studio已经预置了使用深度学习框架实现图片分类的模板,您可以直接从模板创建实验,并将其复用到图片鉴黄、人脸识别及物体检测等领域。

数据集

本实验使用CIFAR-10数据集,该数据集包含6万张像素为32*32的彩色图片,共10个类别,分别为飞机、汽车、鸟、毛、鹿、狗、青蛙、马、船及卡车,如下图所示。您可以下载该数据集及相关代码,详情请参见CIFAR 10案例TF图片分类数据集
使用过程中将该数据集拆分为训练数据集(5万张图片)和预测数据集(1万张图片)。其中5万张图片的训练数据集又被拆分为5个data_batch,1万张图片的预测数据集组成test_batch,如下图所示。数据源

数据准备

将本实验的数据集和相关代码上传至OSS的Bucket路径。例如,在OSS的Bucket下创建aohai_test文件夹及四个子文件夹,如下图所示。数据集在OSS的层级每个文件夹的作用如下:
  • check_point:存储实验生成的模型。
    说明 从PAI-Studio模板创建实验后,必须手动将TensorFlow组件的checkpoint输出目录/模型输入目录参数配置为已有的OSS文件夹路径,整个实验才能运行。本实验中,将checkpoint输出目录/模型输入目录配置为check_point文件夹路径。
  • cifar-10-batches-py:存储训练数据集和预测数据集对应的数据源文件cifar-10-batcher-py和预测集文件bird_mount_bluebird.jpg
  • train_code:存储训练数据,即cifar_pai.py
  • predict_code:存储cifar_predict_pai.py

使用TensorFlow实现图片分类

  1. 进入PAI-Studio控制台。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择模型开发和训练 > Studio-可视化建模
    3. PAI可视化建模页面,单击进入机器学习进入机器学习
  2. 构建实验。
    1. 在PAI-Studio控制台的左侧导航栏,单击首页
    2. 模板列表,单击Tensorflow图片分类下的从模板创建
    3. 新建实验对话框,配置参数(可以全部使用默认参数)。
      参数 描述
      名称 输入TensorFlow图片分类
      项目 不支持修改。
      描述 输入使用TensorFlow实现图片分类
      位置 选择我的实验
    4. 单击确定
    5. 可选:等待大约十秒钟,在PAI-Studio控制台的左侧导航栏,单击实验
    6. 可选:我的实验下,单击TensorFlow图片分类_XX
      其中我的实验为已配置的实验位置TensorFlow图片分类_XX为已配置的实验名称_XX为系统自动添加的实验序号)。
    7. 系统根据预置的模板,自动构建实验,如下图所示。
      TF图片分类实验
      区域 描述
      训练数据,系统已自动配置了本实验的训练数据集路径。如果使用其他数据集,只需单击画布中的读OSS数据-1,在右侧IO/字段设置面板,将OSS数据路径配置为存储训练数据的OSS路径。
      预测数据,系统已自动配置了本实验的预测数据集路径。如果使用其他数据集,只需单击画布中的读OSS数据-2,在右侧IO/字段设置面板,将OSS数据路径配置为存储预测数据的OSS路径。
      使用TensorFlow训练模型,只需要手动配置checkpoint输出目录/模型输入目录,其他参数使用默认值即可。该组件的参数与OSS路径下的文件对应关系如下:
      • Python代码文件:配置为OSS路径中的cifar_pai.py
      • OSS数据源目录:配置为OSS路径中的cifar-10-batches-py文件夹,系统会自动从上游读OSS数据-1节点同步数据。
      • checkpoint输出目录/模型输入目录:配置为OSS路径中的check_point文件夹,用于存储输出模型。
      生成预测结果,只需要手动配置checkpoint输出目录/模型输入目录,其他参数使用默认值即可。该组件的参数与OSS路径下的文件对应关系如下:
      • Python代码文件:配置为OSS路径中的cifar_predict_pai.py
      • OSS数据源目录:配置为OSS路径中的cifar-10-batches-py文件夹,系统会自动从上游读OSS数据-2节点同步数据。
      • checkpoint输出目录/模型输入目录:需要与TensorFlow训练组件的模型输出目录保持一致,即配置为OSS路径中的check_point文件夹。
  3. 运行实验并查看输出结果。
    1. 单击画布上方的运行
    2. 实验运行结束后,右键单击画布中的TensorFlow-2,在快捷菜单,单击查看数据,即可查看预测结果。

训练代码解析

针对cifar_pai.py文件中的关键代码进行解析:
  • 构建CNN图片训练模型
    network = input_data(shape=[None, 32, 32, 3],
                             data_preprocessing=img_prep,
                             data_augmentation=img_aug)
        network = conv_2d(network, 32, 3, activation='relu')
        network = max_pool_2d(network, 2)
        network = conv_2d(network, 64, 3, activation='relu')
        network = conv_2d(network, 64, 3, activation='relu')
        network = max_pool_2d(network, 2)
        network = fully_connected(network, 512, activation='relu')
        network = dropout(network, 0.5)
        network = fully_connected(network, 10, activation='softmax')
        network = regression(network, optimizer='adam',
                             loss='categorical_crossentropy',
                             learning_rate=0.001)
  • 训练生成模型model.tfl
        model = tflearn.DNN(network, tensorboard_verbose=0)
        model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=(X_test, Y_test),
                  show_metric=True, batch_size=96, run_id='cifar10_cnn')
        model_path = os.path.join(FLAGS.checkpointDir, "model.tfl")
        print(model_path)
        model.save(model_path)

预测代码解析

针对cifar_predict_pai.py文件中的关键代码进行解析。首先读入图片bird_bullocks_oriole.jpg,将其调整为32*32像素大小。然后传入model.predict预测函数评分,返回这张图片对应的十种分类[‘airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’]的权重。最后将权重最高的一个分类作为预测结果返回。
    predict_pic = os.path.join(FLAGS.buckets, "bird_bullocks_oriole.jpg")
    img_obj = file_io.read_file_to_string(predict_pic)
    file_io.write_string_to_file("bird_bullocks_oriole.jpg", img_obj)
    img = scipy.ndimage.imread("bird_bullocks_oriole.jpg", mode="RGB")
    # Scale it to 32x32
    img = scipy.misc.imresize(img, (32, 32), interp="bicubic").astype(np.float32, casting='unsafe')
    # Predict
    prediction = model.predict([img])
    print (prediction[0])
    print (prediction[0])
    #print (prediction[0].index(max(prediction[0])))
    num=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
    print ("This is a %s"%(num[prediction[0].index(max(prediction[0]))]))