所有代码和工具均已开源。关注“DL工程实践”,后台回复“web”,自动获取。

1、背景介绍

目前有很多的深度学习推理方案,不过大多是离线部署的。这方面可以利用的开源资源有很多,例如ncnn,mnn,tensorflow lite等。虽然终端离线部署模型具有很大的优势,高效,快速,低延时,能够带来很好的体验,但是也存在一些缺点,例如模型不能太大,且对于不同的硬件平台需要重新部署,开发周期比较长。所以在那些延时没有那么苛刻的场景,使用基于web的深度学习推理服务是非常方便的。一方面与终端硬件无关,使用成熟的http协议进行交互,那么在世界的任何一个角落,只要拿出手机或者电脑,通过网页就能做很多有趣的深度学习检测,这个部署成本比离线的推理要低太多了。另一方面,利用远程深度学习服务器的高性能,还能部署一些大型的网络,提升深度学习的性能。本期我们就来实践一个基于web的深度学习服务,实现远程的深度学习调用,并将结果展现在浏览器上面。为了实现web服务,需要选择一款web框架,基于python的web框架非常多,这里选择一个非常小巧又经典的web框架:web.py。

2、效果演示

电脑端效果演示:

URL链接:https://video.zhihu.com/video/1337520524713914369?

手机效果演示:

URL链接:https://video.zhihu.com/video/1337520739416141824?

3、项目结构

如下图所示为项目的代码结构。由于需要通过web交互,所以需要一点点前端知识。整个工程可以划分为三个部分。第一个部分是models推理模块,主要放一些推理的模型。前端模块,包含static与templates为界面展示相关的代码。templates里面包含了两个html的结构文档,用来定义浏览器的显示界面。static里面的css和img用来修饰界面。服务模块:server.py。里面是web服务的一个业务逻辑。

网络推理模块:

由于习惯了使用pytorch,我这里放了一个基于pytorch训练好的shufflenetv2 1.0x的imagenet1000的预训练模型,从torchvision里面可以直接下载。网络模型文件也是直接使用的torchvision.models里面的模型文件。Infer.py:里面定义了一个PreModel类,用来加载深度学习模型,进行相关的推理。另外为了展示类别的结果,放了一个class_map.py,把imagenet数据集的数字标签与类别名称做了一个对应,方便在浏览器界面上展示。

前端模块:

首先需要对浏览器上的展示界面做一个大致的规划,如下图所示,我规划了三个部分:标题部分,结果显示部分,按钮部分。首先看按钮部分,第一个按钮用于选择图片,点击之后可以从本地选择一张图片。检测按钮点击之后,可以将刚才选择的图片上传到服务器,服务器进行深度学习检测,然后将结果返回当当前页面。返回的结果显示在“结果展示”区。这里我定义了一个分类的展示模式,上半部分是检测的图片,下半部分是检测出的top3的类别。

下面来看一下界面的html文件,其实也非常简单,就是按照刚才的三个模块进行了划分。分别使用三个<div>来表示。

服务模块:

服务模块其实就一个源文件:server.py,定义了web交互的逻辑。其实代码含义非常清晰。当用户选择好图片,并点击了“检测”按钮之后,图片会被浏览器使用POST方法传送到后端,所以会进入到server.py的POST方法里面。第一行的x=web.input(image_file={})表示的就是将浏览器传过来的图片放在变量x中。然后进入到第一部分的代码,“保存用户上传的图片”,因为此时的图片内容在x变量中,是在内存里的,所以先将内存里的图片x保存到本地服务器上面。这里将其保存到static目录下面。首先做一个字符串转换,因为windows服务器传过来的图片,名称中很有可能包含'\'字符,需要转换成'/'字符,然后获取文件名,因为传过来的是一个文件路径。然后在static目录下面新建一个同名的文件,将x里面的图片内容保存到新的同名文件中。接下来进入到第二个流程:调用models的推理模块进行推理。这个就不详细展开,搞过深度学习的人应该很清楚其流程。最后一个流程是根据推理的结果进行一些展示,这里使用matplotlib进行原始图片和预测类型的柱状图展示,为了美观,改成了横向的柱状图。

4、服务搭建

为了能够随时随地的访问我们的深度学习服务,那么需要一台具有公网IP地址的服务器,但是很可惜,我们现在申请的宽带一般都不会分配公网IP,一个可行的办法是使用云服务器,这种服务器都会给你公网IP。例如腾讯云,阿里云等。还有其他方法就是使用NAT打洞或者使用一些第三方的DDNS服务。这里不在展开,有兴趣的朋友可以自行查阅。我这里为了方便,就在局域网里面搭建深度学习服务,然后只要连接在这个局域网里面的客户端,都能够通过浏览器访问并上传图片进行检测。该工程需要依赖web.py, torch,torchvison, matplotlib等,所以可以使用pip或者conda等命令安装好依赖包。至于是windows还是linux,这个没有关系。安装好依赖之后,进入到工程根目录下面:cd  web-dl;启动服务:python server.py。之后会加载模型,打印模型加载进度,完毕之后屏幕打印:http://0.0.0.0:8080/ 表示我们的web服务已经正常启动,并在8080端口进行监听。此时通过任意一台局域网中的电脑或者手机,打开浏览器,输入:http://ip:8080就可以了。

