工程的博客

卷积神经网络实现对汽车的分类

分享这篇文章

卷积神经网络(CNN)先进的神经网络结构,主要用于计算机视觉任务。CNN可以应用于许多不同的任务,如图像识别、物体定位和变化检测。最近,我们的合作伙伴数据的见解获得一个具有挑战性的请求从一个主要汽车公司:开发一个计算机视觉应用程序可以识别汽车模型在给定的图像。考虑到不同的车型会显得非常相似,任何车都可以根据周围环境截然不同的角度拍摄,这样一个任务是,直到最近,根本不可能的。


人工神经网络,与多层之间的输入和输出层,在输入图像,输出是一个汽车模型分类。
然而,从2012年左右开始,深度学习革命能处理这样的问题。而不是解释的概念车,电脑可以反复研究图片和学习这些概念本身。在过去的几年中,额外的人工神经网络的创新导致了人工智能与人类能够进行图像分类任务的准确性。建立这样的发展我们可以火车上深CNN对汽车的模型进行分类。斯坦福大学汽车上的神经网络训练数据集,其中包含超过16000个汽车的照片,包括196个不同的模型。随着时间的推移,我们可以看到的准确性预测开始改善,随着神经网络学习的概念车,以及如何区分不同的模型。

人工神经网络,与多层之间的输入和输出层,在输入图像,输出是一个汽车模型分类。
人工神经网络,与多层之间的输入和输出层,在输入图像,输出是一个汽车模型分类。

同我们的合作伙伴,我们一起建立一个端到端使用Apache火花™和机器学习管道考拉数据预处理,KerasTensorflow模型的训练,MLflow跟踪的模型和结果Azure毫升REST服务的部署。这个设置在Azure砖优化训练网络快速和高效,同时也有助于更快地尝试了很多不同的CNN配置。即使只有几个实践尝试,CNN的准确性达到85%左右。

建立一个人工神经网络对图像进行分类

在本文中,我们概述了一些主要的技术应用于神经网络分成生产。如果你想尝试自己运行的神经网络,包括完整的笔记本用细致的循序渐进的指导,下面可以找到。

这个演示使用公开可用斯坦福大学汽车数据集这是一个更全面的公共数据集,虽然有点过时了,所以你找不到车型2012后(尽管,一旦训练,转移学习可以很容易地使一个新的数据集替换)。提供的数据是通过一个ADLS Gen2存储账户,您可以安装到您的工作空间中。

斯坦福大学汽车数据集用于CNN图像分类展示。

第一步数据预处理的图像被压缩成hdf5文件(一个用于培训和一个用于测试)。这个由神经网络可以读入。完全可以省略这一步,如果你喜欢,hdf5代存储文件的一部分ADLS提供笔记本电脑提供的在这里。

图像增强与考拉

收集的数据的数量和多样性有很大影响结果的一个可以实现深度学习模型。数据增强是一种策略,可以明显提高学习的结果,而不需要实际收集新数据。与不同的种植技术、填充和水平翻转,这是常用的训练神经网络,数据集可以被人为地夸大了增加图像进行训练和测试。

示例数据增加、裁剪、填充,水平翻转,等等,通过使用考拉。

申请增加大型语料库的训练数据可以非常昂贵,特别是当比较不同方法的结果。与考拉很容易尝试现有框架的图像增强在Python中,和扩展过程与多个节点集群上使用数据科学熟悉的熊猫API。

编码Keras ResNet

当你拆开一个CNN,他们组成不同“块”,每一块仅仅代表一组操作适用于一些输入数据。这些模块可以大致分为:

  • 身份:一系列的操作,保持数据的形状不变。
  • 卷积:一系列的操作,减少输入数据的形状较小的形状。

CNN是一系列的身份阻塞和卷积(或ConvBlocks),减少一个输入图像到一个紧凑的群号码。这些生成的数字(如果训练正确)最终应该告诉你一些有用的分类图像。剩余CNN对每一块增加了一个额外的步骤。之前的数据保存为临时变量的操作构成应用块,然后这个临时数据添加到输出数据。一般来说,这个额外的步骤应用于每一块。作为一个例子,下面的图展示了一个简化的CNN检测手写的数字:


CNN例子用来探测手写数字。

有许多不同的神经网络实现方法。更直观的方法之一是通过Keras。Keras提供了一个简单的前端库执行组成神经网络的各个步骤。Keras可以配置为使用Tensorflow后端或Theano后端。在这里,我们将使用一个Tensorflow后端。Keras网络分为多个层次,如下所示。对于我们的网络我们也定义我们的客户实现层。

例子Keras神经网络分解成其组成部分的输入层,卷积层,和最大池层,展示连续图像还原过程用于分类。

规模的层

任何自定义操作,可训练的权重Keras允许你实现自己的层。在处理大量的图像数据,一个可以运行到内存的问题。最初,RGB图像包含整数数据(0 - 255)。当运行在反向传播梯度下降法作为优化的一部分,会发现一个整数梯度不允许足够的精度正确调整网络权值。因此,有必要改变浮动精度。这是可能出现的问题。即使图像缩小到224 x224x3,当我们使用一万训练图像,我们看超过10亿浮点条目。而不是把整个数据集浮点精度,更好的做法是使用一个扩展层,尺度输入数据的一个图像,且仅当它是必要的。这应该是批正常化后应用模型。这种规模的层也参数的参数,可以通过培训学习。

