图像分类是人工智能领域的一个热门话题,同样在生产环境中也会经常会遇到类似的需求,那么怎么快速搭建一个图像分类,或者图像内容是别的API呢?

首先,给大家推荐一个图像相关的库:ImageAI

通过官方给的代码,我们可以看到一个简单的Demo:

from imageai.Prediction import ImagePrediction

import os

execution_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)

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

首先,我们在本地创建一个Python的项目:

mkdir imageDemo

然后新建文件:vim index.py

from imageai.Prediction import ImagePrediction

import os, base64, random

execution_path = os.getcwd()

prediction = ImagePrediction()

prediction.setModelTypeAsSqueezeNet()

prediction.setModelPath(os.path.join(execution_path, "squeezenet_weights_tf_dim_ordering_tf_kernels.h5"))

prediction.loadModel()

def main_handler(event, context):

imgData = base64.b64decode(event["body"])

fileName = '/tmp/' + "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5))

with open(fileName, 'wb') as f:

f.write(imgData)

resultData = {}

predictions, probabilities = prediction.predictImage(fileName, result_count=5)

for eachPrediction, eachProbability in zip(predictions, probabilities):

resultData[eachPrediction] = eachProbability

return resultData

创建完成之后,我们需要下载一下我们所依赖的模型:

- SqueezeNet(文件大小:4.82 MB,预测时间最短,精准度适中)

- ResNet50 by Microsoft Research (文件大小:98 MB,预测时间较快,精准度高)

- InceptionV3 by Google Brain team (文件大小:91.6 MB,预测时间慢,精度更高)

- DenseNet121 by Facebook AI Research (文件大小:31.6 MB,预测时间较慢,精度最高)

我们先用第一个SqueezeNet来做测试:

在官方文档复制模型文件地址:

使用wget直接安装:

wget https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/squeezenet_weights_tf_dim_ordering_tf_kernels.h5

接下来,我们就需要进行安装依赖了,这里面貌似安装的内容蛮多的:

而且这些依赖有一些需要编译的,这就需要我们在centos + python2.7/3.6的版本下打包才可以,这样就显得非常复杂,尤其是mac/windows用户,伤不起。

所以这时候,直接用我之前的打包网址:

直接下载解压,然后放到自己的项目中:

最后,一步了,我们创建serverless.yaml

imageDemo:

component: "@serverless/tencent-scf"

inputs:

name: imageDemo

codeUri: ./

handler: index.main_handler

runtime: Python3.6

region: ap-guangzhou

description: 图像识别/分类Demo

memorySize: 256

timeout: 10

events:

- apigw:

name: imageDemo_apigw_service

parameters:

protocols:

- http

serviceName: serverless

description: 图像识别/分类DemoAPI

environment: release

endpoints:

- path: /image

method: ANY

完成之后,执行我们的sls --debug部署,部署过程中会有扫码的登陆,登陆之后等待即可,完成之后,我们可以复制生成的URL:

通过Python语言进行测试,url就是我们刚才复制的+/image:

import urllib.request

import base64

with open("1.jpg", 'rb') as f:

base64_data = base64.b64encode(f.read())

s = base64_data.decode()

url = 'http://service-9p7hbgvg-1256773370.gz.apigw.tencentcs.com/release/image'

print(urllib.request.urlopen(urllib.request.Request(

url = url,

data=s.encode("utf-8")

)).read().decode("utf-8"))

通过网络搜索一张图片,例如我找了这个:

得到运行结果:

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

将代码修改一下,进行一下简单的耗时测试:

import urllib.request

import base64, time

for i in range(0,10):

start_time = time.time()

with open("1.jpg", 'rb') as f:

base64_data = base64.b64encode(f.read())

s = base64_data.decode()

url = 'http://service-hh53d8yz-1256773370.bj.apigw.tencentcs.com/release/test'

print(urllib.request.urlopen(urllib.request.Request(

url = url,

data=s.encode("utf-8")

)).read().decode("utf-8"))

print("cost: ", time.time() - start_time)

输出结果:

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 2.1161561012268066

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.1259253025054932

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.3322770595550537

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.3562259674072266

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.0180821418762207

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.4290671348571777

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.5917718410491943

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.1727900505065918

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 2.962592840194702

{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}

cost: 1.2248001098632812

这个数据,整体性能基本是在我可以接受的范围内。

