论文阅读HTS-AT- A HIERARCHICAL TOKEN-SEMANTIC AUDIO TRANSFORMERFOR SOUND CLASSIFICATION AND DETECTION

1. 论文介绍

关于论文的中文阅读参考这里:
https://blog.csdn.net/ggqyh/article/details/136098693;

代码:
https://github.com/RetroCirce/HTS-Audio-Transformer

2. 关于事件定位的相关提问

这里主要罗列出作者回答 关于音频事件定位的相关问题:

2.1 audio set 上的事件定位功能;

https://github.com/RetroCirce/HTS-Audio-Transformer/issues/25;

CUDA_VISIBLE_DEVICES=1,2,3,4 python main.py test
// make sure that fl_local=True in config.py
python fl_evaluate.py
// organize and gather the localization results
fl_evaluate_f1.ipynb
// Follow the notebook to produce the results

是的,这个函数是一个临时函数,你可能知道 AudioSet 去年发布了一个带有强大本地化标签的小子集。于是我把公司服务器里的数据处理了一下,以备后用,但现在却无法访问了。

I think doing the localization on AudioSet is different from DESED, there are two differences I would suggest you need to write your own code for processing it:
我认为在 AudioSet 上进行本地化与 DESED 不同,有两个区别我建议您需要编写自己的代码来处理它:

if you want to train a new HST-AT model by localization data (my HTS-AT can support it but I did not write it), you need to extract different output of HST-AT (I believe it is the last second layer feature-map output), and have a loss function to converge it. Actually this might become a new work. One thing to keep in mind is that the interpolation and resolution of the output may be different from the input localization time resolution ----- in that you need to find a way to align them.
如果你想通过本地化数据训练一个新的HST-AT模型(我的HTS-AT可以支持,但我没有写),你需要提取HST-AT的不同输出(我相信它是最后第二层特征) -map 输出),并有一个损失函数来收敛它。其实这可能会成为一部新作品。要记住的一件事是,输出的插值和分辨率可能与输入的本地化时间分辨率不同 ----- 因为您需要找到一种方法来对齐它们。

If you want to evaluate the model on localization dataset, fl_evaluate.py can be served as a code-base but you need to revise something:
如果您想在本地化数据集上评估模型,可以将 fl_evaluate.py 作为代码库,但您需要修改一些内容:

(1) AudioSet’s classes are different from DESED’s, you can see I do a map from 527 classes to 10 classes in DESED. In AudioSet, I think it is more easy since you don’t need to do the map again.
(1) AudioSet的类与DESED的类不同,你可以看到我在DESED中做了从527个类到10个类的映射。在 AudioSet 中,我认为这更容易,因为您不需要再次制作地图。

(2) Somewhere in the fl_evaluate.py: there are some fixed numbers of different thresholds for determining different classes. If you read some localization papers, you might know that different classes might have different thresholds (not all classes are 0.5) to be determined. Usually the thresholds are obtained from “inferring” on training dataset, and doing the quantization (for me, the 0.1-quantization), and then you can use these thresholds to infer on the evaluation data. So you might need to calculate the threshold of AudioSet classes by yourself.
(2) fl_evaluate.py 中的某处:有一些固定数量的不同阈值用于确定不同的类别。如果你读过一些本地化论文,你可能知道不同的类别可能有不同的阈值(并非所有类别都是 0.5)来确定。通常阈值是通过“推断”训练数据集并进行量化(对我来说,0.1 量化)获得的,然后您可以使用这些阈值来推断评估数据。所以你可能需要自己计算AudioSet类的阈值。

Please let me know if you could get more results from localization performance on HST-AT, which is one unfinished work and valuable work of HTS-AT in the future.
如果您能从HST-AT的本地化表现中获得更多成果,请告诉我,这是HTS-AT的一项未完成的工作,也是HTS-AT未来有价值的工作。

2.2 关于 定位功能的理解

https://github.com/RetroCirce/HTS-Audio-Transformer/issues/19#issuecomment-1229115607;

token semantic module 本质上就是一个CNN将频率轴进行了压缩,然后把channel的维度转换为了类别的维度,因为在这篇paper中它将其作为token semantic moduel称呼,我们也在我们的paper中用了这个说法;更进一步说,token semantic module还有一个attention的平均机制,你可能在我代码中的注释中有所看到,但是我们发现最后的效果比较类似,于是就没有使用。

关于定位的部分,你可以看到我们的model最后会输出一个527维的向量(对应audioset中的527)类,这个向量其实上是由上一层的(T,527)矩阵平均过来的,如果你只有弱标签,你就只能通过这个向量去做loss计算(因为你没有每一个时刻上的数据),如果你有强标签,你就不仅可以527维的向量去做loss计算,还可以加上用你强标签的数据转换成(T,527)的矩阵答案,和model的这个矩阵做loss。

如此一来,就可以用该model跑定位模型了

https://github.com/RetroCirce/HTS-Audio-Transformer/issues/20;

又回过头看了关于token semantic module 部分的代码,仍然有一些不明白的地方要请教你,

        B, N, C = x.shape
        SF = frames_num // (2 ** (len(self.depths) - 1)) // self.patch_stride[0]
        ST = frames_num // (2 ** (len(self.depths) - 1)) // self.patch_stride[1]
        x = x.permute(0,2,1).contiguous().reshape(B, C, SF, ST)        
        B, C, F, T = x.shape

        # group 2D CNN
        c_freq_bin = F // self.freq_ratio
        x = x.reshape(B, C, F // c_freq_bin, c_freq_bin, T)
        x = x.permute(0,1,3,2,4).contiguous().reshape(B, C, c_freq_bin, -1)

        x = self.tscam_conv(x)
        x = torch.flatten(x, 2) # B, C, T

1.group 2D 那里,前面已经将特征图分成了SF,ST 的形式了,这里的关于特征图的形状的变换的作用是什么?

2.self.tscam_conv处理后的特征图的形状变成了B,Class,T’,那么这个T’是有什么物理意义在里面吗?

3.上述操作完成了我看到程序中对x进行上采样来生成fpx作为framewise_output,并用它来做定位(确定开始结束时间?),那么这个fpx为什么来用来做定位,以及fpx(B,1024,527)的1024的物理意义是什么?

希望您能抽空解决我的疑惑

  1. 这里的变换是将这个2D的特征图变成我们想要的顺序,你可以跟着这个reshape和permute想象一下:一个音频的T和F经过这个顺序是怎么变换的,这样的变换是符合我在文章中写到的time-frequency-window顺序,这个顺序被送入tscam_conv才能保证该cnn在时间轴和频域轴上处理是是符合我们预想的顺序;

  2. 有的,从理论上讲,这个B,C,T就是一个事件随着时间变化的presence map,在T轴上,你可以得到每个时间(在某个分辨率下)帧上的事件都有哪些,这也是我们用来进行文章最后一个实验(DESED数据集)的最初结果来源。

  3. 根据2的结果,我们有一个BCT的map,但是这个T是包含一定分辨率的,它并不是1024的长度(原来的输入是1024),因此,我们需要将该T长度给拉伸到1024,假设T是64,那么我们是将它拉伸16倍,相当于T中的每一帧实际上是16帧,我们假设这16帧内他的事件就是固定的(其实你算一下就相当于是0.16秒,这个精度其实已经不错了),这里的1024就是对应原来10秒的时间,一帧是0.01秒;当然,这些其实都是可以根据你的训练和infer需求改变

  4. 至于为什么这个fpx可以用来定位,这其实是我们的一个设想,在以前基于cnn的模型中,最后几层的feature其实也是一个类似于BCT的格式,虽然我们只有弱标签答案,但是我们希望这最后一层的BCT可以代表类似于每个时间点上的事件信息,因为这个map是由模型在时间上滑动得到的结果,它确实是捕捉到了每个时间点上的事件信息。在我们的transformer模型中,我们也是这样设想的,因为transformer捕捉了每个时间点上的信息,将它变成了BCT的map。虽然我们只有弱标签答案,但是我们希望这最后一层的BCT可以代表类似于每个时间点上的事件信息

2.3 训练强标注数据

https://github.com/RetroCirce/HTS-Audio-Transformer/issues/12;

有一些帧级别的标注音频,想训练一个声音事件检测的模型,但是看你们这个只有audioset数据集的训练方法,如果换成这种帧级别的标签,该如何重新构建训练方案?;

Hi,

可以重点查看model文件中的输出,有一个是framewise_output, 还有一个是clipwise_output,这两个一个对应的是帧级别(或者一定resolution下的帧级别)的标签,一个是弱标签。如果你用强标注的数据集,你可以把帧级别输出的结果直接拿去算loss,这样就可以了。

很期待在这个上面做出的结果!

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值