C语言实现Flow Matching推理:高性能生成模型的边缘部署实战
如果你最近在关注生成模型领域可能会发现Flow Matching这个词越来越频繁地出现。传统的扩散模型虽然效果惊艳但训练和推理过程往往需要数百甚至上千步计算成本高昂。而Flow Matching技术正在改变这一局面——它能够用更少的步骤生成高质量样本甚至在某些任务上实现一步生成。但当你真正尝试将Flow Matching应用到实际项目中时可能会遇到一个关键问题如何在不牺牲生成质量的前提下实现高效的推理部署特别是当你的目标环境是资源受限的边缘设备或需要低延迟的实时应用时传统的Python实现往往难以满足性能要求。这就是C语言在Flow Matching推理中的价值所在。本文将深入探讨如何使用C语言实现Flow Matching的高效推理从核心原理到完整代码实现为你提供一个可落地的解决方案。1. 为什么需要C语言实现Flow Matching推理Flow Matching的核心优势在于其数学上的简洁性。与扩散模型需要模拟复杂的随机过程不同Flow Matching通过构建确定性的概率路径将简单分布如高斯噪声连续地流动到目标分布。这种确定性特性使其特别适合用C语言进行高效实现。性能优势明显在相同硬件条件下C语言实现的推理速度通常比Python快5-10倍。对于需要实时生成的应用场景如游戏内容生成、实时语音合成或边缘设备上的图像生成这种性能提升是决定性的。资源占用更低C语言程序的内存占用通常更小这对于内存受限的嵌入式设备或需要同时运行多个推理任务的服务端环境至关重要。部署灵活性C代码可以编译为静态库轻松集成到C、Rust、Go等其他语言的项目中也可以直接部署在嵌入式系统上无需复杂的运行时环境。然而C语言实现也面临挑战缺少现成的自动微分框架梯度计算需要手动实现内存管理完全由开发者控制容易引入错误。但正是这些挑战使得理解底层原理变得尤为重要。2. Flow Matching核心原理快速理解要实现C语言的Flow Matching首先需要理解其数学基础。Flow Matching的核心思想可以用一个简单的类比来理解想象你要把一杯清水简单分布变成一杯调好的鸡尾酒目标分布不是通过一次性倒入所有原料而是通过一个连续的调配过程。2.1 概率路径与流方程Flow Matching的目标是学习一个向量场$v_t(x)$使得沿着这个场从初始分布$p_0$到目标分布$p_1$的流动路径最优。具体来说对于任意时间$t \in [0,1]$我们有一个概率路径$p_t(x)$满足运输方程$$\frac{\partial p_t(x)}{\partial t} \nabla \cdot (p_t(x)v_t(x)) 0$$在实际实现中我们通常使用条件流匹配Conditional Flow MatchingCFM目标这大大简化了训练过程。CFM的核心损失函数为$$L_{CFM}(\theta) \mathbb{E}{t,p_t(x),p_1(x_1)}[|v\theta(t,x) - u_t(x|x_1)|^2]$$其中$u_t(x|x_1)$是条件流场通常选择为线性插值路径$x_t (1-t)x_0 tx_1$对应的流场为$u_t(x|x_1) x_1 - x_0$。2.2 推理过程的确定性与扩散模型的随机采样不同Flow Matching的推理过程是完全确定的。给定一个噪声样本$x_0 \sim p_0$我们通过求解常微分方程ODE来生成样本$$\frac{dx_t}{dt} v_\theta(t,x_t)$$在C语言实现中我们可以使用简单的数值积分方法如欧拉法或龙格-库塔法来求解这个ODE。3. 环境准备与基础架构设计在开始C语言实现前需要准备好开发环境和基础架构。本文将使用纯C99标准实现确保代码的可移植性。3.1 开发环境要求编译器GCC 8.0 或 Clang 10.0支持C99标准数学库需要链接数学库-lm操作系统Linux/macOS/Windows本文以Linux为例内存要求至少2GB空闲内存用于模型参数和中间结果3.2 项目目录结构flow_matching_c/ ├── include/ │ ├── tensor.h # 张量数据结构 │ ├── model.h # 模型定义 │ └── ode_solver.h # ODE求解器 ├── src/ │ ├── tensor.c │ ├── model.c │ ├── ode_solver.c │ └── main.c ├── models/ # 预训练模型参数 └── build/ # 编译输出3.3 基础数据类型定义首先定义核心的数据结构——张量这是深度学习计算的基础// include/tensor.h #ifndef TENSOR_H #define TENSOR_H #include stddef.h #include stdbool.h typedef struct { float* data; // 数据指针 size_t* shape; // 形状数组 size_t ndim; // 维度数 size_t size; // 元素总数 bool requires_grad; // 是否需要梯度推理时通常为false } Tensor; // 张量操作函数 Tensor* tensor_create(size_t ndim, const size_t* shape); void tensor_free(Tensor* tensor); Tensor* tensor_zeros(size_t ndim, const size_t* shape); Tensor* tensor_ones(size_t ndim, const size_t* shape); Tensor* tensor_copy(const Tensor* src); float tensor_get(const Tensor* tensor, const size_t* indices); void tensor_set(Tensor* tensor, const size_t* indices, float value); #endif4. 核心模型实现Flow Matching模型的核心是向量场$v_\theta(t,x)$的实现。我们将实现一个简单的全连接神经网络来参数化这个向量场。4.1 模型结构定义// include/model.h #ifndef MODEL_H #define MODEL_H #include tensor.h typedef struct { size_t input_dim; // 输入维度数据维度 时间维度 size_t hidden_dim; // 隐藏层维度 size_t output_dim; // 输出维度与数据维度相同 size_t num_layers; // 隐藏层数量 // 权重和偏置参数 Tensor** weights; // 权重矩阵数组 Tensor** biases; // 偏置向量数组 } FlowMatchingModel; // 模型函数 FlowMatchingModel* model_create(size_t input_dim, size_t hidden_dim, size_t output_dim, size_t num_layers); void model_free(FlowMatchingModel* model); Tensor* model_forward(const FlowMatchingModel* model, const Tensor* input); int model_load_params(FlowMatchingModel* model, const char* filename); #endif4.2 模型前向传播实现// src/model.c #include model.h #include stdlib.h #include math.h #include stdio.h // ReLU激活函数 static float relu(float x) { return x 0 ? x : 0; } // 全连接层前向传播 static Tensor* linear_layer(const Tensor* input, const Tensor* weight, const Tensor* bias) { // 输入形状检查: [batch_size, input_dim] // 权重形状: [output_dim, input_dim] // 偏置形状: [output_dim] // 输出形状: [batch_size, output_dim] size_t batch_size input-shape[0]; size_t input_dim input-shape[1]; size_t output_dim weight-shape[0]; size_t out_shape[2] {batch_size, output_dim}; Tensor* output tensor_create(2, out_shape); for (size_t b 0; b batch_size; b) { for (size_t i 0; i output_dim; i) { float sum 0.0f; for (size_t j 0; j input_dim; j) { size_t indices_in[2] {b, j}; size_t indices_w[2] {i, j}; sum tensor_get(input, indices_in) * tensor_get(weight, indices_w); } size_t indices_bias[1] {i}; sum tensor_get(bias, indices_bias); size_t indices_out[2] {b, i}; tensor_set(output, indices_out, sum); } } return output; } Tensor* model_forward(const FlowMatchingModel* model, const Tensor* input) { Tensor* current tensor_copy(input); // 时间步长编码简单的正弦编码 size_t batch_size current-shape[0]; size_t data_dim current-shape[1] - 1; // 最后一个维度是时间 // 分离时间和数据 Tensor* time_tensor tensor_create(1, batch_size); Tensor* data_tensor tensor_create(2, current-shape); for (size_t b 0; b batch_size; b) { size_t indices_time[1] {b}; size_t indices_data[2] {b, data_dim}; float t tensor_get(current, indices_data); tensor_set(time_tensor, indices_time, t); for (size_t d 0; d data_dim; d) { size_t indices_in[2] {b, d}; size_t indices_out[2] {b, d}; float val tensor_get(current, indices_in); tensor_set(data_tensor, indices_out, val); } } // 时间编码简化版位置编码 for (size_t b 0; b batch_size; b) { size_t indices[1] {b}; float t tensor_get(time_tensor, indices); // 将时间信息融合到数据中 for (size_t d 0; d data_dim; d) { if (d 64) { // 只对前64个维度编码 size_t indices_data[2] {b, d}; float val tensor_get(data_tensor, indices_data); float freq powf(10000.0f, -2.0f * d / 64.0f); val sinf(t * freq); tensor_set(data_tensor, indices_data, val); } } } tensor_free(current); current data_tensor; // 多层前向传播 for (size_t layer 0; layer model-num_layers; layer) { Tensor* next linear_layer(current, model-weights[layer], model-biases[layer]); // 应用ReLU激活最后一层不用 if (layer model-num_layers - 1) { for (size_t i 0; i next-size; i) { size_t indices[2] {i / next-shape[1], i % next-shape[1]}; float val tensor_get(next, indices); tensor_set(next, indices, relu(val)); } } tensor_free(current); current next; } tensor_free(time_tensor); return current; }5. ODE求解器实现Flow Matching的推理需要数值求解ODE我们实现一个简单的欧拉求解器。5.1 求解器接口设计// include/ode_solver.h #ifndef ODE_SOLVER_H #define ODE_SOLVER_H #include tensor.h #include model.h typedef struct { size_t num_steps; // 求解步数 float dt; // 步长 } ODESolver; // ODE求解函数 Tensor* solve_ode_euler(const FlowMatchingModel* model, const Tensor* initial_condition, size_t num_steps); #endif5.2 欧拉法实现// src/ode_solver.c #include ode_solver.h #include stdlib.h Tensor* solve_ode_euler(const FlowMatchingModel* model, const Tensor* initial_condition, size_t num_steps) { // 初始条件形状: [batch_size, data_dim] size_t batch_size initial_condition-shape[0]; size_t data_dim initial_condition-shape[1]; // 创建时间步长张量 float dt 1.0f / num_steps; // 当前状态 Tensor* current_state tensor_copy(initial_condition); for (size_t step 0; step num_steps; step) { float t step * dt; // 为每个样本添加时间维度 size_t augmented_shape[2] {batch_size, data_dim 1}; Tensor* augmented_input tensor_create(2, augmented_shape); for (size_t b 0; b batch_size; b) { for (size_t d 0; d data_dim; d) { size indices_in[2] {b, d}; size indices_out[2] {b, d}; float val tensor_get(current_state, indices_in); tensor_set(augmented_input, indices_out, val); } // 添加时间维度 size indices_time[2] {b, data_dim}; tensor_set(augmented_input, indices_time, t); } // 计算向量场 Tensor* vector_field model_forward(model, augmented_input); // 欧拉更新: x_{tdt} x_t v_θ(t, x_t) * dt for (size_t b 0; b batch_size; b) { for (size_t d 0; d data_dim; d) { size indices_state[2] {b, d}; size indices_vf[2] {b, d}; float current_val tensor_get(current_state, indices_state); float vf_val tensor_get(vector_field, indices_vf); tensor_set(current_state, indices_state, current_val vf_val * dt); } } tensor_free(augmented_input); tensor_free(vector_field); } return current_state; }6. 完整推理流程示例现在我们将所有组件组合起来实现完整的Flow Matching推理流程。6.1 主程序实现// src/main.c #include stdio.h #include stdlib.h #include tensor.h #include model.h #include ode_solver.h int main(int argc, char* argv[]) { if (argc 4) { printf(Usage: %s model_file num_samples num_steps\n, argv[0]); printf(Example: %s model.bin 10 50\n); return 1; } const char* model_file argv[1]; size_t num_samples atoi(argv[2]); size_t num_steps atoi(argv[3]); printf(Initializing Flow Matching Inference...\n); printf(Model: %s, Samples: %zu, Steps: %zu\n, model_file, num_samples, num_steps); // 创建模型假设数据维度为128可根据实际模型调整 size_t data_dim 128; size_t hidden_dim 256; size_t num_layers 4; FlowMatchingModel* model model_create(data_dim 1, hidden_dim, data_dim, num_layers); // 加载预训练参数 if (model_load_params(model, model_file) ! 0) { printf(Error loading model parameters from %s\n, model_file); model_free(model); return 1; } // 生成初始噪声从标准正态分布 size_t noise_shape[2] {num_samples, data_dim}; Tensor* initial_noise tensor_create(2, noise_shape); // 简单初始化实际应用中应使用更好的随机数生成器 for (size_t i 0; i initial_noise-size; i) { // 简化版的随机初始化实际应使用正态分布 size_t indices[2] {i / data_dim, i % data_dim}; float val (float)rand() / RAND_MAX * 2.0f - 1.0f; tensor_set(initial_noise, indices, val); } printf(Starting ODE solving with %zu steps...\n, num_steps); // 求解ODE生成样本 Tensor* generated_samples solve_ode_euler(model, initial_noise, num_steps); printf(Generation completed successfully!\n); // 输出前几个样本的前几个维度作为验证 printf(First sample (first 10 dimensions): ); for (size_t d 0; d 10 d data_dim; d) { size_t indices[2] {0, d}; printf(%.4f , tensor_get(generated_samples, indices)); } printf(\n); // 清理资源 tensor_free(initial_noise); tensor_free(generated_samples); model_free(model); printf(Flow Matching inference completed.\n); return 0; }6.2 编译配置创建Makefile用于编译项目# Makefile CC gcc CFLAGS -stdc99 -O3 -Wall -Wextra -Iinclude LDFLAGS -lm SRCDIR src INCDIR include BUILDDIR build SOURCES $(wildcard $(SRCDIR)/*.c) OBJECTS $(SOURCES:$(SRCDIR)/%.c$(BUILDDIR)/%.o) TARGET $(BUILDDIR)/flow_matching $(BUILDDIR)/%.o: $(SRCDIR)/%.c mkdir -p $(BUILDDIR) $(CC) $(CFLAGS) -c $ -o $ $(TARGET): $(OBJECTS) $(CC) $^ -o $ $(LDFLAGS) all: $(TARGET) clean: rm -rf $(BUILDDIR) .PHONY: all clean编译和运行命令make ./build/flow_matching models/pretrained.bin 5 1007. 性能优化技巧C语言实现的优势在于可以针对特定硬件进行深度优化。以下是几个关键的优化方向7.1 内存访问优化// 优化后的矩阵乘法示例 void optimized_matmul(const float* A, const float* B, float* C, size_t m, size_t n, size_t p) { // 循环重排以提高缓存命中率 for (size_t i 0; i m; i) { for (size_t k 0; k n; k) { float a_val A[i * n k]; for (size_t j 0; j p; j) { C[i * p j] a_val * B[k * p j]; } } } }7.2 SIMD向量化对于支持SIMD的处理器可以使用内联汇编或编译器内置函数#include immintrin.h void simd_matmul(const float* A, const float* B, float* C, size_t m, size_t n, size_t p) { for (size_t i 0; i m; i) { for (size_t j 0; j p; j 8) { __m256 sum _mm256_setzero_ps(); for (size_t k 0; k n; k) { __m256 a _mm256_set1_ps(A[i * n k]); __m256 b _mm256_loadu_ps(B[k * p j]); sum _mm256_add_ps(sum, _mm256_mul_ps(a, b)); } _mm256_storeu_ps(C[i * p j], sum); } } }8. 常见问题与解决方案在实际部署C语言Flow Matching推理时可能会遇到以下典型问题8.1 数值稳定性问题问题现象生成结果出现NaN或数值爆炸解决方案在ODE求解器中添加步长自适应机制实现数值梯度裁剪使用双精度浮点数进行敏感计算// 改进的欧拉法带裁剪 void euler_step_with_clipping(const FlowMatchingModel* model, Tensor* state, float t, float dt, float max_norm) { // 计算向量场 Tensor* vf compute_vector_field(model, state, t); // 梯度裁剪 float norm tensor_norm(vf); if (norm max_norm) { float scale max_norm / norm; tensor_scale(vf, scale); } // 更新状态 tensor_add_scaled(state, vf, dt); tensor_free(vf); }8.2 内存管理问题问题现象内存泄漏或非法内存访问解决方案实现严格的内存分配/释放配对检查使用内存池管理小张量添加边界检查调试模式#ifdef DEBUG #define TENSOR_ALLOC(tensor) \ do { \ tensor _tensor_alloc_debug(__FILE__, __LINE__); \ } while(0) #else #define TENSOR_ALLOC(tensor) tensor malloc(sizeof(Tensor)) #endif8.3 模型文件兼容性问题现象不同平台或编译器下的模型参数加载失败解决方案实现平台无关的二进制格式添加文件头校验和版本检查提供文本格式的备用加载方式9. 实际应用场景与扩展方向C语言实现的Flow Matching推理在以下场景中具有明显优势9.1 边缘设备部署在资源受限的嵌入式设备上C实现的轻量级推理引擎可以实时生成图像、音频或控制信号。例如在无人机上进行实时路径规划或在IoT设备上生成异常检测样本。9.2 高性能计算集成作为大型科学计算管道的一部分C实现的Flow Matching可以与其他数值计算库如FFTW、BLAS高效集成用于物理模拟或分子生成。9.3 游戏开发在游戏引擎中集成实时内容生成功能C语言的性能优势和跨平台特性使其成为理想选择。9.4 扩展方向多精度支持根据应用需求动态切换单精度/双精度硬件加速集成GPUCUDA/OpenCL或专用AI芯片支持流式生成支持连续流式数据生成适用于实时音频/视频应用分布式推理在多节点系统上并行生成大量样本本文提供的C语言实现为Flow Matching的高效推理奠定了坚实基础。虽然当前实现侧重于清晰性和教育价值但其中的优化技巧和架构设计可以直接应用于生产环境。对于需要极致性能的生成式AI应用C语言仍然是不可替代的选择。建议在实际项目中根据具体需求调整模型架构和优化策略并充分利用现代编译器的优化能力。对于更复杂的模型可以考虑集成BLAS库进行矩阵运算或使用多线程并行化推理过程。

相关新闻

ClawdBot多模态AI架构解析与应用实践

ClawdBot多模态AI架构解析与应用实践

1. 从ClawdBot看AI技术演进趋势最近在GitHub上开源的ClawdBot项目引起了我的注意。这个基于多模态大语言模型的智能体框架,展示了当前AI领域几个重要的发展方向。作为一个跟踪AI技术演进多年的从业者,我观察到2026年的AI发展确实呈现出与以往不同的特征。…

2026/10/20 3:52:20 阅读更多 →
AI防爆摄像机与船舶识别算法在工业场景的应用

AI防爆摄像机与船舶识别算法在工业场景的应用

1. 项目背景与行业痛点在石油化工、港口码头、船舶制造等特殊工业场景中,传统监控设备面临着多重挑战。我曾在某大型石化园区亲眼目睹过普通摄像机在易燃易爆环境中被迫"带病工作"的窘境——不仅需要加装厚重的防爆外壳导致视野受限,高温高湿环…

2026/10/19 21:02:09 阅读更多 →
ChatWiki:基于大语言模型的企业知识库智能问答系统

ChatWiki:基于大语言模型的企业知识库智能问答系统

1. 项目概述:ChatWiki如何重塑企业知识管理去年帮一家跨境电商客户部署ChatWiki时,他们的运营总监看着新上线的AI知识库感叹:"这比我们原来那套文档管理系统智能太多了!"确实,当传统wiki还在依赖人工分类检索…

