Pipeline (конвейер) — это минималистичный способ использования абстракции рассуждений больших моделей в библиотеке преобразователей Huggingface. Все большие модели делятся на аудио (Audio), компьютерное зрение (Computer Vision), обработку естественного языка (NLP), мультимодальные (Multimodal). ) и другие 4 большие категории, а также 28 малых категорий задач (задач). Охватывает в общей сложности 320 000 моделей.
Сегодня я представляю шестую статью о компьютерном зрении CV: классификация видео (видео-классификация). В библиотеке HuggingFace имеется 1100 моделей классификации видео.
Классификация видео — это задача присвоения меток или категорий всем видео. Предполагается, что каждое видео будет иметь только одну категорию. Модели классификации видео принимают видео в качестве входных данных и возвращают прогноз о том, к какой категории принадлежит видео.
Наиболее типичной моделью классификации видео (видео-классификации) является серия xclip от Microsoft. Xclip является расширением модели клипа и использует (видео-текст) сравнительное обучение и обучение. Microsoft предоставляет модели, обученные с использованием различных разрешений блоков, включая microsoft/xclip-base-patch32, microsoft/xclip-base-patch16 и т. д. Например, microsoft/xclip-base-patch32, размер разрешения блока — 32, и используется каждое видео. 8 Кадры обучаются с разрешением 224x224。Подробные документы можно найти в《Expanding Language-Image Pretrained Models for General Video Recognition》
str
илиModelCard
,Необязательный) — Карты моделей, принадлежащие этому конвейеру Модель.str
,Необязательный)— структура для использования,"pt"
适用于 PyTorch или"tf"
TensorFlow。Указанный фреймворк должен быть установлен。str
,По умолчанию""
)— Идентификатор задачи конвейера.int
,Необязательный,По умолчанию 8)— 当管道将使用DataLoader(При передаче набора данных,существовать Pytorch Модель的 GPU выше), количество рабочих, которые будут использоваться.int
,Необязательный,По умолчанию 1)— 当管道将使用DataLoader(При передаче набора данных,Когда на графическом процессоре модели Pytorch,Размер используемой партии,для рассуждений,Это не всегда выгодно,Пожалуйста, прочитайтеИспользование конвейеров для пакетной обработки。int
,Необязательный,По умолчанию -1)— CPU/GPU Серийный номер поддерживаемого устройства. установите его на -1 будет использовать ЦП, установка положительного числа приведет к соответствующему CUDA оборудование ID беги дальше Модель。Вы можете передать роднойtorch.device
илиstr
слишкомstr
илиtorch.dtype
,Необязательный) - Отправить напрямуюmodel_kwargs
(Просто более простой ярлык)использовать это Модельдоступная точность(torch.float16
,,torch.bfloat16
...или"auto"
)bool
,Необязательный,По умолчаниюFalse
)——Флаг, указывающий, должен ли вывод канала быть в сериализованном формате.(Прямо сейчас рассол) или необработанные выходные данные (например, текст).str
,List[str]
)——Pipeline обрабатывает три типа видео: Конвейер может принимать одно видео или пакет видео, которые затем необходимо передать в виде строки. Все видеоролики должны быть в одном формате: все http-ссылки или все локальные пути.
int
,Необязательный,По умолчанию 5) — количество верхних меток, которые вернет конвейер. Если предоставленное количество превышает количество тегов, доступных в конфигурации модели.,по умолчанию будет указано количество тегов.int
,Необязательный,По умолчаниюself.model.config.num_frames
)— Количество кадров, выбранных из видео, используемых для классификации. Если не указано, по умолчанию используется количество кадров, указанное в конфигурации модели.int
,Необязательный,По умолчанию 1) — Частота дискретизации, используемая для выбора кадров из видео. Если не указано, по умолчанию используется 1, каждый кадр будет использован.Используйте hf_hub_download для загрузки или использования местных видео:
Я лично проверял, что конвейер использовать нельзя, поэтому использовал метод модели Auto. В отличие от использования Autotokenizer для обработки текста, для обработки изображений я использовал AutoImageProcessor (суть обработки видео заключается в том, чтобы сначала разбить видео на картинки, а затем обработать фотографии)
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
import av
import torch
import numpy as np
from transformers import AutoImageProcessor, VideoMAEForVideoClassification,TimesformerForVideoClassification
from huggingface_hub import hf_hub_download
np.random.seed(0)
def read_video_pyav(container, indices):
'''
Декодируйте определенные кадры видео с помощью библиотеки PyAV.
Decode the video with PyAV decoder.
Args:
container (`av.container.input.InputContainer`): PyAV container.
indices (`List[int]`): List of frame indices to decode.
Returns:
result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
'''
frames = []
container.seek(0)
start_index = indices[0]
end_index = indices[-1]
for i, frame in enumerate(container.decode(video=0)):
if i > end_index:
break
if i >= start_index and i in indices:
frames.append(frame)
return np.stack([x.to_ndarray(format="rgb24") for x in frames])
def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
'''
Индекс кадров, выбранных из видео по определенным правилам.
Sample a given number of frame indices from the video.
Args:
clip_len (`int`): Total number of frames to sample.
frame_sample_rate (`int`): Sample every n-th frame.
seg_len (`int`): Maximum allowed index of sample's last frame.
Returns:
indices (`List[int]`): List of sampled frame indices
'''
converted_len = int(clip_len * frame_sample_rate)
end_idx = np.random.randint(converted_len, seg_len)
start_idx = end_idx - converted_len
indices = np.linspace(start_idx, end_idx, num=clip_len)
indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
return indices
# video clip consists of 300 frames (10 seconds at 30 FPS)
file_path = "./transformers_basketball.avi"
"""
file_path = hf_hub_download(
repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
)
"""
container = av.open(file_path)
# sample 16 frames
indices = sample_frame_indices(clip_len=16, frame_sample_rate=1, seg_len=container.streams.video[0].frames)
video = read_video_pyav(container, indices)
image_processor = AutoImageProcessor.from_pretrained("MCG-NJU/videomae-base-finetuned-kinetics")
#model = VideoMAEForVideoClassification.from_pretrained("MCG-NJU/videomae-base-finetuned-kinetics")
model = TimesformerForVideoClassification.from_pretrained("facebook/timesformer-base-finetuned-k400")
inputs = image_processor(list(video), return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
# model predicts one of the 400 Kinetics-400 classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
После выполнения автоматически загружайте файлы модели, стройте индексы, разделяйте кадры и прогнозируйте классификацию видео:
На Huggingface мы сортируем модели видеоклассификации (классификации видео) от высокой к низкой по объему загрузки. Топ-10 моделей в основном состоят из xclip от Microsoft, videomae от Нанкинского университета, Timesformer от Facebook и Vivit Model.
В этой статье представлена видеоклассификация (видеоклассификация) конвейера трансформаторов с точки зрения обзора, технических принципов, параметров конвейера, практики работы с конвейерами, ранжирования моделей и т. д. Читатели могут использовать минималистичный код для развертывания классификации видео в компьютерном зрении. на модели конвейера (классификации видео), применяемой к сценариям дискриминации видео.