2025/9/5の研究ログ
from 卒論で行うSEDの工夫を実装 ログ
2025/9/5の研究ログ
今日やること: 全体像を把握
BEATsの埋め込みを作成
従来のコードから,埋め込みの利用部分をコメントアウト
動作確認
全体の流れは2025/9/5 中間ヒアリングにある
BEATsの埋め込みを作成
CRNN.pyのBEATsに与える入力をどうやって得るかが問題
元々,BEATsによる埋め込み作成はextract_embeddingsで行っていた
そこを読めば与える必要な入力が分かる
BEATs.pyをざっくり見た感じだと,処理していないwaveformが必要
? CRNN.pyのforward()で,入力のxには何が入っている?
forward()がどこで呼ばれているか分かれば入力が分かる
xをprint()してもいいけど面倒だ
sed_...のtraining_step()を見る
studentを扱っているのはdetect()だ
code: forwawrd.py
# sed student forward
strong_preds_student, weak_preds_student = self.detect(
features,
self.sed_student,
embeddings=embeddings,
classes_mask=valid_class_mask,
)
detect()を見る
code: detect.py
def detect(self, mel_feats, model, embeddings=None, **kwargs):
if embeddings is None:
return model(self.scaler(self.take_log(mel_feats)), **kwargs)
else:
return model(
self.scaler(self.take_log(mel_feats)), embeddings=embeddings, **kwargs
)
embeddingsは多分Noneになる
model(self.scaler(self.take_log(mel_feats)), **kwargs)が問題の部分かな
scaler()を見る
どうやらconfs/pretraind.yamlの内容を参照しているようだ
code: scaler.yaml
scaler:
statistic: instance # instance or dataset-wide statistic
normtype: minmax # minmax or standard or mean normalization
dims: 1, 2 # dimensions over which normalization is applied
savepath: ./scaler.ckpt # path to scaler checkpoint
CNNなどで用いる層のことだろうか?
Github Copilotに聞いてみる
どうやら名前の通り,scaleを調整するらしい
入力特徴量について,標準化・正規化を行う
scaleを一定にする
よく見たらfeaturesはmel_featsに対応している
メルスペクトログラムのままかどうかが問題か?
waveformって生データのことなのだろうか?
featuresを見る < featuresはデータ拡張を受けた後のメルスペクトログラムみたい?
features = self.mel_spec(audio)
ここからマスクを作成
その後mixup < deriving weak labelsとある
mixupはデータ拡張に用いる手法みたい
おそらく,メルスペクトログラムを合わせて新しいデータを作成するのだろう
Github Copilotに聞いたところ,同じような説明が返ってきた
音響イベント検出のために音声波形+ラベルを一定の確率で混合し,新しいデータを作成しているようだ
ここまでを総合すると,xにはデータ拡張済みのメルスペクトログラムが与えられると考えられる
? この入力をそのままBEATsに与えて動くのだろうか?
見る必要があるのはextract_embeddings.pyのBEATs.pyのforwardを呼んでいる場所
引数として与えられているデータを見れば良い
extract_embeddings.pyのextract()が該当していそう
extract()のemb = embedding_model(feats)の通り,featsが与えられている模様
code: feats.py
for i, batch in enumerate(tqdm(dloader)):
feats, filenames = batch
if use_gpu:
feats = feats.cuda()
feats < batch < dloaderの流れ
code: dloader.py
dloader = torch.utils.data.DataLoader(
torch_dset, batch_size=batch_size, drop_last=False
)
生データをそのまま与えているように見える
? 生データではなくメルスペクトログラムを与えても,前処理が適切に行えるよう変更が必要?
Github Copilotに聞いてみるか
普通に生波形を渡せばいいじゃん,と言われた
確かに,引数として増やせばいいのか
* 生データを与える方向で改修を進めよう
改修対象は恐らくsed...のdetect()
?生波形を引数に加えればいいかな?
mixする際の生波形を別途保存しておき,それを呼ぶ形にするか?
mixupした時のデータの名前を保存して,それらを渡す
CRNNの方でデータを読んで,BEATsに渡す
このやり方の方が変更が少なくて済むのでは