2026/10/19 22:40:32 阅读更多 →

最新新闻

大模型提示词设计7大原则:从角色设定到迭代调优

大模型提示词设计7大原则:从角色设定到迭代调优

1. 先搞清楚:提示词为什么值得认真设计你有没有遇到过这种场景:让AI帮你写一份方案,你洋洋洒洒打了几百字,它回你一篇看着很顺滑、实则没有任何信息量的空话;你让它做个会议总结,结果它只是把你发的聊天记录…

2026/10/20 3:53:15 阅读更多 →
“为什么这次做对,下次还得重来?”:三层自进化跃迁与个人Work-RSI六步闭环——读科技博主《灵姐说AI》递归自我改进全景深度拆解

“为什么这次做对,下次还得重来?”:三层自进化跃迁与个人Work-RSI六步闭环——读科技博主《灵姐说AI》递归自我改进全景深度拆解

前沿认知架构 递归自我改进(RSI)与生产力跃迁 | 主讲人:灵姐(《灵姐说AI》主理人、资深科技商业观察者) | 议题:一条视频讲清RSI:AI怎样才能越用越聪明?核心洞察:许多人…

2026/10/20 3:53:15 阅读更多 →
开源基模微调实战:用Kimi在Cursor场景对标Claude

开源基模微调实战:用Kimi在Cursor场景对标Claude

