图像分类是人工智能领域的一个热门话题,通俗来讲,就是根据各自在图像信息中反映的不同特征,把不同类别的目标区分开。图像分类利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,代替人的视觉判读。

在实际生活中,我们也会遇到图像分类的应用场景,例如我们常用的通过拍照花朵来识别花朵信息,通过人脸匹对人物信息等。通常,图像识别或分类工具都是在客户端进行数据采集,在服务端进行运算获得结果。因此,一般都会有专门的 API 来实现图像识别,云厂商也会有偿提供类似的能力:

华为云图像标签


腾讯云图像分析


本文将尝试通过一个有趣的 Python 库,快速将图像分类的功能搭建在云函数上,并且和 API 网关结合,对外提供 API 功能,实现一个 Serverless 架构的 " 图像分类 API"。

入门 ImageAI

首先,我们需要一个依赖库:ImageAI。

什么是 ImageAI 呢?其官方文档是这样描述的:

ImageAI 是一个 python 库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。ImageAI 本着简洁的原则,支持最先进的机器学习算法,用于图像预测、自定义图像预测、物体检测、视频检测、视频对象跟踪和图像预测训练。ImageAI 目前支持使用在 ImageNet-1000 数据集上训练的 4 种不同机器学习算法进行图像预测和训练。ImageAI 还支持使用在 COCO 数据集上训练的 RetinaNet 进行对象检测、视频检测和对象跟踪。 最终,ImageAI 将为计算机视觉提供更广泛和更专业化的支持,包括但不限于特殊环境和特殊领域的图像识别。

简单理解,就是 ImageAI 依赖库可以帮助用户完成基本的图像识别和视频的目标提取。不过,ImageAI 虽然提供一些数据集和模型,但我们也可以根据自身需要对其进行额外的训练,进行定制化拓展。

其官方代码给出了这样一个简单的 Demo:

from imageai.Prediction import ImagePredictionimport osexecution_path = os.getcwd() prediction = ImagePrediction()prediction.setModelTypeAsResNet()prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5"))prediction.loadModel()predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5 )for eachPrediction, eachProbability in zip(predictions, probabilities):print(eachPrediction + " : " + eachProbability)我们可以在本地进行初步运行,指定图片1.jpg为下图时:


可以得到结果:

convertible : 52.459537982940674sports_car : 37.61286735534668pickup : 3.175118938088417car_wheel : 1.8175017088651657minivan : 1.7487028613686562让 ImageAI 上云(部署到 Serverless 架构上)

通过上面的 Demo,我们可以考虑将这个模块部署到云函数:

首先,在本地创建一个 Python 的项目:mkdir imageDemo新建文件:vim index.py根据云函数的一些特殊形式,我们对 Demo 进行部分改造将初始化的代码放在外层;将预测部分当做触发所需要执行的部分,放在入口方法中(此处是 main_handler);云函数与 API 网关结合对二进制文件支持并不是十分的友善,所以此处通过 base64 进行图片传输;入参定为{"picture": 图片的 base64},出参定为:{"prediction": 图片分类的结果}实现的代码如下: