一、概述

通过之前两篇文章的学习,我们应该已经了解了多元分类的工作原理,图片的分类其流程和之前完全一致,其中最核心的问题就是特征的提取,只要完成特征提取,分类算法就很好处理了,具体流程如下:

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_机器学习

之前介绍过,图片的特征是不能采用像素的灰度值的,这部分原理的台阶有点高,还好可以直接使用通过TensorFlow训练过的特征提取模型(美其名曰迁移学习)。

模型文件为:tensorflow_inception_graph.pb

二、样本介绍

 我随便在网上找了一些图片,分成6类:男孩、女孩、猫、狗、男人、女人。tags文件标记了每个文件所代表的类型标签(Label)。

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_.net_02

通过对这六类图片的学习,期望输入新的图片时,可以判断出是何种类型。

三、代码

 全部代码:

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_tensorflow_03

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_.net_04

四、分析

 1、数据处理通道

可以看出,其代码流程与结构与上两篇文章介绍的完全一致,这里就介绍一下核心的数据处理模型部分的代码:


机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_机器学习_05

MapValueToKey与MapKeyToValue之前已经介绍过了;
LoadImages是读取文件,输入为文件名、输出为Image;
ResizeImages是改变图片尺寸,这一步是必须的,即使所有训练图片都是标准划一的图片也需要这个操作,后面需要根据这个尺寸确定容纳图片像素信息的数组大小;
ExtractPixels是将图片转换为包含像素数据的矩阵;
LoadTensorFlowModel是加载第三方模型,ScoreTensorFlowModel是调用模型处理数据,其输入为:“input”,输出为:“softmax2_pre_activation”,由于模型中输入、输出的名称是规定的,所以,这里的名称不可以随便修改。
分类算法采用的是L-BFGS最大熵分类算法,其特征数据为TensorFlow网络输出的值,标签值为"LabelTokey"。

2、验证过程

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_数据_06

 两个实体类代码:

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_数据_07


3、验证结果
我在网络上又随便找了20张图片进行验证,发现验证成功率是非常高的,基本都是准确的,只有两个出错了。

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_tensorflow_08

上图片被识别为girl(我认为是Woman),这个情有可原,本来girl和worman在外貌上也没有一个明确的分界点。

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_.net_09

上图被识别为woman,这个也情有可原,不解释。

需要了解的是:不管你输入什么图片,最终的结果只能是以上六个类型之一,算法会寻找到和六个分类中特征最接近的一个分类作为结果。


4、调试
注意看实体类的话,我们只提供了三个基本属性,如果想看一下在学习过程中数据是如何处理的,可以给ImageNetPrediction类增加一些字段进行调试。
首先我们需要看一下IDateView有哪些列(Column)

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_分类算法_10


 将我们要调试的列加入到实体对象中去,特别要注意数据类型。

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_分类算法_11


 查看数据集详细信息:

机器学习框架ML.NET学习笔记【6】TensorFlow图片分类_机器学习_12