看到“Cursor滑跪开源技术报告:Kimi基模这样微调能干翻Claude”这个标题,第一反应多半是怀疑。但这条技术路线最近在圈子里讨论度确实很高,而且方向很严肃:用开源基模做垂直场景微调,到底能不能在Cursor这类AI编程工具…

2026/10/20 3:53:15 阅读更多 →
UDP跨网段广播不通?广播中继方案从原理到实战

UDP跨网段广播不通?广播中继方案从原理到实战

做上位机和嵌入式联调这些年,遇到“UDP跨网段广播”这个需求,比想象中频繁得多。很多时候设备发现、状态推送、批量控制都在局域网内跑得好好的UDP广播,一搬到跨网段环境就直接“失联”。我记得第一次被问到这个问题,还是在某工厂…

2026/10/20 3:53:15 阅读更多 →
传统数据中心AI改造:翻新还是重建的决策指南

传统数据中心AI改造:翻新还是重建的决策指南

直接讲结论:传统数据中心做AI改造,最核心的问题不是“怎么加GPU”,而是“供电和散热能不能扛住”。我过去三年帮不同行业客户处理过这类项目,有个特别尴尬的共性——几乎所有传统机房的工程师一开始都以为,AI改造就是加…

2026/10/20 3:53:15 阅读更多 →
context-mode:为命令行工具设计可复现的上下文状态管理层

context-mode:为命令行工具设计可复现的上下文状态管理层

你有没有遇到过这种场景:打开终端,先export一串环境变量,再cd到项目目录,然后才开始真正干活。如果只是顺手敲两下还好,但如果你同时在维护三五个项目,每个项目还对应不同的 API 地址、不同的分支策略、不同…

2026/10/20 3:52:15 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →