CLIP复现实战:从对比学习到零样本分类的完整指南
最近把CLIP论文的复现实验完整跑通了一遍从图文对数据准备、双塔模型搭建到大batch对比学习训练最后把zero-shot分类和图文检索指标调到了论文同量级。整个过程和“读论文觉得懂了、一动手全是问题”的预期完全一致踩了不少坑也把不少原先理解模糊的概念彻底搞清楚了。这篇就按我真实的执行顺序来写从项目拆分、环境准备、代码实现再到训练排查把我确认过有效的东西都放出来。如果你也准备自己动手复现CLIP或者正卡在某个环节希望能帮你省掉一些我试错的时间。1. 这篇论文到底在做什么CLIP 的核心思路拆解1.1 从“带标签分类”到“图文对齐”的范式转移在CLIP出现之前多模态模型的常规做法是拿一个预训练好的图像分类模型比如在ImageNet上训过的ResNet把图片编码成向量再接一个针对具体任务的分类头。这种方式有两个绕不开的问题一是需要大量人工标注的数据标注成本极高二是换一个任务或者换一组类别模型就要重新微调泛化能力受限。CLIP的设计思路完全不同它把“图像分类”这个任务重新定义成了“图像与文本的匹配”。模型不再学“这张图属于哪个固定类别”而是学“图像的内容和哪段文本描述是吻合的”。训练数据也从“图片人工标签”换成了“图片自然语言描述”这种图文对在互联网上几乎是无限量的不需要人工标注。一旦模型学会了把图像和文本映射到同一个特征空间新任务的类别只需要写成文字模型就能直接做零样本推理。我在复现前反复想的一个问题是这种范式转移到底强在哪里后来在实验里看得比较清楚。传统的分类模型学到的决策边界是固定的类别一旦变化输出维度就得改。而CLIP学的是图像语义和语言语义之间的对齐关系语言本身提供了类别之间的结构信息。比如“猫”和“老虎”在文本编码器里的距离比“猫”和“汽车”更近这种先验知识会反过来帮助图像侧的特征学习。1.2 对比学习在 CLIP 里是怎么工作的CLIP的核心损失函数是InfoNCE一种基于对比学习的损失。它的逻辑很直白把同一个batch里的图像和文本两两配对计算它们的特征相似度对角线上是正样本对图像和它对应的文本其余位置是负样本对。然后让模型在batch内部做“找出正确配对的文本”这个任务。具体来说假设一个batch有N个图文对图像编码器输出图像特征I1到IN文本编码器输出文本特征T1到TN特征都做L2归一化。模型的目标是最大化I和它对应文本T的余弦相似度同时最小化I和其余N-1个文本的相似度。损失函数是双向的图像到文本的方向计算一份交叉熵文本到图像的方向再计算一份最后取平均。这里有个关键细节容易被忽略对比学习的质量很大程度上取决于负样本的数量和质量。论文里的batch size用到了32768也就是说每个正样本对同时面对32767个负样本。负样本越多模型要区分“相似但不匹配”和“真正匹配”的难度就越大学到的特征也就越具有判别性。我刚开始复现时条件有限只能跑batch size 512的小批量效果差距非常明显后面会详细展开这个问题。import torch import torch.nn.functional as F def clip_loss(image_features, text_features, logit_scale): # image_features: [B, D]已经 L2 归一化 # text_features: [B, D]同样已归一化 logits torch.matmul(image_features, text_features.T) * logit_scale.exp() batch_size logits.shape[0] labels torch.arange(batch_size, devicelogits.device) loss_i F.cross_entropy(logits, labels) # 图像 - 文本 loss_t F.cross_entropy(logits.T, labels) # 文本 - 图像 return (loss_i loss_t) / 2.01.3 论文里容易被忽略的设计细节读第一遍论文的时候会注意到双塔结构和对比损失但有几个细节是到写代码阶段才会意识到它们有多重要。第一个是温度系数。相似度矩阵在进入交叉熵之前要除以一个温度τ论文里初始值设成0.07也就是logits要乘上1/0.07。关键的是这个温度不是固定的而是作为一个可学习参数参与训练。训练后期τ会逐渐变小这意味着模型对相似度的“区分要求”越来越高特征会变得越来越尖锐。我在代码里把它实现成logit_scale的指数形式一是保证正值二是数值稳定性更好logit_scale torch.nn.Parameter(torch.log(torch.tensor(1 / 0.07)))每次前向算logits时乘上logit_scale.exp()实测训练结束后的scale大约在0.01到0.02之间和论文观察到的量级是一致的。第二个细节是文本截断。论文把文本统一截断到77个token这个数字不是拍脑袋的而是兼顾了大部分图文对描述的实际长度和计算效率。很多长描述在40个token之后就是冗余信息了截断不会损失太多语义。第三个细节是两个编码器的特征都做L2归一化。这个操作让相似度退化为余弦相似度让对比学习的目标更纯粹。如果不做归一化模型很可能走捷径通过放大特征模长来降低loss而不是真正学到语义对齐。2. 复现前的准备环境、数据与工具选型2.1 硬件需求与训练框架选择CLIP论文的训练规模和普通单卡实验不是一个量级。原始论文用了几百张GPU训练了相当长时间个人复现不可能完全照搬这个配置。我觉得目标应该定为“用有限的资源验证论文的核心结论”而不是追平参数规模。先说硬件结论如果只做架构验证和小规模训练单张消费级显卡跑得动ResNet-50或ViT-B/32的编码器结构batch size控制在256以内显存占用大约8到12GB。如果想跑出效果好的模型建议batch size至少1024这就得有梯度累积或者多卡分布式训练的配合。训练框架方面我选择了PyTorch的DistributedDataParallel。原因是CLIP这类双塔模型的训练流程里特征收集是个关键的分布式操作每个GPU各自算完本地的图像特征和文本特征之后需要做一次all_gather把所有GPU的特征汇总再统一计算InfoNCE损失。PyTorch对这类操作的支持很成熟分布式通信的代码写起来也直接。# 每个进程先算本地的特征然后 gather 全部特征 import torch.distributed as dist def gather_features(features): gathered [torch.zeros_like(features) for _ in range(dist.get_world_size())] dist.all_gather(gathered, features) all_features torch.cat(gathered, dim0) return all_features框架选型上我没有纠结太久PyTorch生态最完整预训练权重多数据处理库也丰富。TensorFlow也能做但调试灵活性和社区资源都要差一些。动手之前先花半小时把项目结构规划出来能避免后面代码越写越乱。2.2 图文对数据获取、清洗与预处理CLIP训练最关键也最容易被低估的其实是数据。论文里说用了约四亿规模的图文对这个规模个人是拿不到的也不需要真的拿到。我在实际项目里用的是公开的图文对数据集量级在几百万到上千万之间。数据质量对最终效果的影响说实话比模型结构的影响还要大。先说说怎么清洗。网上抓取的图文对存在大量噪声最常见的情况是“图不对文”。一张狗的照片配的文本可能只写着“萌宠”甚至是一段和图片完全无关的营销文案。没有严格清洗的训练数据会让模型学到一些莫名其妙的捷径。我用的清洗规则有这几条文本长度过短少于10个字符的直接丢弃全数字、全符号的丢弃明显的重复文本去重图片分辨率过低比如边长小于100像素的丢弃出现明显不适合作为训练内容的敏感词的丢弃。文本预处理也需要注意。CLIP论文用的是BPE分词词表大小约49k所有文本统一转小写。BPE的好处是能处理未登录词把词拆成子词单元对多语言和网络新词更友好。我用的是HuggingFace的CLIP分词器直接复用省去了自己训练Tokenizer的时间。还有一个容易忽略的工程问题数据处理速度。图像解码、resize、归一化、tokenize这些操作CPU开销很大如果每个step都现算训练速度会被数据加载拖死。我的做法是用WebDataset格式把数据做流式读取同时开启8到16个DataLoader worker做预取图像解码在worker进程里并行做。如果不方便换数据格式那就把文本的tokenize结果缓存到磁盘至少省掉一半以上的CPU开销。2.3 从零搭建还是加载预训练权重动手之前得先想清楚一个问题复现实验的最终目的是什么。如果是为了从原理上搞清楚CLIP每个模块的细节验证论文的各个设计选择那就必须从零搭建把自己的代码和论文描述逐行对齐。如果只是为了快速跑通流程、对比效果那加载已有的预训练权重再微调也是个合理选择。我个人强烈建议至少把模型结构从零写一遍。不是说要重新发明轮子而是在这个过程中你会被迫搞明白每一个细节。比如图像编码器输出特征之前那个projection层是几层、维度多少文本编码器的EOS token特征是在Transformer输出之后再做一次LayerNorm还是直接用温度系数是在哪个位置乘上去的。这些细节读论文时容易滑过去写代码时一个都躲不掉。我在项目里是两条线同时走的模型定义完全从零手写数据加载和训练逻辑自己实现最后用加载预训练权重的输出值去校验我手写模型的前向结果。两边的输出特征余弦相似度应该在0.999以上才算代码正确。这个做法帮我省了很多排查时间强烈推荐。3. 模型搭建与关键模块实现3.1 图像编码器ResNet 还是 ViT图像编码器的选择是复现时第一个要做的决策。CLIP论文做了大量对比实验结论是ViT在参数量相同的情况下效果优于ResNet但ResNet的收敛速度在某些数据规模下更快。我在复现时两个都搭了一遍说下实际感受。ResNet版本实现起来相对简单把最后一层Global Average Pooling的输出接一个两层MLP投影层把2048维压到256维就完成了图像特征提取。预训练时用ResNet-50做主力因为显存占用小、训练速度快迭代速度快适合跑消融实验。调到ResNet-101时效果有小幅提升但收益和成本比偏低。ViT版本稍微复杂一些。输入图片切成patch每个patch线性投影成token加上position embedding后过Transformer block。CLIP论文里用的patch size是32或16实际我选了ViT-B/32即12层、宽度768、12个注意力头。ViT图像编码器的最后取class token的输出接投影层直接作为全图特征。从实际效果看在相同训练数据量下ViT的zero-shot准确率更高尤其在细粒度分类任务上优势更明显。原因是ViT能建模全局依赖关系对图像中“局部纹理”和“整体结构”之间的关联把握得更好。缺点也很明显ViT需要更长的训练步数才能收敛对数据量的需求更大。如果数据只有几百万条ViT的优势不太容易体现出来。3.2 文本编码器结构细节与输入处理文本编码器是整个CLIP架构里相对轻量但是容易写错的部分。论文用的是标准的Transformer decoder结构带因果mask的那种虽然分类场景下其实不需要因果性但没有影响参数量大约63M12层、宽度512、8个注意力头词表大小约49k。文本处理的流程是这样的原始文本统一转小写用BPE分词结果截断到最长77个token包含特殊token文本开头加SOS token结尾加EOS token不足的部分用PAD token补齐。整条文本输入Transformer之后取EOS token对应的输出向量过一次LayerNorm和投影层得到最终的文本特征。这里有个很多人栽过的坑EOS token的位置。如果序列长度不满77EOS token不一定是最后一个位置。实现时必须在tokenize的时候把EOS的索引显式记录下来然后从Transformer输出里通过索引取特征而不是简单取最后一个位置的输出。我一开始就是顺手取的最后一帧结果特征严重错位loss怎么训都不降折腾了两天才定位到是这个问题。还有一个细节是attention mask。虽然CLIP不是生成任务但论文沿用了decoder的causal mask即序列中第t个token只能看到前t-1个token。我实验对比过不加mask即双向注意力的版本最终效果和加了causal mask的差异不大。所以如果为了省事用双向Transformer也能跑但不建议偏离论文太多复现的意义就在于尽可能还原原始设计。3.3 对比损失与温度系数的实现细节前面已经给出了损失函数的核心实现但有几个细节想单独拎出来说。第一个是logits的计算。图像特征和文本特征相乘得到的是[图像数, 文本数]的相似度矩阵在分布式训练里这个矩阵的维度是所有GPU的总batch size而不是本地的batch size。这意味着要先做all_gather收集全部特征然后算相似度矩阵再算损失。顺序很重要如果先算本地loss再同步梯度就不对了。第二个是温度系数的梯度更新。论文里温度τ是学出来的最终值偏向于让logits的分布有一个比较合适的“锐度”。如果温度过大logits趋近于均匀分布交叉熵loss无法提供有效的梯度温度过小logits过于尖锐模型会把所有注意力放在最相似的负样本上训练不稳定。可学习的温度系数让模型自动平衡这个度。第三个是实现上的数值稳定性。相似度矩阵乘上logit_scale之后数值会变大交叉熵内部会做softmax高维向量softmax容易出现数值溢出。我在实现时把交叉熵委托给PyTorch的cross_entropy它在内部做了logsumexp的数值稳定性处理不会出现inf或NaN。如果自己手写softmax加log就要注意减最大值这个经典操作。class CLIPModel(nn.Module): def __init__(self, image_encoder, text_encoder, embed_dim256): super().__init__() self.image_encoder image_encoder self.text_encoder text_encoder self.logit_scale nn.Parameter(torch.log(torch.tensor(1 / 0.07))) def forward(self, images, text_tokens, text_eos_indices): image_features self.image_encoder(images) text_features self.text_encoder(text_tokens, text_eos_indices) image_features F.normalize(image_features, dim-1) text_features F.normalize(text_features, dim-1) return image_features, text_features4. 训练全流程实操记录4.1 训练策略与超参数调整训练CLIP的过程和训练普通分类模型差别挺大最大的差异在于对batch size的敏感性。对比学习的效果几乎和batch size成正比因为更大的batch意味着更多负样本模型的学习信号更丰富。论文用32768的batch size我复现时最高只能到10244卡 × 256效果和理想状态有明显差距。为了把batch size“做大”我用了几种互补的招数。第一是梯度累积每4个step累积一次梯度再更新参数模拟4096的batch效果。第二是梯度检查点gradient checkpointing牺牲一点点计算速度换取显存让我在单卡上可以把batch size从128提到256。第三是混合精度训练PyTorch的autocast配合GradScaler显存占用直接降了将近一半而且在某些GPU上训练速度还有提升。优化器选择了AdamW初始学习率用5e-4配合cosine学习率衰减策略前2000步做warmup。warmup在对比学习里比普通分类任务更重要因为模型刚开始是随机初始化的特征完全没有意义如果一开始就用大学习率loss的震荡非常剧烈甚至可能直接发散。权重衰减分成了两组零。图像编码器和文本编码器的内部参数以及最后的投影层和温度系数各自设置不同的weight decay。具体来说是投影层和温度系数不设weight decay编码器的Transformer/卷积层设置0.02。这个细节看起来小但对最终loss的收敛速度和稳定性都有影响。4.2 训练曲线怎么看loss 不降、发散怎么办训练过程中的loss曲线是判断模型状态的重要信号但很多人不会看。对比学习的loss不像分类任务的loss那么直观它下降得比较慢而且有一个特点初始阶段loss下降飞速从最初的10左右很快到3左右然后进入漫长的“爬坡期”可能一两个epoch才降0.1。如果你的loss在某个数值上完全停滞先排查的是代码和数据而不是超参数。我用过一个很有效的调试方法拿一个小的“玩具数据集”几千条数据先跑少量的step看loss能不能降到接近零。如果模型能在这个小数据集上完全过拟合说明代码逻辑基本正确问题出在数据量或者超参数上如果小数据集都降不下去那一定是模型或者loss实现有bug。训练发散的表现一般有两种。一种是loss直接变成NaN大概率是学习率太大或者logit_scale被更新到过大值。另一个是loss先下降然后突然反弹温度系数在这个过程中可能被更新到了一个异常大的值。我的检查顺序是先看logit_scale的值有没有失控再看梯度范数是不是异常大最后确认数据里有没有异常样本比如全黑图片、全零向量。一个重要的稳定技巧是梯度裁剪我把最大梯度范数设为5。这个操作在普通分类训练里属于可选但在CLIP这种双塔对比学习的训练里基本是必需品。特征空间在初期变化剧烈偶尔会出现一个巨大的梯度脉冲不裁剪的话整个模型参数都会被带偏。4.3 零样本迁移评估检验训练效果训练一个epoch之后最关键的不是loss数值而是能不能“用起来”。CLIP最吸引人的地方就是零样本迁移能力。我的评估方法是在分类任务上做标准的zero-shot推理给定一张图像先用文本编码器把“a photo of a {类别名}”这样的模板文本编码成特征再计算图像特征和所有类别文本特征的余弦相似度取相似度最高对应的类别作为预测结果。这里有个提升效果的小技巧多个模板集成。CLIP论文里提到对每个类别用多个描述模板比如“a photo of a {类别}”、“a photo of many {类别}s”、“a low resolution photo of a {类别}”分别计算文本特征取平均作为最终的类别原型。这个操作能显著提升zero-shot精度提升幅度通常在2到5个百分点对细粒度分类任务尤其明显。模板的多样性覆盖了不同语言表达习惯带来的特征偏移。除了zero-shot分类我还会做图文检索评估给定一张图像在测试集的全部文本里找出与之最匹配的文本看排序结果里正确答案的位置。这个指标更直接地反映图文对齐质量。训练到尾部检索的Top-1准确率上升速度还在继续但我因为时间关系没有继续训这是很可惜的。如果条件允许CLIP这类模型宁可加大数据多训几个epoch好过频繁调整模型结构。5. 常见问题与排查实录5.1 问题速查表与解决步骤以下是我复现过程中遇到的高频问题按照出现概率从高到低排列。每个问题都记录了现象、根因和解决动作可以直接对照排查。现象可能原因排查与解决loss 完全不下降文本 EOS 特征取错位置 / 数据图文不对齐玩具数据集过拟合测试打印一批训练样本人工检查图文对loss 下降后突然 NaN学习率过高 / logit_scale 失控 / 梯度爆炸加梯度裁剪把学习率降到 1e-5 重新测试检查 logit_scale 数值范围显存溢出batch 太大 / 特征图缓存过多开混合精度开梯度检查点减小当前 batch 配合梯度累积zero-shot 精度低数据量少 / batch size 小 / 文本模板单一换多个分类模板做集成如果数据太少考虑用预训练权重初始化编码器多卡训练 loss 抖动all_gather 使用不当 / 不同卡数据不均衡检查 gather 的特征是不是全 batch确认每个进程的 batch 数据量一致训练速度极慢数据加载是瓶颈 / 图像解码串行用 webdataset 流式读取dataloader 多 worker 预取缓存文本 token5.2 我个人踩过的三个最深的坑第一个坑是文本编码器的EOS位置。这个前面已经强调了但我还是想再说一次。我做的是从最后一帧改成显式记录EOS索引在玩具数据集上loss直接从停滞变成正常下降。这个bug表现得很隐蔽因为loss不是完全不动而是缓慢下降到2.5左右就卡住了很容易让人以为是数据量不够实际上代码一直是错的。第二个坑是分布式训练里的all_gather。刚开始我写的gather逻辑只gather了图像特征没有gather文本特征。结果每个GPU上用“本地图像特征 全局文本特征”算的loss与别的GPU上算出来的版本不一致导致梯度更新方向互相打架loss曲线震荡得特别厉害同时各卡的loss数值还不同。后来发现后统一改成“图像特征和文本特征都做all_gather”整个训练稳定了很多。第三个坑发生在数据处理阶段。我从原始图文对数据里抽样查看时一切正常于是觉得清洗可以凑合。结果训练完跑zero-shot评测发现模型对“纯黑色背景”的图特别敏感精准度反而异常地高。后来排查发现数据里有大量的黑底白字截图模型明显学到了“黑底白字文本描述里的关键词”这种捷径。把所有低质量的“文本截图”类型样本过滤掉之后整体的zero-shot指标才回升。这三个坑本质上是同一个教训做复现实验数据质量和代码正确性永远是第一优先级。模型结构再精巧数据和代码出了问题训练结果都会是看似能跑、实则全错。最后再分享一个小技巧在训练开始之前用预训练权重把双塔模型各自的输出单独校验一遍。不需要全套数据抽样几百个图文对计算图像特征和正确文本特征的相似度确认它明显高于负样本的相似度。这一步能快速确认你的模型前向流程是对的再开始训练就踏实了。CLIP的复现实验投入不小把这些基本功做扎实后期省下的时间远超前期多花的这点功夫。

相关新闻

CLIP原理拆解与复现实践:从对比学习到零样本图文检索

CLIP原理拆解与复现实践:从对比学习到零样本图文检索

CLIP 这篇论文,我前后迭代了差不多三周,从最初只跑通预训练模型做零样本分类,到后来把完整的对比学习流程在小规模图文对上复现出来,中间踩的坑比想象中多得多。作为一个一直做单模态模型的人,第一次接触图文联合表征时…

2026/10/18 10:57:53 阅读更多 →
分布式驱动Cruise建模全流程:轮毂/轮边电机四驱动力经济性仿真

分布式驱动Cruise建模全流程:轮毂/轮边电机四驱动力经济性仿真

搞整车动力性经济性仿真这些年,最常被问到的一个需求就是:分布式驱动车型在Cruise里怎么建模?尤其是轮毂电机、轮边电机这种四轮独立驱动的构型,很多刚接触的人一上来就卡在“四个电机怎么接”“扭矩分配怎么给”“经济性结果为什…

2026/10/18 10:57:53 阅读更多 →
高校教师在线学习平台设计与开发:Vue3+Node.js+Element Plus实战

高校教师在线学习平台设计与开发:Vue3+Node.js+Element Plus实战

去年给某高校信息中心做教师继续教育平台的时候,对方一开始给我看了一份需求文档,里面赫然写着“参考某某学习App的学生端”。我当场就有点警觉——教师在线学习和学生在线学习,表面上是同一件事,实际上完全是两种产品逻辑。学生有…

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

最新新闻

Qt开发欧姆龙FINS上位机:协议解析、TCP封装与工业部署实战

Qt开发欧姆龙FINS上位机:协议解析、TCP封装与工业部署实战

简介:本资源是一套基于Qt框架开发的欧姆龙FINS协议上位机完整源码工程,面向工业自动化领域的嵌入式/上位机开发者及PLC通信初学者,解决跨平台PLC数据读写、协议封装与GUI快速构建等核心问题。压缩包共18个文件,含4个关键.cpp实现文…

2026/10/18 14:23:31 阅读更多 →
世界模型新突破:偷懒率下降85.7%

世界模型新突破:偷懒率下降85.7%

强化实例与跨帧一致性 世界模型预测机器人操作过程时,能否保持目标的物理一致性,避免无故复制、消失或形变? 目前的主流方法,是以预训练视频生成模型为基础,在机器人操作数据上进行监督微调(SFT&#xff…

2026/10/18 14:23:31 阅读更多 →
基于Dify与MCP搭建智慧出行助手的完整实战

基于Dify与MCP搭建智慧出行助手的完整实战

最近在折腾 Dify MCP 这个组合,发现拿它做一个智慧出行助手,比想象中顺手太多。所谓智慧出行,通俗讲就是让 AI 根据你的自然语言描述,自动完成查路况、找路线、看天气、比交通方式这一整套动作。这篇我会把从零搭建的完整过程、踩…

2026/10/18 14:23:31 阅读更多 →
黄仁勋谈中国 AI 公司:算力越缺,越逼着他们把架构做到极致

黄仁勋谈中国 AI 公司:算力越缺,越逼着他们把架构做到极致

黄仁勋的短视频推荐页里有什么?AI、炒饭、狗狗,还有大熊猫 “嘿,大家安静!张忠谋打电话来了!” 接到这通电话时,黄仁勋办公室外面的员工正在玩第一代 PlayStation,笑声、喊声混成一片。而他已…

2026/10/18 14:23:31 阅读更多 →
wewin268a打印机驱动安装与ESC/POS底层调试指南

wewin268a打印机驱动安装与ESC/POS底层调试指南

简介:本资源为伟文(Wewin)Wewin268A型号标签打印机的官方最新版驱动安装包,专为使用该硬件的中小企业用户、仓储物流标签打印人员及设备维护技术人员设计,解决驱动缺失导致的无法识别、打印模糊、指令不响应等常见兼容…

2026/10/18 14:23:31 阅读更多 →
MySQL 5.7.40离线安装包部署指南:glibc2.12兼容与生产级配置

MySQL 5.7.40离线安装包部署指南:glibc2.12兼容与生产级配置

简介:本资源为MySQL 5.7.40官方二进制离线安装包,专为x86_64架构、glibc 2.12及以上版本的Linux系统设计,面向数据库运维工程师、Linux系统管理员及后端开发人员,解决无外网环境下的MySQL快速部署与初始化问题。压缩包共379个文件…

2026/10/18 14:22:30 阅读更多 →

日新闻

基于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 阅读更多 →