
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),僅供參考