第二届“马栏山”杯国际音视频算法大赛音乐节拍检测题参赛总结及分享(Rank7)
参加第二届“马栏山”杯的音乐节拍检测赛,最后拿了第7名。赛后一定要做好总结,细致的梳理总结才能把有用的知识沉淀下来。
我这次参赛非常匆忙,赛程中期我才进入,总共用了三个星期时间,由于时间紧,音乐计算领域的很多问题实际上我也没有吃透,好在我直接找到了两篇新上的论文和开源代码,和这个题非常一致,改吧改吧我就直接用上了,没想到最后挤进了前排,运气不错。
比赛链接:https://challenge.ai.mgtv.com/contest/detail/10
提到的两篇文献:
[1]Drum-Aware Ensemble Architecture for Improved Joint Musical Beat and Downbeat Tracking
[2]Source Separation-based Data Augmentation for Improved Joint Beat and Downbeat Tracking
文章目录
- 一、赛题简介
- 二、算法简介
- 三、训练方法
- 四、效果分析
- 五、总结与思考
一、赛题简介
乐曲中强弱有规律的交替叫节拍,我们通常将节拍形容为一段音乐的脉搏,节拍检测是计算音乐学的基础工作,在节拍检测的基础上可以玩出很多新花样。本题要求对给定的音乐片段检测出其中的拍子(beat)和强拍(downbeat)的起始时间点位置。
赛题提供的数据集一是网上公开的GTZAN数据集:http://marsyas.info/downloads/datasets.html,这个数据集中共有1000首音乐片段,每个片段30s左右。二是芒果TV自制的一个数据集,训练集中有100首,测试集A榜50首,B榜50首。训练集都给出了beat和downbeat时间点的标注。比赛不允许使用其他外部数据集和预训练模型。
二、算法简介
目前做音乐节拍检测主要都是用神经网络算法,本次参赛据说也有队伍使用机器学习算法,成绩和前排还是有一些差距。我使用的代码是在文献[2]的基础上修改的,也是用神经网络,这个算法可按以下几个环节来理解:
(1)网络的输入。这个算法的输入不是原始音频数据,是音频数据的频谱以及频谱的一阶差分,因此需要先进行处理。处理使用madmom包,方法参考原开源代码即可。处理后得到的特征是一个二维数组,横轴表示每0.01s间隔的时间,比如30s长的音乐正好生成3000长的特征,纵轴表示各种频谱特征,我共使用了322维。由于如下面(5)部分所说的,网络是采用声源分离的思路把原声又分离出了鼓声分量和无鼓分量,所以还要先把鼓声分量和无鼓分量也分别用madmom包处理成频谱特征输入网络,这两个输入用来和网络的OU子网络的输出计算损失函数以训练OU子网络。所以网络的输入总共又三个,原声的特征,鼓声分量的特征和无鼓分量的特征。
(2)标签。标签就是把beat和downbeat嵌入到0.01s间隔的一维数组中,比如30s的音乐也对应3000长的标签数组,其中有beat的时间点标为1,有downbeat的点标为2,什么也没有的标为0。当然0是很多的,由于beat和downbeat只是一个点位,它们是稀疏的,通常0,1,2的数量比大约为200:3:1,所以在后面训练的时候给CE损失加上了权重1:67:200。
(3)输出。网络的输出是一个和标签等长的三列时间序列数组,分别表示无beat,beat,和downbeat,经sigmoid激活后取值在0,1范围内。
(4)后处理。网络输出的这个激活值还不能直接得出哪里是beat和downbeat,还需要后面再用一个HMM模块进行后处理。这里直接使用了madmom包自带的HMM模块,没有自己写。
(5)网络结构。我把论文中的图贴出来:
考虑到有鼓点的音乐节拍很容易检测,而没有鼓点的音乐则不易检测,论文中的方法是把音乐先进行音轨分离,把原音乐分离出鼓点声部分和无鼓部分,这样可以训练网络在有鼓点和无鼓点时各应该怎么检测节拍。音轨分离使用的工具是Spleeter,Spleeter是一个效果非常不错的音乐音轨分离开源代码,有2音轨,4音轨,5音轨这三种模式的预训练权重可供下载。算法中使用Spleeter的4音轨模式,把音乐分离成drums, bass, other, vocals四个音轨,然后再把bass, other, vocals这三个音轨合并成一个音轨叫做nodrum,这样就得到了drum和nodrum两个音轨。由于使用spleeter分离然后再生成特征的方法非常麻烦,在推理阶段尤其比较耗时,所以论文中还提供了一种源分离的子网络,用来学习spleeter的分离结果,并直接生成有鼓和无鼓的频谱特征,这个子网络等于把spleeter功能转录了一下,然后又把spleeter和madmom两个过程合在一起了。
然后再把原来的音乐(即图中的mixture)以及drum和nodrum这三种数据分别提取特征,然后再分别送入三个节拍检测器Drum Beat tracker, Mixture Beat tracker, NoDrum Beat tracker分别处理,节拍检测器就简单使用了LSTM加一个全链接层,没有使用更复杂的网络结构。三个节拍检测器得到的结果以及全连接层前面的中间特征都合并在一起,作为特征再输入给第四个节拍检测器Fuser Beat tracker做融合处理,最后得到的结果再输出给HMM。训练时四个检测器的输出都同时和标签计算损失,接受标签的监督进行同步优化,但推理时使用的是效果最好的Fuser检测器的输出。
总结一下,网络首先包含两个声源分离子网络OU,两个网络同结构不共享参数,一个网络DrumOU用来将输入的特征分离成仅鼓点分量的特征x_drum,另一个网络BeatOU将输入特征分离成不包含鼓点分量的特征x_nodrum;网络然后包含了四个Beat和DownBeat联合检测子网络,四个网络同结构不共享参数,前三个网络分别对drum, mixture和nodrum进行处理,最后一个网络融合前三个网络的结果。
三、训练方法
1 数据增强
主要是对声音的鼓声部分的强弱进行调整,增加了鼓声弱5dB,弱10dB和无鼓声这三种情况。我也尝试了多种其他的数据增强方式,没有发现别的有效的。
2 训练步骤
Step1: 先固定网络四个tracker的参赛,仅训练两个OU子网络;
Step2: 再固定两个OU子网络,仅在GTZAN数据集上训练四个treaker网络,在芒果TV数据集上验证;
Step3: 在Step2训练充分后,训练集种加入芒果TV数据集,训练少许步骤。(此时没有独立验证集了,无法准确评估训练是否过拟合,所以不能训练太多。)
3 HMM调参
使用madmom包中的madmom.features.downbeats.DBNDownBeatTrackingProcessor来执行HMM过程,这个函数有好几个参数,这些参数一定要调,精细调参后,分数能提升3~4个点。
四、效果分析
不知道怎么在csdn上插入音频文件,就只用画图来表示吧:
图2
图2中给出30秒长度音乐的数据,每0.01s间隔一个点,共3000个点,画一行太挤看不清楚,所以从上到下画成三行,每行表示10s长度。蓝色和黄色线是神经网络的输出激活值(即输入给HMM的数据),其中蓝色线是beat维度,黄色线是downbeat维度。下面一排黑点是标注的beat,上面一排黑点是标注的downbeat,红点是我算法计算的beat,绿点是我算法计算的downbeat。点旁边的红色和绿色数字分别表示计算点和标注点之间的时间误差,单位ms。标题上beat和downbeat后面跟的7个数值分别表示:fmeasure, pscore, cemgil, cmlc, cmlt, amlc, amlt这七种常用的节拍评估指标,也是本次比赛用的七种评分指标。下面bs是beat的平均得分,dbs是downbeat的平均得分,total是两者平均后的总分。
图2这首音乐的分析效果还是不错的,beat和downbeat都找的很准,多数曲子都如此,找的还不错。下面再给出几种比较常见的扣分情况。
图3
图4
图5
图3中beat都找对了,但是downbeat位置找错,这种情况扣分最多。图4是正好漏掉一般,图5则是多出一倍,这两种情况扣分也挺多。
五、总结与思考
本次比赛我最大的收获主要是了解了计算音乐学这个新领域,掌握了一些音乐、音频处理的工具。这次比赛也认识到了和前面大佬的巨大差距,后来也了解到冠军团队使用了TCN网络和GRU+MLP网络,其中TCN网络我以前都没听说过,我只是能快速调通一个开源,再修改修改,让我自己设计一个网络还是不行,说明我对深度学习的掌握仍很基本,不深刻,并不熟练掌握各种网络结构的性能特点和用法,仍不具备创做一种网络的能力。今后的学习仍需要在基础能力上持续提高。
赛后也有一些思考,我觉得也许可以在以下方面对算法进行改进和提高:
(1)网络的输入部分是否可以直接输入音频原数据而不再是用madmom等库处理后的频谱特征,因为网络应该可以学到直接根据raw_data处理生成特征这个环节,这样就可以做到端到端,速度会更快。
(2)对节拍的检测不用非把全部30s都计算完,因为节拍都是重复的,听一两个小节应该就可以确定节拍位置了,这就可以大大提高速度。
(3)后处理过程使用的这个madmom库的HMM总觉得不是很好,因为它不是根据本数据集训练出来的,也许未必对本数据集是最优的,应该设计一种可训练的某种网络结构来实现,不仅精度提高,也能和前两步结合,真正实现端到端和实时高速。
第二届“马栏山”杯国际音视频算法大赛音乐节拍检测题参赛总结及分享(Rank7)相关推荐
- @开发者,第二届马栏山杯国际音视频算法大赛高分攻略请查收,心动大奖等你来战!...
一秒让墙上的广告消失,保留完整墙面:户外大屏幕显示LOGO被擦除后,背景毫不违和-- 欢迎来到魔法世界-- 停!这其实并不是什么魔法,而是由弗吉尼亚理工大学提出的基于流的视频补全算法FGVC的一项应用 ...
- 千亿企业的真实业务思考,名校大厂高手同台 PK,“马栏山杯”国际音视频算法大赛来袭!...
在刚结束的计算机视觉顶级学术会议CVPR 2021上,涌现了多种优秀的计算机视觉AI算法解决方案. 其中最佳论文奖为<GIRAFFE:Representing Scenes as Composi ...
- @开发者,第二届“马栏山”杯国际音视频算法大赛高分攻略请查收,心动大奖等你来战!...
一秒让墙上的广告消失,保留完整墙面:户外大屏幕显示LOGO被擦除后,背景毫不违和-- 欢迎来到魔法世界-- 停!这其实并不是什么魔法,而是由弗吉尼亚理工大学提出的基于流的视频补全算法FGVC的一项应用 ...
- 总奖池120万!中国“马栏山”杯国际音视频算法大赛启动
由中国(长沙)马栏山视频文创产业园和芒果TV联合举办的首届"马栏山"杯国际音视频算法大赛,以搭建专业技术交流平台,遴选杰出算法人才为目的,面向全社会及高等院校.科研单位.互联网企业 ...
- @开发者,第二届“马栏山杯”国际音视频算法大赛高分攻略请查收,心动大奖等你来战!...
一秒让墙上的广告消失,保留完整墙面:户外大屏幕显示LOGO被擦除后,背景毫不违和-- 欢迎来到魔法世界-- 停!这其实并不是什么魔法,而是由弗吉尼亚理工大学提出的基于流的视频补全算法FGVC的一项应用 ...
- 第二届“马栏山”杯国际音视频算法大赛高分攻略
一秒让墙上的广告消失,保留完整墙面: 户外大屏幕显示LOGO被擦除后,背景毫不违和-- 欢迎来到魔法世界-- 停!这其实并不是什么魔法,而是由弗吉尼亚理工大学提出的基于流的视频补全算法FGVC的一项应 ...
- 首届“马栏山杯”国际音视频算法优化大赛 马栏山上绽放智能之花
9月8日下午,首届"马栏山杯"国际音视频算法优化大赛颁奖盛典暨高峰论坛在马栏山举行.该活动是2020互联网岳麓峰会的重要组成部分. 前沿课题源自业界需求 马栏山视频文创产业园聚集了 ...
- 首届“马栏山杯”国际音视频算法优化大赛颁奖盛典暨高峰论坛圆满落幕
"音画密码,神机妙算",2020互联网岳麓峰会重磅活动--首届"马栏山杯"国际音视频算法优化大赛颁奖盛典暨高峰论坛9月8日在长沙马栏山盛大举行,湖南省委常委.省 ...
- 年度最Hot,三大热点赛题,首届「马栏山」杯国际音视频算法大赛正式开赛
不久之前,一段使用人工智能修复老北京影像的视频火爆全网,引起了极大的关注.这段修复视频,让我们无须穿越,就能体验一把 100 年前的老北京生活. 在这段效果惊艳的修复视频背后,用到了多项前沿研究,如基 ...
- 从生产到理解分发,第三届“马栏山杯”算法大赛带你了解视频平台AI全流程...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 从生产到理解分发 第三届"马栏山杯"算法大赛 带你了解视频平台AI全流程 -立足现有业务,朝元宇宙出发 ...
最新文章
- flutter中的生命周期
- 「系统架构」什么是堡垒机?为什么需要堡垒机?
- 51Nod 1242 斐波那契数列的第N项
- Python ML环境搭建与学习资料推荐
- SQL SERVER视图
- Linux网络编程服务器模型选择之并发服务器(上)
- mongodb morphia
- 确认系统存储模式C语言,关于C语言中的union
- python3安装MySQLdb
- 前端地图之色斑图渲染(数据格式为.tif的栅格数据)(一)——以leaflet为例
- ftp 创建工具下载,3款能够下载的ftp 创建工具
- minecraft fabric_server 和 MCDR 安装与运行
- 元宇宙时空——元宇宙是什么
- 1078 加油站加油
- win10找回图片查看器
- AMD提出的补丁使退出延迟降低21%左右
- c# 计算圆锥的体积_用c#编写一个程序计算出球、圆柱和圆锥的表面积和体积。...
- android在代码中利用Spinner控件设置联动地区的解决办法
- 主成分回归之后预测_回归分析|笔记整理(B)——主成分回归(下),偏最小二乘回归...
- oracle数据库服务器01
热门文章
- 笔记20210518正则表达式和面向对象
- 使用ftp访问资源管理器托拽文件下载出现“当前的安全设置不允许从该位置下载文件”提示
- mysql http_put_洪永佳 - SegmentFault 思否
- 音乐与现代计算机技术,计算机音乐技术在音乐教育中的应用.doc
- python上传百度云_python通过百度云api的方式上传或下载文件
- python爬12306余票_Python 爬取12306火车票
- 定义Java中的方法及调用
- 安卓语音识别文字软件
- IDEA 中添加@author注释(live templates)
- android 自动运行 app,「定时启动」时间一到自动运行指定的 App(Android)