深入浅出:深度学习模型部署全流程详解

news2024/10/24 7:05:39

在这里插入图片描述

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @Yaoyao2024
  • 往期回顾: 【论文精读】PSAD:小样本部件分割揭示工业异常检测的合成逻辑
  • 每日一言🌼: 生活要有所期待, 否则就如同罩在玻璃瓶子里的苍蝇, 每天只忙碌地嗡嗡地飞来飞去, 却不清楚这一切的意义何在。—— 郭城《人间行走:向着通透与自由》

0、前言:

在我大二,参与了一个较为完整的机器学习的目标检测项目,在这个过程中,我陆陆续续写了以下博客,目的是记录我在这个过程中所学习到的知识和技术。

🌸部署和系统开发系列文章

  • QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发
  • QT C++实战:实现用户登录页面及多个界面跳转
  • QT C++实践|超详细数据库的连接和增删改查操作|附源码
  • 【yolov8部署实战】VS2019+OpenCV环境部署yolov8目标检测模型|含详细注释源码
  • 【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolov8目标检测|含源码
  • 【yolov8部署实战】VS2019+Onnxruntime环境部署yolov8-seg分割模型|含详细注释源码
  • QT C++实践| 连接数据库的登录界面实现| 附源码
  • VS2019下打包QT项目的方法(包含第三方库)、打包成一个 exe 安装包

本篇文章的目的,是对整个AI模型生产和AI系统开发做一个较为宏观和整体介绍和讲解。博主本人也只是初学者,若文章有不恰当和错误的地方,恳请指出!万分感谢!

一、AI 模型生产流程过程

生产一个具体的AI模型都会有哪些步骤呢?我们以一个具体例子来串起整个过程。我希望能达到的目的是:输入一张影视明星的图片,可以帮我输出这个明星的名字。
而AI模型生产流程可以分为一下6个步骤:
在这里插入图片描述
相信大家对前四个步骤都是很熟悉了:从确定项目需求,到收集数据,到选择or设计模型到模型的训练。

而在部署的前一个步骤:模型选择和训练,我们都是在pycharm/远程服务器上进行的,我们编写python代码,在一定环境上运行和测试。

Tips:本篇文章的背景是我们在Windows操作系统下,使用开发工具(pycharm/vs code等)进行模型的训练。

这篇文章我们着重讲解的是:模型的部署和系统的开发

在这里插入图片描述

我知道你们可能想问为什么呢?在IDE上运行出来结果不就可以了吗?为什么要进行后续这么多“复杂”的操作呢?其实不是这样的。下面我将对模型的部署的各个步骤进行讲解:

  1. 模型格式转换:
    首先研究员通过各种训练框架训练好的模型一般都需要进行模型格式适配。模型训练大家可以选择各种不同的训练框架,例如TensorFlow,Pytorch,PaddlePaddle,Caffe等等一系列的开源框架,这么多不同的训练框架他们训练出来的模型格式都有各自的标准,各不相同,部署要解决的第一个问题就是要适配各种不同的模型格式。但是如果要一个个训练框架去适配格式,工作量太大,也不适合扩展,所以微软联合Facebook等大厂推出一种中间格式ONNX,希望能解决多种模型格式适配的问题,就是无论是什么训练框架训练出来的模型格式,最终都是用ONNX格式来进行部署。所以一般模型部署可以跑的第一步要解决的问题就是模型格式转换。

  2. 模型压缩:
    模型压缩是对已经训练好的深度模型进行精简,进而得到一个轻量且准确率相当的网络,压缩后的网络具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署在受限的硬件环境中。 训练的时候因为要保证前后向传播,每次梯度的更新是很微小的,这个时候需要相对较高的精度,一般来说需要float型,如FP32,32位的浮点型来处理数据,但是在推理(Inference)的时候,对精度的要求没有那么高,很多研究表明可以用低精度,如半长(16)的float型,即FP16,也可以用8位的整型(INT8)来做推理(Inference)。所以,一般来说,在模型部署时会对模型进行压缩。模型压缩方法有:蒸馏,剪枝,量化等。

    ⭐Tips:在我部署的模型,由于时间原因,其实并没有对模型进行剪枝,这其实导致模型结构大,参数多,效率并不是很高,这其实也是有待优化的一点。

  3. 模型推理和前后处理

    • 前处理因为模型推理的输入是Tensor(多维矩阵)数据,但是正常AI应用的输入都是图片,视频,文字等数据,所以前处理就是要将业务的输入数据(图像,视频,文字等)预先处理成模型推理可以接收的数据—Tensor(多维矩阵)。以图像处理为例,前处理动作就包括但不限于:图像格式转换,颜色空间变换,图像变换(resize,warpaffine(仿射变换)),图像滤波等操作。OpenCV就是intel推出开源的跨平台的计算机视觉库。

    Tips:在后续我们部署的过程中,主要也就是利用OpenCV库进行的。

    • 模型推理模型推理应该是模型部署pipline中最核心的部分。就是需要在实际应用环境中(具体部署设备)将实际输入的数据(转换成Tensor数据后)在训练好的模型中跑通,并且性能和精度等商业指标上达到预期效果。这个过程包括了对部署设备的适配(CPU/GPU/DSP/NPU),要想将模型跑在任何一种设备上,都需要提前针对设备进行适配,并且还要保证性能和精度等指标。这是个非常复杂的过程。
      市面上有非常多的开源深度学习推理框架都是在解决模型推理相关的问题。例如:国内各大厂推出的开源的推理框架:OpenPPL、NCNN、TNN、MNN、PaddleLite、Tengine等等,还有NVIDIA推出的针对GPU卡的TensorRT、intel针对intel芯片的OpenVINO等。
    • 后处理就是将模型推理后的Tensor数据转换成业务可以识别的特征数据(不同的业务会呈现不同的最终效果数据)。

