敦煌壁画破损识别分割数据集:14210张Labelme标注与DeepLabV3+训练实践

1. 从一张残损壁画到一个数据集:这个项目解决的真实问题

做文物数字化和视觉识别交叉方向的朋友,应该都有过类似的尴尬时刻:算法模型在公开数据集上跑得风生水起,一遇到真实的敦煌壁画图像,效果立刻断崖式下跌。不是模型不行,而是壁画破损的形态太特殊——它不像通用分割数据集里那种边界清晰的物体,风化和裂缝是渐变的、模糊的、漫延的,跟背景纹理大量交织。

我做这个敦煌壁画破损识别分割数据集,核心目标就一个:把"破损"这件事变成可量化的像素级任务,让模型学会在复杂壁画纹理中把病害区域逐像素啃出来。项目最终产出了14210张Labelme格式标注图,1个类别,覆盖了壁画中常见的裂隙、酥碱、起甲、剥落等多种视觉破损形态。

这个项目主要解决三个层面问题:

  • 数据稀缺:文物破损相关的公开分割数据集极少,尤其是针对壁画材质和病害形态的,几乎是空白。想做壁画修复辅助、病害监测的团队,往往被数据卡在第一步。
  • 标注工具链缺失:很多团队还在用通用目标检测框去标注破损区域,但破损不是矩形能框住的。它需要多边形级别的精细标注,这正是Labelme格式的价值所在。
  • 训练和评估标准化:没有统一的数据集格式,模型复现和横向对比就是空谈。固定到Labelme格式后,数据增强、掩码转换、模型训练、指标评估都是标准流程。

如果你是做文化遗产数字化、文物保护智能分析、或者工业上的表面缺陷检测,这个数据集的构建思路都能直接套用。尤其是"如何在一个标注工具、一个类别的前提下,把数据质量做到可用"这一整套方法,比数据集本身更有参考价值。

2. 数据生产流水线:从原始壁画图像到14210张Labelme标注文件

2.1 图像来源与筛选:第一道关卡决定了后续一切

数据集的源头很重要。不是所有敦煌壁画照片都能直接进数据集,需要经过严格筛选。我当时主要从三个渠道获取原始图像:

  • 公开的壁画数字化成果:包括一些学术项目公开的高清扫描图,这部分图像质量高、光线均匀,是训练集的主力。
  • 实地拍摄的现场照片:这部分图像存在透视畸变和光照不均,但恰好能模拟真实监测场景,对提升模型泛化能力很有价值。
  • 历史档案扫描件:部分黑白或偏色老照片,破损形态清晰但对标注人员要求高。

筛选时我踩过一个坑:不能只看图像是否清晰,更要看破损区域和背景的对比度。有些壁画本身颜色暗沉,破损区域肉眼都很难分辨,标注人员被迫"猜"边界,这种图像标注出来噪声极大。我的筛选标准是至少要保证破损区域在原始分辨率下能以肉眼可辨的状态呈现。

最终有效图像数量收到将近1.5万张,经过人工排查,剔除了严重模糊、过曝和内容重复的样本,留下14210张进入标注环节。这14210张不是随便凑出来的,而是每个专题、每个窟区都有覆盖,避免模型只学会识别某一种特定色调的壁画。

2.2 Labelme标注实操:多边形操作的几个关键细节

Labelme是老牌的图像多边形标注工具,为什么选它而不是别的工具?因为它输出的JSON格式非常直观,每个标注对象包含一个多边形点集和一个类别标签,这种格式对分割任务极其友好,后续转掩码非常简单。

标注过程中,最核心的细节有三个:

第一个是标注粒度的把握。破损区域的外边界往往不是一条清晰的线,而是一个逐渐过渡的"晕染带"。标注太紧会漏掉边缘的早期病害,太松会把完好区域框进来。我的经验是:裂缝类破损沿裂缝可见边缘标注;剥落类破损沿着颜料层缺失的边缘标注;酥碱类破损则按照颜色和质地明显改变的区域边界标注。宁可略微外扩,不要让模型学到"破损是孤立斑块"的错误认知。

