ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Oemer的SVM符号分类器详解:谱号、升降号与休止符识别的原理

Oemer的SVM符号分类器详解:谱号、升降号与休止符识别的原理 Oemer的SVM符号分类器详解谱号、升降号与休止符识别的原理【免费下载链接】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, Optical Music Recognition系统能把手机拍摄的五线谱照片转成可编辑的 MusicXML 文件并进一步导出 MIDI。而在整条识别流水线的末端真正给符号定性的是几组轻量级 SVM 符号分类器——它们负责区分谱号、升降号sharp/flat/natural与各种休止符。这篇文章带你从零看懂这套分类器的数据准备、训练与调用原理。 SVM 符号分类器在整个 OMR 流程中的位置Oemer 的识别流程大致分为四步去歪斜dewarping把拍摄弯曲、倾斜的乐谱照片拉直双 UNet 语义分割第一个网络区分五线谱线与其他符号第二个网络把符号细分成音符头、谱号/升降号、符干/休止符等通道几何提取从分割结果中找出连通的符号区域算出每个符号的边界框SVM 符号分类器定性把每个符号的小图块丢给轻量级分类器判断它到底是高音谱号还是低音谱号、是升号还是还原号、是八分休止还是十六分休止。也就是说深度学习网络只负责把符号圈出来最终的符号类型判定交给 SVM 完成。下面是第二个分割网络的预测结果其中粉色通道就是接下来要交给分类器的谱号与升降号 四个开箱即用的符号分类模型训练好的分类器以 pickle 文件形式存放在 oemer/sklearn_models/ 目录下共 4 个分工非常清晰模型文件识别对象类别clef.model谱号高音谱号 (gclef)、低音谱号 (fclef)sfn.model升/降/还原号sharp、flat、naturalrests.model休止符粗分全休止、四分休止、八分休止rests_above8.model休止符细分八分、十六分、三十二分、六十四分休止️ 训练数据从彩色标签切出符号切片分类器的训练数据来自 DeepScores-extended 数据集的彩色标注图——每个符号类别用一种固定颜色标记。oemer/classifier.py 中的collect_data()定义了完整的类别表例如颜色 74 代表升号、10 代表高音谱号、97 代表全休止符等。采集流程可以概括为找区域用get_bbox()在彩色通道里找出所有连通区域每个区域就是一个符号切切片沿边界框外扩 10 像素把符号图块切出来数据增强随机缩放 0.6~1.3 倍 随机透视变换模拟手机拍摄时的畸变再二值化为纯黑白数量控制每个类别各采集 400 张训练样本 400 张测试样本。训练时每张切片被统一缩放到40×70 像素并展平成一个 2800 维的向量——这就是 SVM 看到的样本。 SVM 是如何工作的三步看懂展平40×70 的黑白符号图被拉直成长度为 2800 的一维特征向量核技巧SVM 使用 RBF径向基核函数把低维特征映射到高维空间在那里找到一个最大间隔的分离超平面把不同符号分开多分类三分类、四分类等场景下SVM 通过 one-vs-oneovo或 one-vs-restovr策略组合多个两两分类器得到最终结果。代码中的SVM_PARAM_GRID给出了典型超参数搜索空间C正则化强度、gamma核宽、degree与kernelrbf/poly。值得注意的是oemer/classifier.py 同时提供了一个轻量级 CNN三层小卷积 两层全连接作为备选方案——两者的输入输出接口完全一致你可以按需替换。⚡ 一行推理统一的 predict() 接口无论训练时用的是哪种模型推理入口都是 oemer/inference.py 中的predict(region, model_name)加载sklearn_models/{model_name}.model里面打包了模型本体、目标尺寸w/h和类别映射表class_map把符号图块 resize 到训练时的统一尺寸展平后调用model.predict()再用class_map把预测编号翻译回符号名如sharp。整个过程不需要 GPU单符号推理在毫秒级完成——这正是选择轻量级分类器的价值所在。 实战一区分谱号与升降号parse_clefs_keys第二个 UNet 故意把谱号和升降号混在同一个预测通道里见上图粉色区域。算法用两条几何规则先做粗分oemer/symbol_extraction.py 中的parse_clefs_keys()面积比 3.5×unit_size²且填充率 45%→ 又大又空是谱号尺寸较小 → 是升降号。其中unit_size是五线谱线间距整个系统所有尺寸判断的尺子。粗分之后真正的定性交给分类器谱号候选送clef二分类升降号候选送sfn三分类。识别结果如下图所示红色框标注谱号G_CLEF/F_CLEF紫色标注升降还原号SHARP/FLAT/NATURAL 实战二休止符的两段式识别parse_rests休止符的识别更巧妙采用了两段式层级分类从符干/休止符通道中减去音符组掩膜和谱线区域剩下的连通块就是休止符候选用unit_size做尺寸过滤高度不超过 3.5 倍线距、宽度不小于半倍线距第一段用rests.model在全休止 / 四分休止 / 八分休止三个类别中做粗分第二段如果粗分结果是八分再交给rests_above8.model细分到八分 / 十六分 / 三十二分 / 六十四分。为什么分两段因为 16 分、32 分、64 分休止符长得几乎一样只是尾巴多几道单独一组 6 分类容易混淆先粗分再细分把决策拆成两个更简单的分类问题准确率更高。识别结果如下图所示绿色框标注了 EIGHTH八分休止等类型 为什么不直接全用深度学习活已经干完了语义分割网络承担了大量工作剩下的只是 40×70 的小图块、最多 6 个类别SVM 级别的模型绰绰有余轻快模型文件只有 KB~MB 级CPU 上毫秒级推理不需要 GPU易扩展想加新符号在classifier.py的color_map里加一行、建个新文件夹重新训练即可可替换SVM 参数网格和train_tf()备选 CNN 都写在同一份代码里换模型零成本。 总结Oemer 的 SVM 符号分类器体现了大模型做分割、小模型做定性的实用主义思路训练侧oemer/classifier.py —— 数据切片、增强、SVM/CNN 训练与打包推理侧oemer/inference.py —— 统一的predict()接口调用侧oemer/symbol_extraction.py —— 谱号/升降号粗分 休止符两段式识别模型文件oemer/sklearn_models/ ——clef.model、sfn.model、rests.model、rests_above8.model整体流程入口oemer/ete.py。理解这套分类器后你也就看懂了 OMR 系统从像素到符号的最后一块拼图。【免费下载链接】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),仅供参考
返回列表