全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
阿里云机器学习

TensorFlow实现图像分类

更新时间:2018-05-07 13:45:24

背景

随着互联网的发展,产生了大量的图片以及语音数据,如何将这部分非结构化数据有效地利用起来,一直是困扰数据挖掘工程师的难题。首先,解决非结构化数据问题通常要使用深度学习算法,上手门槛高。其次,对于这部分数据的处理,往往需要依赖GPU计算引擎,计算资源代价大。
本文档通过阿里云机器学习产品,使用Tensorflow深度学习框架,快速搭建了图像识别的预测模型。整个流程只需要半小时,就可以实现对下面这幅图片的识别,系统会返回“鸟”。这种使用深度学习实现图片识别的案例也可以用在图片检黄、人脸识别、物体检测等各个领域。

数据集介绍

本案例数据集及相关代码下载地址:https://help.aliyun.com/document_detail/51800.html?spm=5176.doc50654.6.564.mS4bn9

CIFAR-10数据集:包含6万张像素为32*32的彩色图片,分成10个类别,分别是飞机、汽车、鸟、毛、鹿、狗、青蛙、马、船、卡车。数据集截图如下。

数据源在使用过程中被拆分成两部分,其中5万张用于训练,1万张用于测试。5万张训练数据又被拆分成5个data_batch,1万张测试数据组成test_batch。最终数据源如下图所示。

数据探索流程

搭建实验前,需要开通阿里云机器学习产品的GPU使用权限,并且开通OSS,用于存储数据。

机器学习产品控制台:https://data.aliyun.com/product/learn?spm=a21gt.99266.416540.112.IOG7OU
OSS控制台:https://www.aliyun.com/product/oss?spm=a2c0j.103967.416540.50.KkZyBu

1. 数据源准备

  1. 下载本案例提供的相关数据和代码,并解压缩。

  2. 进入OSS对象存储,创建OSS存储空间,即OSS Bucket(详细请参考OSS产品文档)。

  3. 在OSS Bucket中新建目录,本案例创建了“aohai_test”文件夹,并在这个目录下建立了如下4个文件夹目录。

    每个文件夹的作用如下:

    • check_point:用来存放实验生成的模型。
    • cifar-10-batches-py:用来存放训练数据和预测集数据,对应数据源的cifar-10-batcher-py文件和bird_mount_bluebird.jpg文件。
    • predict_code:用来存放预测代码文件,对应数据源的cifar_predict_pai.py文件。
    • train_code:用来存放训练代码文件,对应数据源的cifar_pai.py文件。
  4. 将已经下载好的数据和代码文件上传到OSS Bucket的对应目录下。

2. OSS访问授权配置

进入阿里云机器学习平台,单击设置,配置OSS的访问授权,如下图所示,详细请参见深度学习文档的“读OSS Bucket”章节。

3. 模型训练

  1. 在控制台左侧的组件区域中拖拽“读OSS Bucket”和“Tensorflow”组件并链接,完成后配置“Tensorflow”组件的参数,如下图所示。

    参数说明如下:

    • Python代码文件:OSS中的cifar_pai.py文件。
    • 数据源目录:OSS中的cifar-10-batches-py文件夹。
    • 输出目录:OSS中的check_point文件夹。
  2. 单击运行,实验开始训练。
    可以灵活调节底层的GPU资源。支持在界面端进行设置,如下图所示。也支持通过代码文件进行设置,代码编写需要符合Tensorflow的多卡规范。

4. 模型训练代码解析

“cifar_pai.py”文件中的关键代码说明如下:

  • 构建CNN图片训练模型
  1. network = input_data(shape=[None, 32, 32, 3],
  2. data_preprocessing=img_prep,
  3. data_augmentation=img_aug)
  4. network = conv_2d(network, 32, 3, activation='relu')
  5. network = max_pool_2d(network, 2)
  6. network = conv_2d(network, 64, 3, activation='relu')
  7. network = conv_2d(network, 64, 3, activation='relu')
  8. network = max_pool_2d(network, 2)
  9. network = fully_connected(network, 512, activation='relu')
  10. network = dropout(network, 0.5)
  11. network = fully_connected(network, 10, activation='softmax')
  12. network = regression(network, optimizer='adam',
  13. loss='categorical_crossentropy',
  14. learning_rate=0.001)
  • 训练生成模型名为model的一系列文件,这些文件组成了TF的预测模型
  1. model = tflearn.DNN(network, tensorboard_verbose=0)
  2. model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=(X_test, Y_test),
  3. show_metric=True, batch_size=96, run_id='cifar10_cnn')
  4. model_path = os.path.join(FLAGS.checkpointDir, "model.tfl")
  5. print(model_path)
  6. model.save(model_path)

5. 日志查看

  1. 实验运行过程中,右键单击“Tensorflow”组件,选择查看日志,结果如下图所示。

  2. 单击上图中的蓝色logview链接,执行以下步骤查看日志。

    1. 打开ODPS Tasks下面的Algo Task
    2. 双击Tensorflow Task
    3. 单击左侧的MWorker,选择All,如下图所示。

    4. 单击StdOut下方的小图标,模型训练日志被实时地打印出来,如下图所示。

    实验运行过程中会不断地打印日志,也可以使用print函数在代码中打印关键信息,结果会显示在日志中。可以通过日志中的“acc”参数查看本案例模型训练的准确度。

6. 结果预测

在控制台左侧的组件区域中拖拽一个“Tensorflow”组件用于预测,并配置参数,如下图所示。

参数说明如下:

  • Python代码文件:OSS中的cifar_predict_pai.py文件。
  • 数据源目录:OSS中的cifar-10-batches-py文件夹,用来读取bird_mount_bluebird.jpg文件。
  • 输出目录:读取OSS中的check_point文件夹下模型训练生成的model.tfl文件。

预测的图片是存储在“checkpoint”文件夹下的图。

可通过日志查看结果,如下图所示。

7. 预测代码解析

部分预测代码说明如下:

  1. predict_pic = os.path.join(FLAGS.buckets, "bird_bullocks_oriole.jpg")
  2. img_obj = file_io.read_file_to_string(predict_pic)
  3. file_io.write_string_to_file("bird_bullocks_oriole.jpg", img_obj)
  4. img = scipy.ndimage.imread("bird_bullocks_oriole.jpg", mode="RGB")
  5. # Scale it to 32x32
  6. img = scipy.misc.imresize(img, (32, 32), interp="bicubic").astype(np.float32, casting='unsafe')
  7. # Predict
  8. prediction = model.predict([img])
  9. print (prediction[0])
  10. print (prediction[0])
  11. #print (prediction[0].index(max(prediction[0])))
  12. num=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
  13. print ("This is a %s"%(num[prediction[0].index(max(prediction[0]))]))
  1. 读入图片“bird_bullocks_oriole.jpg”,将图片像素调整为32*32。
  2. 将该图片作为参数,传入model.predict预测函数中进行评分。
  3. 最终返回这张图片对应的十种分类[‘airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’]的权重,选择权重最高的一项作为预测结果返回。

注意:因为模型训练存在随机性,所以不保证每次训练出的模型对于预测图片都可以返回准确结果,需要不断调试对应参数才能达到稳定效果,本案例比较简单,仅供参考。

本文导读目录