第二个是多边形点数的选择。很多人以为点越多越精确,实际上点太多会引入大量噪声,标注和训练效率也低。我最终统一规范:每个多边形控制在20到80个点之间,既能表达复杂轮廓,又不至于过度拟合标注人员的鼠标抖动。

第三个是对象拆分策略。一个大面积破损区域内可能包含多个独立裂隙,是标成一个多边形还是拆成多个?我选择了拆。因为壁画破损的分布天然是离散的,拆开标注有利于模型学习"破损是局部性病变"这一特征,而不是把所有破损糊成一个大团。

下面是一个典型的Labelme标注JSON结构示例:

{ "version": "4.5.6", "flags": {}, "shapes": [ { "label": "damage", "points": [ [128.5, 260.3], [135.2, 264.1], [142.8, 262.7] ], "group_id": null, "shape_type": "polygon", "flags": {} } ], "imagePath": "dunhuang_00421.jpg", "imageData": null, "imageHeight": 1024, "imageWidth": 1024 }

这个JSON结构是Labelme的标准格式,训练时我们需要解析shapes里的points坐标,在多边形内部填充为1,外部为0,生成掩码图。这就是"分割数据集"和"检测数据集"的本质区别——标签不是框,而是精确的边缘坐标集合。

2.3 质量审核:人工复查是数据生产中最耗时也最必要的环节

数据标注完成后,我做了两轮审核。第一轮是完整性检查:每张图像是否都对应正确数量的JSON文件,多边形是否闭合,类别标签是否统一为"damage"。这类问题可以写脚本自动检查,十万火急的事其实就这么简单。

第二轮是语义审查:随机抽检5%的样本,由经验丰富的标注员复查标注区域是否符合规范。这里有一个命中率很高的经验:如果一张图里标注的多边形个数为0,很可能不是"没有破损",而是标注员漏标了。壁画中大面积背景往往会让标注员产生视觉疲劳,所以零标注样本必须人工复核。

还有一个细节容易被忽略:文件的目录结构。Labelme格式的数据集没有强制的目录结构,但如果组织混乱,后续处理脚本会非常痛苦。我的组织方式如下:

dataset/ ├── images/ │ ├── dunhuang_00001.jpg │ ├── dunhuang_00002.jpg │ └── ... ├── labels/ │ ├── dunhuang_00001.json │ ├── dunhuang_00002.json │ └── ... └── class_names.txt

images和labels文件名一一对应,class_names.txt里写好类别名。这种结构在后续写数据加载脚本时省了大量时间。

3. 数据集体检:14367个标注多边形背后的统计学意义

3.1 单类别设计的核心思路

很多人看到"1类别"会质疑:壁画破损分这么多种类,只标一个类别是不是太粗糙了?这个质疑有道理,但我做这个数据集时有明确的现实考量。

第一,目前标注工作的核心矛盾是"有没有破损",而不是"哪种破损"。破损形态的精细分类,需要文物修复专家深度参与,标注成本极高,且需要专门的病理学知识。在数据基础尚未牢固时过度细分,只会让每一类的样本量都不够,模型什么都学不好。

第二,单类别分割本质上是异常检测场景。模型需要输出一张"破损概率图",这在实际文物保护工作中已经足够支撑许多应用——比如区域破损率统计、修复优先级评估、病害扩散趋势追踪。这些应用不依赖破损的具体类型,只需要准确的区域定位。

第三,从工程实践看,单类别分割的训练稳定性远高于多类别分割。类别间不平衡是分割任务中最头疼的问题之一,做单类别时可完全规避,把精力集中在"区域定位精度"上。后续如果确实需要细分类别,完全可以在单类别输出的基础上引入第二级分类器,这是一个可扩展的架构。

3.2 统计分析与均衡性

数据集完成标注后,我做了一次全面统计分析,这是建模前必须做的事,也是避免日后被自己数据坑死的关键一步。

  • 图像分辨率分布:大多数图像集中在1024x1024附近,少量高清图为2048x2048,这符合壁画数字化扫描的常见规格。
  • 单图标注多边形数量:平均每张图有2.3个多边形,但方差很大。有些图只有1个多边形且面积很小,有些图有几十个多边形覆盖了大半张图。这种极端不平衡在训练时需要特别注意,否则模型会偏向学习"大面积破损"而忽略"小面积裂隙"。
  • 破损区域面积占比:大多数图像的破损面积占比在5%-30%之间,符合壁画整体保存状况的一般规律——完全破损成废墟的壁画通常不具备数字化和修复价值。

做一个覆盖率分析很值得:计算所有标注多边形的总面积占整个数据集图像总面积的比例,这个值大约是8.7%。这意味着训练一个语义分割模型时,正样本(破损)在像素级别只占不到十分之一。前背景极度不平衡,这是分割任务的头号敌人,后面需要靠损失函数设计和数据增强来兜底。

表格如下整理了数据集的关键统计量:

统计项数值/描述
图像总数14210张
类别数1(damage)
标注多边形总数约33000个
平均单图多边形数约2.3个
破损像素占比约8.7%
标注格式Labelme JSON(polygon)

3.3 掩码生成与格式转换细节

Labelme原生的JSON文件不能直接送入深度学习框架,需要先转换成掩码图。这一步网上有很多现成脚本,但自己动手时有几个细节想提醒。

坐标尺度问题:Labelme记录的坐标是相对于原始图像尺寸的像素值。如果你的训练流程里做了图像缩放,那么掩码也必须同步缩放,否则坐标会对不上。我实际使用的是全尺寸数据集,即图像和掩码都是1024x1024(或原图尺寸),缩放交给数据加载阶段的resize操作统一处理,这样能减少一次插值误差的引入。

多边形填充与抗锯齿问题:用OpenCV的polylines和fillPoly函数填充多边形时,默认是整数坐标的硬填充,边缘会出现锯齿。分割任务中对边缘像素的要求不像目标检测那么严格,但如果做精细评估,建议在掩码生成时做轻微高斯平滑,让边缘过渡更自然,这样模型输出的概率图也更容易收敛。

去除极小多边形:我在清洗阶段发现有一些标注多边形的面积只有几十个像素,这些往往不是真实的破损区域,而是标注过程中鼠标误操作产生的残影。我写了一个过滤脚本,删除面积低于总面积0.01%的多边形。这一操作大约去掉了总标注量的2%,但对训练稳定性帮助显著。

4. 从标注走向模型:基于14210张数据训练分割网络的实战记录

4.1 数据划分的策略

14210张图不能简单按比例随机切分成训练集和测试集,壁画有一个显著特点:同一窟区、同一壁面的图像在色调和纹理上高度相似。如果随机切分,训练集和验证集可能出现大量"近亲"图像,模型在验证集上的得分虚高,实战部署时立刻露馅。

我按图像来源进行划分:来自同一批数字化采集任务的图像归入同一组,然后把整组按比例分配。这叫做"group split",能更真实地反映模型遇到没见过的采集批次时的性能。

最终切分比例:训练集占80%(约11368张),验证集占10%(约1421张),测试集占10%(约1421张)。

4.2 模型选型与Loss函数设计

单类别分割的模型选型,我对比了U-Net、DeepLabV3+和SegFormer,最终选定了DeepLabV3+作为baseline,ResNet50为backbone。原因很实在:

  • 壁画破损边缘的上下文信息很重要——一条裂缝往往被周围的颜料脱落区域"提示",DeepLabV3+的空洞空间金字塔池化模块(ASPP)能有效扩大感受野,让模型关注到这种上下文关联。
  • 相对于U-Net的对称编码-解码结构,DeepLabV3+在相同精度下训练速度更快,对于14210张规模的数据集,迭代实验的效率差异是肉眼可见的。
  • SegFormer效果好,但由于壁画图像结构复杂且目标(破损区域)高度非规则,它对数据量的需求更大,在当时的数据规模下表现并不显著优于DeepLabV3+。

损失函数方面,测试了几种组合:

Loss方案验证集mIoU备注
单纯BCE Loss0.734前景占比太低,偏向背景
Dice Loss0.761改善了前景召回,但边缘较粗糙
BCE + Dice(1:1)0.783平衡较好
Focal Loss + BCE0.771小目标有所改善,但总体不如Dice