总结下:模型推理和前后处理的流程:

  • step1:PreProcess(Image -> Tensor)
  • step2:NN Forword/Inference(Input Tensor -> Output Tensor)
  • step3:PostProcess(Output Tensor -> Annotation Data)。

⭐Tips:其实在我个人实现的项目中,并没有自己设计推理的代码,大部分根据该模型对应的c++版本稍加修改(这个要看其官网或者民间有没有高手自己手写c++版本的上述推理),这点可以看我写的这几个博客:
- 【yolov8部署实战】VS2019+OpenCV环境部署yolov8目标检测模型|含详细注释源码
- 【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolov8目标检测|含源码
- 【yolov8部署实战】VS2019+Onnxruntime环境部署yolov8-seg分割模型|含详细注释源码

  1. 部署 SDK 和集成
    • 部署SDK:需要模型推理和前后处理功能打包,并考虑实际应用中的license、模型安全(加解密)等功能实现,最终输入一个业务方方便使用的部署SDK
      这是一种单机模式的部署,现在大型模型部署和公有云部署可能是另一种形式。

    SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。具体到我们这个系列教程,我们后面只讨论广义 SDK 的一个子集——即开发 Windows 平台下的应用程序所使用的 SDK。 为了解释什么是 SDK 我们不得不引入 API、动态链接库、导入库等等概念,详细可以看这篇文章:什么是SDK? SDK是什么意思?。

    • 集成:由具体的业务方工程化的同学去实现,将部署SDK集成到具体的应用中,根据实际业务需要通过接口调用,最终达到实际应用AI的效果。例如:上述例子中,具体是要将部署SDK集成进手机端还是pc端,是通过app来实现还是小程序来实现,最终效果如何展示,这些都是集成部分具体业务同学去实现。

⭐Tips:在我使用的部署和集成方法中,我首先在Windows操作系统的C++开发平台上进行模型的部署(就是将模型转换为onnx模式,且将项目代码转换成c++格式),然后在这基础之上呢直接使用专门的模型打包和系统集成工具,一步到位,实现部署SDK和系统的集成,具体可以看我的这篇文章: 🔗VS2019下打包QT项目的方法(包含第三方库)、打包成一个 exe 安装包。

二、我的模型部署和系统集成思路

在讲解之前,先对以下几个概念进行解释:
AI模型特指使用神经网络作为参数结构进行优化的最终具有一个特定作用的模式。 不知道大家在刚开始接触AI模型概念时,是否有这样的疑惑,模型,算法和网络经常是混着出的,而经常好像是互相替换使用的。而下面关于网络,模型和算法的概念是我认为讲的比较清楚的。

  • 网络: 一种简单的网络结构,不包含任何权重参数。
  • 模型: 设计一个网络后,在某些数据集上进行训练,得到一个包含权重参数的数据,称为模型。
  • 算法: 在模型的基础上通过一些代码具体实现某些相关目的,这些代码以及模型文件等等资源被称为某算法。

下面是我个人模型部署的方法:在我的部署方法中,这种方法的具体流程是什么?

我是先在pycharm上开发模型代码(python)格式,然后转换为c++的Qt项目,在c++开发平台上进行开发,我需要对整个模型预测的过程用c++代码和库进行重构,这个过程需要对训练出来的模型权重文件进行转换,以及配置相关的环境。

在把整个python和相关python框架下的模型预测代码转换部署到c++之前,因为我们的目的是:开发在windows上的Qt软件(应用程序),这个软件集成了我们的算法功能。那么这里我们需要使用的就是在C++开发环境下结合Qt相关开发环境,共同进行这个软件的开发,其中Qt的作用就是界面设计,和设计将算法集成到这个系统中。

当我们用Qt设计好界面、且模型也均转换且预测代码部署为c++格式后(上述两个步骤同时进行);对于前者,我们需要在Qt项目的控件触发时留好对应的槽函数,对于后者,在集成时候,注意分好文件,一个功能设计为一个类(一个文件),功能都用函数封装好;在集成时,注意对应设计的功能函数(槽函数)的名称相同,以便加快我们的集成速度。

当上述操作均完成,我们在C++开发平台(如:VS 2019) 上完成了界面设计、模型部署和系统集成后吗,测试无误,则我们可以进行打包操作,打包操作你可以简单理解我把我们智能在开发软件上运行的项目变成任何一个我们在电脑上软件一样的运行方式,这样我们每次想要用这个软件的时候,不用安装开发软件点击exe应用程序即可运行。

总结:

  1. Python模型开发:
    在Pycharm或其他开发环境中编写并训练你的机器学习模型,使用Python编程语言及其相关框架(如TensorFlow、PyTorch等)。在这个阶段,你将完成模型训练、验证,并获得最终的模型权重文件。

  2. 预测算法由python转换为c++:
    一旦模型在Python中训练完成,你需要将模型从Python格式转换为C++可使用的格式。这通常需要将模型权重文件导出为通用格式(如ONNX、TensorFlow Lite等),然后在C++环境中加载这些权重文件。这一步还涉及对Python中的预测代码进行重写,以使用C++的相关库来实现同样的预测功能。

  3. C++和Qt平台上的系统开发:
    在C++环境下(如使用Visual Studio或Qt Creator),你将开发整个应用系统。Qt负责界面设计,C++负责实现模型的推理和业务逻辑。在界面设计上,你使用Qt进行控件的布局和交互设计,确保用户可以通过界面与模型进行交互。

    你需要将Qt控件的槽函数(事件处理函数)与C++代码中的模型推理函数进行关联。例如,用户点击某个按钮时,程序调用相应的C++模型推理代码,给出预测结果。

  4. 代码模块化和封装:
    在C++中开发模型预测功能时,建议将每个功能模块独立封装为类或函数。比如,一个模型的推理过程可以封装为一个类,相关功能和操作都设计为独立的函数。这样能够提高代码的可维护性,也方便在系统集成时快速匹配相应的槽函数和功能函数。

  5. 系统集成:
    当模型转换完毕,Qt界面也设计好之后,你需要将模型的预测功能集成到Qt项目中。此时,要确保在Qt的事件槽函数中正确调用对应的模型推理函数。通过这种方式,你的整个模型预测功能将与Qt界面无缝结合,用户能够通过界面直接触发模型预测。

  6. 测试与打包:
    在C++环境(如Visual Studio或Qt Creator)中完成系统的功能开发后,进行充分的测试,确保模型部署、界面交互及系统集成功能都能正常运行。

    完成测试后,接下来就是打包操作。打包的目的是生成一个可执行文件(.exe),让用户不需要开发环境即可运行软件。在打包时,你需要确保所有依赖库和资源文件都被正确包含在打包文件中,以便于最终用户能够直接运行程序。

通过以上步骤,你将把Python训练好的机器学习模型成功部署到C++环境下,并且通过Qt设计的图形界面提供给最终用户使用。

这个方法的关键点是:

  • 模型转换(Python到C++);
  • C++中功能模块化(确保每个功能独立封装,方便集成);
  • Qt与C++的系统集成(槽函数与模型推理函数的关联);
  • 打包操作(将整个项目打包为可执行文件)。

下面是将模型部署和系统集成思路转换为详细的Mermaid流程图的代码:

Python模型开发
模型训练与验证
导出模型权重文件
模型转换为C++
导出ONNX或TensorFlow Lite格式
重写模型预测代码为C++
在C++平台上开发应用系统
Qt界面设计
模型推理功能实现
功能模块化封装
为控件设计槽函数
将模型推理功能与界面槽函数集成
测试与调试
打包生成可执行文件
生成EXE文件
用户无需开发环境即可运行程序

🪧解释:

  1. Python模型开发:开发Python代码并进行模型训练与验证。
  2. 模型转换为C++:模型训练完毕后,导出模型权重文件(如ONNX格式),并重写C++代码实现模型推理。
  3. C++平台开发应用系统:在C++环境中进行Qt界面设计和模型推理功能的实现。模型的推理功能独立封装,Qt界面的控件与对应的槽函数绑定。
  4. 系统集成:将各个功能模块集成在一起,确保界面操作触发相应的模型推理。
  5. 测试与调试:测试系统并进行调试,确保模型部署和界面集成功能无误。
  6. 打包与发布:打包为可执行文件,用户可以直接运行。

下面我将分三个大的部分进行介绍,分别是:

  • Qt项目的创建和Qt界面的设计
  • 模型转换为C++的部署在Qt项目中
  • 将完整的Qt项目打包成exe文件

2.1:Qt项目的创建和Qt界面的设计

首先是在VS2019中创建Qt项目,这个网上教程就很多了,我也不重复造轮子了,大家就安装我下面发的几个教程进行即可

  • VS2019 Qt开发环境搭建与配置

  • VS2019+opencv4.5.1+Qt5.12.10配置+Qt设计图片处理GUIDemo实操 全记录

Qt这个工具的主要作用是:

  1. 软件界面的设计
  2. 软件功能的设计

它的用法也很简单,这个一边学一边做就可以,我上面展示的博客也记录了我使用Qt开发的一些功能,很多代码都是现成的,需要什么功能现场搜着学习就行。

最重要的就是按钮和槽函数,理解这个开发起来就会容易很多。让我来通俗易懂解释一下,按钮也就是槽,当我们点击我们软件上的按钮时候,软件会给出一些反应,这些反应就是因为这个按钮触发到了其对应的槽函数,运行这个函数进行的。

相信我们计科的同学都学过前端设计,和html的工作原理是基本相同的,而且Qt还是拖拽式的,相信你们上手也会非常快。

🌻总结:

Qt开发流程:

  1. VS2019中创建Qt项目

    • 参考教程配置VS2019与Qt环境,创建一个新的Qt项目。此步骤主要是项目的初始配置,可以根据教程一步步完成。
  2. 界面设计(UI设计)

    • 使用Qt Designer(集成在Qt Creator中)或VS2019中的Qt UI工具进行软件界面设计。拖放按钮、文本框、图像等UI控件,快速创建用户界面。
  3. 按钮和槽函数关联

    • 槽函数是Qt中用来响应用户交互的机制。通过信号和槽的机制,将按钮等控件的动作(例如点击)与具体的功能逻辑关联起来。
  4. 实现软件功能

    • 在VS2019的C++开发环境中编写与界面相关的功能代码。例如,实现按钮点击后触发的功能逻辑,将算法功能集成到槽函数中。
  5. 模型功能集成

    • 将C++重构后的算法模型整合到Qt项目中。实现当用户点击某个按钮时,触发模型推理功能并在界面上显示结果。
  6. 测试和调试

    • 反复测试UI交互、模型推理功能,确保每个控件触发的功能符合预期。
  7. 打包发布

    • 完成界面设计与功能集成后,将项目打包成可执行文件,生成一个独立的可运行软件。

Qt开发流程图(Mermaid)

打包发布
功能实现
UI设计流程
使用Qt Designer
信号和槽机制
C++代码
完成功能
生成EXE可执行文件
修复问题
软件独立运行
集成模型预测功能
实现功能逻辑
拖放按钮和控件布局
UI设计
按钮连接槽函数
创建Qt项目
测试和调试

解释:

  • 创建项目:参考教程在VS2019中创建Qt项目,完成开发环境的配置。
  • UI设计:通过Qt Designer设计软件界面。用户可以通过拖放控件(按钮、文本框等)快速生成界面。
  • 按钮和槽函数:按钮的点击事件通过槽函数与功能代码关联,Qt的信号和槽机制将控件的动作与功能逻辑连接。
  • 功能实现:编写C++代码,定义槽函数的具体功能,实现算法推理功能。
  • 测试与调试:测试按钮点击、功能触发及模型推理的正确性,调试并优化代码。
  • 打包发布:完成项目后,生成EXE文件,使软件可以独立运行。

🌟Tips:其中我们第二部中,功能的实现,就是指我们把我的模型预测功能用c++实现,放到槽函数中,进行功能的完成。

2.2:模型转换为C++的部署在Qt项目中

因为我们代码中主要涉及到了两个功能:

  1. 目标检测
  2. 分割
  3. 和上述功能的集成

这里对于前两个,如何进行部署,我都写了详细的博客,这个直接去看我写的博客即可:

  • 【yolov8部署实战】VS2019+OpenCV环境部署yolov8目标检测模型|含详细注释源码
  • 【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolov8目标检测|含源码
  • 【yolov8部署实战】VS2019+Onnxruntime环境部署yolov8-seg分割模型|含详细注释源码

部署完后,我们再将其与对于的槽函数连接,在对应的槽函数中调用其部署好的C++功能函数即可。

🚨注意:在我们把预测代码转换为c++后,我们要注意我们开发环境(推理所用到的环境。如库等)需要适配于目标部署机器,不同设备(如GPU、CPU、DSP、NPU)的适配问题以及同意设备不同型号之间的差别需要格外注意。

2.3:将完整的Qt项目打包成exe文件

这一步是最简单的一步,我也写了完整的操作流程博客:

  • VS2019下打包QT项目的方法(包含第三方库)、打包成一个 exe 安装包

三、最后

上文对模型部署和系统集成的流程进行了较为全面的概述,但实际上每一个步骤都并非那么简单。在整个开发流程中,一些具体的功能性实现,如连接数据库、菜单栏的设计以及模型的优化等,都蕴含在各个大的步骤当中。

连接数据库需要考虑数据库的类型选择、连接参数的配置以及数据的存储和读取方式等问题。在进行菜单栏设计时,要充分考虑用户的操作习惯和需求,合理布局菜单选项,以提高软件的易用性。而模型的优化则涉及到多个方面,包括但不限于调整模型的超参数、采用更高效的训练算法、进行数据增强等,以提升模型的性能和准确性。

这些具体的功能和优化需要开发者在实际的开发过程中不断探索和实践,根据具体的项目需求和实际情况进行调整和改进。只有深入理解每一个步骤的内涵和要求,才能开发出高质量的 AI 系统,实现预期的目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上,华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布。 华为官方透露,截至目前,鸿蒙操作系统在中国市场份额占据 Top2 的领先地位,拥有超过 1.1 亿 的代码行和 6…

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者,我最近发现了一个超赞的请求库 alovajs,它真的让我眼前一亮!说实话,我感觉自己找到了前端开发的新大陆。大家知道,在前端开发中,处理 Client-Server 交互一直是个老大难的问题&#xff…

查缺补漏----用户工作区,系统缓冲区,外设工作最短时间计算

对于下面这一题,分析起来很简单: 答案:C 以上是单缓冲区,补充双缓冲区是什么情况: 1.假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为15us,由缓冲区送至用户区的时间是5us&#xff0c…

etl-查询错误log日志和oracle删除数据表空间

查看weblogic日志的目录 建立连接ssh root192.168.30.1xx 密码hygd123 找到下面路径中的文件 cd /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/bapp-logs 查看log日志 tail -f -n 400 Adminservers.log oracle删除表空间(切换到dba用户…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

Qt开发-----线程调度

目录 前言 一、Linux下查看进程的情况 二、线程的创建 三、多线程的创建和使用 前言 以下引用内容源自正点原子Qt开发指南文档。 我们写的一个应用程序,应用程序跑起来后一般情况下只有一个线程,但是可能也有特殊情况。比如我们前面章节写的例程都跑…

《YOLO目标检测》—— YOLOv1 详细介绍

文章目录 一、算法特点二、网络结构三、检测过程四、损失函数五、性能表现六、优缺点 YOLO v1(You Only Look Once version 1)是一种快速的目标检测算法,以下是对YOLO v1的详细介绍: 一、算法特点 端到端的网络结构:Y…

项目:Boost 搜索引擎

项目:Boost 搜索引擎 1、项目背景 公司:百度、360、搜狗、谷歌 …站内搜索:搜索的数据更垂直(相关),数据量小 2、整体框架 3、技术栈和项目环境 技术栈:C/C C11,STL,jso…

【JAVA毕设】基于JAVA的仓库管理系统

一、项目介绍 本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router实现动态路由,Ajax实现前后端通信,Element-plus组件库使页面快速成型。后端部分:采用SpringBoot作为开发框架,同时集成MyBatis、Redis、…

C#中的LINQ之美:优雅的数据查询与操作

LINQ(Language Integrated Query,语言集成查询)是C#中一个强大的工具,它将查询功能直接融入到语言中,使开发者能够以一种更直观、更接近自然语言的方式来操作数据。LINQ不仅能极大地提高开发效率,而且让代码…

掌握ElasticSearch(五):查询和过滤器

一、查询和过滤器的区别 在 Elasticsearch 中,查询(Query)和过滤器(Filter)是用于检索和筛选数据的重要组成部分。它们虽然都能用来查找文档,但在性能和用法上有所不同。下面详细介绍查询和过滤器的概念以…

Lucas带你手撕机器学习——K近邻

K近邻 (K-Nearest Neighbor KNN) K近邻算法(K-Nearest Neighbors, KNN)是一种简单直观的机器学习算法,适用于分类和回归问题。它的核心思想是:判断一个数据点的类别或预测值时,参考它在特征空间中最近的 KKK 个数据点…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

什么是微服务中的反应性扩展?

大家好,我是锋哥。今天分享关于【什么是微服务中的反应性扩展?】面试题?希望对大家有帮助; 什么是微服务中的反应性扩展? Reactive Extensions 也称为 Rx。这是一种设计方法,我们通过调用多个服务来收集结果…

STM32G474使用TIM2触发DAC输出输出正弦波

STM32G474使用TIM2触发DAC输出,数据从内存到外设就要使用DMA来协助。DAC1每隔1秒输出一个正弦波数据,就会模拟近似得到模拟的正弦波形。用来测试CPU内部的运算放大器,或者用作其它模拟输入信号。 测试程序如下: #include "…

立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!

前言:本文参考,韦东山老师开发文档,连接放在最后。 为什么需要中断管理函数? 在FreeRtos操作系统中,需要实时响应性,也就是随时随地必须保证正常多任务的运行,如果有中断发生,因为中…

Spring Cloud --- Sentinel 规则持久化

为什么要持久化 一旦我们重启微服务应用,sentinel 规则将消失,生产环境需要将配置规则进行持久化 怎么实现持久化 将限流配置规则持久化进 Nacos 保存,只要刷新 8401 某个 rest 地址,sentinel 控制台的流控规则就能看到&#x…

keil新建工程HC32L176MATA

先看一下最后的文件夹结构(文件夹结构可以根据项目实际的需要去定义) keil内: 参考文章: KEIL平台下新建华大HC32F460单片机工程笔记_hc32f keil环境搭建-CSDN博客 (我根据需要,创建的文件夹结构和原文是有…

面试总结一

面试总结 1、自我介绍一下自己2.面试11、css常用布局有哪些2、css常用的属性3.js原型链4、开发中遇到的技术难点5、闭包6、ts了解什么呢7.git都用什么命令8、vue怎么打包9.vue启动一个项目需要什么10、vue怎么创建一个项目 2.面试21.vue2和vue3有什么区别2.复杂组件的封装&…

C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser

本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要,及北京联高软件开发有限公司实现的 C# 版本 xodr 文件(XML) Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时,ASAM 允许不受限制地…