OV-MER: Towards Open-Vocabulary Multimodal Emotion Recognition

If our project helps you, please give us a star ⭐ on GitHub to support us. 🙏🙏
## ✨ OV-MER Task **OV-MER** transitions from *traditional MER* to a framework that enables the prediction of *any number and category of emotions*, thereby advancing emotion AI toward real-world applicability by capturing the full spectrum of human emotions. **(a) Task Comparison**: We compare the differences among three tasks (one-hot MER, multi-label MER, and OV-MER) across three aspects (label space, label number, and annotation manner). **(b) Label Comparison**: We provide an example to visualize the one-hot and OV labels. ## 🚀 OV-MERD Dataset We construct the first dataset for the OV-MER task. We use a human-LLM collaboration strategy for dataset construction, obtaining the **OV-MERD** dataset.

**OV-MERD** dataset contains 236 emotion categories and most samples have 2 to 4 labels, far exceeding those in current datasets.

This dataset is available at: https://huggingface.co/datasets/MERChallenge/MER2025 ```bash dataset ├── mer2025-dataset | ├── video # all training data, including 132,171 samples | ├── audio # pre-extracted audio | ├── openface_face # # pre-extracted face files | ├── subtitle_chieng.csv # pre-extracted subtitle content | ├── track2_train_ovmerd.csv # OV-MERD Dataset (OV labels) | ├── track3_train_ovmerd.csv # OV-MERD Dataset (Description) ``` ## 🛠️ Requirements and Installation My Dependencies (We have not tested other envs): * CUDA Version == 12.1 **[Environment Preparation]** ```bash # We need different envs for different MLLM baselines conda env create -f environment_vllm2.yml conda env create -f environment_whisperx.yml ``` ## 🗝️ Inference ### Data and Pre-trained Checkpoints Structure ```bash dataset # MERCaption+ available at: https://huggingface.co/datasets/MERChallenge/MER2025 ├── mer2025-dataset | ├── video # all training data, including 132,171 samples | ├── audio # pre-extracted audio | ├── openface_face # # pre-extracted face files | ├── subtitle_chieng.csv # pre-extracted subtitle content | ├── track2_train_ovmerd.csv # OV-MERD Dataset (OV labels) | ├── track3_train_ovmerd.csv # OV-MERD Dataset (Description) OV-MER ├── models # We put all pre-trained baselines weights to: https://pan.baidu.com/s/1KHL1oGCtvqr8IMNWDWxH3Q?pwd=djjw │ ├── bert-base-uncased │ ├── Chat-UniVi │ ├── clip-vit-large-patch14 │ ├── LanguageBind_Image │ ├── ... ``` ### Inference Code Please change *xxx* in *DATA_DIR* to your own root. All results are stored in **./output**. ```bash # vllm2 conda activate vllm2 cd Qwen-Audio CUDA_VISIBLE_DEVICES=0 python main-audio.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-audio.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd SALMONN CUDA_VISIBLE_DEVICES=0 python main-audio.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-audio.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd Video-ChatGPT CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd Chat-UniVi CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd mPLUG-Owl CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd Otter CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd VideoChat CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd VideoChat2 CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' # whisperx conda activate whisperx cd LLaMA-VID CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' cd Video-LLaVA CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='subtitle' --dataset='OVMERD' CUDA_VISIBLE_DEVICES=0 python main-video.py --subtitle_flag='nosubtitle' --dataset='OVMERD' ``` ### Clue Merging We also provide a demo code to merge subtitle and clues. ```bash conda activate vllm2 python merge.py ``` ## 👍 Score Calculation 1. If you want to skip the above inference process, we also provide intermedia outputs for evaluation. ```bash [1] prepare results # Available in current github OV-MER ├── output │ ├── results-ovmerd │ │ ├── Chat-UniVi │ │ ├── LLaMA-VID │ │ ├── mPLUG-Owl │ │ ├── ... [2] score calculation: ov labels + gt labels => score CUDA_VISIBLE_DEVICES=0 python evaluation-scoreonly.py # output format: M1, M2, M3W1-L1, M3W1-L2, ..., M3W5-L1, M3W5-L2 ``` 2. Full evaluation code ```bash conda activate vllm2 CUDA_VISIBLE_DEVICES=0 python evaluation.py ``` Since the emotion labels extracted in different runs are slightly different, the results may differ slightly from those reported in our paper.

## 📑 Citation If you find OV-MER useful for your research and applications, please cite using this BibTeX: ```bibtex @inproceedings{lian2025ov, title={OV-MER: Towards Open-Vocabulary Multimodal Emotion Recognition}, author={Lian, Zheng and Sun, Haiyang and Sun, Licai and Chen, Haoyu and Chen, Lan and Gu, Hao and Wen, Zhuofan and Chen, Shun and Siyuan, Zhang and Yao, Hailiang and others}, booktitle={Proceedings of the 42nd International Conference on Machine Learning}, year={2025} } ``` ## 👍 Acknowledgement We evaluate the performance of various LLM-based baselines on OV-MERD, including [**SECap**](https://github.com/thuhcsi/SECap), [**SALMONN**](https://github.com/bytedance/SALMONN), [**Qwen-Audio**](https://github.com/QwenLM/Qwen-Audio), [**Otter**](https://github.com/Luodian/Otter), [**OneLLM**](https://github.com/csuhan/OneLLM), [**PandaGPT**](https://github.com/yxuansu/PandaGPT), [**VideoChat**](https://github.com/OpenGVLab/Ask-Anything/tree/main/video_chat), [**VideoChat2**](https://github.com/OpenGVLab/Ask-Anything/tree/main/video_chat2), [**Video-LLaMA**](https://github.com/DAMO-NLP-SG/Video-LLaMA), [**Video-LLaVA**](https://github.com/PKU-YuanGroup/Video-LLaVA), [**Video-ChatGPT**](https://github.com/mbzuai-oryx/Video-ChatGPT), [**LLaMA-VID**](https://github.com/dvlab-research/LLaMA-VID), [**mPLUG-Owl**](https://github.com/X-PLUG/mPLUG-Owl), and [**Chat-UniVi**](https://github.com/PKU-YuanGroup/Chat-UniVi). We extend our gratitude to the authors for their excellent work. ## 🔒 License This project is released under the Apache 2.0 license as found in the LICENSE file. The service is a research preview intended for **non-commercial use ONLY**. Please get in touch with us if you find any potential violations.