Alibaba представила мультимодальную нейросеть, которая может за четыре секунды проанализировать двухчасовое видео

от автора

Инженеры китайской компании Alibaba представили мультимодальную модель машинного обучения mPLUG-Owl3. С её помощью можно анализировать текст, изображения и видео. Разработчики делают упор именно на скорость работы нейросети, отмечая, что на обработку двухчасового видео уйдёт всего четыре секунды.

В основе mPLUG-Owl3 используется модель Qwen2, которую доработали и оптимизировали. Благодаря этому в шесть раз сократилось время ожидания первого токена, а на одной видеокарте A100 можно обрабатывать по 400 изображений в секунду. Кроме того, инженеры использовали специальный блок HATB (Hyper Attention Transformer), который связывает визуальные и текстовые признаки. Так, нейросеть, например, может искать визуальные образы на основе текста.

Код проекта открыт и опубликован на GitHub. Также инженеры поделились всем необходимым для работы на портале Hugging Face и его китайском аналоге Model Scope. Есть полный текст исследования, в котором разработчики подробно рассказали о работе mPLUG-Owl3.

Код инференса для работы с изображениями
from PIL import Image  from transformers import AutoTokenizer, AutoProcessor from decord import VideoReader, cpu    # pip install decord model_path = 'mPLUG/mPLUG-Owl3-7B-240728' tokenizer = AutoTokenizer.from_pretrained(model_path) processor = model.init_processor(tokenizer)  image = Image.new('RGB', (500, 500), color='red')  messages = [     {"role": "user", "content": """<|image|> Describe this image."""},     {"role": "assistant", "content": ""} ]  inputs = processor(messages, images=image, videos=None)  inputs.to('cuda') inputs.update({     'tokenizer': tokenizer,     'max_new_tokens':100,     'decode_text':True, })   g = model.generate(**inputs) print(g)

Код инференса для работы с видео
from PIL import Image  from transformers import AutoTokenizer, AutoProcessor from decord import VideoReader, cpu    # pip install decord model_path = 'mPLUG/mPLUG-Owl3-7B-240728' tokenizer = AutoTokenizer.from_pretrained(model_path) processor = model.init_processor(tokenizer)   messages = [     {"role": "user", "content": """<|video|> Describe this video."""},     {"role": "assistant", "content": ""} ]  videos = ['/nas-mmu-data/examples/car_room.mp4']  MAX_NUM_FRAMES=16  def encode_video(video_path):     def uniform_sample(l, n):         gap = len(l) / n         idxs = [int(i * gap + gap / 2) for i in range(n)]         return [l[i] for i in idxs]      vr = VideoReader(video_path, ctx=cpu(0))     sample_fps = round(vr.get_avg_fps() / 1)  # FPS     frame_idx = [i for i in range(0, len(vr), sample_fps)]     if len(frame_idx) > MAX_NUM_FRAMES:         frame_idx = uniform_sample(frame_idx, MAX_NUM_FRAMES)     frames = vr.get_batch(frame_idx).asnumpy()     frames = [Image.fromarray(v.astype('uint8')) for v in frames]     print('num frames:', len(frames))     return frames video_frames = [encode_video(_) for _ in videos] inputs = processor(messages, images=None, videos=video_frames)  inputs.to('cuda') inputs.update({     'tokenizer': tokenizer,     'max_new_tokens':100,     'decode_text':True, })   g = model.generate(**inputs) print(g)


ссылка на оригинал статьи https://habr.com/ru/articles/837686/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *