音樂中的音符檢測(cè)可被視為圖像識(shí)別問題。 在這里薄声,我將回顧一些像狗和汽車之類的圖像和音樂圖像之間的差異。 我還將描述用于從計(jì)算機(jī)視覺修改神經(jīng)網(wǎng)絡(luò)的技術(shù)题画,以生成實(shí)際上頗具可玩性的(和弦)音樂的樂譜轉(zhuǎn)錄默辨。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)已經(jīng)在計(jì)算機(jī)視覺領(lǐng)域取得了最準(zhǔn)確的結(jié)果。 在一個(gè)典型的CNN中苍息,您首先將圖像作為三維數(shù)組(寬度缩幸,高度和3個(gè)顏色通道)壹置,然后將這些數(shù)據(jù)通過幾層卷積,最大池和某種非線性傳遞表谊,如ReLU钞护。 最后一層為每個(gè)圖像類(花,貓等)輸出一個(gè)分?jǐn)?shù)爆办,表示輸入屬于該分類的可能性难咕。 反向傳播用于從一組標(biāo)記的訓(xùn)練數(shù)據(jù)(輸入和期望輸出對(duì))迭代更新卷積參數(shù)。 這個(gè)過程建立了一個(gè)復(fù)雜的功能距辆,由許多簡(jiǎn)單的功能組成余佃,主要是卷積。
來自音樂的圖像
那么跨算,音樂中的音符檢測(cè)如何與圖像識(shí)別相似呢爆土? 我們可以創(chuàng)建稱為譜圖的音頻圖像。 它們顯示頻譜或頻率內(nèi)容隨時(shí)間如何變化诸蚕。 如果您將立體聲音頻中的左右聲道視為類似于照片中的顏色通道步势,則譜圖圖像與您要輸入圖像識(shí)別神經(jīng)網(wǎng)絡(luò)的三維圖像陣列相似。
但在概念上桑腮,在譜圖圖像中找到筆記以找到照片中的物體有多類似? 音樂比較簡(jiǎn)單蛉幸,因?yàn)闆]有真正需要學(xué)習(xí)的重要紋理破讨,頻譜圖通常僅由兩種基本形狀組成:諧波,窄頻帶奕纫,跨越短頻率范圍和長(zhǎng)時(shí)間范圍提陶,以及鼓或其他寬帶特征, 它跨越了很短的時(shí)間范圍和很長(zhǎng)的頻率范圍匹层。 也不需要擔(dān)心或縮放不同距離的旋轉(zhuǎn)隙笆。 而且,我們只關(guān)心一個(gè)對(duì)象類:注釋升筏。
但是音符的幾個(gè)方面比物理對(duì)象的圖像更具挑戰(zhàn)性撑柔。 在某些基波頻率(如B?3(233 Hz))中的音符由該基頻的倍數(shù)處的諧波組成,隨著上升幅度逐漸減小您访。 因此铅忿,與大多數(shù)物體不同,音符不會(huì)局限于輸入的單個(gè)區(qū)域灵汪。
與物理圖像不同檀训,來自不同音符的諧波可能會(huì)相互干擾柑潦。 在照片中,一個(gè)物體可以被另一個(gè)物體部分隱藏峻凫,但前面的物體不會(huì)發(fā)生任何變形渗鬼。 不過,筆記確實(shí)會(huì)變形荧琼。 附近的諧波會(huì)導(dǎo)致振幅“跳動(dòng)”譬胎,您可以在上圖中的第4次和第5次諧波中看到這種振幅。 音符識(shí)別算法需要以某種方式考慮音樂的這些方面铭腕。
使用CNN
由于我們希望能夠一次檢測(cè)多個(gè)音符银择,因此可以省略通常用于分類的softmax層。 每個(gè)鋼琴鍵只有88個(gè)輸出節(jié)點(diǎn),而不是圖像類届氢。 由于一次處理整個(gè)譜圖圖像是不可行的可岂,我們需要首先檢測(cè)可能的音符開始時(shí)間,然后以這些時(shí)間為中心的頻譜圖的矩形切片(全頻率范圍和前后的固定時(shí)間量 提供一些上下文)昙啄。
注意起始點(diǎn)的特征是許多頻率在某個(gè)小的時(shí)間間隔內(nèi)幅度增加的點(diǎn)只怎。 可以訓(xùn)練單獨(dú)的神經(jīng)網(wǎng)絡(luò)來識(shí)別這些位置,但我只是在平均幅度變化中尋找局部最大值怜俐。 如果這些點(diǎn)中的某些點(diǎn)沒有任何注釋身堡,這是可以的,因?yàn)镃NN將確定具體的注釋是什么拍鲤,但是錯(cuò)過有注釋的區(qū)域是不好的贴谎。 我訓(xùn)練CNN找到哪些音符在每個(gè)區(qū)域開始并忽略偏移量。 為了創(chuàng)建可播放的樂譜季稳,我假設(shè)每個(gè)音符在下一個(gè)音符開始時(shí)結(jié)束。
創(chuàng)建頻譜圖
短時(shí)傅里葉變換(STFT)是創(chuàng)建頻譜圖的常用方法景鼠,但它有一些缺點(diǎn)。 離散傅里葉變換的頻率是線性間隔的溯香,但音符頻率與每個(gè)八度(每12個(gè)音符)一起加倍。 我使用了一些更接近恒定Q變換的東西浓恶,這是一個(gè)恒定的頻率帶寬比逐哈,每個(gè)音符有4個(gè)頻率分檔问顷。 這對(duì)于卷積很好禀梳,因?yàn)榈谝缓偷诙C波或第二和第三諧波之間的距離現(xiàn)在對(duì)于所有音符是相同的,與基頻無關(guān)肠骆。 這意味著不需要完全連接的層算途,并且CNN可以完全由卷積層和最大池化層構(gòu)成。
常數(shù)Q轉(zhuǎn)換(ConstantQtransform)與短時(shí)距傅立葉轉(zhuǎn)換一樣為重要時(shí)頻分析工具蚀腿,其中特別適用于音樂信號(hào)的分析莉钙,這個(gè)轉(zhuǎn)換產(chǎn)生的頻譜最大的特色是在頻率軸為對(duì)數(shù)標(biāo)度(logscale)而不是線性標(biāo)度(linearscale),且窗口長(zhǎng)度(windowlength)會(huì)隨著頻率而改變磁玉。
為了減少來自附近諧波的干擾效應(yīng),我在生成頻譜圖時(shí)檢測(cè)到附近諧波區(qū)域的Q因子增加喊熟。 這與增加FFT中的窗口大小類似胧奔,只是它僅適用于較窄的頻率和時(shí)間范圍。 較高的Q可以減少來自附近諧波的幅度失真龙填,但是改進(jìn)的頻率分辨率是以較差的時(shí)間分辨率為代價(jià)的,所以我們希望默認(rèn)使用較低的Q因子來保存關(guān)于幅度如何隨時(shí)間變化的信息扇商。 我還進(jìn)行了一些非線性縮放以獲得更接近振幅對(duì)數(shù)的東西宿礁。
優(yōu)化CNN
由于音符沒有局限于單個(gè)區(qū)域,CNN需要查看整個(gè)頻譜以確定是否存在任何特定的音符控汉,因此我使得許多卷積過長(zhǎng)且很瘦。 通過最后一層乎婿,每個(gè)輸出神經(jīng)元都受到每個(gè)輸入箱的影響街佑。 大多數(shù)網(wǎng)絡(luò)由成對(duì)的層組成:一個(gè)Mx1,后面跟著一個(gè)1xN沐旨。 這些長(zhǎng)卷積有助于有效連接遙遠(yuǎn)的頻譜區(qū)域磁携。
我還使用了微軟ResNet中描述的向前跳轉(zhuǎn)連接,它在2015年贏得了ILSVRC挑戰(zhàn)璃搜。它們幫助網(wǎng)絡(luò)訓(xùn)練更快鳞上,并允許輸出由輸入上的一系列增加(殘差)組成吊档。 這在音樂中很有意義,在消除非基本諧波之后鬼贱,輸出基本上等同于輸入香璃。
后期處理
為了提高準(zhǔn)確度,對(duì)CNN的輸出進(jìn)行了附加處理葡秒,濾除了一些較低置信度的音符(音符大于0.5的概率但小于某個(gè)閾值)眯牧。 這涉及單獨(dú)的音符檢測(cè)算法,該算法使用更傳統(tǒng)的方法來搜索譜圖中的峰值学少,形成連續(xù)峰值的軌道,并從最可能到最不可能的順序排列候選筆記版确。 這個(gè)輔助算法背后的主要思想是乎折,任何時(shí)刻最強(qiáng)的音軌很可能是一個(gè)低諧波:第一侵歇,第二或第三。
更新:我刪除了版本3.0.0中的后期處理酗洒,因此只使用了CNN枷遂。
訓(xùn)練與結(jié)果
為了訓(xùn)練這個(gè)網(wǎng)絡(luò),我創(chuàng)建了一個(gè)包含3000個(gè)MIDI文件的250萬(wàn)個(gè)訓(xùn)練樣例的數(shù)據(jù)集矩桂,這些樣本涵蓋了幾種不同類型的音樂痪伦。 MIDI文件包含歌曲中有關(guān)音符和樂器的信息,這使得創(chuàng)建帶標(biāo)簽的真實(shí)數(shù)據(jù)變得很容易癞蚕。 MIDI-to-WAV實(shí)用程序創(chuàng)建用于聲譜圖生成的實(shí)際音頻數(shù)據(jù)辉哥。 每個(gè)訓(xùn)練示例的數(shù)據(jù)集平均有3個(gè)音符。
在TensorFlow的980 Ti GPU上訓(xùn)練了幾天之后饲齐,CNN在評(píng)估級(jí)別(未用于訓(xùn)練的數(shù)據(jù))上的準(zhǔn)確率為99.200%捂人。 該數(shù)值來自將88個(gè)輸出中的每一個(gè)舍入為0或1,并測(cè)量與真值相匹配的所有輸出的分?jǐn)?shù)先慷。 但是,由于每個(gè)訓(xùn)練示例的數(shù)據(jù)集平均有3個(gè)音符和85個(gè)非音符福青,如果CNN從未檢測(cè)到任何音符,則使用此測(cè)量的準(zhǔn)確率為96.6%媒役。 我還測(cè)量了評(píng)估分組中樣本的百分比宪迟,其中88個(gè)舍入輸出中的每一個(gè)都是正確的。 這個(gè)數(shù)字達(dá)到了60.326%穿仪。 整個(gè)端到端算法的準(zhǔn)確性還取決于CNN輸出開始時(shí)間檢測(cè)和過濾的精確度意荤。 對(duì)于鋼琴,只有評(píng)估音符開始和音高紫谷,它達(dá)到0.8左右的F分?jǐn)?shù)捐寥。