본문 바로가기
AI/딥러닝

ViT 모델로 YOLO 미검출 객체 실험-1

by 바다의 공간 2025. 2. 27.

이번에 비전트렌스포머를 논문리뷰한 후 더불어서 모델에 대한 지식적인 측면과 코드단에서

돌려보는것이 피드백이었는데 ViT모델을 읽은 후 모델 특징을 이용해서 간단하게 돌려보려고 한다.

 

일단 ViT의 모델에 대해 크게 기억해야할 부분은 

매우 큰 데이터셋으로 사전학습을 했기때문에 큰 모델이라는점 

작은 모델로 파인튜닝시 더 좋은 성능을 낸다는 점이다.

 

조금 더 딥하게 들어가서 생각하면 

 

✅ ViT와 CNN의 근본적인 차이로

CNN은 합성곱연산을 통해 국소적인(local)특징을 학습하지만

ViT는 이미지를 패치로 나눈 후 Transformer의 Self-Attention을 사용하여 글로벌 관계를 학습한다.

즉 cnn은 작은 영역에서 점진적으로 특징을 추출하는 반면, ViT는 전체 이미지에서 중요한 패치들을 한 번에 비교하고 학습함.

 

장점 (Advantage):

  1. Self-Attention을 활용해 장거리 의존성(Long-Range Dependency)을 잘 포착할 수 있음.
    • CNN은 국소적 특징을 먼저 학습하고 점진적으로 넓혀가지만,
    • ViT는 한 번의 Self-Attention 연산으로 이미지 전체의 패치 관계를 학습할 수 있음.
  2. 사전 훈련을 잘 활용하면 SOTA 성능을 달성할 수 있음.
    • 특히 대규모 데이터셋(JFT-300M 등)에서 사전 훈련을 수행하면, 기존 ResNet 기반 모델을 능가하는 성능을 보임.
  3. 아키텍처가 확장 가능(Scalable)함.
    • ViT는 NLP에서 쓰이던 Transformer 구조를 거의 그대로 가져오므로,
    • 하드웨어 성능이 좋아질수록 더 큰 모델을 효과적으로 훈련할 수 있음.

단점 (Disadvantage):

  1. 대규모 데이터가 필요함.
    • CNN은 이미지의 공간적 특징을 활용하는 구조적 편향(inductive bias)이 있어서 적은 데이터로도 잘 학습할 수 있음.
    • 하지만 ViT는 이런 구조적 편향이 거의 없어서, 충분한 데이터를 주지 않으면 학습이 어렵고 과적합(overfitting)될 가능성이 큼.
  2. 연산량이 많고 메모리 사용량이 높음.
    • Transformer는 모든 패치 간 관계를 연산하기 때문에, 패치 개수(즉, 해상도)가 증가할수록 연산량이 기하급수적으로 증가함.
    • 따라서, CNN보다 훨씬 높은 메모리 사용량이 요구됨.
  3. 작은 데이터셋에서는 성능이 저하될 가능성이 있음.
    • 작은 데이터에서는 CNN이 더 유리할 수 있음(예: ImageNet에서 ResNet이 ViT보다 성능이 더 좋을 수도 있음).

 

코드단에서 실습해볼 수 있는말을 조금 더 디테일하게 알고싶어서 GPT의 도움을 받았다.

실제로 구현하고 학습시켜보거나 추론을 수행해본다는것을 의미한다고 한다.

 

제공된 코드실행하고 딥러닝 프레임워크인 텐서플로우나 파이토치에서 구현해보려고 한다.

데이터 셋을 준비하고 모델학습을 실행해야하는데 간단히 돌려볼 예정이라 파인튜닝(미세조정)으로 수행하려고 한다.

 

더불어서 모델이 학습한 내용을 TEST하고 성능을 평가까지하고 논문과 결과비교와 분석정도 해볼예정이다.

 


실습을 위한 추천 방법

Google Research의 공식 ViT 코드 사용

  • Google에서 공개한 ViT 구현이 있으니, 이를 직접 실행하면서 논문을 이해하는 것이 좋아!
  • GitHub Repo

google-research/vision_transformer

 

GitHub - google-research/vision_transformer

Contribute to google-research/vision_transformer development by creating an account on GitHub.

github.com

 

Hugging Face에서 제공하는 ViT 모델 활용

PyTorch / TensorFlow로 직접 구현

  • 논문의 수식을 보고 직접 ViT 모델을 PyTorch나 TensorFlow로 구현해보는 것도 좋은 실습 방법.

나는 그동안 해왔던 익숙한 Colab에서 실습을 하려고한다.

허깅페이스 ViT모델을 이용해서 실습을 한다면 빠르게 실습이 가능하다고 한다.

다만 대규모 데이터셋인 (ImageNet)으로 직접 학습하는것은 어렵고, 큰 모델(ViT-L, ViT-H)은 실행이 어려울수도 있다고 했다. (당연!)

그래서 나는 작은 모델로 진행하려고한다.


나는 이전에 탐지하지 못했던 한계점을 뚫어보려고 한다.

https://so-fast.tistory.com/entry/YOLO%EC%9D%98-%ED%95%9C%EA%B3%84%EC%A0%90-%EC%8B%A4%ED%97%98-%EB%B0%8F-%EB%B6%84%EC%84%9D-%EC%9E%91%EC%9D%80%EA%B0%9D%EC%B2%B4%ED%83%90%EC%A7%80%EC%99%80-%EA%B3%B5%EA%B0%84%EC%A0%81-%EC%A0%9C%EC%95%BD

 

YOLO의 한계점 실험 및 분석 - 작은객체탐지와 공간적 제약

1. 실험배경 · 목적실험배경 : yolo논문에서 제시된 한계점이 실질적 영향을  확인하고자 하였습니다.목적 : yolo의 한계점인 작은객체 탐지와 공간적 제약을 실험적으로 분석하고 개선 가능성을

so-fast.tistory.com

 

 

지난 한계점 실험에서 한계를 보여주었던 사진 1장을 가지고 확인해보려고 합니다.

 

일단 허깅페이스에서 사전 학습된 ViT모델을 사용하여 해당 객체를 분류할 수 있는지 테스트를 해보려고 한다.

YOLO가 탐지하지 못했던 사진의 ViT의 성능을 비교하려고 합니다.

 


from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image
import requests
import torch

# YOLO에서 탐지하지 못한 이미지 불러오기
image_path = "/content/DOG_HORSE.jpg"  # YOLO에서 인식하지 못한 이미지
image = Image.open(image_path)

# ViT 모델 로드
feature_extractor = ViTFeatureExtractor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")

# 이미지 전처리
inputs = feature_extractor(images=image, return_tensors="pt")

# 모델 예측
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits
    predicted_class = logits.argmax(-1).item()

print(f"ViT Predicted class: {predicted_class}")

 

결과는 CLASS 912가 나왔다 

여기서 제공하는 데이터셋은 1000개 클래스가 있는데 그 중에 912번째 라벨이라는건데

진짜 새가 맞는지 확인해보려고 한다.

# 모델의 라벨 정보를 불러오기
id2label = model.config.id2label

# 예측된 클래스 라벨 출력
predicted_class = 912
print(f"Class {predicted_class}: {id2label[predicted_class]}")

Class 912: worm fence, snake fence, snake-rail fence, Virginia fence 가

결과로 나온다.

 

사실 여기에 뱀은 전혀없는데 왜 worm fence라고 예측을 했을지 생각을 해보았다.

 

gpt4o가 예측한 답은 

1. ImageNet-1K로 사전학습된 ViT모델이기때문이다.

2. ViT가 물체 자체보다 배경을 더 중요하게 봤다.

 

2번도 신빙성이 있는것이 사람이 아니라 기계이기때문에  면적이 넓은 배경과 울타리에 어텐션값이 높았을 수 있다.

 

모델 예측도 높이기

 

 

일단 ViT를 말과 강아지 분류에 좀 더 적합한 데이터로 파인튜닝을 해보려고 한다.

 

방법1)

DOG랑 HORSE만 포함된 데이터셋으로 파인튜닝해보려고하는데 Pytorch나 hugging Face에서 파인튜닝 코드를 실행하면 된다고 한다.

 

방법2)

ViT의 예측을 TOP-5로 확인해보기

: ViT는 가장 확률이 높은 1개만 출력 되고있는데 TOP5를 봐서 강아지나 말이 있는지 확인해보려고했다.

더보기
# 예측 결과를 정렬해서 상위 5개 출력
sorted_indices = logits[0].argsort(descending=True)[:5]

# 상위 5개 클래스 출력
for i in sorted_indices:
    label = model.config.id2label[i.item()]
    print(f"Class {i.item()}: {label}")

 

Class 912: worm fence, snake fence, snake-rail fence, Virginia fence
Class 339: sorrel
Class 263: Pembroke, Pembroke Welsh corgi
Class 264: Cardigan, Cardigan Welsh corgi
Class 273: dingo, warrigal, warragal, Canis dingo


 

직접적으로 예측하지 못하는 것을 확인할 수 있고, 약간 강아지 종류를 Dingo, Corgi 등으로 예측한것같다.

좀 더 상위로예측한것으로 보인다.


모델변경 |  ViT-Base ▶ViT-Large

지금은 ViT-Base로 작은 모델을 사용하니까...

더 큰 모델 Large모델로 사용해볼까? 라는생각이 문들 들었다. gpu를 사용하더라도 일단 예측해보고싶어서 해보려고 한다.

더보기
from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image
import requests
import torch

# YOLO에서 탐지하지 못한 이미지 불러오기
image_path = "/content/DOG_HORSE.jpg"  # YOLO에서 인식하지 못한 이미지
image = Image.open(image_path)

# ViT 모델 로드
# feature_extractor = ViTFeatureExtractor.from_pretrained("google/vit-base-patch16-224")
# model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-large-patch16-224")
feature_extractor = ViTFeatureExtractor.from_pretrained("google/vit-large-patch16-224")


# 이미지 전처리
inputs = feature_extractor(images=image, return_tensors="pt")

# 모델 예측
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits
    predicted_class = logits.argmax(-1).item()

print(f"ViT Predicted class: {predicted_class}")

#모델의 라벨정보 확인
id2label = model.config.id2label

# 예측된 클래스 라벨 출력
predicted_class = 231
print(f"Class {predicted_class}: {id2label[predicted_class]}")

 

그래서 출력해보니 클래스가 변경되었다. 231로 변경되었고 collie가 나왔다.

 

 

오? 맞추었다.

 

이어서 예측 결과중 상위 5개를 출력해보았는데


Class 231: collie
Class 912: worm fence, snake fence, snake-rail fence, Virginia fence
Class 230: Shetland sheepdog, Shetland sheep dog, Shetland
Class 339: sorrel
Class 263: Pembroke, Pembroke Welsh corgi


비슷하지만 다르게 나왔다 일단 상위 1위가 collie로 잘 예측한것을 볼 수 있으나

horse를 예측하지는 못하는것을 볼 수 있다.

 

그래서

다음은 ViT모델을 말과 강아지로 분류할 수 있도록 Fine-tuning하는 방법으로 진행해보려고한다.