至此,我们通过Serveerless架构搭建的Python版本的图像识别/分类小工具做好了。

图像分类python代码_20行代码:Serverless架构下用Python轻松搞定图像分类相关推荐

  1. 图像水平梯度和竖直梯度代码_20行代码发一篇NeurIPS:梯度共享已经不安全了

    整理 | 夕颜,Jane 出品 | AI科技大本营(ID:rgznai100) [导读]12 月 8 日-14 日,NeurIPS 2019 在加拿大温哥华举行,和往常一样,今年大会吸引了数万名专家参 ...

  2. 用Python获取全国地铁站点数据,用时5秒轻松搞定,看呆了!!

    截止发文,全国一共有40个城市开通了地铁,累计站点数量为5968 而我,爬完这些数据,只用了5秒 此时,正在看文章的你,是不是心里会默默的来一句:麻雀啄了牛屁股-雀食牛逼  今天就来教大家用 Pyth ...

  3. python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

    因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程.类似这样: 每个方程有两个变量,x和y,形式为:ax+by+c=d 由于这次有了两个方程,我们提取参数的代码就适合提炼为一个 ...

  4. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋

    Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...

  5. Python简单几行代码实现黑客电影镜头屏幕画面

    Python简单几行代码实现黑客电影镜头屏幕画面 通过几行简单的Python代码实现炫酷的数据流动效果 一.Python版本:Python3 二.操作示范 为了显得更加牛逼 逼真,通常不会直接运行源代 ...

  6. 【python】20行代码实现有道翻译api接口调用

    文章目录 1. 目标站点 2. 完整代码 3. 测试样例 3.1. 测试样例Ⅰ(汉译英) 3.2. 测试样例Ⅱ(英译汉) 4. 调用文档 4.1. 接口地址 4.2. 请求方法 4.3. 请求参数 4 ...

  7. 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!

    教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...

  8. 【python】15行代码实现猫脸检测(opencv)

    文章目录 1. 项目简介 2. 项目地址 3. 依赖模块 4. 完整代码 5. 必要组件 5.1. haar级联特征分类器(精度高) 5.2. lbp级联特征分类器(速度快) 6. 成果展示 6.1. ...

  9. 精选10个Python库,几行代码轻松搞定探索性数据分析!

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货,第一时间送达!!! 探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一.在拿到一个 ...

  10. 【python】60行代码实现给头像戴上圣诞帽(opencv)

    文章目录 1. 成果展示 2. 项目简介 3. 项目地址 4. 预备知识 5. 完整代码 6. 必要组件 7. 圣诞素材 8. 引用参考 9. 软件下载 1. 成果展示 2. 项目简介 原理很简单,就 ...

最新文章

  1. python前面+r
  2. 《WCF技术内幕》翻译1:《WCF技术内幕》目录和作者简介
  3. 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人
  4. dnf单机无线连接服务器,dnf单机云服务器
  5. linux 改成utc时间_C++下四种常用的程序运行时间的计时方法总结
  6. java nio node_支撑 Java NIO 与 NodeJS 的底层技术
  7. C#反射使用方法过程及步骤
  8. linux进程cpu资源分配命令nice,renice,taskset
  9. PHP:6种GET和POST请求发送方法
  10. tf.truncated_normal_initializer 从截断的正态分布中输出随机值。
  11. 【转】Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)...
  12. linux中删除文件命令
  13. Visual Studio 2013中因SignalR的Browser Link引起的Javascript错误一则
  14. 文本生成,文本数据增强怎么做?
  15. 2.2 BubbleSort
  16. java静态池_java 常量池静态变量详解
  17. GCF(3)---GCF简介
  18. Wordress博客添加音乐播放器插件
  19. win7关机一直卡在正在关机
  20. 实用收藏,外贸常用工具大全分享-跨境知道

热门文章

  1. 趣闻|论文不必参考任何文献?看到作者,网友大呼失敬了
  2. 在vue中实现锚点定位功能
  3. MySQL解决中文编码问题
  4. 10月31 安装redis报错
  5. HTML中的一般标签、常用标签和表格
  6. 【转】android 完全退出应用程序
  7. MyEclipse部署,将一个项目引入到两个项目;多项目部署
  8. 读取文本作为输出字段
  9. Imagej分析所有气泡的粒径
  10. 从零基础入门Tensorflow2.0 ----七、35. 文本生成之---1.数据处理