[Chia sẻ] [ZaloAI] Music Genre Classification Challenge

classification
deep-learning

#1

Chào mọi người, Trong bài viết này mình xin được chia sẻ source code và một số trải nghiệm mà nhóm mình (Toppan) tích lũy được khi tham gia cuộc thi Music Genre Classification của Zalo. Solution của nhóm mình cũng khá đơn giản, chỉ sử dụng một model duy nhất (một phần do thời gian bọn mình dành cho chalenge lần này không nhiều), tuy nhiên cũng rất may mắn khi đạt được top 3 Final Leaderboard tạm thời của Zalo (bằng điểm với một team khác luôn :sweat_smile: ). Source code và description về solution các bạn có thể truy cập ở https://github.com/taprosoft/music-genre-classification. Dưới đây mình xin tóm tắt một vài nội dung chính:

Preprocessing

  • Cách tiền xử lý dữ liệu audio của mình cũng giống với các team đã chia sẻ trước đây: chia file nhạc thành nhiều đoạn nhỏ và convert dưới dạng phổ (spectrogram). Mỗi đoạn nhỏ này sẽ đưa vào một model CNN để phân loại bài nhạc đó thuộc thể loại nào.
  • Đối với challenge lần này bọn mình tập trung vào việc chọn ra được những đặc trưng tốt nhất cho việc xác định thể loại nhạc. Để thuận tiện cho việc thử nghiệm các tổ hợp feature khác nhau, mình có tạo một script preprocess có nhiệm vụ extract nhiều feature khác nhau từ file audio (STFT, Mel-spectrogram, HPSS, CQT, Chromagram, …). Mỗi feature này sẽ được lưu lại dưới dạng ảnh grayscale với tên file nhạc tương ứng + tên feature. Khi huấn luyện hoặc test model chỉ cần stack các ảnh này lại theo tổ hợp mà mình muốn.
  • Ở solution cuối cùng bọn mình chọn tập feature là Harmonic-Percussive spectrogram. Chi tiết hơn về dạng phổ này các bạn có thể tham khảo thêm ở đây. Nói đơn giản thì dạng phổ này sẽ lọc ra phần âm hữu thanh (tiếng đàn, kèn, giọng hát, …) và phần vô thanh (tiếng trống, beat, …) để biểu diễn thông tin một cách tốt hơn. Như vậy, đầu vào của model sẽ là 1 ảnh 2 channel tương ứng với 2 thành phần này.

Training model

  • Model bọn mình sử dụng là ResNet18, đầu vào là 1 đoạn spectrogram có shape là (128,1024,2), train from scratch luôn (không dùng fine-tuning) :blush: . Trong code mình cũng có thử nghiệm một số model khác như CRNN (CNN + LSTM), ResNet34, ResNet50, … nhưng cuối cùng mình chọn ResNet18 vì nó có performance trên tập validation khá tốt và thời gian train cũng không quá lâu, thích hợp cho việc thử nghiệm nhiều feature khác nhau
  • Tỉ lệ phân chia tập train / val mình dùng là 90% / 10%. Phân tách ngay từ tập mp3 để tránh overfit khi train trên tập spectrogram
  • Để xử lý vấn đề imbalance giữa các class, khi train mình có sử dụng weighted loss và sampling các slice theo tỉ lệ thích hợp.
  • Khi predict 1 file mp3 mình có sử dụng bộ trọng số cho các slice để tối ưu kết quả predict trên tập validation. Bộ trọng số này được tìm ra từ quá trình thử nghiệm + chút heuristics :smile:
  • Khi đạt được acc ~80 trên Public Leaderboard bọn mình cũng sử dụng một subset của tập public này để train tiếp cho model. Các file được chọn bao gồm phần kết quả predict chung giữa tất cả các lần submit trước + threshold xác suất nhất định. Việc train này cũng giúp acc trên tập public test tăng thêm khoảng 0.6%
  • Final acc đạt được trên tập public test là 0.80669, tập private test còn 0.65247 :joy: , có thể do phân bố class của tập private khác nhiều so với tập public test + model của mình có xu hướng overfit
  • Trong quá trình thử nghiệm mình cũng muốn sử dụng thêm ensemble để cải thiện acc nhưng vì thời gian quá ngắn nên cũng không kịp làm. Hôm submit final solution mình cũng không cài được nvidia-docker để test nên file docker chỉ dùng CPU để predict. Cũng may là dùng một model chứ nhiều model ensemble chắc bị time-out luôn :sweat_smile:

Trên đây là một số chia sẻ của mình về challenge zalo music đợt này. Hi vọng các bạn sẽ tìm được một số thông tin hữu ích từ những chia sẻ trên. Rất mong nhận được sự đóng góp và nhận xét của các bạn về challenge này.


[09/09/2018 18:54] https://forum.machinelearningcoban.com/t/chia-s-zaloai-music-genre-classification-challenge/802 [ZaloAI - Music genre classification] Chào mọi người, Để tiếp nối tinh . . .
#2

Cảm ơn chia sẻ của nhóm :smiley:


#3

Chào anh, em dang tìm hiểu về CNN+LSTM, anh có thể chia sẻ chút về cái này được không ạ