最终采用BCE Loss与Dice Loss加权求和的方式,权重比设为0.5:0.5。这个方案对前背景不平衡的问题解决得最彻底,而且Dice Loss天然关注区域重叠度,跟分割任务的评估指标高度一致。

4.3 训练参数与数据增强策略

训练过程中最值得说的还是数据增强。壁画破损检测很容易遇到的问题是:模型把"某一色调的纹理异常"当成"破损",而没真正学会破损的结构特征。为了对抗这个倾向,我做了一系列针对性增强:

  • 色彩抖动:在HSV空间随机调整饱和度、亮度和色调。这能强迫模型从结构上识别破损,而不是依赖颜色线索。
  • 随机旋转与翻转:壁画破损的方向性特征不强,旋转和翻转是安全增强,也能大幅提升样本多样性。
  • 弹性形变:模拟壁画表面因支撑体变形导致的图像畸变,这个增强对提升模型的鲁棒性很有帮助。
  • CutMix:将两张图的破损区域随机拼贴到另一张图上,模拟真实场景中多种破损形态混合出现的情况。

训练超参数如下:

learning_rate = 1e-4 batch_size = 8 epochs = 60 optimizer = AdamW scheduler = CosineAnnealingLR(T_max=60)

实际训练在单张GPU上进行,骨干网络使用在ImageNet上预训练的权重。60轮训练后,测试集上的核心指标如下:

指标数值
mIoU0.785
Dice系数0.869
像素准确率97.4%
推理速度(1024x1024)约48ms/张

4.4 模型预测结果可视化

拿测试集里的典型样本看,效果还是很直观的:一张壁画的右上角有一块酥碱区域,颜色泛白、质地疏松,模型输出的掩码基本上把这块区域完整地罩住了,边缘虽然比人工标注略粗糙,但主体覆盖准确。另一张图里的裂隙横穿人物面部,模型能识别出来算是一个亮点——因为模型的训练数据里,人物面部纹理复杂,裂隙与颜料的边界极难区分,能正确分割说明增强策略有效。

这套pipeline从数据处理、模型训练到推理部署大概花了两周时间,最耗时间的反而不是训练,而是数据格式转换和调试数据加载逻辑。如果谁想快速复现,最稳妥的建议是先把Labelme的JSON解析逻辑写对,然后找一个成熟的DeepLabV3+开源实现,把数据和增强策略换上。

5. 复盘与避坑:数据集的边界、误差与二次改造建议

5.1 标注噪声分析:人工标注到底有多"准"

数据集的标注质量直接决定模型上限,但这个"质量"不是绝对的。我做了一个有意思的实验:让两位标注员分别独立标注同一批100张图,然后计算两人标注掩码之间的Dice系数。

结果是多少?平均只有0.83。

这意味着什么?两位受过同样规范的标注员,对同一张壁画破损区域的理解差异竟然达到17%。这些差异集中出现在破损边界的过渡地带,以及大面积破损中"中间状态"的区域——轻微的颜料起甲但还没有脱落,算不算破损?这个灰色地带在不同标注员之间产生了明显分歧。

我应该早点意识到这个问题,因为模型在测试集上Dice系数的理论天花板,不是1.0,而是标注者之间的共识度,大约是0.83-0.9。模型测试Dice达到0.869,说明它已经接近甚至达到了"人工共识上限"。这不是模型不行,而是数据本身存在标注噪声,判断性能时要带着这个认知去看,否则会陷入无意义的内耗。

5.2 容易被忽视的三个工程坑

坑一:Labelme坐标的浮点数精度。Labelme导出的坐标是浮点数,而图像像素是整数。直接取整会导致掩码和图像之间出现0.5像素的偏移。这个偏移在单张图上可忽略,但在模型训练中反复上下采样后会累积成边缘漂移。解决方法是生成掩码时统一使用round而不是int强制截断,并在掩码生成后做一次与原始图像的对齐检查。

坑二:数据增强必须作用于掩码。如果训练时对图像做了旋转或缩放,掩码必须同步做相同的几何变换。这个很多人会踩坑——只对图像增强、掩码保持原样,最终模型会出现严重的空间错位混淆。我使用的是Albumentations库,它支持图像和掩码联动变换,推荐大家直接用。

