[VideoLLaMA 3] processor

FSA·2025년 3월 2일
0

[video] foundation model

목록 보기
9/10

Videollama3Qwen2Processor

_process_conversation

GPT의 설명

  • 요약하면, _process_conversation 메서드는 멀티모달 대화를 입력받아,
    • 내부적으로 멀티모달 데이터를 추출하고,
    • 텍스트와 이미지(또는 영상)를 각각 전처리한 후,
    • 모델이 요구하는 형식의 입력 데이터(토큰화된 텍스트와 이미지 특징)를 생성

  1. 대화와 멀티모달 데이터 준비
    • 이 메서드는 입력으로 대화(conversation)를 받습니다. 대화는 일반적으로 역할(role)과 내용(content)을 포함하는 메시지 리스트입니다.
    • 만약 별도로 이미지나 비디오 등 멀티모달 입력이 제공되지 않으면,
      • 내부에서 _load_multimodal_data 메서드를 호출하여 대화 내에서 이미지나 비디오와 같은 멀티모달 데이터를 추출
    • 이후 _gather_multimodal_data를 통해 추출된 데이터를 모아 리스트 형태로 준비

  1. 모달리티별 전처리 설정 병합
    • _merge_kwargs 메서드를 통해 텍스트, 이미지, 영상 등 각 모달리티별 처리에 필요한 다양한 옵션(kwargs)을 통합
      • 이 과정에서 기본값, 토크나이저 초기 설정, 그리고 호출 시 전달된 인자들이 적절히 병합

  1. 이미지/비디오 처리
  • 준비된 멀티모달 데이터가 있다면, process_images 메서드를 통해 이를 모델 입력에 맞는 이미지 특징(예: 텐서 형태의 이미지 데이터)으로 변환
    • 이때 make_batched_images 함수를 이용해 입력 형식을 정규화하고,
    • 이미지 프로세서(image_processor)를 호출하여 처리

  1. 텍스트 전처리 및 라벨 생성 (옵션)
    • 메서드는 두 가지 모드로 동작할 수 있습니다.
      • 라벨 생성 모드 (return_labels=True):
        • _process_conversation_with_label 메서드를 호출하여 텍스트를 토크나이즈할 때, 이미지 토큰과의 정렬(align)을 고려해 target 라벨을 생성합니다. 이는 주로 모델 학습 시 정답(ground truth) 생성을 위한 처리입니다.
      • 일반 텍스트 처리 모드 (return_labels=False):
        • _process_conversation_without_label 메서드를 호출하여 대화 전체를 하나의 텍스트 시퀀스로 결합한 후 토크나이즈합니다.

  1. 최종 입력 Feature 구성
    • 최종적으로, 텍스트 관련 입력(text_inputs)과 이미지/비디오 관련 입력(image_inputs)을 하나의 BatchFeature 객체에 병합하여 반환합니다.
    • 이 객체는 모델의 입력으로 바로 사용할 수 있도록 구성되어 있습니다.

내 예측 요약 (_process_conversation)

  • conversation(비디오 파일 경로)도 input으로 가져갈 수 있지만, 추가적으로 images도 input으로 가져갈 수 있다.
  • 추가적으로 images를 input으로 주지 않으면
    • _load_multimodal_data 에서 비디오 경로에서 프레임으로 변환하는 것 같다.
  • 이후 _gather_multimodal_data를 통해 추출된 데이터를 모아 리스트 형태로 준비
  • process_images 메서드: 비디오 데이터 처리 -> 내 생각: 패치화 후 -> 선형 임베딩 통과
    • make_batched_images 함수를 이용해 입력 형식을 정규화
    • 이미지 프로세서(image_processor)를 호출하여 처리
  • 최종 입력 Feature 구성
    • 최종적으로, 텍스트 관련 입력(text_inputs)과 이미지/비디오 관련 입력(image_inputs)을 하나의 BatchFeature 객체에 병합하여 반환합니다.

_load_multimodal_data

input

  • List[Dict[str, Any]]
conversation = [
    {
        "role": "user",
        "content": [
            {
                "type": "video",
                "video": {"video_path": video_path, "fps": 1, "max_frames": 180}
            },
            {
                "type": "text",
                "text": "Please accurately provide the timestamps for all the moments when a goal occurs in the given futsal video."
            },
        ]
    }
..., {}
]

output

  • new_conversation: List[Dict[str, Any]]
conversation = [
    {
        "role": "user",
        "content": [
            {
                "type": "video",
                "video": List[Image.Image],
                "num_frames": int,
                "timestamps": List[float]
            {
                "type": "text",
                "text": "Please accurately provide the timestamps for all the moments when a goal occurs in the given futsal video."
            },
        ]
    }
]

내 요약 (TODO: 여기서부터)

  • input

  • 아래 말 무슨 뜻인지 공부하기

    • 이 딕셔너리(여기서는 로드에 필요한 인자들; 예: 이미지 경로 비디오의 시작/종료 시간등)를 기반으로 고유 식별자(data_id)를 생성
  • load_video 메서드를 호출하여 전체 비디오의 프레임들과 타임스탬프를 얻습니다. (공부하기)

  • 각 개별 콘텐츠마다 지정한 시작/종료 시간에 해당하는 프레임과 타임스탬프를 필터링하여,

    • 콘텐츠 딕셔너리에 실제 비디오 데이터(프레임 목록), 프레임 수("num_frames"), 타임스탬프 목록("timestamps")을 추가

GPT의 설명

  • 대화(conversation) 내에 포함된 멀티모달 콘텐츠(이미지 및 비디오)를 사전에 로드하고, 이를 대화 메시지에 반영하여 후속 처리에서 사용할 수 있도록 준비하는 역할
  • 대화 내에서 이미지나 비디오와 같이 외부 파일의 경로와 관련 인자를 포함한 멀티모달 콘텐츠를 찾아
    • 이를 실제 데이터(이미지 배열 혹은 비디오 프레임 및 타임스탬프)로 로드하고,
    • 해당 데이터를 각 메시지에 주입

  1. 대화 메시지 순회 및 복사
    • 각 대화 메시지를 순회하면서 메시지의 역할(role) 정보는 그대로 유지하고, 콘텐츠(content)가 리스트나 튜플이 아닐 경우에는 그대로 복사하여 새로운 대화 리스트(new_conversation)에 추가

  1. 멀티모달 콘텐츠 식별 및 그룹화
    • 메시지의 콘텐츠가 리스트/튜플 형태인 경우, 각 항목을 확인
    • 항목이 딕셔너리 형태이며 반드시 "type" 필드를 가져야 합니다.
    • 만약 콘텐츠의 "type""image" 또는 "video"이고, 해당 타입에 해당하는 데이터(예: content["image"] 또는 content["video"])가 딕셔너리라면,
      • 예 : "video": {"video_path": video_path, "fps": 1, "max_frames": 180}
      • 이 딕셔너리(여기서는 로드에 필요한 인자들; 예: 이미지 경로, 비디오의 시작/종료 시간 등)를 기반으로 고유 식별자(data_id)를 생성 (그냥 위 예시 Dict를 json화 한거임)
      • json화 할 때 "start_time""end_time"은 제외하여
        • 동일한 멀티모달 데이터를 그룹화할 수 있게 합니다.
      • 복사된 콘텐츠를 multimodal_info라는 defaultdict에 저장하여,
        • 나중에 동일한 멀티모달 데이터끼리 한 번에 처리할 수 있도록 합니다.

  1. 이미지 데이터 처리
    • 그룹 내 콘텐츠의 타입이 "image"인 경우,
      • 첫 번째 콘텐츠에서 제공한 이미지 경로를 바탕으로 load_images 메서드를 호출하여 이미지를 로드합니다.
      • 로드한 이미지를 복사한 후, 해당 그룹의 모든 콘텐츠 항목에 대해 "image" 키에 이미지 데이터를 리스트 형태로 할당합니다.

  1. 비디오 데이터 처리
    • 그룹 내 콘텐츠의 타입이 "video"인 경우,
      • 각 콘텐츠에서 제공한 "start_time""end_time" 정보를 수집합니다.
        • 만약 값이 없으면 각각 기본값(시작은 0, 종료는 무한대)을 사용
      • 이들 중 최소 시작 시간과 최대 종료 시간을 이용해, 전체 비디오 범위를 결정하고 이를 로드 인자에 반영합니다.
      • load_video 메서드를 호출하여 전체 비디오의 프레임들과 타임스탬프를 얻은 뒤,
      • 각 개별 콘텐츠마다 지정한 시작/종료 시간에 해당하는 프레임과 타임스탬프를 필터링하여,
        • 콘텐츠 딕셔너리에 실제 비디오 데이터(프레임 목록), 프레임 수("num_frames"), 타임스탬프 목록("timestamps")을 추가합니다.

  1. 수정된 대화 반환
    • 모든 메시지와 그룹에 대해 멀티모달 데이터를 로드 및 할당한 후, 수정된 대화 리스트(new_conversation)를 반환합니다.

load_video


_gather_multimodal_data

_gather_multimodal_data 메서드는 대화(conversation) 내에 포함된 멀티모달 콘텐츠(이미지와 비디오)를 간단히 수집하여 별도의 리스트로 반환하는 역할을 합니다. 이 메서드의 주요 기능은 다음과 같습니다.

  1. 대화 메시지 순회

    • 대화의 각 메시지를 순회하면서, 메시지의 "content" 필드가 리스트나 튜플인지 확인합니다. 만약 그렇지 않으면 해당 메시지는 건너뜁니다.
  2. 콘텐츠 필터링 및 수집

    • 리스트 또는 튜플 형태의 콘텐츠 내 각 항목에 대해, 항목이 딕셔너리인지 확인합니다.
    • 콘텐츠 딕셔너리의 "type" 필드가 "video"이면, 해당 콘텐츠에서 "video" 데이터를 추출합니다. 이때, 추출된 비디오 데이터가 유효한지 (is_valid_video 함수로) 검증한 후, 튜플 ("video", video) 형태로 결과 리스트에 추가합니다.
    • 마찬가지로, "type""image"인 경우에는 "image" 데이터를 추출하여 튜플 ("image", image) 형태로 추가합니다.
  3. 최종 결과 반환

    • 수집된 멀티모달 데이터가 하나라도 있으면 그 리스트를, 없으면 None을 반환합니다.

즉, 이 메서드는 대화 내에서 이미지와 비디오 데이터를 식별하고, 이들을 나중에 멀티모달 처리를 위해 별도로 모으는 간단한 수집 단계로 볼 수 있습니다.


process_images

process_images 메서드는 입력으로 전달된 이미지 또는 영상 데이터를 모델이 사용할 수 있는 형식으로 전처리하는 역할을 합니다. 구체적인 기능은 다음과 같습니다.

  1. 입력 데이터 표준화

    • 먼저, make_batched_images 함수를 호출하여 입력 데이터(images)를 표준화합니다.
    • 이 함수는 입력 데이터를 두 부분으로 분리하는데, 하나는 각 데이터의 모달리티("image" 또는 "video")를 나타내는 리스트(modals)이고, 다른 하나는 실제 이미지/영상 데이터의 리스트입니다.
  2. merge_size 설정

    • kwargs에 merge_size 값이 없다면, 각 모달리티에 따라 적절한 merge_size를 자동으로 설정합니다.
    • 여기서 이미지 데이터는 self.image_merge_size, 영상 데이터는 self.video_merge_size 값을 사용합니다.
  3. 이미지 프로세서 호출

    • 표준화된 이미지 데이터와 merge_size 등의 추가 옵션(kwargs)을 인자로 하여, self.image_processor를 호출합니다.
    • 이 호출을 통해, 이미지나 영상 데이터가 모델에 맞게 전처리되고, 텐서나 다른 적절한 형식으로 변환됩니다.
  4. 모달 정보 포함

    • 전처리 결과에 모달리티 정보를 나타내는 "modals" 필드를 추가하여, 후속 처리 단계에서 이미지와 영상 데이터를 구분할 수 있도록 합니다.

최종적으로, process_images 메서드는 입력된 멀티모달 데이터를 일관된 형식으로 정리 및 전처리하여, 모델이 요구하는 형태의 입력(feature)으로 변환하는 핵심 파이프라인의 한 부분입니다.


make_batched_images

make_batched_images 함수는 입력으로 주어진 이미지 또는 비디오 데이터를 일관된 배치(batch) 형태로 변환하는 역할을 합니다. 다양한 입력 형식(예: 단일 이미지, 단일 비디오, 여러 이미지/비디오, 또는 이름(label)과 함께 제공된 데이터)을 모두 처리하여, 이후 프로세싱 단계에서 일관된 방식으로 다룰 수 있도록 모달리티(이미지 또는 비디오)와 실제 데이터를 별도의 리스트로 분리해 반환합니다.

주요 동작 과정은 다음과 같습니다.

  1. 리스트/튜플 형태의 'named image' 처리

    • 입력 데이터가 리스트나 튜플이고, 모든 요소가 (모달리티, 데이터) 형태(예: ("image", 이미지데이터) 또는 ("video", 비디오데이터))이면,
    • 각 요소에서 모달리티와 실제 데이터를 각각 추출하여 두 개의 리스트로 반환합니다.
  2. 리스트/튜플 형태의 이미지 혹은 비디오 처리 (이름 없이 제공된 경우)

    • 입력 데이터가 리스트나 튜플이고, 각 요소가 유효한 이미지 또는 비디오라면,
    • 각 요소에 대해 해당 데이터가 이미지인지 비디오인지 확인하고, 각각 ("image", 데이터) 또는 ("video", 데이터) 형태로 래핑한 뒤,
    • 모달리티 리스트와 실제 데이터 리스트로 분리하여 반환합니다.
  3. 단일 named image 처리

    • 입력이 단일 named image(예: (모달리티, 데이터) 형태)라면, 이를 단일 요소 리스트로 변환하여 반환합니다.
  4. 단일 이미지 또는 비디오 처리

    • 입력 데이터가 단일 유효 비디오라면, 모달리티를 "video"로,
    • 단일 유효 이미지라면, 모달리티를 "image"로 설정한 후 각각 단일 요소 리스트로 반환합니다.
  5. 오류 처리

    • 위의 어느 조건에도 해당하지 않으면, 입력 데이터를 배치 형태로 변환할 수 없다고 판단하여 ValueError를 발생시킵니다.

요약하면, make_batched_images 함수는 다양한 형태로 입력된 이미지 및 비디오 데이터를 "모달리티 정보"와 "실제 데이터"를 각각 리스트로 정리하여, 후속 이미지 전처리나 모델 입력에 적합한 형식으로 만드는 핵심 역할을 수행합니다.


image_processor

Videollama3Qwen2Processor 클래스의 image_processor는 입력된 이미지와 비디오 데이터를 모델이 요구하는 형식으로 전처리하는 핵심 구성요소입니다. 구체적으로는 다음과 같은 역할과 기능을 수행합니다.

  1. 원시 멀티모달 데이터 전처리

    • 이미지나 비디오 프레임 같은 원시 데이터를 받아서, 모델이 이해할 수 있는 텐서나 다른 구조화된 형태로 변환합니다.
    • 이 과정에서 크기 조정, 정규화, 채널 순서 변경 등 표준적인 이미지 전처리 작업을 수행합니다.
  2. 배치 형태로 데이터 구성

    • process_images 메서드에서 make_batched_images 함수를 통해 입력 데이터를 "모달리티"와 실제 데이터로 분리한 후, image_processor를 호출하여 통일된 배치(batch) 형식의 이미지 입력(feature)으로 변환합니다.
    • 변환된 이미지 입력은 이후 텍스트 데이터와 결합되어 최종 모델 입력(BatchFeature)을 구성하는 데 사용됩니다.
  3. 모델 요구사항 반영

    • image_processor는 사전 학습된 이미지 처리 모듈(Videollama3ImageProcessor)로부터 로드되며, 해당 모델의 특성에 맞게 설계되어 있습니다.
    • 예를 들어, 모델이 특정 크기의 이미지 패치나 그리드 정보를 필요로 한다면, 이러한 정보도 함께 생성할 수 있습니다.

즉, image_processor는 멀티모달 입력 중 이미지와 영상 데이터를 효과적으로 전처리하고 정제하여, 텍스트와 함께 모델에 전달될 수 있도록 하는 역할을 담당합니다.


profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

0개의 댓글

관련 채용 정보