关注“DL工程实践”,后台回复“web”,自动获取源码地址。

@end

[零基础,全开源]基于web的远程深度学习服务搭建相关推荐

  1. 基于Ubuntu18.04下深度学习服务器搭建

    基于Ubuntu18.04下深度学习服务器搭建 目录: 基于Ubuntu18.04下深度学习服务器搭建 主要模块组成 Anaconda安装 CUDA安装 pytorch安装 CuDNN安装 其他常用指 ...

  2. 基于web端的深度学习模型部署

    1.1 web服务与技术框架 下面以ResNet50预训练模型为例,旨在展示一个轻量级的深度学习模型部署,写一个较为简单的图像分类的REST API.主要技术框架为Keras+Flask+Redis. ...

  3. 零基础带你飞web前端教程带你探究web前端趋势

    web前端教程带你探究web前端趋势,IT行业发展迅速,瞬息万变,很多想要学习Web前端进入IT行业的人都会担忧Web前端行业发展趋势如何.下面,老师就带大家了解一下2021年Web前端行业发展趋势如 ...

  4. 零基础新手自学Python编程教程入门精通学习资料网站大全

    零基础新手自学Python编程教程入门精通学习资料网站大全 今天说下关于Python的一些普及知识,以及学习资料,这一节我来跟大家分享下. 1 为什么要学习Python? 1 Python是一个脚本语 ...

  5. 零基础的前端开发初学者应如何系统地学习?前端技能汇总 Frontend Knowledge Structure

    本文转自 张帅 于知乎<零基础的前端开发初学者应如何系统地学习?>中的回答. 知乎原文:https://www.zhihu.com/question/19834302 GitHub项目:前 ...

  6. ElasticDL:首个基于 TensorFlow 实现弹性深度学习的开源系统

    9 月 11 日,蚂蚁金服开源了 ElasticDL 项目,据悉这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统. Google Brain 成员 Martin Wicke 此前在公 ...

  7. 零基础:邪恶带你3步快速掌握iSCSI搭建

    零基础:邪恶带你3步快速掌握iSCSI搭建 Hello,我是--邪恶君子!今天呢,给大家分享一下Linux上iSCSI的搭建,通过文字+图像的解说,不管你是小白还是菜鸟,都能够让你掌握搭建iSCSI的 ...

  8. 零基础入门CV--街景字符识别(阿里天池学习赛)

    零基础入门CV–街景字符识别(阿里天池学习赛) 比赛链接传送门:零基础入门CV - 街景字符编码识别-天池大赛-阿里云天池 1.简介 该比赛以SVHN街道字符为赛题数据,数据集报名后可见并可下载,该数 ...

  9. 写给 Web 开发者的深度学习教程 - 向量化 矩阵

    前言 在这个科技发展日新月异的时代,行业的宠儿与弃儿就如同手掌的两面,只需轻轻一翻,从业者的境遇便会有天翻地覆的改变. 人工智能作为近两年来业界公认的热门领域,不同于之前火热的移动端开发或前端开发,其 ...

最新文章

  1. 敏捷项目管理—敏捷四宣言
  2. php codecept,Yii2 codecept unit 类找不到
  3. SEO:如何做好软文推广
  4. 编写高性能 Web 应用程序的 10 个技巧 (转)
  5. 小电科技开启裁员,涉及多个部门一律劝退?回应:消息不属实
  6. java 中计算时间差
  7. C#操作EXCLE表
  8. AD6.8_mcu123 分享地址
  9. 北京市地铁线路及站点数据
  10. IDEA git 切换分支注意事项
  11. 计算ERA-5数据的相对湿度(RH)与饱和水汽压差(VPD)
  12. exo文件_eXo平台概述
  13. helm开发环境部署gitea
  14. python学习笔记(13)数据结构
  15. chcp永久修改控制台字符编码
  16. 读书笔记3——《如何高效学习》:斯科特·扬
  17. Python 中最全面的 Socket 编程指南
  18. HTML创意菜单设计,有特色的使用大菜单的网页设计
  19. 【6】SCI易中期刊推荐——人工智能神经科学机器人学(中科院3区)
  20. AVFoundation编程-AVPlayer使用

热门文章

  1. linux ping不允许的操作,linux – ping:sendmsg:不允许操作(有时)
  2. html5 markdown,Markdown常用语法
  3. 安卓调用系统相机三步走
  4. Java并发(十九):final实现原理
  5. spring boot 中启用 https
  6. Android 自定义控件之腾讯安全卫士扫描
  7. CentOS下安装网卡驱动
  8. WPF Application 类介绍以及怎样修改启动方式
  9. 国产海量存储系统的新突破
  10. html5 选择列表,Html5添加基于列表的选择美化插件教程