图像分类模型嵌入flask中开发PythonWeb项目
图像分类模型嵌入flask中开发PythonWeb项目
图像分类是一种常见的计算机视觉任务,它的目的是将输入的图像分配到预定义的类别中,如猫、狗、花等。图像分类模型是一种基于深度学习的模型,它可以利用大量的图像数据来学习图像的特征和类别之间的关系,并且能够对新的图像进行分类。在本博客中,我将介绍如何将深度学习模型嵌入到PythonWeb中,实现图像分类模型的web端实现。具体以西红柿病害识别交流平台的开发为例进行描述。
视频演示地址:https://www.bilibili.com/video/BV11X4y1d7Cj/?spm_id_from=333.999.0.0
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAjyooC1-1686113308410)(wps8.jpg)]](https://img-blog.csdnimg.cn/0d39eeef872c429db504f2a94f2a4716.png)
一、系统架构
本系统使用flask+mysql+layui+ajax开发,深度学习环境为pytorch+anaconda,数据库存储使用mysql,开发工具为pycharm,前后端不分离项目,但可以实现前后端的动态交互。
- 前端:使用layui框架搭建一个简洁美观的界面,使用ajax技术实现与后端的同步通信,实现上传图片、显示结果等功能。
- 后端:使用flask框架搭建一个轻量级的web服务器,使用flask_mysqldb模块连接mysql数据库,使用pytorch框架加载预训练好的图像分类模型,实现接收图片、处理图片、返回结果等功能。
- 数据库:使用mysql数据库存储用户信息、图片信息、分类结果等数据,方便后期的数据分析和管理。
二、系统功能
本系统主要实现了以下功能:
(1)账号注册
用户首次进入平台需要进行注册。
(2)账号登录
当用户进入平台后,需进入登录界面,用户登录后,方可正常使用其它功能。
(3)信息修改
用户进入个人中心后,可以修改包括头像,用户名,用户密码等个人信息。
(4)账号退出
用户点击退出按钮之后,退出当前登录状态。
(5)图片上传
用户在点击检测之后,可以上传西红柿叶片的图片。
(6)病害识别
用户成功上传西红柿叶片的图片后,可在进行病害的识别及分析,稍作等待可查看结果。
(7)记录查看
用户可随时在平台看到历史上传的西红柿叶片,以及识别结果。
(8)发布论坛
用户点击论坛进入论坛界面,可点击发布论坛。
(9)评论帖子
用户点击论坛进入帖子的详情页面后,可点击发表帖子评论。
三 软件概述
3.1需求分析
西红柿病害识别交流平台是一个专注于西红柿病害识别和交流的网站,用户可以通过该平台上传西红柿照片,进行病害识别和分类,并且可以在论坛中与其他用户交流和分享经验。下面是该平台的需求分析:
用户端需求:
(1)用户可以注册和登录账号。
(2)用户可以上传西红柿照片进行病害识别和分类。
(3)系统可以对上传的照片进行自动识别和分类。
(4)用户可以在识别结果页面查看病害的名称和描述信息。
(5)用户可以在社区中发布病害相关的问题或心得,也可以对其他用户发布的内容进行回复。
技术需求:
(1)需要使用深度学习框架(如PyTorch)对西红柿照片进行训练和分类。
(2)需要使用Web框架(如Flask)搭建用户端和管理端。
(3)需要使用数据库(如MySQL)存储用户信息、照片和社区内容等数据。
(4)需要使用HTML、CSS和JavaScript等技术实现网站的前端交互和设计。
3.2 系统开发环境
(1)硬件环境主要支撑软件的正常运行。下表为该系统的硬件开发环境。
| 硬件配置 | |
|---|---|
| CPU | Intel Core i5-7300HQ |
| 显卡 | 4G NVIDIA GTX 1050 |
| 内存 | 16 GB DDR4 2400Mhz |
(2) 软件环境主要进行系统源代码的开发以及调试。下表为该系统的软件开发环境。
| 软件环境 | |
|---|---|
| 操作系统 | Window10 64bit |
| 后端开发语言 | Python3.7 |
| 开发工具 | PyCharm 2022.3.3 |
| 后端开发框架 | Flask 2.2.3 |
| 数据库 | MySQL 5.7 |
| 数据库可视化 | Navicat Premium 16 |
四 系统操作说明
4.1账号注册
用户进入西红柿病害识别交流平台后需要进行注册才能得到登录的许可,用户需要根据提示信息首先输入注册的邮箱,然后点击发送验证码按钮并进入邮箱查看验证码信息,填写正确的邮箱验证码。接下来进行用户名、密码以及性别的输入,密码需要二次确认,成功注册后会自动跳转进入登录界面。图4-1为注册界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11bTaCwd-1686113308418)(wps1.jpg)]](https://img-blog.csdnimg.cn/46e201587ae84369a860e3dae956eba5.png)
图4-1 注册界面
用户成功注册后会将用户信息添加进MySQL数据库的user表中,如图4-2,用户名为“一个人走”,性别为“男”,邮箱为“gzy_personal@163.com”的用户成功被添加进user表中。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VtJ0t2bG-1686113308419)(wps2.jpg)]](https://img-blog.csdnimg.cn/631332d0559f42fba12858d2fbd90c9e.png)
图4-2 数据库表
4.2账号登录
用户可在右上角进行登录操作,用户通过输入正确的邮箱、密码以及验证码才可以成功登入系统,其中邮箱必须是正确格式,密码必须大于等于6位数。成功登录后页面自动跳转到首页。图4-3为登录界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYfxyIGp-1686113308420)(wps3.jpg)]](https://img-blog.csdnimg.cn/458548d4889342d7b768653b4bd545cf.png)
图4-3 登录界面
4.3个人信息修改
用户登录系统后,右上角由“登录”,“注册”按钮切换为头像以及用户名,系统会根据用户性别生成默认头像,用户名也是一个二级导航栏,可点击用户个人中心、密码修改以及退出登录。图4-4为登录成功后右上角出现的用户信息。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTRYXY12-1686113308428)(wps4.jpg)]](https://img-blog.csdnimg.cn/616e2b9566b84dcb9556e044c5d19bd9.png)
图4-4 用户信息导航栏
通过点击个人中心可进行头像的上传以及用户名的修改,其中邮箱和性别是不可修改的,用户点击上传头像可进入资源管理器进行个人头像的上传,也可以修改用户名。图4-5为用户个人中心界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUiTSCKR-1686113308429)(wps5.jpg)]](https://img-blog.csdnimg.cn/ad04a539848347bcb8fb1cb1272b9aa9.png)
图4-5 用户个人中心
如图4-6所示,用户的默认头像被更改,用户名由“一个人走”修改为“小小志”。

图4-6 成功修改界面
通过点击修改密码可进行用户密码的修改,用户需要输入原始的登录密码、新密码以及图片验证码,其中原始密码必须是正确的登录密码,新密码需要二次确认,图片验证码必须与图片中的验证码一致才可以成功修改密码。图4-7为用户修改密码页面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wgxy8qcx-1686113308433)(wps7.jpg)]](https://img-blog.csdnimg.cn/79cb3758882b458ba1887a2f27531227.png)
图4-7 修改密码
4.4 主页面
用户进入页面或者成功登录即可跳转到严重度分级平台的主页面,主页显示了自动轮播的4个轮播图和平台提供的一些西红柿病害资料。图4-8为主页面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFS99MPb-1686113308434)(wps8.jpg)]](https://img-blog.csdnimg.cn/c5dd20343e63420d853f5ede1f6c649a.png)
图4-8 主页面
4.5病害识别
用户可以在上传页面进行西红柿叶片的图片上传,点击选择文件选择本地图片资源,然后点击识别按钮即可进行西红柿病害的识别,图4-9为识别界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLdxCMkd-1686113308435)(wps9.jpg)]](https://img-blog.csdnimg.cn/f2f4c0e91a3c4bcb87fa0959c161aa74.png)
图4-9 识别界面
用户只需稍等即可看到西红柿叶片病害识结果。图4-10为结果界面,其中根据上传的图片可以看到上传的原图,也可以得到识别出的病害分类、识别准确率、识别时间和对应的建议。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOh26Oq4-1686113308438)(wps10.jpg)]](https://img-blog.csdnimg.cn/20ed6285934c43a18daf9112cc8aba5f.png)
图4-10 结果界面
4.6记录查看
用户点击导航栏处的记录即可查看该用户曾经识别的病害图像记录。其中,西红柿病害识别交流平台能够根据用户上传的图片信息进行筛选,如图像一致可避免记录中的重复显示。图4-11为记录查看界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuyJiIKC-1686113308441)(wps11.jpg)]](https://img-blog.csdnimg.cn/6aada8a823f147d8badac6e362602258.png)
图4-11 记录查看界面
4.7论坛功能
用户点击导航栏上的论坛可以进入论坛界面,图4-12为论坛界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cp1nJYG3-1686113308442)(wps12.jpg)]](https://img-blog.csdnimg.cn/5cb66027afb64fb28ea95b8cb1c51376.png)
图4-12 论坛界面
在论坛界面中可以看到其他用户发表的论坛记录及其内容,点击“+”按钮按钮即可进入论坛发布的界面,图4-13为发布论坛界面,用户需要输入标题以及内容,然后点击发布按钮即可成功发布论坛。其中,西红柿病害识别交流平台会检测用户输入的情况,标题必须大于5个字符,内容必须大于10个字符,否则将不能成功发布论坛。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4692s9H-1686113308444)(wps13.jpg)]](https://img-blog.csdnimg.cn/dc09966f69374304b2035cf8419a860a.png)
图4-13 发布论坛界面
用户在论坛界面中可以看到其他用户发表的论坛记录及其内容,点击帖子的标题即可进入该帖子的详情界面。用户可在详情页面看到该帖子的主要内容,发布者信息、发布时间以及其他用户的评论,用户自己也可以填写并发表自己的评论,输入内容后点击评论按钮即可成功发布评论。图4-14为帖子详情界面。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afGy91Jp-1686113308446)(wps14.jpg)]](https://img-blog.csdnimg.cn/a22fcd6f58024fb992b3e5a1c6fbd0ee.png)
图4-14 帖子详情界面
五 部分代码展示:
代码目录结构:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7SwQzaU-1686113308448)(image-20230607124318504.png)]](https://img-blog.csdnimg.cn/58955582af6349be9e0648d97b06fb92.png)
model.py数据库表模型文件代码
from exts import db
from datetime import datetime# 用户表,记录用户账号信息
class UserModel(db.Model):__tablename__ = 'user'id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(100), nullable=False)password = db.Column(db.String(200), nullable=False)email = db.Column(db.String(100), nullable=False, unique=True) # 邮箱唯一join_time = db.Column(db.DateTime, default=datetime.now())# 用户注册表,记录用户注册时的信息
class EmailCaptchaModel(db.Model):__tablename__ = 'email_captcha'id = db.Column(db.Integer, primary_key=True, autoincrement=True)email = db.Column(db.String(100), nullable=False)captcha = db.Column(db.String(100), nullable=False)# 用户上传表,记录用户在网页中上传的图片
class ImageUploadModel(db.Model):__tablename__ = 'image_upload'id = db.Column(db.Integer, primary_key=True, autoincrement=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)img_name = db.Column(db.String(100), nullable=False)img_format = db.Column(db.String(100), nullable=False)upload_time = db.Column(db.DateTime, default=datetime.now())# 结果记录表,记录用户在网页中上传图片的结果
class ImageRecordModel(db.Model):__tablename__ = 'image_record'id = db.Column(db.Integer, primary_key=True, autoincrement=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)img_id = db.Column(db.Integer, db.ForeignKey('image_upload.id'), nullable=False)img_acc = db.Column(db.String(50), nullable=False)img_class = db.Column(db.String(50), nullable=False)ident_time = db.Column(db.DateTime, default=datetime.now())record=db.relationship('UserModel', backref='user_record', uselist=False)
predict_pth.py预测单张图片的分类并返回结果
import json
import osimport numpy as np
import torch
from matplotlib import pyplot as plt
from torchvision import transforms
from PIL import Image
from model.mobilenetv2 import MobileNetV2 as create_model
from model.utils import GradCAM, show_cam_on_image, center_crop_imgdef pred(img_path):device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")print(f"using {device} device.")num_classes = 4img_size = 224data_transform = transforms.Compose([transforms.Resize(int(img_size * 1.14)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])img = Image.open(img_path)# [N, C, H, W]img = data_transform(img)# expand batch dimensionimg = torch.unsqueeze(img, dim=0)# read class_indictjson_path = 'model/class_indices.json'assert os.path.exists(json_path), "file: '{}' dose not exist.".format(json_path)json_file = open(json_path, "r", encoding='utf-8')class_indict = json.load(json_file)# create modelmodel = create_model(num_classes=num_classes).to(device)# load model weightsmodel_weight_path = "model/bestmodel.pth"model.load_state_dict(torch.load(model_weight_path, map_location=device))model.eval()with torch.no_grad():# predict classoutput = torch.squeeze(model(img.to(device))).cpu()predict = torch.softmax(output, dim=0)predict_cla = torch.argmax(predict).numpy()# print_res = "class: {} prob: {:.3}".format(class_indict[str(predict_cla)],# predict[predict_cla].numpy())class_prob=predict[predict_cla].numpy()class_name=class_indict[str(predict_cla)]return class_prob,class_nameif __name__=="__main__":img_path = "static/img/1.jpg"class_prob,class_name= pred(img_path)print(class_name,class_prob)
参考资料
《Python编程从入门到实践》
《PyTorch 官方文档》
《PyTorch 图像分类教程》
《Flask官方文档》
《Flask Web开发实战》
《图像处理与计算机视觉》
具体代码及实现教程可私信。
相关文章:
图像分类模型嵌入flask中开发PythonWeb项目
图像分类模型嵌入flask中开发PythonWeb项目 图像分类是一种常见的计算机视觉任务,它的目的是将输入的图像分配到预定义的类别中,如猫、狗、花等。图像分类模型是一种基于深度学习的模型,它可以利用大量的图像数据来学习图像的特征和类别之间…...
GIT安装教程(入门)
目录 前言 Git作者 官网 GIT优点 GIT缺点 为什么要使用 Git 下载以及安装步骤 一、官网下载 二、GIT安装步骤 1、安装get程序 2、许可声明 3、选择安装路径 4、选择git组件 5、创建菜单名称 6、 git文件默认编辑器 7、设置新存储库中初始分支的名称 8、调整Pa…...
全志V3S嵌入式驱动开发(触摸屏驱动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的触摸屏,其实就是在普通的lcd屏幕之上,再加一层屏而已。这个屏是透明的,这样客户就可以看到下面lcd屏幕的…...
死信队列详解
什么是死信队列? 在消息队列中,执行异步任务时,通常是将消息生产者发布的消息存储在队列中,由消费者从队列中获取并处理这些消息。但是,在某些情况下,消息可能无法正常地被处理和消耗,例如&…...
我用ChatGPT写2023高考语文作文(五):北京卷I
2023年 北京卷 I 适用地区:北京 “续航”一词,原指连续航行,今天在使用中被赋予了新的含义,如为青春续航、科技为经济发展续航等。 请以“续航”为题目,写一篇议论文。 要求:论点明确,论据充实&…...
《微服务实战》 第二十八章 分布式锁框架-Redisson
前言 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常⽤接⼝的基础上,为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调…...
局部搜索,变邻域搜索算法
目录 局部搜索 02 变邻域搜索算法 局部搜索 1.1 局部搜索是什么玩意儿? 官方一点:局部搜索是解决优化问题的一种启发式算法。对于某些计算起来非常复杂的优化问题,比如各种NP-难问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次…...
软件工程实训——第一天
第一天 前后分离 前端:android 后端:springbootmbatis-plus 高心星 软件工程的思维来开发项目 问题定义 可行性研究 需求分析 概要设计 详细设计 编码 测试 维护 需求分析 1.用户的信息管理 2.新增支出 3.新增收入 4.支出统计 5.收入…...
嵌入式C语言中if/else如何优化详解
观点一(灵剑): 前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅…...
【LSTM】读取时间序列数据 | 时间序列数据的小批量划分方法
由于序列数据本质上是连续的,因此我们在处理数据时需要解决这个问题。当序列过长而不能被模型一次性全部处理时,我们希望能拆分这样的序列以便模型方便读取。 Q:怎样随机生成一个具有n个时间步的mini batch的特征和标签? A&…...
K8s in Action 阅读笔记——【12】Securing the Kubernetes API server
K8s in Action 阅读笔记——【12】Securing the Kubernetes API server 12.1 Understanding authentication 在上一章中,我们提到API服务器可以配置一个或多个认证插件(授权插件也是同样的情况)。当API服务器接收到一个请求时,它…...
爆肝整理,3个月从功能进阶自动化测试,一跃成测试卷王...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先先了解自动化…...
人生这场概率游戏,怎么玩
只会标准答案,是不可救药的愚蠢 那么为了便于理解,我用一些典型的案例来讲解,什么是概率游戏,以及这个游戏,应该怎么玩。 比如典型的相亲,婚恋。人生大事,用标准答案来说,你的意中人…...
Redis笔记
缓存过期时间很重要!redis是单线程的 对于内存过多的3中方案: 惰性删除: 在定时删除的基础上,对于已经过期了的数据,redis的随机选择算法一直没有选中这个数据,所以导致它就一直没被删除,但是…...
centos 安装supervisor并运行网站
前言 之前一直用宝塔的**进程守护管理器【Supervisor】**来启动一些项目,如ThinkPHP、Hyperf的项目,或laravel的一些命令。如果不用宝塔怎么办呢? 一、简介[supervisor] [Supervisor] 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支…...
Hadoop面试题十道
问题 1:Hadoop是什么? 答案:Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的存储和处理。它基于Google的MapReduce和Google文件系统(GFS)的思想,旨在解决大数据量的处理和分析问题。…...
使用Docker-Compose对Docker容器集群快速编排
目录 一、Docker-Compose1、Docker-Compose使用场景2、Docker-Compose简介3、Docker-Compose安装部署4、YAML 文件格式及编写注意事项5、Docker Compose配置常用字段6、Docker Compose 常用命令7、Docker Compose 文件结构8、docker Compose撰写nginx 镜像9、docker Compose撰写…...
React-Redux 对Todolist修改
在单独使用redux的时候 需要手动订阅store里面 感觉特别麻烦 不错的是react有一个组件可以帮我们解决这个问题, 那就是react-redux。 react-redux提供了Provider 和 connent给我们使用。 先说一下几个重点知道的知识 Provider 就是用来提供store里面的状态 自动getState()co…...
初识微信小程序
新建小程序 创建一个新的微信小程序项目: 打开微信开发者工具,点击“新建项目”。 在弹出的窗口中,填写小程序的 AppID、项目名称和项目目录等信息。 点击“确定”按钮,等待微信开发者工具自动下载并安装所需的依赖库和框架。 …...
我们该如何入门编程呢
提醒:以下内容仅做参考,可自行发散。在发布作品前,请把不需要的内容删掉。 随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?选择编程语言:选择一种编程…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
