timm
이 제공하는 모델 중 cspdarknet53
, vit_large_patch16_384
, vit_small_patch16_224
위 3가지에 대해 모델 성능을 테스트 해봤습니다.
cspdarknet53
같은 경우는 acc 0.8이상 f1 score 0.7이상의 성능을 냈지만 다른 두 경우는 터무니없이 낮은 결과가 나왔습니다. 모델 자체의 문제가 아닌 input data 전처리를 제대로 하지 못해서 발생한 것 같고 단순히 resize만으로는 모델을 제대로 활용할 수 없는 것 같습니다.
dataloader의 이미지를 plt를 활용해 눈으로 볼 수 있습니다.
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
transform_train = transforms.Compose([
transforms.ToTensor(),
])
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=4)
이렇게 불러온 이미지는 실제로 Tensor 객체로 존재하며, 각 원소의 값이 0부터 1 사이의 값이다. 그렇기 때문에 이를 화면에 출력하고자 한다면, 이 값을 다시 0부터 255 사이의 값으로 늘려야 하는 건지 궁금할 수 있다. 다행히도 파이썬의 matplotlib는 기본적으로 0부터 1사이의 값이라고 해도 알아서 인식하여 정상적인 이미지로 출력해준다. 하지만 별도로 OpenCV 등에서 활용하고자 한다면, 추가적인 전처리가 필요할 수 있다.
또한 기본적으로 PyTorch는 이미지 데이터셋을 [Batch Size, Channel, Width, Height] 순서대로 저장하기 때문에, 이를 matplotlib로 출력하기 위해서는 각 이미지를 [Width, Height, Channel] 형태로 변경해 줄 필요가 있다. 그것은 numpy 라이브러리의 transpose() 함수를 이용하여 해결할 수 있다.
def custom_imshow(img):
img = img.numpy()
plt.imshow(np.transpose(img, (1, 2, 0)))
plt.show()
def process():
for batch_idx, (inputs, targets) in enumerate(train_loader):
custom_imshow(inputs[0])
출처: https://ndb796.tistory.com/372 [안경잡이개발자]
상세코드는 위와같고 자세한 내용은 출처를 확인
Pstage를 진행하며 부족함을 많이 느꼈습니다. 그전까지 강의들을 듣고는 있지만 제대로 이해했는가에 대해 의문이 있었는데 프로젝트를 진행하니 역시 실전 적용은 다른것을 많이 느꼈습니다. 전체적으로 도메인 지식이 부족해 모델들을 무작정 때려박아 헤딩하는 느낌으로 진행했는데 조금 더 개념을 이해하고 분석할 수 있었다면 더 좋은 성적을 낼 수 있지 않았을까 합니다. 이번 stage는 감을 잡는 느낌이었고 다음 stage에선 어떻게 시작해야되는가에 대해서는 알 수 있겠지만 지금 상태로 진행하면 결과는 큰 차이가 없을 것 같아 걱정입니다. 다음 Ustage 강의뿐만 아니라 이전 강의를 다시한번 복습하는 시간을 가져야 할 것 같습니다.