Building a Keras + deep learning REST API(三部曲之一)

简介: 一、基本环境$ pip install flask gevent requests pillow其中 flask不需要解释gevent 是用于自动切换进程的;pillow 是用来进行python下的图像处理的;requests 是用来进行python下request处理的。
一、基本环境
$ pip install flask gevent requests pillow
其中 flask不需要解释
gevent 是用于自动切换进程的;
pillow 是用来进行python下的图像处理的;
requests 是用来进行python下request处理的。

二、核心代码解释
# import the necessary packages
from keras.applications import ResNet50
from keras.preprocessing.image import img_to_array
from keras.applications import imagenet_utils
from PIL import Image
import numpy as np
import flask
import io
引入所需的头文件。其中注意keras的几个类库是很有通用性的;
# initialize our Flask application and the Keras model
app = flask.Flask( __name__)
model = None
类库的初始化
def load_model():
     # load the pre-trained Keras model (here we are using a model
     # pre-trained on ImageNet and provided by Keras, but you can
     # substitute in your own networks just as easily)
     global model
    model = ResNet50( weights= "imagenet")
引入model模型,如果想引入自己的模型(CBIR)的话,就在这里引入。
def prepare_image( image, target):
     # if the image mode is not RGB, convert it
     if image.mode != "RGB":
        image = image.convert( "RGB")

     # resize the input image and preprocess it
    image = image.resize(target)
    image = img_to_array(image)
    image = np.expand_dims(image, axis= 0)
    image = imagenet_utils.preprocess_input(image)

     # return the processed image
     return image
image的预处理,这里使用的是keras+PIL,和opencv之间的比较,需要有时间来做。
@app.route( "/predict", methods=[ "POST"])
def predict():
     # initialize the data dictionary that will be returned from the
     # view
    data = { "success": False}

     # ensure an image was properly uploaded to our endpoint
     if flask.request.method == "POST":
         if flask.request.files.get( "image"):
             # read the image in PIL format
            image = flask.request.files[ "image"].read()
            image = Image.open(io.BytesIO(image))

             # preprocess the image and prepare it for classification
            image = prepare_image(image, target=( 224, 224))

             # classify the input image and then initialize the list
             # of predictions to return to the client
            preds = model.predict(image)
            results = imagenet_utils.decode_predictions(preds)
            data[ "predictions"] = []

             # loop over the results and add them to the list of
             # returned predictions
             for (imagenetID, label, prob) in results[ 0]:
                r = { "label": label, "probability": float(prob)}
                data[ "predictions"].append(r)

             # indicate that the request was a success
            data[ "success"] = True

     # return the data dictionary as a JSON response
     return flask.jsonify(data)
虽然是核心部分,但是其实非常容易被复用。就是读取数据,然后进行处理的过程。     
# if this is the main thread of execution first load the model and
# then start the server
if __name__ == "__main__":
     print(( "* Loading Keras model and Flask starting server..."
         "please wait until server has fully started"))
    load_model()
    app.run()

比不可少的main过程。缺少不可运行。
三、运行效果
使用VPS能够更快地得到效果,至少你不需要下载resnet*.h5,一个链路不是太好的大物件。

img_e377de1e10e9d382a7ad4ebdbe5e1743.png

flask的运行效果,使用curl进行处理的效果

img_f8ecebdbd07866f1b2d301b17059e52c.jpe

img_755e914d5dc20a9e624dbd8e6312156a.png

从结果上来看,curch排在了第2,而将这张图片识别为钟楼或者修道院、城堡,宫殿
,似乎也没有什么不妥。
四、小结反思

真的仅仅是通过了几行代码,就实现了flask部署的核心问题。不过光是跑这个简单的过程,机器就已经发出巨大的热量了;另一方面,整个的结构是什么,也需要进一步去研究清楚才对。







目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
3月前
|
JSON API 开发工具
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
|
3月前
|
存储 API 网络架构
【Azure 存储服务】调用REST API获取Stroage Account Table中所有的Entity计数 -- Count
【Azure 存储服务】调用REST API获取Stroage Account Table中所有的Entity计数 -- Count
|
25天前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
2月前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
2月前
|
JSON JavaScript API
编写REST API
编写REST API
61 2
|
1月前
|
Java API Maven
使用 Smart-doc 记录 Spring REST API
使用 Smart-doc 记录 Spring REST API
47 0
|
3月前
|
存储 JSON API
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
|
3月前
|
JSON API 网络架构
SharePoint REST API 设置SummaryLength属性
【8月更文挑战第10天】在SharePoint中,可通过REST API设定`SummaryLength`属性来控制列表或库内项目摘要的显示长度。首先确定目标URL,接着构建POST请求并指定JSON格式的新摘要长度值,例如设置为100字符。利用Postman等工具发送请求,并确保提供认证信息。成功后,摘要长度将按设定更新,注意操作权限及对用户体验的影响。
|
3月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
204 0
|
3月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
45 0
下一篇
无影云桌面