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
目录
相关文章
|
2月前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
23天前
|
设计模式 缓存 JavaScript
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
30 0
|
2月前
|
缓存 前端开发 API
构建可扩展的API:REST vs GraphQL
【5月更文挑战第14天】在API设计中,REST和GraphQL是两种主要的架构风格。REST基于HTTP协议,强调资源的无状态性和客户端-服务器模型,适合简单CRUD操作。而GraphQL提供更灵活的数据查询,允许客户端精确指定需求,减少HTTP请求和数据冗余,适合复杂场景和高性能需求。选择时要考虑项目需求、技术栈、性能和团队经验。
|
1天前
|
JSON API 网络架构
gRPC 与 REST 的比较分析:哪种 API 适合您的开发需求?
gRPC, 由 Google 推出的开源远程过程调用(RPC)框架, 使两个应用程序间的方法调用变得简单,支持结构化数据的交换。通过采用 Protocol Buffers (Protobuf) ——一种与语言无关的接口定义语言,gRPC 体现了许多现代网络通信技术的优势
gRPC 与 REST 的比较分析:哪种 API 适合您的开发需求?
|
3天前
|
数据采集 DataWorks 测试技术
DataWorks产品使用合集之如何通过REST API进行数据采集,并且自定义传入API的参数
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3天前
|
JavaScript 应用服务中间件 API
Node.js搭建REST API实战:从基础到部署
【7月更文挑战第18天】通过以上步骤,你可以将你的Node.js REST API从开发环境顺利迁移到生产环境,并利用各种工具和技术来确保应用的稳定性、安全性和可扩展性。
|
3天前
|
分布式计算 DataWorks API
DataWorks产品使用合集之使用REST API Reader往ODPS写数据时,如何获取入库时间
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
1天前
|
前端开发 JavaScript API
SharePoint Search REST API 获取数据
【7月更文挑战第6天】使用SharePoint Search REST API进行搜索涉及发送AJAX请求到`/_api/search/query`,其中`querytext`包含搜索关键词,`sourceid`指定结果源ID。示例代码展示了使用jQuery的`.ajax()`方法,成功后通过`success`回调处理返回的搜索结果数据。记得替换URL占位符并确保有相应权限。返回数据的结构可能因配置而异,可能需要进一步解析。还要考虑身份验证、分页和其他查询参数。查阅官方文档可了解更多复杂操作和API使用。
|
12天前
|
安全 Java API
构建基于Spring Boot的REST API安全机制
构建基于Spring Boot的REST API安全机制
|
16天前
|
开发框架 Java API
Java中的REST API开发详解
Java中的REST API开发详解