TensorFlow Lite端侧AI集成实战:从模型量化到性能调优
很多端侧AI功能做出来跟跑通是两回事。模型在服务器上精度再高到了用户手机上一跑就卡、一跑就崩体验直接归零。我自己在集成TensorFlow Lite这件事上前前后后折腾过不少轮踩过的坑比文档里写的多得多。这篇就当作第17章把整个集成过程拆开揉碎从模型转换、工程接入到性能调优和排查问题一次讲清楚。适合正在做端侧推理、或者刚把手伸向移动端AI的开发者和算法工程师内容偏实战代码和参数我都给全。1. 集成前的模型准备与方案选型1.1 为什么选TensorFlow Lite而不是别的方案移动端做推理可选的方案不算少。系统自带的框架、云端推理、还有各种跨平台推理引擎我都接触过最后落到TensorFlow Lite简称TFLite上的原因不是它单项性能最强而是综合成本最低。先说跨平台能力。我们项目里目标平台是Android和iOS双端如果用系统原生框架就得分别维护两套模型转换和调用逻辑训练框架又跟部署框架分开中间对齐一个算子都要花不少时间。TFLite在这块做得比较省心一份转换好的模型文件两端都能加载后处理逻辑也基本一致。代码层面上虽然平台语言不同但核心的、API调用思路是一样的少走一半弯路。再看部署体积。TFLite运行时库本身很小完整版也就几百KB如果只用到部分算子和操作还能进一步裁剪。对移动应用来说体积意味着下载转化率多一两MB可能就流失一批用户。这种优势很多纯软件层面的部署方案给不了。还有一个关键点TFLite和训练框架同源。模型在Keras或PyTorch里训练完转成TFLite格式算子映射和数值行为基本保持一致。我们之前试过另一套推理引擎模型转换后某些层的输出值跟训练时差了几个小数点排查了半天才发现是某个激活函数的数值实现不完全一致。TFLite在这块的安全感高得多踩坑成本低。1.2 模型转换的完整流程与量化方法模型转换是整个集成里最不能跳步的环节。我们在项目里用的是一个自研的图像分类模型叫端侧质检模型V1输入是224x224的RGB图像输出1000类置信度。转换用官方提供的转换器API一行核心代码就能完成基础转换import tensorflow as tf # 加载训练好的Keras模型 model tf.keras.models.load_model(quality_check_v1.h5) # 转换为TFLite格式 converter tf.lite.TFLiteConverter.from_keras_model(model) tflite_model converter.convert() # 写入文件 with open(quality_check_v1.tflite, wb) as f: f.write(tflite_model)这个版本是最朴素的FP32推理模型文件从原始的45MB压缩到约43MB体积变化不大但已经能在移动端运行了。真正让体积发生质变的是量化。量化分两种训练后量化和训练感知量化。我们这里用训练后量化做法是给转换器指定一个代表数据集让它自动统计权重和激活值的分布然后从FP32映射到INT8def representative_dataset(): # iterating over a sample of our training data for data in sample_loader.take(100): yield [data.numpy()] converter tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations [tf.lite.Optimize.DEFAULT] converter.representative_dataset representative_dataset converter.target_spec.supported_types [tf.int8] tflite_quant_model converter.convert()这里有个细节容易忽略即使指定了INT8如果模型里含有某些不支持量化的算子转换器会回退到FP32结果就是部分量化性能提升打了折扣。我们通过转换日志检查发现模型里的自定义注意力层必须手动替换成标准卷积层才实现全INT8量化。量化后的体积直观对比模型版本文件大小精度Top-1单次推理耗时中端AndroidFP32原版43MB88.6%约180msINT8量化版11MB86.9%约65ms动态范围量化版15MB88.1%约95ms精度损失控制在1.7个百分点换来的是3倍速度提升和4倍体积缩减。需要特别说明的是INT8精度下降幅度跟模型结构强相关如果遇到精度掉太多的情况优先检查是不是有敏感层被量化破坏了。提示代表数据集的样本量不用太多100张左右就够了但要覆盖模型实际使用中的典型场景不能只选最干净的那一批否则量化时的数值范围统计会失真。2. 核心集成流程与推理封装2.1 工程依赖配置与项目结构模型准备好之后就要往工程里接了。我们项目的整体结构是客户端直连TFLite运行时中间不做额外的代理层。听起来简单实际写起来有不少讲究。先看依赖。Android端的Gradle配置如下dependencies { // 核心运行时 implementation org.tensorflow:tensorflow-lite:2.14.0 // 如果用到GPU代理需要额外引入 implementation org.tensorflow:tensorflow-lite-gpu:2.14.0 // 如果用到XNNPACK优化需要依赖对应的库 implementation org.tensorflow:tensorflow-lite-support:0.4.4 }注意版本号不同版本之间的兼容性差异不小。TFLite 2.x系列较新版本对XNNPACK的默认开启策略不同有些版本可能在老设备上引发莫名其妙的算子报错。我们的经验是选定一个版本后就尽量锁定不要频繁升级除非确实需要新特性否则排查问题的成本远高于升级带来的收益。工程结构上我们把TFLite相关的代码单独抽成一个模块跟业务代码解耦。这样做的好处是模型一换只改模块内部实现上层业务不用动。同时模型文件也不放在assets根目录下而是单独建一个ml_models子目录方便统一管理和热更新准备。一个比较隐蔽的坑是Android中assets目录里的文件是压缩存储的TFLite模型是二进制大文件直接用AssetManager读取会触发IO解压导致首次加载模型非常慢。解决办法是让模型文件以非压缩方式打包在Gradle里配置android { androidResources { noCompress tflite } }2.2 模型加载与输入预处理细节模型加载有两种做法一种是直接用Interpreter加载文件路径另一种是先把模型读进字节数组再交给Interpreter初始化。实测下来第二种方式在频繁切换模型时更稳定因为每次直接传文件路径底层会重新做内存映射极端情况下可能ANR应用无响应。看一下我们封装后的核心加载代码// 读取模型文件为字节数组 byte[] modelBuffer loadModelFile(context, ml_models/quality_check_v1.tflite); // 创建Interpreter Interpreter.Options options new Interpreter.Options(); options.setNumThreads(4); options.setUseXNNPACK(true); Interpreter interpreter new Interpreter(modelBuffer, options);加载完成后每次推理前都需要把输入图像转成模型要求的格式。这个环节最容易出错也是新手最容易忽略的地方。我们的模型输入是224x224x3的RGB图像但手机摄像头出来的帧是NV21或者YUV格式宽高比例也不是正方形的。完整的预处理流程是这样的Bitmap bitmap decodeAndCropToSquare(imageFrame); Bitmap resizedBitmap Bitmap.createScaledBitmap(bitmap, 224, 224, true); // 把Bitmap转成RGB像素数组 int[] pixels new int[224 * 224]; resizedBitmap.getPixels(pixels, 0, 224, 0, 0, 224, 224); // 归一化到[-1, 1]范围取决于训练时的预处理 float[][][][] inputData new float[1][224][224][3]; for (int i 0; i 224; i) { for (int j 0; j 224; j) { int pixel pixels[i * 224 j]; int r (pixel 16) 0xFF; int g (pixel 8) 0xFF; int b pixel 0xFF; inputData[0][i][j][0] (r / 255.0f - 0.5f) * 2.0f; inputData[0][i][j][1] (g / 255.0f - 0.5f) * 2.0f; inputData[0][i][j][2] (b / 255.0f - 0.5f) * 2.0f; } }这里有个性能细节。我自己一开始是逐像素做浮点运算跑下来发现预处理本身占了整个推理耗时的近一半。后来改成用颜色矩阵做一次性的Bitmap转换再直接读取像素副本速度提升了5倍以上。移动端做实时推理每一个环节都要抠时间预处理必须做到秒级完成。// 使用颜色矩阵提前把像素值映射到目标范围 float[] colorTransform new float[] { (2.0f / 255.0f), 0, 0, 0, -1.0f, 0, (2.0f / 255.0f), 0, 0, -1.0f, 0, 0, (2.0f / 255.0f), 0, -1.0f, 0, 0, 0, 1.0f, 0 }; ColorMatrix colorMatrix new ColorMatrix(colorTransform); // 应用到Bitmap Canvas再读像素2.3 推理调用与输出结果后处理模型加载完成后推理调用本身极其简单float[][] outputData new float[1][1000]; long startTime SystemClock.elapsedRealtime(); interpreter.run(inputData, outputData); long inferenceTime SystemClock.elapsedRealtime() - startTime;run方法内部会自动做算子调度和内存拷贝。需要留意的是输入输出的tensor形状必须跟模型定义完全一致不然会直接抛异常。我们踩过的一个典型坑是模型在训练时输入是(None, 224, 224, 3)到了TFLite格式后形状变成了(1, 224, 224, 3)batch维度被固定死了但很多教程代码写的仍然是可变形状结果运行时一直报维度不匹配。如果遇到复杂输入的模型比如多个输入或输出可以用Interpreter的runForMultipleInputsOutputs方法传入一个输入对象数组和一个输出对象映射表。这个API用起来更灵活但性能上跟run差别不大。推理结束后拿到的只是一个1000维的浮点数组还要做后处理才能得到业务可用的结果。分类模型的输出一般有两个问题一是数值不是概率分布没有经过softmax二是需要取Top-K标签。TFLite在转换时默认不包含softmax层因为softmax在某些量化环境下实现不够高效所以一般交给业务侧做。int topK 3; PriorityQueueFloat maxHeap new PriorityQueue(topK, Comparator.naturalOrder()); for (float score : outputData[0]) { maxHeap.offer(score); if (maxHeap.size() topK) { maxHeap.poll(); } } // 再从outputData里找到对应的索引值3. 性能优化与实际问题排查3.1 首次推理耗时异常的定位与处理集成完成后第一次完整跑通我下意识看了下耗时报告发现一个很严重的问题首帧推理耗时高达900多毫秒而后面的帧稳定在65毫秒左右。这个巨大的差异被我们当成了首要解决目标。排查下来首次推理慢的原因有三个叠加一是模型加载和初始化阶段做了完整的算子注册和资源分配这部分一次性开销不可避免但可以通过预加载来掩盖。二是XNNPACK等优化器在首次推理时要做内部数据结构构建如果模型复杂这个构建时间可能会达到几百毫秒。解决办法是在应用启动时用一个空闲线程提前执行一次推理把初始化开销提前消耗掉。三是系统在首次访问模型文件时要从磁盘加载到内存这一步受文件大小影响我们模型11MB正常情况下应该在100ms内完成但如果在低端机上且未配置noCompress tflite这个时间会成倍放大。实际处理方案是在应用启动流程里初始化一个后台推理任务加载模型并执行一次全流程推理做一个“热身”。判断热身完成的flag主线程等flag置位后才允许调用推理接口。简单有效。针对那种极端情况可以通过内存映射文件FileChannel.map读模型文件代替readBytes能显著降低首次加载耗时。3.2 线程数与XNNPACK的调优策略线程数对推理性能的影响在移动端非常敏感。TFLite的setNumThreads控制底层算子并行度但并不是线程越多越快这点很多人容易误解。手机CPU大小核架构下线程数超过物理核心数之后线程切换会引入额外开销反而拖慢速度。我实测过一组数据以我们项目中端Android8核为例线程数平均推理耗时INT8模型CPU占用峰值1118ms12%278ms25%465ms40%668ms55%882ms70%最优解是4线程超过了反而劣化。这里的核心原因在于TFLite底层的算子并行化不是对所有层都有效的卷积层可以并行但很多逐元素操作串行执行线程多起来后同步和内存带宽竞争就成了瓶颈。XNNPACK是Google为移动端CPU推理专门做的优化库开启方式就是上面提到的setUseXNNPACK(true)。它对FP32和INT8模型都有不错的加速效果尤其在ARM架构上向量化指令利用得更充分。但实测发现XNNPACK在某些自定义算子场景下会造成精度下降因为它对浮点运算顺序做了重新组合不同执行顺序产生的小数值差异在某些任务上会被放大。这个不是bug是浮点计算的固有属性。如果模型对精度极其敏感建议开启XNNPACK后做一遍离线的全量测试集评测对比开启前后的Top-1精度差异。差异在0.3%以内基本可以忽略超过就要考虑回退。3.3 GPU代理与NPU代理的取舍集成的下一步自然是想着上硬件加速。TFLite支持GPU代理Android上通过OpenCL或Vulkan执行推理iOS上通过Metal。我们专门花了一周时间做GPU代理的适配。GPU代理接入代码很轻量GpuDelegate delegate new GpuDelegate(); Interpreter.Options options new Interpreter.Options(); options.addDelegate(delegate);实测下来GPU对FP32模型的加速效果确实明显但我们模型已经做了INT8量化GPU对INT8的支持并不好。量化模型的卷积用GPU跑需要反量化到FP16再计算再量化回去中间多了两次转换性能反而比CPU的XNNPACK差。最终方案是FP32模型用GPUINT8模型用CPUXNNPACK这个组合最稳。NPU代理NNAPI我们也试过但在我们项目的中端设备上NNAPI的算子支持范围参差不齐经常碰到某个设备支持某个算子、另一个设备不支持的尴尬局面。调试成本很高最终放弃了。如果你的目标设备集中在几款特定的高端机型可以考虑NNAPI但如果是全机型覆盖建议明确放弃。3.4 内存峰值与调用频率控制推理过程中内存峰值是另一个容易被忽视的指标。TFLite在推理时需要分配中间tensor的内存模型输入维度越大中间缓冲区越大。我们用Profiler跑了一下发现单次推理的内存峰值在120MB左右这在内存吃紧的老机型上已经非常危险了。控制方案主要有两个一是复用输入输出buffer。不要在每次推理时新建float[][]而是提前分配好固定大小的数组推理时直接把数据填进去。这一点做好了GC压力和内存碎片问题都会缓解。二是控制调用频率。实时视觉类的应用可能会在每一帧做推理但实际场景中很多帧是连续的重复画面尤其是静态场景完全没有必要每帧都推理。我们在代码里加入了帧差检测画面变化超过阈值才触发推理实际调用频率降到了原来的三分之一发热问题也明显缓解。4. 集成调试工具与常见问题速查4.1 避不开的调试辅助设施TFLite集成阶段肯定离不开各种辅助调试手段。我这里有几个趁手的工具每次集成新模型都用得上。模型结构查看用官网提供可视化工具可以直接查看模型的输入输出名称、维度和量化状态。这个是排查维度不匹配问题的第一站。性能剖析TFLite自带一个性能剖析器。开启之后每次推理会输出各算子的耗时分布这个对于定位瓶颈层非常关键比如发现某个卷积层耗时300ms那就要考虑是不是走了某种低效实现。// 启用性能剖析 Interpreter.Options options new Interpreter.Options(); options.setUseXNNPACK(true); // 通过Android Studio Profiler查看耗时崩溃排查TFLite底层是C实现如果触发了原生崩溃查看logcat中的堆栈信息是首要手段。常见的原因是输入数据越界或者张量形状错误从崩溃点向上排查基本能快速定位。4.2 常见问题汇总与处理方案最后把这半年多遇到的典型问题整理成了一张速查表方便后续项目直接对照排查问题现象可能原因处理方案模型加载失败提示File not foundassets路径不对或未配置noCompress检查路径配置noCompress tflite推理报DIMENSIONS_MISMATCH输入输出张量形状与模型定义不一致用可视化工具核对维度量化模型精度骤降5%存在对量化敏感的层改成动态范围量化或者混用敏感层保留FP32首次推理极慢初始化开销未预热启动时后台预加载并执行一次热身推理双端结果不一致浮点运算顺序不同引起用INT8模型弱化差异或统一到同一推理库版本内存持续增长每次推理新建大数组复用推理buffer提前分配固定大小低端机频繁ANR主线程执行了预处理把预处理和推理整体放到子线程模型更新后功能异常新旧模型输出含义不一致建立模型版本管理机制和业务逻辑绑定还有一个容易踩的坑是模型版本管理。我们早期直接在assets目录里覆盖模型文件结果线上用户更新应用后模型输出的类别含义变了但业务代码还是在用旧的类别映射关系直接导致识别结果错乱。后来我们把模型文件放在独立的API接口下由服务端下发客户端启动时检查模型版本跟业务代码版本做对齐校验彻底解决了这类问题。5. 稳定运行之后的一些体会整个TFLite集成项目跑下来我个人最大的体会是工具本身并不难难的是把性能、稳定性、兼容性这堆细节编织到一起。模型转换阶段花了两天但这部分决定了后续性能的上限。量化和算子的选择是硬骨头如果一开始就避重就轻后面到了优化阶段再回头改代价会翻倍。工程接入阶段看似简单其实最考耐心。预处理、后处理、线程模型、内存复用每一个点都值得认真设计。尤其要养成从数据流角度审视代码的习惯看到每一步数据是怎样被拷贝、被变换、被消耗的瓶颈自然就暴露出来了。性能优化阶段最有成就感。从最初的900ms首帧优化到65ms稳定推理这中间每一次调优都建立在基准测试上。建议大家都保留一个简单的耗时统计脚本每次改动都跑一遍完整对比。最后再多说一句端侧推理永远是综合权衡的艺术速度快、体积小、精度高这三点不可能同时做到最优。实际项目里一定要先明确需求优先级如果是实时滤镜类应用速度优先如果是医疗图像判断精度优先如果是下载型应用体积优先。想清楚优先级再动手远好过埋着头把所有方案试一遍。希望这篇实战记录能让你少走几个弯路。端侧AI的坑永远比想象的多但趟过去之后模型跑在自己的设备上那种掌控感是纯云端方案替代不了的。

相关新闻

487万条结构化图书数据集:开箱即用的推荐与NLP工程基底

487万条结构化图书数据集:开箱即用的推荐与NLP工程基底

简介:这是一份面向文本挖掘、自然语言处理与机器学习初学者及研究者的轻量级书籍数据集资源,聚焦于中文文本分析基础任务的训练与验证需求。压缩包共3个文件(1.59MB),含CSV格式的结构化书籍元数据(标题、作…

2026/10/18 17:43:44 阅读更多 →
从题目到终稿:用AI辅助工具高效完成毕业设计论文与实践报告

从题目到终稿:用AI辅助工具高效完成毕业设计论文与实践报告

毕设这东西,绝大多数人第一次接触时根本不知道从哪下手。我自己当年也是,题目定下来之后整整两周没动笔,打开文档半小时,写了删、删了写,最后屏幕上就剩个标题。后来陪好几届同学把整套流程完整跑下来,才想…

2026/10/18 17:43:44 阅读更多 →
Window 显示鼠标的坐标:用 GetCursorPos 与 SetCursorPos 做实时坐标面板

Window 显示鼠标的坐标:用 GetCursorPos 与 SetCursorPos 做实时坐标面板

/* 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 17:42:44 阅读更多 →

最新新闻

n8n CVE-2025-68668漏洞应急响应:24小时处置手册与安全加固指南

n8n CVE-2025-68668漏洞应急响应:24小时处置手册与安全加固指南

半夜被监控告警拉起来,说是生产环境的 n8n 实例正在被人疯狂拉取执行历史。第一反应是有人在调试,再看告警频率,明显是扫描器在批量探测。顺着源 IP 和请求路径追下去,确认是对 CVE-2025-68668 的自动化利用。这个漏洞今天在自动化…

2026/10/18 18:21:56 阅读更多 →
Run ‘conda init‘ before ‘conda activate‘ 报错最全解决办法:从 PowerShell 到 TaoToken 配置排查

Run ‘conda init‘ before ‘conda activate‘ 报错最全解决办法:从 PowerShell 到 TaoToken 配置排查

/* 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 18:21:56 阅读更多 →
Zed 新特性:AI 还在跑,电脑可以不睡了——用 TaoToken 统一 Key 打通 GPUI 编辑器 AI 工作流

Zed 新特性:AI 还在跑,电脑可以不睡了——用 TaoToken 统一 Key 打通 GPUI 编辑器 AI 工作流

/* 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 18:21:56 阅读更多 →
Claude Code 知识工作插件实战:从安装到自定义 slash command

Claude Code 知识工作插件实战:从安装到自定义 slash command

1. 从零认识 knowledge-work-plugins:它到底解决什么问题第一次看到knowledge-work-plugins这个仓库名,很多人会以为是某个笔记软件的插件合集,或者某个知识管理工具的扩展包。实际上,它是一套面向 Claude Code 和 Claude Cowork …

2026/10/18 18:21:56 阅读更多 →
Cesium for UE4坐标系转换全解析:从经纬高到UE4世界坐标

Cesium for UE4坐标系转换全解析:从经纬高到UE4世界坐标

1. 为什么坐标系是Cesium for UE4的第一道坎刚接触Cesium for UE4的人,十有八九会在坐标系上栽跟头。你兴冲冲地把一个倾斜摄影模型或者点云数据拖进UE4场景,结果发现模型要么飘在离原点几万公里外的地方,要么小得跟蚂蚁一样,要么…

2026/10/18 18:21:56 阅读更多 →
分数阶系统辨识:从Caputo算子到嵌入式C实现

分数阶系统辨识:从Caputo算子到嵌入式C实现

简介:本资源是一套面向控制工程、信号处理及系统建模方向研究者与高年级本科生/研究生的分数阶模型辨识实践代码包,聚焦解决传统整数阶模型难以刻画系统记忆性与遗传特性的核心问题。压缩包共495个文件(2.77MB),以179个…

2026/10/18 18:20:56 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →