01.模型介绍
HumanOmni是业内首个理解以人为中心的场景,可以同时处理视觉信息、音频信息的多模态大模型。
在人类中心场景中,理解和处理视觉与听觉信息至关重要。文章指出,当前方法大多关注于视觉-语言模型,但缺乏对音频输入的处理能力,导致对场景的理解不完整。
近期一些可以同时处理视频+音频的模型被提出,但是由于缺乏大规模专门的人类中心数据集以及缺乏针对人物场景的针对性网络架构,导致其对于人物中心场景的理解能力还有较大的提升空间。
论文主要创新:
- 提出了HumanOmni,首个专注于人物中心场景理解的可以同时处理视觉+声音的多模态大语言模型。
- 构建了包含240万个人类中心视频片段的数据集,使用多个先进的模型进行联合校验,生成超过1400万条指令,以促进对多样化人类中心场景的理解。
- 人工对5w条视频片段进行标注,产生了超过10w条高质量指令,这些数据进一步提升了我们对于人物场景的理解能力。在情绪识别、面部描述、动作理解等多个人物相关的任务下,我们的HumanOmni均达到了sota的水平,同时我们实验验证了视觉+音频的联合输入相比单独使用视觉和单独使用音频的优势。
模型架构
- 在视觉理解部分,利用三个不同的分支来分别处理面部相关问题、人体相关问题、环境交互相关问题。设计一个指令驱动的融合模块来利用用户的输入指令生成不同的权重,从而将这三个分支的视觉特征进行自适应融合。
- 将视觉token、音频token、文本token结合后送入大语言模型,实现对于多模态信息的同步处理。
模型下载链接:
https://modelscope.cn/collections/HumanOmni-shipinrenwulijie-234cdc0e5fe247
https://huggingface.co/StarJiaxing/HumanOmni-7B
代码地址:
https://github.com/HumanMLLM/HumanOmni
模型训练
模型训练分为三个阶段
第一阶段是视觉能力构建,在这一阶段,我们利用生成的指令数据以及人工标注的指令数据构建了模型的视觉能力,其中我们更新了三个分支的视觉映射器的参数、指令驱动的融合模块的参数以及大语言模型的参数。
第二阶段是听觉能力发展,在这一阶段,我们基于第一阶段的大语言模型的参数,利用大规模音频数据进行训练,只更新音频映射器的参数,使得模型具备对语音的理解和解释能力。
第三阶段是跨模态交互集成阶段。这一阶段基于前两阶段的模型参数,利用结合视觉和音频数据,提升模型处理和关联不同模态信息的能力。
02.模型效果
情绪识别:
面部表情描述:
动作理解:
在这三个人物理解相关的任务上,我们的HumanOmni均达到了SOTA的水平。
ASR:
在ASR任务上,在Omni模型中,达到了先进的水平。
我们也对模型中不同模态的作用进行了分析:
该表格说明了HumanOmni理解了不同模态的信息,模型可以通过不同模态的信息来完成不同类型的任务。
03.模型推理
我们开源了推理代码,只需执行inference.py即可:
import os import argparse from humanomni import model_init, mm_infer from humanomni.utils import disable_torch_init from transformers import BertTokenizer os.environ['TRANSFORMERS_OFFLINE'] = '1' os.environ['CUDA_VISIBLE_DEVICES'] = '0' def main(): parser = argparse.ArgumentParser(description="HumanOmni Inference Script") parser.add_argument('--modal', type=str, default='video_audio', help='Modal type (video or video_audio)') parser.add_argument('--model_path', type=str, required=True, help='Path to the model') parser.add_argument('--video_path', type=str, required=True, help='Path to the video file') parser.add_argument('--instruct', type=str, required=True, help='Instruction for the model') args = parser.parse_args() # 初始化BERT分词器 bert_model = "bert-base-uncased" bert_tokenizer = BertTokenizer.from_pretrained(bert_model) # 禁用Torch初始化 disable_torch_init() # 初始化模型、处理器和分词器 model, processor, tokenizer = model_init(args.model_path) # 处理视频输入 video_tensor = processor['video'](args.video_path) # 根据modal类型决定是否处理音频 if args.modal == 'video_audio' or args.modal == 'audio': audio = processor['audio'](args.video_path)[0] else: audio = None # 执行推理 output = mm_infer(video_tensor, args.instruct, model=model, tokenizer=tokenizer, modal=args.modal, question=args.instruct, bert_tokeni=bert_tokenizer, do_sample=False, audio=audio) print(output) if __name__ == "__main__": main()
输入参数分别为
modal,控制使用的模态,这里可以选择video_audio(使用视觉+声音),video(仅使用视觉),audio(仅使用声音)。我们推荐同时使用视觉+声音。
model_path,模型的路径。
video_path,视频的路径。
instruct,用户的指令。
我们的模型可以通过modelscope和huggingface进行获取。
04.模型微调
我们开放了模型微调的代码,供开发者使用我们的模型在数据集上进行微调。我们提供的方式是基于HumanOmni-Video(一阶段)和HumanOmni-Audio(二阶段)的参数,进行跨视觉和音频模态的微调。
torchrun --nnodes $WORLD_SIZE \ --nproc_per_node $NPROC_PER_NODE \ --master_addr=$MASTER_ADDR \ --master_port=$MASTER_PORT \ --node_rank $RANK \ humanomni/train_flash_attn.py \ --deepspeed scripts/zero3.json \ --model_type HumanOmni_qwen2 \ --model_path /mnt/data/jiaxing.zjx/code/HumanOmni/HumanOmni_7B_Video/ \ --vision_tower google/siglip-so400m-patch14-384 \ --audio_tower openai/whisper-large-v3 \ --mm_projector_type all_in_one \ --mm_tunable_parts "mm_mlp_adapter,audio_projector,mm_language_model" \ --pretrain_audio_mlp_adapter /mnt/data/jiaxing.zjx/code/HumanOmni/HumanOmni_7B_Audio/audio_projector.bin \ --data_path ./yamls/oryx_audio.yaml \ --data_folder / \ --mm_vision_select_layer -2 \ --image_aspect_ratio pad \ --num_frames 32 \ --bf16 True \ --tf32 True \ --fp16 False \ --output_dir ${OUTP_DIR}/${WANDB_PROJECT}/finetune_${RUN_NAME} \ --num_train_epochs 1 \ --per_device_train_batch_size $LOCAL_BATCH_SIZE \ --per_device_eval_batch_size 4 \ --gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \ --evaluation_strategy "no" \ --save_strategy "steps" \ --save_steps 500 \ --save_total_limit 99 \ --learning_rate 2e-5 \ --weight_decay 0. \ --warmup_ratio 0.03 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --model_max_length 2048 \ --gradient_checkpointing True \ --mm_use_x_start_end True \ --dataloader_num_workers 4 \ --report_to tensorboard \ --run_name $RUN_NAME \
当然用户也可以基于我们最终的HumanOmni模型进行微调。取决于用户的数据量以及数据的相关程度。
05.效果展示
我们分别在电影片段、特写视频、实拍视频三个人物场景下测试了我们的模型的理解能力。
电影片段:
https://live.csdn.net/v/466486
User:What's the major emotion? HumanOmni:angry. User:What's the major facial expression? HumanOmni:frown. User:Desribe the woman. HumanOmni:The woman has long brown hair and is wearing a pink top with a dark cardigan. User:Please describe the major action in detail. HumanOmni:The woman is frowning and shaking her head, indicating that she is angry. She is also gesturing with her hands as if she is explaining something or emphasizing a point. User:What did the woman say? HumanOmni:The woman said "Of course we object! I object, Steve!"
特写视频
https://live.csdn.net/v/466487
User:What's the major emotion? HumanOmni:happy. User:What's the major facial expression? HumanOmni:smile. User:Desribe the woman in detail. HumanOmni:The woman in the video has blonde hair, is wearing a black top, and is smiling. User:What did the woman say? HumanOmni:The woman said "Dogs are sitting by the door."
实拍视频
https://live.csdn.net/v/466488
User:描述一下视频中男子的外貌穿着. HumanOmni:视频中的男性有短的黑发,配戴圆框眼镜。他穿了一件棕色的毛大衣,内里是白色的. User:视频中男子说了什么内容? HumanOmni:男子说他穿什么颜色的衣服,现在处于什么环境,今天的天气怎么样. User:视频中男子有什么情绪吗? HumanOmni:没有情绪。
我们在三类视频下,分别测试了模型对于主要依靠视觉内容进行回答的问题(外貌描述),主要依靠音频内容进行回答的问题(说话内容),依靠音视频共同回答的问题(情绪理解)的效果。我们的HumanOmni均有非常稳定且准确的输出。
点击链接即可跳转模型链接~