使用这个自定义层还在得分我们必须一起包的类模型。MLflow我们可以实现这个Keras custom_objects字典名称(字符串)映射到与Keras相关联的自定义类或函数模型。MLflow保存这些自定义层使用CloudPickle和恢复时自动加载模型mlflow.keras.load_model ()mlflow.pyfunc.load_model ()

mlflow.keras.log_model(模型,“模型”custom_objects = {“规模”规模:})

跟踪结果MLflow和Azure机器学习

机器学习的发展涉及到软件开发之外的额外的复杂性。有大量的工具和框架很难跟踪实验,再现结果和部署的机器学习模型。一起Azure机器学习可以促进和管理端到端机器学习生命周期使用MLflow可靠地构建、分享和部署使用Azure砖机器学习应用程序。

为了自动跟踪的结果,现有的或新的Azure毫升工作区可以链接到Azure砖工作区。此外,MLflow支持Keras自动对数模型(mlflow.keras.autolog()),使经验几乎毫不费力。

MLflow允许您自动跟踪的结果Azure Keras工作区和无缝地支持自动对数似然模型。

虽然MLflow内置的模型持久性实用程序方便包装模型从Keras等各种流行的ML库,他们不覆盖每一个用例。例如,您可能想要使用一个模型从一个毫升库,没有显式地支持MLflow内置的味道。或者,您可能想要包自定义推理代码和数据来创建一个MLflow模型。幸运的是,MLflow提供了两种解决方案,可用于完成这些任务:自定义Python模型定制的味道

在这种情况下我们要确保我们可以使用一个模型推理引擎,支持从REST API客户端服务请求。我们使用自定义模型基于之前构建的Keras模型接受JSON Dataframe对象,base64编码的图像。

进口mlflow.pyfuncAutoResNet150(mlflow.pyfunc.PythonModel):defpredict_from_picture(自我,img_df):进口cv2作为简历进口numpy作为np进口base64# base64编码的解码图像用于通过http传输img = np.frombuffer (base64.b64decode (img_df [0][0]),dtype = np.uint8)img_res = cv.resize(简历。imdecode (img标记=1),(224年,224年),cv.IMREAD_UNCHANGED)rgb_img = np.expand_dims (img_res,0)
              仅仅= self.keras_model.predict (rgb_img)概率= np。马克斯(仅仅)
              class_id = np.argmax(仅仅)返回{“标签”:self.class_names [class_id] [0][0),“概率”:“{:。4}”格式(概率)}defload_context(自我,上下文):进口scipy.io进口numpy作为np进口h5py进口keras进口cloudpicklekeras.models进口load_model
              自我。结果= []开放(context.artifacts [“cars_meta”),“rb”)作为文件:#加载汽车类文件cars_meta = scipy.io.loadmat(文件)自我。类_names = cars_meta[“class_names”]自我。类_names = np.transpose(self.class_names)开放(context.artifacts [“scale_layer”),“rb”)作为文件:自我。scale_layer = cloudpickle.load(文件)开放(context.artifacts [“keras_model”),“rb”)作为文件:f = h5py.File (file.name“r”)自我。keras_model = load_model(f, custom_objects={“规模”:self.scale_layer})def预测(自我,上下文,model_input):返回self.predict_from_picture (model_input)

在下一步中,我们可以使用这个py_model并将其部署到一个Azure容器实例服务器可以通过MLflow Azure毫升的集成

例子Keras模型部署到Azure容器实例MLflow Azure毫升的集成成为可能。

部署一个图像分类模型在Azure容器实例

现在我们有一个训练有素的机器学习模型,并注册一个模型在我们与MLflow工作区云。作为最后一步,我们想将模型作为web服务部署到Azure容器实例。

web服务是一个图像,在这种情况下,一个码头工人的形象。它封装了得分逻辑和模型本身。在这种情况下,我们使用我们的自定义MLflow模型表示这让我们控制得分的逻辑从REST客户端接受医疗图像,如何响应的形状。

#为建立MLflow Azure毫升集装箱图像模型azure_image azure_model = mlflow.azureml.build_image (model_uri =“{}/ py_model”格式(resnet150_latest_run.info.artifact_uri),image_name =“car-resnet150”,model_name =“car-resnet150”,工作区= ws,同步=真正的)
              webservice_deployment_config = AciWebservice.deploy_configuration ()
              #定义容器规格aci_config = AciWebservice.deploy_configuration (cpu_cores =3.0memory_gb =12.0)
              网络服务= Webservice.deploy_from_image (形象= azure_image,工作区= ws,name =“car-resnet150”,deployment_config = aci_config,覆盖=真正的)
              webservice.wait_for_deployment ()

测试容器实例是一个伟大的解决方案和理解工作流。可伸缩的生产部署,考虑使用Azure Kubernetes服务。有关更多信息,请参见如何部署和在哪里

开始与CNN图像分类

本文和笔记本演示中使用的主要技术建立一个端到端的工作流程培训和部署一个神经网络在生产在Azure上。连接笔记本的演习将指导您完成所需的步骤创建这个在你自己的Azure砖环境使用Keras等工具,砖考拉,MLflow,Azure毫升

开发人员资源

免费试着砖

相关的帖子

看到所有工程的博客的帖子