尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Oemer双UNet语义分割模型揭秘:CvcMuscima到DeepScores的数据增强训练之道

Oemer双UNet语义分割模型揭秘:CvcMuscima到DeepScores的数据增强训练之道 Oemer双UNet语义分割模型揭秘CvcMuscima到DeepScores的数据增强训练之道【免费下载链接】oemerEnd-to-end Optical Music Recognition (OMR) system. Transcribe phone-taken music sheet image into MusicXML, which can be edited and converted to MIDI.项目地址: https://gitcode.com/gh_mirrors/oe/oemerOemer 是一个端到端的光学音乐识别OMR系统能把手机随手拍的乐谱照片转写成可编辑的 MusicXML并进一步转换为 MIDI 播放。它的核心由双 UNet 语义分割模型驱动一个在 CvcMuscima-Distortions 数据集上训练负责分离五线谱线与乐谱符号另一个在 DeepScores-extended 数据集上训练负责识别符头、谱号、休止符等细粒度符号。本文带你揭秘这两个 UNet 模型的结构分工以及从数据增强到训练回调的完整训练之道。为什么要用两个 UNetOMR 流水线中的模型分工 把一张拍照乐谱变成 MIDI第一步是看懂图。Oemer 的推理入口 oemer/ete.py 中两个语义分割模型各领一段模型一unet_big输出 3 通道——背景、五线谱线、其他所有符号。它是后续提取五线谱、节奏符杠/符尾、小节线的基础。模型二seg_net输出 4 通道——背景、符干/休止符/小节线、符头、谱号/升降记号。通道定义见 oemer/constant_min.py 与 oemer/dense_dataset_definitions.py。左图为原始乐谱照片如《Tabi》钢琴谱右图即 Oemer 转写出的 MusicXML 渲染结果而输入就是一张普通的手机拍摄乐谱无需专业扫描仪双模型输出对比一张照片两种语义分割 同样是《Tabi》乐谱两个 UNet 给出的着色图截然不同模型结构都定义在 oemer/models/unet.py 中但各有侧重对比项模型一语义分割 UNet模型二U-Net代码位置unet.py#L60-L131unet.py#L165-L234输入尺寸256×256288×288训练数据集CvcMuscima-DistortionsDeepScores-extended输出通道3背景/谱线/符号4背景/符干·休止/符头/谱号·调号结构亮点编码器内嵌 ASPP 空洞空间金字塔池化多尺度感受野瓶颈处并行 4 个空洞率1/2/6/12可分离卷积Checkpointoemer/checkpoints/unet_big/arch.jsonoemer/checkpoints/seg_net/arch.json两个数据集各司其职正是关键CvcMuscima 专门提供五线谱线与符号的二值分割标签适合粗粒度分离DeepScores 提供逐符号的彩色实例级标注每种符号一种颜色适合细粒度分类。数据增强之道6 招模拟真实世界乐谱 真实乐谱照片背景泛黄、光照不均、有噪点模糊。Oemer 在 oemer/train.py#L55-L113 的preprocess_image中对每张训练图叠加了 6 种随机增强随机背景换色用随机 HSV色相 19~60、饱和度 0~15%、明度 70~100%替换白色背景模拟纸张泛黄/偏色颜色抖动亮度 0.7~1.3、饱和度 0.5~1.2、对比度 0.5~1.5模拟光照差异高斯模糊半径 0~2模拟对焦不准像素打乱Pixel Shuffle按 0~0.2 的因子扰动像素模拟传感器噪声JPEG 编码压缩质量因子随机 0~100模拟低质量手机照片像素化Pixelization比例 0.3~1.0模拟分辨率不足。在 oemer/train.py 的数据加载器中还有两项视角级增强随机缩放以 0.2~1.2 倍随机 resize让模型对不同打印密度免疫随机透视变换sigma70对图像与分割掩码施加同一随机种子的透视变形——这正是模拟手机斜拍纸张的关键也是 Oemer 能处理歪拍照片的根基。 增强只改变外观不改变符号内容因此标签掩码可以同步变换无需重新标注。UNet 分割模型的训练之道切窗采样到 Focal 损失 ⚙️训练脚本为 oemer/train.py由根目录的 train.py 调用python train.py segnet训练模型二python train.py unet训练模型一。核心要点① 滑窗采样代替整图训练。整页乐谱动辄数千像素无法整张喂给 UNet。两个DataLoader都在后台用 4 个多进程预先增强图像再从大图中以 256×256模型一或 288×288模型二的窗口随机步进截取小样本源源不断生成(feat, label)。② 标签的智能构建。模型二的标签由 oemer/build_label.py 生成把 DeepScores 彩色标注按颜色映射到 4 个通道并特意把空心二分/全音符填充为实心——这样后处理的形态学腐蚀才不会把空心符头误删。③ 学习率与损失。优化器为 Adam配WarmUpLearningRate调度1000 步线性升温 周期衰减损失函数选用Sigmoid Focal Cross Entropy专治背景占 95% 以上像素的类别不平衡另有备用的 Focal-Tversky 损失定义在 oemer/train.py#L409-L417。④ 早停与存档。EarlyStopping按验证精度 patience8 早停ModelCheckpoint保存最优权重最终产物是arch.jsonweights.h5即仓库中 checkpoints 目录里的结构。训练参数速查表 参数取值说明epochs / steps15 / 1500每轮 1500 步batch_size8学习率5e-4WarmUp 起步见 train.py#L377-L406验证集占比10%随机切分早停 patience8监控 val_accuracy损失函数SigmoidFocalCrossEntropy抗类别不平衡从 Checkpoint 到 MusicXML双模型如何协同 推理时Oemer 先把输入图缩放到 3M~4.35M 像素再以 128 像素步进、重叠滑窗的方式喂给两个 UNet重叠区域的预测取平均以消除拼缝痕迹逻辑见 oemer/train.py#L517-L575 的inference与 oemer/inference.py。两路分割图随后进入规则引擎先提取五线谱得到unit_size再定位符头、分组、识别小节线对谱号、休止符这类同类多形态符号再由 SVM 分类器oemer/classifier.py模型存于 oemer/sklearn_models/细分出高音谱号/降号/八分休止等具体类型。最终事件流被编码为 MusicXML 文档——整条链路由 main.py 的oemer 图片路径命令一键驱动。总结 ✅Oemer 用两个职责分离的 UNet粗粒度谱线 vs 符号CvcMuscima 训练 细粒度符号四分类DeepScores 训练数据增强是鲁棒性来源换背景色、抖动、模糊、噪声、压缩、像素化 同步变换的随机缩放与透视让模型敢面对歪斜、泛黄、低质的手机照片工程细节同样重要滑窗多进程采样、空心符头填充、Focal 损失与早停缺一不可。读懂这条CvcMuscima → 数据增强 → DeepScores的训练之道你就能理解 OMR 系统如何让 AI 真正看懂一张随手拍的乐谱。【免费下载链接】oemerEnd-to-end Optical Music Recognition (OMR) system. Transcribe phone-taken music sheet image into MusicXML, which can be edited and converted to MIDI.项目地址: https://gitcode.com/gh_mirrors/oe/oemer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表