據(jù)增強(qiáng)訓(xùn)練之道)
Oemer雙UNet語義分割模型揭秘CvcMuscima到DeepScores的數(shù)據(jù)增強(qiáng)訓(xùn)練之道【免費下載鏈接】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 是一個端到端的光學(xué)音樂識別OMR系統(tǒng)能把手機(jī)隨手拍的樂譜照片轉(zhuǎn)寫成可編輯的 MusicXML并進(jìn)一步轉(zhuǎn)換為 MIDI 播放。它的核心由雙 UNet 語義分割模型驅(qū)動一個在 CvcMuscima-Distortions 數(shù)據(jù)集上訓(xùn)練負(fù)責(zé)分離五線譜線與樂譜符號另一個在 DeepScores-extended 數(shù)據(jù)集上訓(xùn)練負(fù)責(zé)識別符頭、譜號、休止符等細(xì)粒度符號。本文帶你揭秘這兩個 UNet 模型的結(jié)構(gòu)分工以及從數(shù)據(jù)增強(qiáng)到訓(xùn)練回調(diào)的完整訓(xùn)練之道。為什么要用兩個 UNetOMR 流水線中的模型分工 把一張拍照樂譜變成 MIDI第一步是看懂圖。Oemer 的推理入口 oemer/ete.py 中兩個語義分割模型各領(lǐng)一段模型一unet_big輸出 3 通道——背景、五線譜線、其他所有符號。它是后續(xù)提取五線譜、節(jié)奏符杠/符尾、小節(jié)線的基礎(chǔ)。模型二seg_net輸出 4 通道——背景、符干/休止符/小節(jié)線、符頭、譜號/升降記號。通道定義見 oemer/constant_min.py 與 oemer/dense_dataset_definitions.py。左圖為原始樂譜照片如《Tabi》鋼琴譜右圖即 Oemer 轉(zhuǎn)寫出的 MusicXML 渲染結(jié)果而輸入就是一張普通的手機(jī)拍攝樂譜無需專業(yè)掃描儀雙模型輸出對比一張照片兩種語義分割 同樣是《Tabi》樂譜兩個 UNet 給出的著色圖截然不同模型結(jié)構(gòu)都定義在 oemer/models/unet.py 中但各有側(cè)重對比項模型一語義分割 UNet模型二U-Net代碼位置unet.py#L60-L131unet.py#L165-L234輸入尺寸256×256288×288訓(xùn)練數(shù)據(jù)集CvcMuscima-DistortionsDeepScores-extended輸出通道3背景/譜線/符號4背景/符干·休止/符頭/譜號·調(diào)號結(jié)構(gòu)亮點編碼器內(nèi)嵌 ASPP 空洞空間金字塔池化多尺度感受野瓶頸處并行 4 個空洞率1/2/6/12可分離卷積Checkpointoemer/checkpoints/unet_big/arch.jsonoemer/checkpoints/seg_net/arch.json兩個數(shù)據(jù)集各司其職正是關(guān)鍵CvcMuscima 專門提供五線譜線與符號的二值分割標(biāo)簽適合粗粒度分離DeepScores 提供逐符號的彩色實例級標(biāo)注每種符號一種顏色適合細(xì)粒度分類。數(shù)據(jù)增強(qiáng)之道6 招模擬真實世界樂譜 真實樂譜照片背景泛黃、光照不均、有噪點模糊。Oemer 在 oemer/train.py#L55-L113 的preprocess_image中對每張訓(xùn)練圖疊加了 6 種隨機(jī)增強(qiáng)隨機(jī)背景換色用隨機(jī) HSV色相 19~60、飽和度 0~15%、明度 70~100%替換白色背景模擬紙張泛黃/偏色顏色抖動亮度 0.7~1.3、飽和度 0.5~1.2、對比度 0.5~1.5模擬光照差異高斯模糊半徑 0~2模擬對焦不準(zhǔn)像素打亂Pixel Shuffle按 0~0.2 的因子擾動像素模擬傳感器噪聲JPEG 編碼壓縮質(zhì)量因子隨機(jī) 0~100模擬低質(zhì)量手機(jī)照片像素化Pixelization比例 0.3~1.0模擬分辨率不足。在 oemer/train.py 的數(shù)據(jù)加載器中還有兩項視角級增強(qiáng)隨機(jī)縮放以 0.2~1.2 倍隨機(jī) resize讓模型對不同打印密度免疫隨機(jī)透視變換sigma70對圖像與分割掩碼施加同一隨機(jī)種子的透視變形——這正是模擬手機(jī)斜拍紙張的關(guān)鍵也是 Oemer 能處理歪拍照片的根基。 增強(qiáng)只改變外觀不改變符號內(nèi)容因此標(biāo)簽掩碼可以同步變換無需重新標(biāo)注。UNet 分割模型的訓(xùn)練之道切窗采樣到 Focal 損失 ??訓(xùn)練腳本為 oemer/train.py由根目錄的 train.py 調(diào)用python train.py segnet訓(xùn)練模型二python train.py unet訓(xùn)練模型一。核心要點① 滑窗采樣代替整圖訓(xùn)練。整頁樂譜動輒數(shù)千像素?zé)o法整張喂給 UNet。兩個DataLoader都在后臺用 4 個多進(jìn)程預(yù)先增強(qiáng)圖像再從大圖中以 256×256模型一或 288×288模型二的窗口隨機(jī)步進(jìn)截取小樣本源源不斷生成(feat, label)。② 標(biāo)簽的智能構(gòu)建。模型二的標(biāo)簽由 oemer/build_label.py 生成把 DeepScores 彩色標(biāo)注按顏色映射到 4 個通道并特意把空心二分/全音符填充為實心——這樣后處理的形態(tài)學(xué)腐蝕才不會把空心符頭誤刪。③ 學(xué)習(xí)率與損失。優(yōu)化器為 Adam配WarmUpLearningRate調(diào)度1000 步線性升溫 周期衰減損失函數(shù)選用Sigmoid Focal Cross Entropy專治背景占 95% 以上像素的類別不平衡另有備用的 Focal-Tversky 損失定義在 oemer/train.py#L409-L417。④ 早停與存檔。EarlyStopping按驗證精度 patience8 早停ModelCheckpoint保存最優(yōu)權(quán)重最終產(chǎn)物是arch.jsonweights.h5即倉庫中 checkpoints 目錄里的結(jié)構(gòu)。訓(xùn)練參數(shù)速查表 參數(shù)取值說明epochs / steps15 / 1500每輪 1500 步batch_size8學(xué)習(xí)率5e-4WarmUp 起步見 train.py#L377-L406驗證集占比10%隨機(jī)切分早停 patience8監(jiān)控 val_accuracy損失函數(shù)SigmoidFocalCrossEntropy抗類別不平衡從 Checkpoint 到 MusicXML雙模型如何協(xié)同 推理時Oemer 先把輸入圖縮放到 3M~4.35M 像素再以 128 像素步進(jìn)、重疊滑窗的方式喂給兩個 UNet重疊區(qū)域的預(yù)測取平均以消除拼縫痕跡邏輯見 oemer/train.py#L517-L575 的inference與 oemer/inference.py。兩路分割圖隨后進(jìn)入規(guī)則引擎先提取五線譜得到unit_size再定位符頭、分組、識別小節(jié)線對譜號、休止符這類同類多形態(tài)符號再由 SVM 分類器oemer/classifier.py模型存于 oemer/sklearn_models/細(xì)分出高音譜號/降號/八分休止等具體類型。最終事件流被編碼為 MusicXML 文檔——整條鏈路由 main.py 的oemer 圖片路徑命令一鍵驅(qū)動。總結(jié) ?Oemer 用兩個職責(zé)分離的 UNet粗粒度譜線 vs 符號CvcMuscima 訓(xùn)練 細(xì)粒度符號四分類DeepScores 訓(xùn)練數(shù)據(jù)增強(qiáng)是魯棒性來源換背景色、抖動、模糊、噪聲、壓縮、像素化 同步變換的隨機(jī)縮放與透視讓模型敢面對歪斜、泛黃、低質(zhì)的手機(jī)照片工程細(xì)節(jié)同樣重要滑窗多進(jìn)程采樣、空心符頭填充、Focal 損失與早停缺一不可。讀懂這條CvcMuscima → 數(shù)據(jù)增強(qiáng) → DeepScores的訓(xùn)練之道你就能理解 OMR 系統(tǒng)如何讓 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創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考