基于ResNet的手写数学公式识别:从数据预处理到端到端计算
简介这份资源是一套基于深度学习ResNet架构的手写数学公式识别系统面向教育领域的技术开发者、机器学习学习者及中小学数学教学场景用于自动识别手写公式中的加减乘除、括号及0-9数字并完成计算。系统采用Python 3.9开发涵盖数据集预处理、模型训练与推理、图形界面交互等完整流程ResNet的残差结构有效缓解深层网络梯度消失问题提升复杂图像特征提取能力。压缩包共43个文件约39.85MB包含13个py源码文件、20张png图像、1个pth模型权重及txt、md、docx等说明文档覆盖训练脚本、分割模块、预测逻辑与UI组件目录结构清晰便于按模块学习。目前已有69人学习下载。读者可获取从数据清洗、归一化到模型部署的完整工程实现理解手写公式识别与计算的技术链路并借助说明文档快速上手运行与二次开发适合作为教育智能化方向的实践参考。1. 手写公式识别到底难在哪从一张草稿纸说起教育场景里有个很具体的痛点学生在平板上写完(35)×2-4÷2系统只能存成一张图片没法判断对错更没法自动批改。手写数学公式识别要解决的就是这件事——把笔迹图像转成结构化的 LaTeX 或表达式树再交给计算引擎求值。它和普通 OCR 最大的区别在于数字和运算符的识别只是第一步真正的难点是二维结构。x²和x2像素分布接近1/2的横线位置决定它是分数还是两个独立数字括号的跨度可能横跨三行。ResNet 在这里的价值是提供一个足够强的视觉骨干把笔画特征抽干净后面再接序列解码或结构分析模块。这套方案适合做教育类工具、作业批改系统、智能答题板的开发者也适合想入门文档图像分析的算法同学。下面按数据、骨干、训练、部署、避坑的顺序讲透。2. 数据从哪来手写公式数据集的构建与预处理2.1 为什么不能直接用印刷体公式数据集印刷体公式数据集比如用 LaTeX 渲染出来的图和手写公式的分布差异极大。印刷体的笔画粗细均匀、字符间距固定、没有连笔和涂抹手写体里同一个数字7可能带横杠也可能不带可能写成两笔交叉也可能一笔画完。如果拿印刷体数据训练再直接推理手写图准确率会断崖式下跌。常见做法是以公开手写数学符号数据集为底叠加自己采集的笔迹数据做微调。采集时要注意覆盖不同书写习惯——左撇子、连笔、倾斜、不同笔宽。2.2 图像预处理的四个关键步骤预处理的目标是把任意尺寸、任意背景的笔迹图变成网络能吃的规整输入。下面这段代码是完整的预处理流水线每一步都有明确的参数理由。import cv2 import numpy as np def preprocess_formula_image(img_path, target_size(224, 224)): # 1. 灰度化手写公式不需要颜色信息灰度能降通道、减计算量 img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: raise ValueError(f无法读取图像: {img_path}) # 2. 二值化OTSU 自动找阈值比固定阈值 127 更适应不同光照 # 反转使笔画为白(255)、背景为黑(0)符合后续归一化习惯 _, binary cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) # 3. 去噪中值滤波核 3x3去掉孤立噪点但保留笔画边缘 denoised cv2.medianBlur(binary, 3) # 4. 裁剪有效区域找到所有非零像素的包围盒去掉多余白边 coords cv2.findNonZero(denoised) if coords is None: raise ValueError(图像中未检测到有效笔画) x, y, w, h cv2.boundingRect(coords) cropped denoised[y:yh, x:xw] # 5. 等比缩放 填充保持宽高比短边补零到目标尺寸 # 直接 resize 会拉伸字符导致 1 变胖、0 变扁 h_orig, w_orig cropped.shape scale min(target_size[0] / w_orig, target_size[1] / h_orig) new_w, new_h int(w_orig * scale), int(h_orig * scale) resized cv2.resize(cropped, (new_w, new_h), interpolationcv2.INTER_AREA) canvas np.zeros(target_size, dtypenp.uint8) pad_x (target_size[0] - new_w) // 2 pad_y (target_size[1] - new_h) // 2 canvas[pad_y:pad_ynew_h, pad_x:pad_xnew_w] resized # 6. 归一化到 [0,1] 并扩展通道维度匹配 ResNet 输入格式 normalized canvas.astype(np.float32) / 255.0 return np.expand_dims(normalized, axis-1) # shape: (224,224,1)逻辑说明二值化用 OTSU 而不是固定阈值是因为手机拍照或平板截图的光照条件不可控固定阈值在暗光下会把笔画和背景一起判黑。等比缩放加填充是手写识别里最容易被忽略的一步——很多人直接cv2.resize到 224×224结果细长的公式被横向拉伸1和l的区分度直接消失。归一化到 [0,1] 而不是 [-1,1]是因为后面接的是标准 ResNet 骨干它的第一层卷积默认按 [0,1] 输入设计。2.3 标签编码从 LaTeX 到字符级序列标签侧要做的是把\frac{1}{2}这种 LaTeX 串转成模型能学的序列。常见做法是维护一个字符表覆盖 0-9、、-、×、÷、(、)、、x、y 以及分数线和根号等结构符号。编码时按字符切分每个字符映射到一个整数 ID序列两端加sos和eos。如果公式里出现字符表外的符号直接丢弃该样本不要用unk硬编码——手写公式里未知符号往往意味着标注错误留着会污染训练集。提示字符表大小建议控制在 60 以内。超过这个数说明你在试图覆盖过于复杂的公式而手写场景下复杂公式的标注一致性很难保证不如先聚焦加减乘除和括号。3. ResNet 骨干怎么选从 ResNet18 到 ResNet50 的取舍3.1 为什么是 ResNet 而不是 VGG 或 MobileNet手写公式识别的骨干网络需要同时满足两个条件足够深以捕捉二维结构关系又不能太深导致小数据集过拟合。VGG 系列参数量大、没有残差连接在几千张手写样本上训练很容易梯度消失MobileNet 虽然轻但深度可分离卷积对细笔画的特征提取偏弱和×这种细线交叉的区分度会下降。ResNet 的残差连接让梯度能直接回传配合 BatchNorm 在小数据集上也能稳定收敛。实际选型时ResNet18 是起步首选ResNet34 是精度和速度的平衡点ResNet50 只在样本量超过五万张时才有明显收益。3.2 骨干网络的改造输入通道与输出层标准 ResNet 是为 RGB 三通道 224×224 设计的手写公式是单通道灰度图需要改第一层卷积。同时要去掉最后的 1000 类全连接层换成适合序列输出的结构。import torch import torch.nn as nn from torchvision import models class FormulaResNet(nn.Module): def __init__(self, num_classes, backboneresnet18, pretrainedTrue): super().__init__() # 加载预训练骨干pretrainedTrue 能加速收敛 if backbone resnet18: self.backbone models.resnet18(pretrainedpretrained) feat_dim 512 elif backbone resnet34: self.backbone models.resnet34(pretrainedpretrained) feat_dim 512 else: self.backbone models.resnet50(pretrainedpretrained) feat_dim 2048 # 改造第一层3通道 - 1通道 # 做法是把预训练权重的三通道求和保留原始特征响应 old_conv self.backbone.conv1 new_conv nn.Conv2d(1, 64, kernel_size7, stride2, padding3, biasFalse) with torch.no_grad(): new_conv.weight.copy_(old_conv.weight.sum(dim1, keepdimTrue)) self.backbone.conv1 new_conv # 去掉原始 fc 层保留全局池化前的特征 self.backbone.fc nn.Identity() # 接一个分类头做字符级预测简化版实际可用 CTC 或 Transformer 解码 self.classifier nn.Sequential( nn.Linear(feat_dim, 256), nn.ReLU(inplaceTrue), nn.Dropout(0.3), nn.Linear(256, num_classes) ) def forward(self, x): # x: (B, 1, 224, 224) feat self.backbone(x) # (B, feat_dim) logits self.classifier(feat) # (B, num_classes) return logits逻辑说明第一层卷积的权重改造是关键。直接把三通道权重随机初始化会浪费预训练特征把三通道求和压成单通道相当于把 RGB 三个通道的响应叠加到灰度上保留了边缘和纹理检测能力。self.backbone.fc nn.Identity()是 PyTorch 里去掉全连接层的标准写法比手动改fc为None更安全因为forward里还会调用它。分类头里的 Dropout 设 0.3 而不是 0.5是因为手写公式的特征维度不算高过强的 Dropout 会让训练震荡。3.3 序列解码CTC 还是 Attention如果公式是单字符分类比如只识别一个数字上面的分类头就够了。但真实公式是变长序列需要解码器。CTCConnectionist Temporal Classification适合字符间距不均匀、不需要显式对齐的场景实现简单但要求字符之间大致有序。Attention 解码器Transformer Decoder能处理二维结构比如分数线的上下关系但需要更多数据和更长的训练时间。我的经验是先上 CTC 跑通 baseline确认骨干特征有效再换 Attention 做结构建模。不要一上来就堆 Transformer否则调参周期会拖到让人怀疑人生。注意CTC 的 blank 标签要和字符表分开编号通常设num_classes len(charset) 1最后一位是 blank。如果忘了加 blankCTC 损失会直接报维度不匹配。4. 训练与调参让模型在几千张样本上收敛4.1 数据增强手写场景该做和不该做的数据增强是手写识别里性价比最高的操作。该做的随机旋转 ±10 度模拟书写倾斜、随机缩放 0.9~1.1模拟不同字号、弹性形变模拟笔画抖动。不该做的水平翻转会把变成但把2变成镜像语义错误、垂直翻转6和9直接混淆、大角度旋转超过 15 度后公式结构被破坏。下面是一个基于 albumentations 的增强配置。import albumentations as A from albumentations.pytorch import ToTensorV2 train_transform A.Compose([ A.Rotate(limit10, border_mode0, p0.5), # 小角度旋转 A.RandomScale(scale_limit0.1, p0.3), # 缩放 0.9~1.1 A.ElasticTransform(alpha1, sigma50, p0.2), # 弹性形变 A.GaussNoise(var_limit(10, 50), p0.2), # 模拟拍摄噪点 A.Normalize(mean[0.5], std[0.5]), # 单通道归一化 ToTensorV2() ])参数说明Rotate的border_mode0表示旋转后空白区域填 0黑底和预处理后的背景一致。ElasticTransform的alpha控制形变强度1 是温和形变超过 3 会让字符结构扭曲到不可读。GaussNoise的方差上限 50 是经验值再高会淹没细笔画。4.2 学习率与优化器的实际配置ResNet 微调的学习率不能照搬 ImageNet 训练的 0.1。预训练权重已经包含通用特征手写数据量小学习率要降两个数量级。我一般用 AdamW初始学习率 1e-4权重衰减 1e-4配合余弦退火。Batch size 在显存允许下尽量大32 是底线64 更稳。如果显存不够用梯度累积模拟大 batch。from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR model FormulaResNet(num_classes60, backboneresnet18) optimizer AdamW(model.parameters(), lr1e-4, weight_decay1e-4) scheduler CosineAnnealingLR(optimizer, T_max50, eta_min1e-6) # 训练循环核心片段 for epoch in range(50): model.train() for images, labels in train_loader: optimizer.zero_grad() logits model(images) loss nn.CrossEntropyLoss()(logits, labels) loss.backward() # 梯度裁剪防止梯度爆炸阈值 5.0 是经验值 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm5.0) optimizer.step() scheduler.step()逻辑说明CosineAnnealingLR的T_max设成总 epoch 数让学习率从 1e-4 平滑降到 1e-6。梯度裁剪的max_norm5.0是手写识别里常用的保守值因为弹性形变增强后的样本偶尔会产生异常梯度。如果训练 loss 在前 5 个 epoch 不下降先检查数据标签是否对齐再检查第一层卷积权重是否被正确初始化。4.3 验证指标准确率之外要看什么字符级准确率会掩盖结构错误。比如1/2识别成12字符准确率是 100%但语义完全错了。验证时要同时看三个指标字符错误率CER、公式级完全匹配率EMR、以及括号配对正确率。CER 用编辑距离算EMR 要求整串完全一致括号配对单独统计是因为括号错误在教育场景里最致命——(35少一个右括号计算引擎直接报错。建议在验证集上每 5 个 epoch 打印一次这三个指标不要只看 loss。5. 避坑与排查手写公式识别里最容易翻车的五件事5.1 现象训练 loss 正常下降但验证准确率卡在 30% 不动原因数据泄露或标签错位。常见情况是训练集和验证集里出现了同一张图的增强版本模型在验证集上其实见过这些样本但标签编码时字符表顺序不一致导致预测 ID 和真实 ID 对不上。解决先检查训练集和验证集的图像文件名是否有重叠再打印前 10 个样本的标签解码结果肉眼确认3没有被编码成8。5.2 现象模型对和×的区分度极低混淆矩阵里两者互相误判原因预处理阶段二值化阈值过高细笔画被腐蚀。和×都是细线交叉如果 OTSU 把浅色笔画判成背景两者的像素差异进一步缩小。解决把二值化后的图存下来肉眼检查如果笔画有断裂改用自适应阈值cv2.adaptiveThreshold或者把中值滤波核从 3 降到 1相当于不做滤波。5.3 现象推理时单张图耗时超过 500ms批量推理又爆显存原因输入尺寸设成了 448×448 或更大ResNet 的计算量随边长平方增长。手写公式的有效信息集中在笔画区域224×224 足够覆盖大多数公式。解决把输入尺寸降到 224×224如果公式特别长超过 15 个字符改用 224×320 的矩形输入而不是正方形放大。批量推理时用torch.no_grad()包住前向显存占用能降一半。5.4 现象模型在测试集上表现好但部署到实际场景后准确率暴跌原因训练数据的采集条件和实际使用条件不一致。训练集可能是扫描仪采集的白底黑字实际场景是平板上的灰底蓝字或者手机拍照有阴影。解决在预处理里加一步自适应直方图均衡化CLAHE把不同光照条件下的对比度拉齐。同时收集至少 200 张实际场景的样本做微调不要指望模型零样本泛化到新设备。5.5 现象括号识别正确但分数结构完全错乱1/2被识别成12原因纯序列模型丢失了二维空间信息。CTC 或单向 Attention 只按从左到右的顺序解码分数线的上下关系被压平。解决在骨干特征后接一个二维位置编码或者改用基于检测的方案——先检测分数线、括号等结构符号的位置再按空间关系组装表达式树。如果不想改架构至少在训练数据里加入大量分数样本让模型从像素分布里隐式学到横线位置的含义。6. 从识别到计算表达式解析与结果验证的最后一公里识别出 LaTeX 串只是中间产物教育场景真正要的是计算结果。这一步的常见做法是把 LaTeX 串解析成表达式树再递归求值。解析时要注意运算符优先级和括号配对求值时要把×和÷映射成*和/同时处理除零和非法字符。import re def latex_to_expr(latex_str): # 简化版处理加减乘除和括号分数用 / 表示 s latex_str.replace(\\times, *).replace(\\div, /) s s.replace(\\frac{, ().replace(}{, )/().replace(}, )) s s.replace( , ) # 校验只允许数字、运算符、括号和小数点 if not re.fullmatch(r[0-9\-*/().], s): raise ValueError(f表达式含非法字符: {s}) # 括号配对检查 depth 0 for ch in s: if ch (: depth 1 elif ch ): depth - 1 if depth 0: raise ValueError(括号不匹配右括号多余) if depth ! 0: raise ValueError(括号不匹配左括号多余) return s def safe_eval(expr): # 用 eval 前先做字符白名单校验避免代码注入 allowed set(0123456789-*/().) if not set(expr).issubset(allowed): raise ValueError(表达式含不允许的字符) try: result eval(expr, {__builtins__: {}}, {}) except ZeroDivisionError: return 除数不能为零 return result # 示例 latex r\frac{1}{2} 3 \times (4 - 1) expr latex_to_expr(latex) # 得到 (1)/(2)3*(4-1) print(safe_eval(expr)) # 输出 9.5逻辑说明latex_to_expr里的替换顺序很重要——先替换\times和\div再处理\frac否则\frac里的{}会干扰后续替换。括号配对检查用深度计数遇到右括号时深度减到负数说明右括号多了遍历结束深度不为零说明左括号多了。safe_eval里把__builtins__设为空字典防止eval执行任意代码这是处理用户输入时的基本安全习惯。验证环节建议加一层反向校验把计算结果代回原公式检查是否满足等式。比如识别出358计算左边得 8和右边一致说明识别和计算都正确。如果左边算出 9要么是识别错了要么是原题写错了两种情况都值得记录日志用于后续迭代模型。我自己的习惯是每次模型更新后拿 50 张手写样本跑一遍端到端流程从图像输入到计算结果输出人工核对每一步。这比只看验证集准确率更能发现真实问题——验证集上的高分有时候只是过拟合的假象端到端跑通才是硬道理。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PCA9422+PIC18F57Q43低功耗可穿戴电源方案设计与调试总结

PCA9422+PIC18F57Q43低功耗可穿戴电源方案设计与调试总结

给低功耗设备做电源方案,最烦的不是主控写不出逻辑,而是电源那部分看起来很常规,真调起来全是暗坑。最近把手头一个可穿戴原型机的供电链路重构了一版,主控选了PIC18F57Q43,电源管理交给PCA9422这颗PMIC,充…

2026/10/9 15:36:19 阅读更多 →
针对MCP协议实现的降熵洞察:错误处理与容错机制是大模型系统的自愈中枢

针对MCP协议实现的降熵洞察:错误处理与容错机制是大模型系统的自愈中枢

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

2026/10/9 15:35:18 阅读更多 →
PCA9422与TM4C1294嵌入式电源管理实战:I2C配置与动态调压

PCA9422与TM4C1294嵌入式电源管理实战:I2C配置与动态调压

做嵌入式这几年,我越来越觉得电源管理才是真正决定设备能不能稳定长期跑下去的关键。这次这个项目把PCA9422这颗PMIC和TM4C1294NCPDT组合在一起,搭了一套完整的电源管理链路,从硬件接入、I2C协议、寄存器配置到动态调压、中断处理和故障排查&…

2026/10/9 15:35:18 阅读更多 →

最新新闻

SQLServer跨服务器触发器同步实战:从链路配置到踩坑避雷指南

SQLServer跨服务器触发器同步实战:从链路配置到踩坑避雷指南

简介:一份面向 SQL Server 数据库管理员与开发人员的同步方案文档,聚焦跨服务器数据一致性问题,讲解如何利用触发器在 srv1 与 srv2 间实现新增、修改、删除三类操作的实时同步。资源为单份 PDF 电子文档,压缩包大小仅 7KB&#x…

2026/10/9 16:53:18 阅读更多 →
PHP全开源聊天室源码:WebSocket高并发实战与避坑指南

PHP全开源聊天室源码:WebSocket高并发实战与避坑指南

简介:这是一套基于PHP与WebSocket技术构建的全开源H5聊天室源码,面向需要为网站或应用快速集成即时通讯功能的开发者,尤其适合具备一定PHP基础、希望深入理解实时通信原理的中级学习者。资源包共19个文件,约1.5MB,以9个…

2026/10/9 16:53:18 阅读更多 →
二极管选型与电路设计:从PN结原理到工程避坑指南

二极管选型与电路设计:从PN结原理到工程避坑指南

1. 从一个二极管符号说起:为什么这个标题值得单独写一篇“Diode”这个词,直译过来就是二极管。但凡摸过电路板、焊过元件、或者大学里上过一门模电课的人,对这个词都不陌生。但恰恰是因为太熟悉,很多人反而忽略了它背后那一整套精…

2026/10/9 16:53:18 阅读更多 →
opencode OContinue 插件:把 endpoint 改到 TaoToken 的配置与验证

opencode OContinue 插件:把 endpoint 改到 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/9 16:53:18 阅读更多 →
Python实战:从采集到调度,搭建高匿免费代理池

Python实战:从采集到调度,搭建高匿免费代理池

1. 免费代理池这件事,到底值不值得自己动手做数据采集的朋友大概率都遇到过这样的场景:目标站点请求频率一高,IP 就被限流甚至封禁,脚本跑着跑着就返回 403 或者验证码页面。这时候最直接的解法就是换 IP,而免费代理池…

2026/10/9 16:52:16 阅读更多 →
英语语法术语表:从词法到句法,构建语法体系的核心指南

英语语法术语表:从词法到句法,构建语法体系的核心指南

1. 为什么我建议你死磕这套英语语法术语表很多人学英语学了好几年,一开口还是“主谓宾定状补”傻傻分不清楚,更别提什么“非谓语动词”“虚拟语气”“倒装结构”了。你问他什么是“表语”,他可能愣半天告诉你“就是be动词后面的那个东西”。这…

2026/10/9 16:52:16 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →