news 2026/8/29 14:19:38

边缘AI模型验证实战:STM32N6部署与调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
边缘AI模型验证实战:STM32N6部署与调优

做嵌入式AI落地三年多,我一直觉得最磨人的环节不是训练,而是“搬模型”。训练的时候精度再高,一部署到单片机上就各种水土不服:内存爆了、算子不支持、量化后精度掉得一塌糊涂。LAT1601这个应用笔记,讲的就是STM32N6上怎么把模型验收这关过掉——从工具链环境准备,到模型转换、TrustZone安全区/非安全区配置,再到实际跑推理和精度性能验证,一条龙讲透。写这篇文章,就是把我在N6上实际验证模型踩过的坑和验证方法完整复盘一遍,希望对正在做STM32N6 AI落地的朋友有直接帮助。

1. 先搞清楚:STM32N6上的模型验证到底在验证什么

1.1 STM32N6和Neural-ART加速器,能做什么

STM32N6是ST针对边缘AI场景推出的高性能MCU系列,和以往STM32最大的区别在于它集成了一个专门的NPU——Neural-ART加速器。这颗NPU在800MHz的主频配合下,可以提供600 GOPS的INT8算力。对比一下,STM32H7这类不带NPU的芯片,跑一个MobileNetV2单次推理往往需要几百毫秒甚至更久,而STM32N6可以把耗时压到个位数毫秒级,这个差距是质的飞跃。

Neural-ART本质上是一个由多个计算簇组成的深度学习加速器,专门针对卷积、全连接、激活函数这些常见算子做了硬件优化。它支持INT8、INT16量化精度,内部有紧耦合SRAM用来缓存权重和中间激活值,尽可能减少和Cortex-M55核心之间的数据搬运。这种架构设计决定了验证模型时不能只看算法精度,还得看内存布局、数据格式、数据搬运路径是否合理。

1.2 验证模型和训练模型是两回事

很多刚开始接触模型部署的同事会有一个错觉:模型在PC上跑通了,数据也对,剩下的无非是交叉编译。实际完全不是这样。

训练时我们处理的是浮点张量,PyTorch或TensorFlow会帮你处理内存分配、算子调度、并发执行。但在STM32N6上,模型要经过量化转成INT8、权重要重新排列成NPU友好的布局、算子的执行顺序要经过X-CUBE-AI的编译器重新规划、中间激活值要预分配到有限的SRAM里。任何一步出错,或者模型里有不支持的算子,转换阶段就会直接失败。

更关键的是浮点转INT8的量化过程。同一个模型,在PC上跑Float32精度可能达到95%,量化为INT8之后可能掉到90%,差的这5个点如果在验证阶段不仔细评估,等产品量产之后再暴露出来就是事故。所以“验证模型”这四个字,实际包含三个层面的内容:

  • 功能验证:模型在硬件上能否正常推理,输出结果是否正确
  • 精度验证:量化后的模型精度相对浮点基准损失了多少,是否在可接受范围内
  • 性能验证:单次推理耗时多少,RAM/Flash占用如何,NPU利用率如何

这三个层面缺少任何一个,模型都还不能算“验证通过”。

2. 验证前要配齐的环境:硬件、软件和模型文件

2.1 硬件准备

要想在STM32N6上验证模型,评估板是必须的。ST目前提供的官方评估板包括STM32N6570-DK和STM32N6B0-EVK,这两块板子都板载了ST-LINK调试器,用USB线连接电脑即可。我手头用的是STM32N6570-DK,板载资源比较全,有摄像头接口用来做视觉demo,还带外部OctoSPI PSRAM,这对模型验证来说非常重要——有时候片上SRAM不够放激活值,就得靠外部PSRAM顶上。

除了评估板之外,调试器也是必不可少的,虽然板载ST-LINK已经够用,但如果你有外置的ST-LINK V3,调试性能会更好一些,尤其是在查看内存变量和抓取时序的时候。电源方面建议用Type-C接口的5V/3A电源,避免开发板上其他外设(比如LCD屏)启动瞬间把电压拉垮。

2.2 软件工具链

在STM32N6上验证模型,需要的软件工具比传统STM32开发要多一层,但也不用担心,ST把这些东西都集成到了STM32Cube生态里,装一个STM32CubeMX和STM32CubeIDE就能搞定大部分流程。具体版本上,我建议用下面这套组合:

软件推荐版本用途
STM32CubeMX6.12或更高图形化配置芯片、外设、中间件
STM32CubeIDE1.16或更高工程编译、调试、烧录
X-CUBE-AI9.1或更高AI模型转换、网络分析、代码生成
STM32CubeProgrammer最新版烧录、查看内存、分区管理

需要特别提醒的是,X-CUBE-AI 9.0之前的老版本不识别Neural-ART加速器,生成的代码默认走Cortex-M55的CMSIS-NN,推理速度会有数量级差距。所以你的CubeMX里的X-CUBE-AI插件版本一定要升到9.1以上,最好是使用CubeMX内置的中间件管理功能直接在线安装,不要自己从网上下载一个老版本拖进去。

2.3 模型文件准备

模型验证前的最后一步,是准备好一个可被X-CUBE-AI识别的模型文件。X-CUBE-AI支持多种输入格式,包括TensorFlow Lite(.tflite)、ONNX(.onnx)、Keras(.h5)、PyTorch导出的ONNX等。实际项目里,我最常用的是ONNX,因为主流的训练框架都能导出ONNX,而且X-CUBE-AI对ONNX算子的覆盖度也在不断提高。

如果你手上只有PyTorch模型,导出ONNX时有几点要注意:

  1. 用torch.onnx.export导出时,opset_version建议设置到15以上,太低会丢失一些结构化信息
  2. 导出时固定输入尺寸,动态batch在部署场景下没必要,还会增加转换失败的风险
  3. 尽量减少自定义算子,X-CUBE-AI对标准ONNX算子支持好,自定义算子需要额外封装,很容易出问题

导出完成后,先用电脑上的onnxruntime或Netron工具打开模型检查一遍拓扑结构,确认输入输出的名称、维度、数据类型都符合预期。这一步看似多余,实际上能帮你省掉后续很多“为什么转换失败”的排查时间。

3. 模型转换与代码生成:X-CUBE-AI的核心实操

3.1 在CubeMX里添加AI中间件

模型验证的整个流程中,最核心的一步就是模型转换。启动STM32CubeMX,新建工程选择STM32N6570K6或对应型号,然后在Middleware and Software Packs页面里勾选X-CUBE-AI。右键点击X-CUBE-AI,选“Open Configuration”,就能看到模型导入界面。

模型导入时,X-CUBE-AI会自动分析模型结构,给出一个网络分析报告,里面包含模型层数、算子类型分布、估计的RAM/Flash占用、推理时间预算。这里有一个关键参数叫“Activation buffer size”,它表示所有中间层的激活值缓冲总大小。如果这个值超过了STM32N6片上的可用SRAM,你就得考虑两种方案:一是精简模型结构,比如把输入分辨率降低;二是在CubeMX里配置外部PSRAM,并将激活缓冲指向外部内存。

导入成功后,选择生成方式。X-CUBE-AI支持生成C代码库或者独立源码。对于验证阶段,我推荐生成C代码库(Library模式),这样集成简单,不容易把生成的源码和手写代码混在一起。生成时会输出一个类似network.c的C文件,里面包含模型初始化和推理的函数接口。

3.2 生成的代码结构:从ai_network_create到ai_run

X-CUBE-AI生成的代码核心API是固定的,理解这几个API,后面写验证代码就有了抓手。下面这个代码片段是我工程里实际用到的初始化逻辑:

#include "network.h" #include "ai_runner.h" AI_ALIGNED(4) static ai_handle network_data[AI_NETWORK_DATA_ACTIVATIONS_SIZE / 4]; static ai_handle network = AI_HANDLE_NULL; static ai_network_report report; int ai_network_init(void) { ai_error err; err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG); if (err.type != AI_ERROR_NONE) { return -1; } ai_network_get_report(network, &report); return 0; }

这里的AI_NETWORK_DATA_ACTIVATIONS_SIZE是X-CUBE-AI在头文件里根据模型自动算好的激活缓冲大小,network_data这个数组就是NPU推理时存放中间激活值的空间。注意这个数组一定要4字节对齐,因为Neural-ART加速器对地址对齐有要求,不对齐会导致HardFault。AI_ALIGNED宏就是干这个的,不要图省事定义成普通数组。

推理执行的代码也很直接:

AI_ALIGNED(4) static ai_u8 in_data[AI_NETWORK_IN_1_SIZE]; AI_ALIGNED(4) static ai_u8 out_data[AI_NETWORK_OUT_1_SIZE]; int ai_network_run(const ai_u8 *input, ai_u8 *output) { ai_i32 batch; ai_buffer ai_input[1]; ai_buffer ai_output[1]; ai_input[0].data = (ai_handle)input; ai_input[0].size = AI_NETWORK_IN_1_SIZE; ai_input[0].format = AI_NETWORK_IN_1_FORMAT; ai_output[0].data = (ai_handle)output; ai_output[0].size = AI_NETWORK_OUT_1_SIZE; ai_output[0].format = AI_NETWORK_OUT_1_FORMAT; batch = ai_run(network, ai_input, ai_output); return batch; }

这里在验证阶段有个很实用的技巧:不要直接把摄像头数据或者传感器数据喂进去,而是先用PC端准备好一组固定输入,导成C数组格式放进芯片里跑。这样能确保验证的可重复性——如果每次输入都不一样,精度对比就失去意义了。

3.3 模型转换的常见输出指标怎么看

X-CUBE-AI转换完成之后,会在控制台打印一份“Performance Report”,里面有几个关键指标需要重点看:

  • Total memory(total RAM + Flash):这个数字决定了模型能不能在当前芯片上跑起来
  • MACCs:模型的总乘加运算次数,用于估算算力需求
  • Inference time estimate:基于神经网络编译器估算的单次推理时间,这个估算值和实测值通常有10%-20%的偏差,但可以用于方案初选
  • NPU offloading rate:模型算子里有多大比例被映射到了Neural-ART加速器上,剩余部分由Cortex-M55的CMSIS-NN执行

我记得第一次转换MobileNetV2时,NPU offloading rate只有60%多,剩下的Conv算子因为Kernel尺寸不匹配被放到CPU上执行,推理耗时比预期翻了一倍。后来把输入分辨率调整为网络标准尺寸后,offloading rate才升到90%以上。所以拿到性能报告后先不要急着写代码,先看看这个指标,如果偏低了,回头调整模型结构或者输入尺寸,收益比在代码层面优化大得多。

4. 安全区与非安全区:TrustZone在模型验证阶段的实战配置

4.1 为什么STM32N6上的AI部署离不开安全区概念

STM32N6基于Cortex-M55内核,支持ARM TrustZone技术,这意味着芯片上的内存、外设、中断都可以被划分为“安全”和“非安全”两个世界。传统MCU开发里,TrustZone主要用于安全固件、密钥管理这些场景,但在AI模型部署中它也有很实用的价值——模型权重和网络结构本身就是商业资产,训练一个像样的模型有巨大的数据和时间成本,如果权重直接暴露在非安全世界的内存里,攻击者通过调试接口就能轻松把模型dump出来。

所以ST在设计STM32N6参考方案时,推荐的做法是:模型权重和AI推理运行时放在安全区,应用程序和用户界面放在非安全区。二者之间通过安全的函数调用通道(Secure Gateway)交互。这个架构不仅保护了模型IP,还能防止外部非安全任务篡改推理输入输出。

4.2 在CubeMX中启用TrustZone并对内存分区

在STM32CubeMX里启用TrustZone很简单,在Security配置选项卡中勾选TZEN。但勾完之后你还需要对系统地址空间做一个合理划分,否则后面的工程编译都过不去。

在STM32N6的默认内存映射中,安全区和非安全区的划分主要通过SAU(Security Attribution Unit)和内存映射的别名来实现。以我用的STM32N6570-DK为例,我将内部SRAM的前1MB划分给非安全区,后面的内存划分给安全区,这样非安全区的应用有充足的堆栈空间,安全区的模型激活缓冲和权重数据则放在受保护的内存段里。

在CubeMX里,切换到“Memory”视图,可以直接在地址映射图上点击拖动来调整安全/非安全边界。调整完成后,CubeMX会自动生成两套工程:一个Secure工程,一个NonSecure工程。这标志着你的项目已经进入TrustZone双工程模式。

提示:如果你用的CubeMX版本较老,可能找不到TZEN选项的位置,先确认一下你选的具体型号是不是带完整TrustZone支持的N6系列,以及CubeMX版本是否足够新。

4.3 安全区里跑模型,非安全区里调模型

TrustZone双工程模式下,你的代码被拆成两部分:

  • Secure工程:包含模型权重、X-CUBE-AI生成的网络代码、NPU驱动
  • NonSecure工程:包含主流程、数据采集、输出处理

Secure工程需要一个入口函数供NonSecure侧调用。函数定义需要带cmse_nonsecure_entry属性,这样编译器会自动插入SG(Secure Gateway)指令和参数校验。看下面这个例子:

/* Secure工程 */ #include "arm_cmse.h" __attribute__((cmse_nonsecure_entry)) int SECURE_AI_Run(const uint8_t *input, uint8_t *output, uint32_t size) { // 从非安全区拷贝输入到安全区缓冲区 memcpy(secure_input_buf, input, size); // 执行NPU推理 if (ai_network_run(secure_input_buf, secure_output_buf) != 1) return -1; // 将结果拷贝回非安全区 memcpy(output, secure_output_buf, AI_NETWORK_OUT_1_SIZE); return 0; }

注意一个问题:NonSecure传入的input指针,在Secure中被当作不可信数据,所以要用memcpy先拷贝到安全区内部的缓冲区,再让NPU读取。直接让NPU去读非安全区内存虽然技术上可行,但从安全角度考虑,这等于把模型推理的输入边界暴露给了攻击者,不安全。

我在一个实验项目里试过两种方案:一种是不拷贝直接让NPU访问NonSecure内存,另一种是带拷贝的Secure封装。结果发现,拷贝一次输入输出的开销大约是几十微秒,对于一个几十毫秒量级的模型推理来说可以忽略不计。所以不要省这个拷贝,安全边界必须清晰。

4.4 安全/非安全区对验证结果的影响

很多第一次接触TrustZone的工程师会担心:加了安全区之后,模型推理速度会不会变慢?实测下来,推理本身的速度影响极小,因为NPU作为硬件加速器,它的数据通路在底层驱动初始化之后就是固定的,不涉及每次调用都切换世界模式。实际变慢的部分主要在于Secure Gateway的跳转开销(约几十个时钟周期)和输入输出的memcpy拷贝时间,整体影响在5%以内。

但有一个坑需要特别注意:在双工程模式下,Secure工程和NonSecure工程各自有独立的存储器配置,如果你给Secure工程分配的内存过小,模型推理时激活缓冲可能分配失败,出现HardFault。排查这类问题最快的方法是打断点看Secure工程的network_data数组是否越界,或者看变量地址是否落在了非安全区的地址范围内。

5. 在STM32N6上跑通模型:从数据准备到推理验证

5.1 输入数据怎么进芯片

模型验证阶段,我习惯用“PC端生成固定输入,C数组方式嵌入工程”的方式来做。具体操作是:在PC上用Python脚本读取一张测试图片,预处理成模型输入要求的数据格式(比如224×224×3的RGB图像),然后保存为一个包含十六进制数据的C头文件,直接include进工程。

# PC端准备测试输入 import numpy as np from PIL import Image img = Image.open("test_cat.jpg").resize((224, 224)) input_data = np.array(img, dtype=np.float32) # 归一化 input_data = input_data / 255.0 # 按照模型输入布局排布 input_data = np.transpose(input_data, (2, 0, 1)) # 保存为C数组 with open("test_input.c", "w") as f: f.write("const float test_input[3*224*224] = {\n") for i, v in enumerate(input_data.flatten()): f.write(f"{v:.6f}f, ") if (i+1) % 8 == 0: f.write("\n") f.write("};\n")

如果你验证的是量化后的INT8模型,写入的数据就得是uint8_t类型,并且要带上量化参数(scale和zero_point),否则输入数据分布和量化区间不匹配,推理结果会乱掉。

5.2 用DWT计数器测量单次推理耗时

性能验证是模型验证的硬指标,我建议用DWT->CYCCNT做计时而不是用HAL的systick定时器,因为模型推理时间往往在1-20毫秒量级,Systick的毫秒分辨率太低,测出来误差太大。DWT->CYCCNT是Cortex-M55自带的周期计数器,频率等于CPU主频,800MHz下分辨率为1.25ns,拿来测推理时间绰绰有余。

volatile uint32_t start, stop; float time_ms; CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; start = DWT->CYCCNT; ai_network_run(in_data, out_data); stop = DWT->CYCCNT; time_ms = (float)(stop - start) / 800000.0f;

多次运行取平均值。注意第一次推理通常会含缓存冷启动,应当丢弃;一般跑10次,去掉一个最大值和一个最小值,再取平均。此外,推理时要保证所有外设(比如调试串口)的中断不打断推理过程,否则测出来的时间会被拉长。

5.3 和PC基准输出做对比:看懂精度损失

硬件上跑完推理,拿到输出后,怎么判断结果对不对?正确的做法是:在PC上对同一份输入做一次浮点推理,保存输出logits;在STM32N6上对同一份输入做量化推理,得到INT8输出,反量化后与浮点输出对比。

对比指标一般用余弦相似度或Top-5一致率。我经验中的接受标准是:余弦相似度>0.99,Top-1类别一致,Top-5类别一致率>90%。如果达不到,优先检查量化方式是否符合预期,检查X-CUBE-AI输出的量化报告,看看有没有某个层因为动态范围太大而被单独用了高精度。

分类模型看Top-1命中就够了?不一定。很多边缘AI场景对误报敏感,比如工位安全帽检测,漏检和误检的后果完全不同。这种情况下,建议把硬件输出的logits和PC的浮点logits绘制成散点图,观察异常点集中在哪些类别上,定位是否存在系统性量化偏差。

5.4 验证结果记录:一份可复现的实验报告

我强烈建议在验证阶段就建立一个标准化的实验结果记录模板,每次转换模型或调整参数后都记录一次。表格至少包含:模型版本、输入分辨率、量化类型、激活内存大小、Flash占用、单次推理耗时、NPU利用率、Top-1精度、余弦相似度。这个表看起来简单,但有了它,后续模型迭代时对比退化、定位问题都能快一倍。

6. 踩坑记录与问题排查:几个高频故障的实战解法

6.1 模型转换失败,怎么定位是算子问题

X-CUBE-AI转换失败时,经常报到一半说“Unsupported operator”就停住了。这时候不要慌,先看日志里提示的算子名称,然后到X-CUBE-AI的官方算子支持列表里查一下。常见的几个不支持类型是动态shape相关算子(如NonMaxSuppression)、涉及字符串的操作,以及部分高级激活函数。解决思路有两个:一是换框架重新导出,比如PyTorch的某些实现转ONNX后算子会变复杂,改成TFLite格式反而能过;二是在模型结构里手动替换,把自定义算子替换成标准算子组合,这个属于模型结构调整,要重新训练验证。

6.2 实际RAM不足,激活缓冲塞不进SRAM

STM32N6的片上SRAM容量虽然比一般MCU大,但遇到大输入尺寸的模型,激活缓冲还是会爆。遇到这种情况,先从模型侧想办法:降低输入分辨率、减少通道数、压缩网络层数。这些操作对精度的影响需要实际验证。如果模型已经没法再压,再考虑用外部PSRAM存放激活缓冲。配置方法和SRAM几乎一样,只需要在CubeMX的内存配置里把X-CUBE-AI的activation buffer的分配区域指向外部存储器地址段。

但外部PSRAM的读写延迟远高于片上SRAM,用外部内存做激活缓冲会让推理时间显著增加。我做过一个对比测试,同样的模型,激活缓冲放在片上SRAM时推理耗时12ms,放到外部PSRAM后变成了21ms,慢了75%。所以在预算充足的情况下,优先保证片上SRAM够用。

6.3 TrustZone切换导致HardFault

双工程模式下最常见的崩溃场景是:NonSecure调用Secure函数时,函数参数指针指向了非安全区地址,而Secure内部访问该指针时越界或属性不匹配。解决方法是检查Secure侧代码是否对传入指针执行了cmse_check_address_range校验,以及函数的cmse_nonsecure_entry属性是否声明正确。

还有一个容易被忽略的点:Secure工程和NonSecure工程编译时如果有配置不一致(比如优化等级、浮点选项),可能导致结构体对齐方式不一致,Secure入口收到参数后按错误的对齐解析结构体,直接崩溃。遇到这类问题,把两侧编译选项统一即可。我踩过一次,Secure工程开了-O3,NonSecure工程默认-Og,两边结构体对齐方式不同导致传参崩溃,花了半天才定位到编译选项上。

6.4 实测建议速查表

问题表现可能原因排查顺序
编译报错找不到network.hX-CUBE-AI生成代码路径未加入Include1. 检查生成选项 2. 手动添加生成目录
NPU推理时间异常长算子卸载率低1. 查看性能报告offloading rate 2. 调整模型结构
输出全为0或全为1输入数据格式或量化参数错误1. 检查输入buffer内容 2. 核对scale/zero_point
第一帧推理慢,后续快缓存冷启动预热运行一次后计时
Secure调用HardFault指针未校验或对齐不一致1. 检查cmse属性 2. 检查编译选项
Flash不够放权重模型过大或Float16权重1. 重新量化INT8 2. 裁剪模型

最后再说一点和工具链配合不太相关、但很影响验证体验的小事:STM32N6的工程编译时间偏长,尤其是双工程模式下Secure和NonSecure各编一次,加上链接时间,一次全量构建可能要好几分钟。建议把生成文件的路径和编译输出目录都放在SSD上,并且在CubeIDE里开启增量编译。改代码后只编译改动的文件,能省掉不少等待时间。

STM32N6这套东西,我已经在几个实际项目上验证过模型,最大的感受是:工具链已经相当成熟,但流程上的细致程度决定成败。特别是TrustZone安全区/非安全区的划分,这个功能如果一开始没规划好,后面切换成本非常高;而如果规划得当,不仅能保护模型IP,还能让应用架构更清晰。建议第一次上手的朋友,不要图快跳过模型转换后的性能报告,也不要跳过PC基准对比,把每一组参数、每一次推理的结果都记录下来,这对后续模型迭代和问题定位的价值,真的比想象中更大。如果你在STM32N6上验证模型时遇到其他坑,欢迎交流——我这几年攒下来的经验就是,边缘AI落地,大多数问题不是理论问题,而是实践中的小细节。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 14:19:28

Ventoy 启动盘:多个系统镜像装进一个U盘,不用再反复格式化

Ventoy 启动盘:多个系统镜像装进一个U盘,不用再反复格式化 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy Ventoy 是一款开源启动盘工具:在U盘头部写入 32MB 引导区…

作者头像 李华
网站建设 2026/8/29 14:18:07

ST电源管理手册实战:从LDO/DC-DC选型到NVDC与低功耗设计

做嵌入式硬件这几年,案头翻得最勤的资料,除了MCU数据手册,就是电源管理手册。意法半导体的电源管理指南属于那种“平时觉得用不上,真出事才后悔没早看”的参考书,从LDO、DC-DC、PMIC到电池充电管理、上电时序、PCB布局…

作者头像 李华
网站建设 2026/8/29 14:17:27

Claude Skills 插件完整指南:3 步搭出你的 AI 自动化工作流

Claude Skills 插件完整指南:3 步搭出你的 AI 自动化工作流 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/aw…

作者头像 李华
网站建设 2026/8/29 14:17:22

自动化框架选型与落地:从脚本执行到智能决策的关键实践

1. 自动化浪潮下的真实切面:从“跑腿”到“动脑”“自动化”这个词,在技术圈已经被聊得快要包浆了。厂商发布会提它,行业白皮书提它,连招聘JD里都恨不得把“自动化思维”写成岗位硬性要求。但说句实在话,我入行这些年见…

作者头像 李华
网站建设 2026/8/29 14:14:40

用代码做数学动画:Manim 的第一行动画,10 分钟跑通

用代码做数学动画:Manim 的第一行动画,10 分钟跑通 【免费下载链接】manim Animation engine for explanatory math videos 项目地址: https://gitcode.com/GitHub_Trending/ma/manim Manim 是用 Python 代码做数学动画的引擎,一行代码…

作者头像 李华
网站建设 2026/8/29 14:14:25

Hoppscotch 浏览器扩展:三步装好,发完第一个 API 请求

Hoppscotch 浏览器扩展:三步装好,发完第一个 API 请求 【免费下载链接】hoppscotch Open-Source API Development Ecosystem • https://hoppscotch.io • Offline, On-Prem & Cloud • Web, Desktop & CLI • Open-Source Alternative to Postm…

作者头像 李华