2023년 5월 27일 토요일

오디오, 영상, 텍스트, 센서, 3D깊이맵 멀티모달 딥러닝 모델 페이스북 imagebind 설치 및 사용기

이 글은 페이스북 멀티모달 딥러닝 모델 imagebind 설치 및 사용기를 간단히 정리해 나눔한다. 이 이미지바인드 모델은 텍스트, 오디오, 비전, 깊이맵, 히트맵, IMU등 다중 데이터셋을 임베딩하여, 트랜스포머로 학습할 수 있다. 이 모델을 잘 활용하면, 멀티모달을 지원하는 데이터 생성AI를 개발할 수 있다.
imagebind

여기에 사용된 트랜스포머 모델 동작 개념은 다음을 참고한다.

설치
설치는 깃허브에 올라와 있으나, 완벽하지 않아, 설치 테크트리 확인, 시도에 시간이 좀 걸린다. 제일 좋은 것은 리눅스 우분투(ubuntu) 운영체제 환경에서, 아나콘다(anaconda)를 설치하고, 다음 링크의 설명에 따라 imagebind를 설치한다(현재, 윈도우에서는 몇몇 패키지가 설치 에러가 발생한다).

설치 중에 avi 생성 라이브러리에서 에러가 발생할 수 있다. 이 경우, 다음 링크를 참고해 별도로 설치해야 한다. 
파이토치와 트랜스포머 알고리즘을 사용하는 데, 이 패키지를 설치하기 어려우면 도커 이미지를 사용해야 한다. 이는 다음 링크를 참고한다.

사용
다음과 같이 파이썬 코드를 생성하고, 실행해 본다. 실행 시 설치되지 않아 에러가 나는 패키지는 pip 명령으로 설치하여, 문제를 해결한 후 다시 실행해 본다(예. pip install torchaudio torchvision pytorchvideo einops timm ftfy regex). 
import data
import torch
from models import imagebind_model
from models.imagebind_model import ModalityType

text_list=["A dog.", "A car", "A bird"]
image_paths=[".assets/dog_image.jpg", ".assets/car_image.jpg", ".assets/bird_image.jpg"]
audio_paths=[".assets/dog_audio.wav", ".assets/car_audio.wav", ".assets/bird_audio.wav"]

device = "cuda:0" if torch.cuda.is_available() else "cpu"

# Instantiate model
model = imagebind_model.imagebind_huge(pretrained=True)
model.eval()
model.to(device)

# Load data
inputs = {
    ModalityType.TEXT: data.load_and_transform_text(text_list, device),
    ModalityType.VISION: data.load_and_transform_vision_data(image_paths, device),
    ModalityType.AUDIO: data.load_and_transform_audio_data(audio_paths, device),
}

with torch.no_grad():
    embeddings = model(inputs)

print(
    "Vision x Text: ",
    torch.softmax(embeddings[ModalityType.VISION] @ embeddings[ModalityType.TEXT].T, dim=-1),
)
print(
    "Audio x Text: ",
    torch.softmax(embeddings[ModalityType.AUDIO] @ embeddings[ModalityType.TEXT].T, dim=-1),
)
print(
    "Vision x Audio: ",
    torch.softmax(embeddings[ModalityType.VISION] @ embeddings[ModalityType.AUDIO].T, dim=-1),
)

ImageBind 실행 모습

실행하면, 사전 훈련된 딥러닝 모델(4기가 이상)을 다운로드 받고, 모델에 전달한 강아지, 자동차, 새 프롬프트 입력에 대한 멀티모달 출력인 텍스트, 오디오, 이미지에 대한 텐서를 리턴한다. 
Vision x Text:
tensor([[9.9761e-01, 2.3694e-03, 1.8612e-05],
        [3.3836e-05, 9.9994e-01, 2.4118e-05],
        [4.7997e-05, 1.3496e-02, 9.8646e-01]])

Audio x Text:
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

Vision x Audio:
tensor([[0.8070, 0.1088, 0.0842],
        [0.1036, 0.7884, 0.1079],
        [0.0018, 0.0022, 0.9960]])
이미지 바인드 멀티모달 출력 임베디드 텐서 값

이 텐서값은 원 데이터를 임베딩하고 있는 것이므로, 관련된 텍스트, 오디오, 이미지로 변환 가능하다. 

결론
ImageBind는 3차원 데이터를 포함해, 오디오 등 멀티모달 데이터를 학습, 프롬프트 기반 생성할 수 있는 오픈소스 모델로 의미가 있다. 다만, 아직 초기 버전인 관계로, 예제 등 관련 자료가 매우 부족하다. 해외 관련 자료에도 유의미한 튜터리얼 등이 릴리즈되지 않아, 직접 필요한 예제를 만들어 나가야 한다. 그럼에도, 나름 신뢰성있는 곳에서 멀티모달 딥러닝 모델이 릴리즈되어, 참고할 만한 내용이 많다. 
앞으로, GPT4와 같이, 트랜스포머 알고리즘을 이용해 3차원 데이터를 포함한 멀티모달 딥러닝 모델이 개발되어 실무적으로 적용될 날이 멀지 않은 듯 하다.

레퍼런스