坑三:类别命名的统一性。Labelme标注时,类别名如果有人在文件里写成"damage",有人写成"Damage",哪怕只是大小写不同,后续训练脚本里会生成两个不同的类别ID,掩码会错乱。我在项目里加了一道强制校验,所有JSON的label字段必须严格等于"damage",不合规的重新命名,绝不留情。

5.3 关于单类别数据集的扩展与改造

如果你拿到这个数据集,做二次开发有几个可行的方向:

第一,增加背景类别。当前数据集只有"破损"一个正类,背景是隐式的。如果做了多类别扩展,建议将背景类显式写入类别清单中,这会改变损失函数的计算方式,也能更方便地计算多类mIoU。

第二,增补负样本。现实场景中不是所有壁画图像都有破损,模型目前只在有破损的图像上训练,部署到全健康壁画上时可能会有误报。建议在应用时额外采集一批无破损的壁画图像作为负样本,并加入一个"无损坏"类别,或者专门校准模型的置信度阈值。

第三,半监督扩展。14210张标注图已经不少了,但壁画种类繁多,不同朝代、不同窟区的壁画风格差异巨大。如果遇到模型在新窟区效果不佳的场景,建议用伪标签方案:先在现有数据集上训练一个初始模型,对未标注的新图像做预测,用高置信度区域的预测结果作为伪标签,然后交给标注员只修正错误区域,效率远超从零标注。

6. 标注之外的思考:数据集的持续迭代与价值释放

数据集的构建不是一锤子买卖,它应该是活的。我在完成这个14210张版本后,陆续收到了不少反馈,其中一个高频请求是:能不能把不同的破损类型分开标注?像酥碱、裂隙、起甲、霉变这类病害的病理特征和修复策略完全不同,文物专家希望得到更细粒度的信息。

这确实是一个值得推进的方向。我的建议是:不要推翻现有数据集重标,而是在当前"damage"输出的基础上叠加一个病害分类分支。具体做法是,先用现有数据集训练分割模型,得到破损区域掩码,再对每个掩码区域做病害类型分类。这个方案充分利用了现有标注的辨识能力,同时把细粒度分类的任务交给另一个模型,工程上风险更小。

另一个被反复问到的问题是:Labelme格式能不能直接转成COCO或COCO的衍生格式用于目标检测?可以的。Labelme的shapes里除了polygon还支持rectangle,如果要转成检测框,用多边形的外接矩形即可。但我的经验是,分割模型在破损识别任务上的实际效果,明显好于检测模型。原因在于破损区域形状高度不规则,包围盒里混入大量背景,检测框架天然吃亏。所以如果目标不是"找到破损在哪几张图上",而是"找到破损在哪个像素",都不建议降级成检测任务。

数据标注这个环节,我至今仍认为是整个项目中最值得反复打磨的部分。起初我拿到一堆壁画图像时,也想直接找现成的分割数据集开训练,但很快就发现,数据背后的材质差异、光线差异、病害形态差异,不是任何公开数据集能覆盖的。只有亲手做了一遍标注,才会真正理解模型的输出为什么会在某些边界上犹豫——因为人工标注在那里也犹豫。

这个数据集的创建过程,把壁画破损识别从"看起来很美好"变成了"可训练、可评估、可部署"的工程实践。也希望这套从图像清洗、规范化标注、统计分析到模型训练的方法论,能帮你在自己的领域少走一段弯路。毕竟数据集的核心价值,不只在于那14210张图,更在于它承载的标注规则、质量标准和工程取舍。

相关新闻

Spring Boot聊天系统可靠性设计:WebSocket+STOMP消息不丢方案

Spring Boot聊天系统可靠性设计:WebSocket+STOMP消息不丢方案

简介:这是一套基于SpringBoot的毕业设计级在线聊天系统源码,面向计算机类专业学生(如计科、人工智能、通信工程等)开展课程设计、期末大作业及毕设开发,也适合Java后端与移动端初学者进阶实践。系统采用前后端分离架构…

2026/10/20 19:51:48 阅读更多 →
用Python卷积神经网络实现几何形状识别:毕设实战全解析

用Python卷积神经网络实现几何形状识别:毕设实战全解析

如果把毕业论文当成一道需要反复打磨的作品,用Python做卷积神经网络(CNN)去识别几何形状,是我目前见过性价比最高、也最适合把深度学习理论落到代码的毕设方向之一。图形分类不像人脸识别、语义分割那么复杂,但麻雀虽小…

2026/10/20 19:50:46 阅读更多 →
日志系统的双刃剑:如何设计一个生产环境下可动态开启且不影响实时性的 printf 重定向方案

日志系统的双刃剑:如何设计一个生产环境下可动态开启且不影响实时性的 printf 重定向方案

摘要: 日志是嵌入式调试的刚需,但日志系统设计不当会直接破坏实时性——这一点在第 2 篇《你的 printf 正在拖垮实时性》里已经用真实事故验证过。然而那篇只给出了"环形缓冲区 DMA"的骨架,生产环境的日志系统还需要解决更多问题&…

2026/10/20 19:50:46 阅读更多 →

最新新闻

小橘子V4.790:本地可调试塔防策略模拟器

小橘子V4.790:本地可调试塔防策略模拟器

简介:本资源是《向僵尸开炮》游戏的自动化对局辅助工具——小橘子V4.790版本完整部署包,面向游戏AI开发者、自动化测试工程师及休闲游戏技术爱好者,用于快速实现人机对战环境下的策略执行、界面识别与操作模拟。压缩包共741个文件&#xff0c…

2026/10/20 20:42:25 阅读更多 →
Win11访问Win7共享报错0x80070035?SMB协议与网络配置修复指南

Win11访问Win7共享报错0x80070035?SMB协议与网络配置修复指南

1. 0x80070035 到底是什么:先搞清楚报错在哪里先把结论说在前面:这个错误码的意思是“找不到网络路径”。很多朋友升到 Win11 之后,双击网络里那台老 Win7 电脑的共享文件夹,直接弹一个红叉,错误码 0x80070035&#xf…

2026/10/20 20:42:24 阅读更多 →
LLM-as-Judge实战:大模型互评与自我批评提升生成质量

LLM-as-Judge实战:大模型互评与自我批评提升生成质量

做AI应用开发这段时间,我越来越频繁地遇到一个尴尬场景:模型生成的内容没人帮忙把关。人工一条条看,慢且贵,尤其是在批量评估几百条结果的时候,整个人都会被拖垮;用BLEU、ROUGE这类传统指标,又完…

2026/10/20 20:42:24 阅读更多 →
Win11访问Win7共享报错0x80070035?一文搞定SMB网络路径问题

Win11访问Win7共享报错0x80070035?一文搞定SMB网络路径问题

这个问题我前前后后帮人处理过不下二十次,多数是家里有老电脑、老 NAS 或者公司还有几台 Win7 机器没淘汰的场景。症状很统一:Win11 地址栏敲\\192.168.x.x,回车,等一两秒,弹窗直接甩一句“Windows 无法访问”&#xf…

2026/10/20 20:42:24 阅读更多 →
手写Master-Worker并发框架:线程安全设计与实战避坑

手写Master-Worker并发框架:线程安全设计与实战避坑

1. 从一次线上事故说起:为什么要自己造一个Master-Worker轮子去年帮一个做数据清洗的朋友排查问题,他们的服务在高峰期会偶发数据错乱——同一批任务被重复执行了两次,日志里却找不到任何异常。最后定位到根因:他们用线程池提交任…

2026/10/20 20:42:24 阅读更多 →
GNU M4 1.4.19 源码编译与 Autotools 构建实战指南

GNU M4 1.4.19 源码编译与 Autotools 构建实战指南

简介:m4-1.4.19.tar.gz 是 Linux 环境下经典宏处理器 m4 的官方源码发布包,面向需要理解 autoconf 构建机制、编写配置脚本或搭建轻量模板系统的开发者与运维人员。压缩包共 1670 个文件,约 2.82MB,以 558 个 C 源文件、268 个头文…

2026/10/20 20:41:20 阅读更多 →

日新闻

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/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →