【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

news2024/9/30 11:17:32

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

    • 一、TFLM是什么?
    • 二、TFLM开源项目
      • 2.1 下载TFLM源代码
      • 2.2 TFLM基准测试说明
      • 2.3 TFLM基准测试命令
    • 三、TFLM初步体验
      • 3.1 PC上运行Keyword基准测试
      • 3.2 PC上运行Person detection基准测试
      • 3.3 No module named 'numpy'问题解决
    • 四、TFLM源码浅析
      • 4.1 编译生成的.o文件
      • 4.2 基准测试的构建目标
      • 4.3 基准测试的构建规则
      • 4.4 TFLM库的构建规则
    • 五、TFLM主体移植
      • 5.1 实现TFLM库的构建
      • 5.2 实现辅助函数microlite_test
      • 5.3 实现keyword基准测试的构建
      • 5.4 实现Person detection基准测试的构建
      • 5.5 实现基准测试依赖的功能——计时和日志
    • 六、参考链接

本系列将介绍如何将TensorFlow Lite for Microcontrollers一直到STM32H7S78-DK上。由于整个过程较为繁琐,本系列将分为上下两篇进行介绍。本文为系列内容的上篇,主要分为TFLM是什么、TFLM初步体验、TFLM源码浅析、TFLM主体移植几个部分。其中,TFLM初步体验部分将会介绍如何在PC上运行TFLM基准测试,TFLM源码浅析部分主要介绍TFLM源码是如何进行构建的,TFLM主体移植主要介绍如何在基于CMake的STM32项目中构建TFLM库和基准测试。

一、TFLM是什么?

你或许都听说过TensorFlow——由谷歌开发并开源的一个机器学习库,它支持模型训练和模型推理。

今天介绍的TFLM,全称是TensorFlow Lite for Microcontrollers,翻译过来就是“针对微控制器的TensorFlow Lite”。那TensorFlow Lite又是什么呢?

TensorFlow Lite(通常简称TFLite)其实是TensorFlow团队为了将模型部署到移动设备而开发的一套解决方案,可以简单理解为TensorFlow的手机版。下面是TensorFlow官网上关于TFLite的一段介绍:

TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型,以便实现设备端机器学习。

而我们今天要介绍的TensorFlow Lite for Microcontrollers(TFLM)则是 TensorFlow Lite的微控制器版本。这里是官网上的一段介绍:

TensorFlow Lite for Microcontrollers (以下简称TFLM)是 TensorFlow Lite 的一个实验性移植版本,它适用于微控制器和其他一些仅有数千字节内存的设备。 它可以直接在“裸机”上运行,不需要操作系统支持、任何标准 C/C++ 库和动态内存分配。核心运行时(core runtime)在 Cortex M3 上运行时仅需 16KB,加上足以用来运行语音关键字检测模型的操作,也只需 22KB 的空间。

这三者一脉相承,都出自谷歌,区别是TensorFlow同时支持训练和推理,而后两者只支持推理。TFLite主要用于支持手机、平台等移动设备,TFLM则可以支持单片机。从发展历程上来说,后两者都可以说是TensorFlow项目的“支线项目”。或者说这三者是一个树形的发展过程,目前是三个并进发展的。

简单总结: TensorFlow Lite是 TensorFlow的移动版,少了训练功能,TensorFlow Lite for Microcontrollers 是 TensorFlow Lite 的MCU优化版。这三者,CPU推理的代码基本上完全一致,后两者也可以理解为TensorFlow 的裁剪版。

二、TFLM开源项目

TFLM代码仓链接:https://github.com/tensorflow/tflite-micro

2.1 下载TFLM源代码

下载TFLM需要使用如下git命令:

 git clone https://github.com/tensorflow/tflite-micro.git

TFLM顶层目录下的文件和目录,如下图所示:

image-20240915212410086

2.2 TFLM基准测试说明

TFLM顶层目录有README.md文件,其Additional Documentation节列出来Benchmark说明,Benchmark(基准测试)用于衡量关键模型和工作负载的性能。

README.md前一半内容为:

image-20240915212828124

完整内容参考: tflite-micro/tensorflow/lite/micro/benchmarks/README.md at main · tensorflow/tflite-micro (github.com)

2.3 TFLM基准测试命令

从README的”Run on x86”可以看到,在x86 PC上运行关键词基准测试的命令是:

make -f tensorflow/lite/micro/tools/make/Makefile run_keyword_benchmark

在x86 PC上运行人体检测基准测试的命令是:

make -f tensorflow/lite/micro/tools/make/Makefile run_person_detection_benchmark

以上两个命令都会调用make命令,并以tensorflow/lite/micro/tools/make/Makefile为构建规则,分别构建run_keyword_benchmarkrun_person_detection_benchmark两个目标。

查阅tensorflow/lite/micro/tools/make/Makefile文件夹内容,可以看到:

image-20240915213658373

这段代码中的 595行、601行、605行、612行、613行 分别会下载一些文件,具体下载的是tflm依赖的库和测试数据集;

而执行上面两个make命令,实际上会依次执行如下步骤:

  1. 下载依赖库和数据集;
  2. 编译测试程序;
  3. 运行测试程序;

必须至少一遍make命令,才会下载测试数据集,才能进行后续的移植步骤。

三、TFLM初步体验

由于TFLM开源项目依赖部分三方软件代码没有直接放在TFLM源码仓中,需要运行一次基准测试才会下载下拉进行编译。因此,我们需要先在PC上体验一下TFLM基准测试。

PC上运行TFLM推荐使用Ubuntu系统,其他操作系统运行可能会有些问题。

3.1 PC上运行Keyword基准测试

PC Linux系统上,运行如下命令,可以执行Keyword基准测试:

make -f tensorflow/lite/micro/tools/make/Makefile run_keyword_benchmark

命令执行完毕,最后输出如下:

image-20240915220542913

PC上运行10次耗时3毫秒。

3.2 PC上运行Person detection基准测试

make -f tensorflow/lite/micro/tools/make/Makefile run_person_detection_benchmark命令执行完毕,最后输出如下:

image-20240915220904048

image-20240915220841572

PC上运行10次,有人的耗时343毫秒,无人的耗时337毫秒。

3.3 No module named 'numpy’问题解决

make命令报错:

image-20240915214404249

解决方法:

pip install numpy

四、TFLM源码浅析

开始移植TFLM之前,需要清楚TFLM整个源码项目是如何构建的(也就是构建规则)。

4.1 编译生成的.o文件

PC上运行完基准测试命令过程中,会执行源码编译命令。运行完成后,使用如下命令,可以找到所有.o文件:

find . -name '*.o'

部分输出如下图所示:

image-20240918205828262

通过该命令的输出,我们可以知道刚刚的两个命令一共有多少源文件参与了编译。

4.2 基准测试的构建目标

要移植TFLM,仅仅知道有多少源文件参与编译还不够,我们需要知道具体的构建规则。本节将通过分析Makefile解读基准测试的具体构建目标(target)。

从前面的PC端运行Keyword基准测试的输出可以看到,可执行程序名称为keyword_benchmark,通过搜索源码,可以找到对应的Makefile构建规则代码为:

image-20240918213031151

这里调用了Makefile的宏函数microlite_test,并传递了4个参数,分别为:

  • 参数1:keyword_benchmark
  • 参数2:$(KEYWORD_BENCHMARK_SRCS)
  • 参数3:$(KEYWORD_BENCHMARK_HDRS)
  • 参数4:$(KEYWORD_BENCHMARK_GENERATOR_INPUTS)

4.3 基准测试的构建规则

下面以keyword_benchmark为例分析具体构建规则。

宏函数microlite_test的具体定义为:

image-20240918214047186

image-20240918215156216

前面我们执行了如下命令:

make -f tensorflow/lite/micro/tools/make/Makefile run_keyword_benchmark

这个命令指定的目标名称为run_keyword_benchmark,对应到helper_function.inc文件中的84行,参数1为keyword_benchmark,下方规则的TEST_SCRIPT变量的值定义在tensorflow/lite/micro/tools/make/Makefile文件中为空白字符串,因此不起作用;

84行还可以看到run_keyword_benchmark目标依赖$(keyword_benchmark_BINARY)目标,回看到52行,可以知道:

  • $(keyword_benchmark_BINARY)目标表示可执行程序文件路径,:

  • $(keyword_benchmark_BINARY)目标依赖$(keyword_benchmark_LOCAL_OBJS)目标;

  • $(keyword_benchmark_BINARY)目标依赖$(MICROLITE_LIB_PATH)目标;

  • $(keyword_benchmark_BINARY)目标的构建规则为:

    $$(CXX) $$(CXXFLAGS) $$(INCLUDES) \
     	-o $$(keyword_benchmark_BINARY) $$(keyword_benchmark_LOCAL_OBJS) \
     	$$(MICROLITE_LIB_PATH) $$(LDFLAGS) $$(MICROLITE_LIBS)
    

根据传参,可以知道,一些变量的值为:

  • keyword_benchmark_LOCAL_SRCS的初始值为: tensorflow/lite/micro/benchmarks/keyword_benchmark.cc

  • keyword_benchmark_LOCAL_HDRS的值为:tensorflow/lite/micro/benchmarks/micro_benchmark.h

  • 得到GEN_RESULTS的命令为: python3 tensorflow/lite/micro/tools/generate_cc_arrays.py gen/linux_x86_64_default_gcc/genfiles tensorflow/lite/micro/models/keyword_scrambled.tflite,该命令会将模型文件转为.h.cc文件,其中.h为声明,.cc为数据:

    #include <cstdint>
    
    constexpr unsigned int g_keyword_scrambled_model_data_size = 34576;
    extern const unsigned char g_keyword_scrambled_model_data[];
    

    命令的输出为:gen/linux_x86_64_default_gcc/genfiles/tensorflow/lite/micro/models/keyword_scrambled_model_data.cc

  • keyword_benchmark_LOCAL_SRCS值会变为包含刚刚生成的模型keyword_scrambled_model_data.cc

  • keyword_benchmark_LOCAL_OBJS的值是:先将keyword_benchmark_LOCAL_SRCS值中所有.cc替换为.o,再给每个值添加前缀gen/linux_x86_64_default_gccobj/core/

  • MICROLITE_LIB_PATH的值为库文件libtensorflow-microlite.a的完整路径: gen/linux_x86_64_default_gcc/lib/libtensorflow-microlite.a

好了,到这里就可以看到$(keyword_benchmark_BINARY)目标构建规则下方命令的主要参数了:

  • -o选项为gen/linux_x86_64_default_gcc/bin/keyword_benchmark

  • $(keyword_benchmark_LOCAL_OBJS)为所有目标文件(.o)列表;

  • $(MICROLITE_LIB_PATH)是链接的库文件(.a)路径;

  • $(LDFLAGS)是链接器命令行选项;

  • $(MICROLITE_LIBS)是额外库选项,实际为 -lm

    到这里,Keyword基准测试的构建规则以及分析清楚了。

4.4 TFLM库的构建规则

接下来,我们分析keyword链接的库文件libtensorflow-microlite.a(简称TFLM库)的链接规则。

该目标的定义为:

image-20240918223607739

这里可以看到,该库是由以下目标文件列表归档(使用ar命令)而来:

  • $(MICROLITE_LIB_OBJS)
  • $(MICROLITE_KERNEL_OBJS)
  • $(MICROLITE_THIRD_PARTY_OBJS)
  • $(MICROLITE_THIRD_PARTY_KERNEL_OBJS)
  • $(MICROLITE_CUSTOM_OP_OBJS)

其中,前四个变量的值来自:

image-20240918223939972

这里可以看到,前面的几个目标文件列表分别来自:

  • $(MICROLITE_LIB_OBJS)来自于$(MICROLITE_CC_SRCS)
  • $(MICROLITE_KERNEL_OBJS)来自于$(THIRD_PARTY_CC_SRCS)
  • $(MICROLITE_THIRD_PARTY_OBJS)来自于$(THIRD_PARTY_KERNEL_CC_SRCS)
  • $(MICROLITE_THIRD_PARTY_KERNEL_OBJS)来自于$(MICROLITE_CC_KERNEL_SRCS)
  • $(MICROLITE_CUSTOM_OP_OBJS)没有在Makefile中定义,默认为空,可以忽略(实际使用时,可以通过命令行参数指定);

经过在Makefile中加入日志打印,发现上述几个xxx_SRCS变量的值为:

image-20240919211922448

五、TFLM主体移植

从TFLM官方介绍文档、测试命令以及源码分析可以知道,在STM32H7S78-DK上移植TFLM可以分解为以下几个主要任务:

  • 实现TFLM库的构建
  • 实现CMake版的辅助函数microlite_test
  • 实现keyword基准测试的构建
  • 实现person detection基准测试(可选)的构建
  • 实现基准测试依赖的功能——计时和日志

接下来分别介绍,如何完成上述任务。

5.1 实现TFLM库的构建

有了以上分析之后,我们就可以进行今天最重要的工作,将Makefile转换为CMake构建规则文件(CMakeLists.txt)。

这部分是整个移植过程中工作量和难度最大的部分,涉及到很多CMake的语法细节,这里不详细介绍。

实现TFLM库构建的CMake代码为:

TFLM-libtflite-micro

5.2 实现辅助函数microlite_test

TFLM源码中,构建基准测试使用了GNU Make的microlite_test宏函数,实现了代码的复用和逻辑精简。和GNU Make类似的,CMake也支持函数。本节我们实现GNU Make的microlite_test宏函数的CMake移植版。

CMake具体代码如下:

TFLM-microlite_test

这部分做了几个特殊处理:

  • 目标类型从可执行程序修改为静态库,即生成文件类型由.elf文件改为.a文件;
  • 使用宏将main函数重命名为${NAME}_main

做出如上两处修改的原因是——由CubeMX生成的基础已经有main函数,并且可以生成elf文件。通过上述两个修改,我们可以将基准测试代码链接到CubeMX生成的代码中去,进而实现整个项目可以在STM32H7S78-DK上运行。

5.3 实现keyword基准测试的构建

有了CMake辅助函数microlite_test之后,实现keyword基准测试的构建就很简单了,直接看代码:

TFLM-keyword_benchmark

5.4 实现Person detection基准测试的构建

同样的,有了CMake辅助函数microlite_test之后,实现Person detection基准测试的构建也很简单,直接看代码:

TFLM-person_detection

5.5 实现基准测试依赖的功能——计时和日志

TFLM本身是一个边缘AI推理库,可以理解为一个举证向量计算库,纯CPU计算不依赖任何外设功能。但是,TFLM的基准测试则依赖计时和日志功能。在不同平台上,计时和日志功能的实现方式有所不同,对应的代码也不同(例如Linux、Windows、MacOS操作系统、STM32单片机、ESP32单片机上,实现计时和日志的代码是不是一样的)。

TFLM源码中,已经为移植进行了设计,其中两个文件名分别对应计时和日志:

  • debug_log.cc,用于实现计时功能,不同平台有不同版本;
  • micro_time.cc,用于实现计时功能,不同平台有不同版本;

默认的debug_log.cc实现为tensorflow/lite/micro/debug_log.cc,其主要代码内容为:

TFLM-debug_log_stderr

这里实现了——使用vfprintfstderr输出。借助过往经验,我们知道CubeMX生成的项目稍加修改就能够支持printf,这种方式应该也可以支持。

因此,对于STM32单片机这部分可以不用修改!

默认的micro_time.cc实现为tensorflow/lite/micro/micro_time.cc,其主要代码内容为:

TFLM-micro_time_ctime

这个文件里面提供了两种实现,通过TF_LITE_USE_CTIME宏进行切换:

  • 如果没定义TF_LITE_USE_CTIME宏,则为空实现,提供空壳函数,可以编译通过,无法正常计时;
  • 如果定义了TF_LITE_USE_CTIME宏,则为基于C标准库clock()CLOCKS_PER_SEC的计时;

对于STM32单片机,C标准库的clock()的计时不能直接使用。

因此,对于STM32单片机,需要单独实现一个micro_time.cc文件,具体代码为:

TFLM-micro_time_stm32_hal

到这里,TFLM移植的主体内容基本已经完成了,还有一些问题需要解决,我能将在下篇进行介绍,欢迎关注。

本篇内容到此为止,感谢阅读!

六、参考链接

  1. TensorFlow Lite for Microcontrollers介绍: TensorFlow Lite for Microcontrollers (google.cn)
  2. TensorFlow Lite for Microcontrollers入门: 微控制器入门 | TensorFlow (google.cn)
  3. tflite-micro 源码GitHub仓: https://github.com/tensorflow/tflite-micro
  4. CMake最新文档: CMake Reference Documentation — CMake 3.30.3 Documentation

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

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

相关文章

netty之基础aio,bio,nio

前言 在Java中&#xff0c;提供了一些关于使用IO的API&#xff0c;可以供开发者来读写外部数据和文件&#xff0c;我们称这些API为Java IO。IO是Java中比较重要知识点&#xff0c;且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能&#xff0c;目前有三种IO共…

怎么在Windows系统中使用Chrome的语音搜索功能

在Windows系统中使用谷歌浏览器的语音搜索功能是一种快速且方便的搜索方式。本文将详细介绍如何在Windows系统中启用和使用Chrome的语音搜索功能。 &#xff08;本文由https://chrome.cmrrs.com/站点的作者进行编写&#xff0c;转载时请进行标注。&#xff09; 一、 启用语音搜…

《Cell》|单细胞+空间转录组绘制人类鳞状细胞癌组成和空间结构图谱

文章信息 文章题目&#xff1a;Multimodal Analysis of Composition and Spatial Architecture in Human Squamous Cell Carcinoma 发表期刊&#xff1a;《Cell》 影响因子&#xff1a;45.5 PART 1 研究背景 皮肤鳞状细胞癌&#xff08;cSCC&#xff09;主要特征是组织极…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用&#xff0c;也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是&#xff0c;此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码&#xff0c;请按照我们的指南重…

基于基于微信小程序的社区订餐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

64.【C语言】再议结构体(下)

本文衔接第63篇63.【C语言】再议结构体(上) 目录 目录 6.复习 7.修改默认对齐数 8.结构体传参 01.传递非指针参数 02.传递指针参数(传递地址) 03.对比 9.结构体实现位段 01.位段的定义 02.格式 03.例题 答案速查 分析 10.位段跨平台问题 11.位段的应用 12.其他…

ubuntu20.04系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot&#xff0c;使得c可以可视化编程&#xff1b;安装Matplot之前&#xff0c;需要先安装一个gnuplot&#xff0c;因为Matplot是依赖于此库 gnuplot下载链接&#xff1a; http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过&#xff0c;下面源码…

EasyCVR视频汇聚平台:解锁视频监控核心功能,打造高效安全监管体系

随着科技的飞速发展&#xff0c;视频监控技术已成为现代社会安全、企业管理、智慧城市构建等领域不可或缺的一部分。EasyCVR视频汇聚平台作为一款高性能的视频综合管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建智慧安防/视频监控系统中展现出了…

如何设计能吸引下载的截图以及注意事项

应用商店优化包括两个方面&#xff1a;关键字优化&#xff08;吸引人们查看您的应用页面&#xff09;和屏幕截图优化&#xff08;将浏览量转化为下载量&#xff09;。两者相互依存&#xff0c;两者相辅相成&#xff0c;让您的应用获得应有的下载量。但是&#xff0c;如果浏览量…

MySQL_视图

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

计算机毕业设计Python抖音可视化 抖音大数据分析 抖音爬虫 抖音用户行为分析 抖音大数据 Hadoop Spark 数据仓库 推荐系统 机器学习 深度学习

Python抖音可视化开题报告 一、研究背景与意义 随着移动互联网的迅猛发展&#xff0c;短视频平台如抖音已成为人们日常生活中不可或缺的一部分。抖音以其独特的算法和内容推荐机制&#xff0c;吸引了数以亿计的用户。然而&#xff0c;随着用户规模的不断扩大&#xff0c;如何…

海信给AI电视打样,12大AI智能体全面升级大屏体验

9月29日&#xff0c;海信在秋季新品发布会上正式推出了百吋AI新品阵容&#xff0c;通过全新升级的ULED AI画质平台和行业首发的12大电视AI智能体&#xff0c;再一次引领AI电视创新方向&#xff0c;让用户在任意环境和场景下享受超高画质体验。同时可以用最简单的交流获得最想要…

WingetUI:可视化Windows常用的命令行包管理工具

推荐一个Windows工具&#xff0c;可以轻松地下载、安装、更新和卸载任何在支持的包管理器上发布的软件。 01 项目简介 WinGetUI 是一个基于 .NET 的开源项目&#xff0c;它旨在提供一个图形用户界面&#xff08;GUI&#xff09;来管理包&#xff0c;支持命令比如 Winget、Sco…

Javase学习day1-前置知识

1、什么是计算机 2、 硬件及冯诺依曼结构 3、软件及软件开发 4、常用的快捷键 5、常用的Dos命令 常用的Dos命令&#xff1a;(基本都是在cmd里面写的) #盘符切换&#xff1a;直接输入那个盘符的名字加一个冒号就行。 #切换目录&#xff1a; cd change directory&#xff08;这是…

阿里云ACP认证考试题库

最近有好些同学&#xff0c;考完阿里云ACP了&#xff0c;再来跟我反馈&#xff1a;自己花700买的阿里云ACP题库&#xff0c;结果答案是错的&#xff01; 或者考完后发现&#xff0c;买的阿里云ACP题库覆盖率只有50%&#xff01; 为避免大家继续踩坑&#xff0c;给大家分享一个阿…

【机器学习】自动驾驶——智能交通与无人驾驶技术的未来

自动驾驶技术是近年来最热门的人工智能应用之一。它结合了机器学习、计算机视觉、传感器融合以及复杂的算法&#xff0c;推动了智能交通系统的发展。随着技术的不断进步&#xff0c;自动驾驶不仅有望改变个人出行方式&#xff0c;还将对城市交通、物流配送以及公共安全产生深远…

虚拟机如何固定IP地址(VMware+centos7)图文教程

创建虚拟机后进行ip固定 关闭上面的界面 安装下面的图片打开网络编辑器 打开管理员权限 安装图中进行配置 打开ssh客户端&#xff08;这里使用的是Mobaxterm&#xff09; 输入以下命令 #直接复制粘贴 cd /etc/sysconfig/network-scripts/ ls 例 然后编辑文件 ifcfg-ens33 …

ArduSub程序学习(11)--EKF实现逻辑④

1.controlFilterModes() controlFilterModes() 是 NavEKF2_core 类中的一个关键函数&#xff0c;用于控制和管理扩展卡尔曼滤波器&#xff08;EKF&#xff09;的不同工作模式。该函数在 UpdateFilter 方法中被调用&#xff0c;确保滤波器根据系统状态&#xff08;如飞行状态、…

云中红队系列 | 使用 Azure FrontDoor 混淆 C2 基础设施

重定向器是充当 C2 服务器和目标网络之间中间人的服务器。其主要功能是重定向 C2 和受感染目标之间的所有通信。重定向器通常用于隐藏 C2 服务器流量的来源&#xff0c;使防御者更难以检测和阻止 C2 基础设施。 基于云的重定向器提供了一个很好的机会&#xff0c;通过内容分发…

万界星空科技MES系统,打造数字化转型小灯塔企业

小灯塔工厂是一个相对的概念&#xff0c;它可能指的是在数字化转型和智能制造方面取得一定成就&#xff0c;但尚未达到全球“灯塔工厂”标准的企业。这些企业可能已经在生产过程中运用了数字化、网络化和智能化的手段&#xff0c;提高了生产效率和质量&#xff0c;降低了制造成…