게시글 본문내용
|
|
다음검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import torch from PIL import Image import matplotlib.pyplot as plt import torchvision.transforms as transforms import numpy as np import cv2 import time import os class_label = ['cat', 'dog'] # load pth model model = torch.load(r"C:\Users\2\minseo\work\dataset1\output\model.pth", weights_only=False) # set model to inference mode model.eval() # print(model) transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) #os 패키지로 호출 test_dir = r"C:\Users\2\minseo\work\dataset1\test" os.chdir(test_dir) list = os.listdir(test_dir) file_num = 20 acc_num = 0 all_img = plt.figure() rows = 4 cols = 5 number = 0 for file in list: start_time = time.time() print(file) test_image = Image.open(file) img = transform(test_image) print(img.shape) img = img.to('cuda') with torch.no_grad(): pred = model(img.unsqueeze(0)) print(pred) y_pred = torch.argmax(pred) print(y_pred) print(class_label[y_pred]) using_time = time.time() - start_time print(f"using_time : {using_time}") if 'cat' in file and class_label[y_pred] == 'cat': acc_num = acc_num + 1 elif 'dog' in file and class_label[y_pred] == 'dog': acc_num = acc_num + 1 number += 1 sub = all_img.add_subplot(rows, cols, number) sub.set_title(file) sub.imshow(test_image) sub.set_xlabel('y_pred : ' + class_label[y_pred]) sub.set_xticks([]), sub.set_yticks([]) sub.text(0,100,class_label[y_pred]+':'+f'{pred[0][y_pred]:.3f}',size=15,color='red') plt.show() print(f"right_result : {acc_num}") print(f'acc : {acc_num / file_num}') | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | import os from torchvision import datasets dataset = datasets.MNIST(root=r"D:\work\Pytorch\mnist", download=False) for i in range(10): os.makedirs(f"{i}", exist_ok=True) for idx, (img, label) in enumerate(dataset): img_rgb = img.convert('RGB') label_dir = str(label) img_rgb.save(os.path.join(label_dir, '{:05d}.jpg'.format(idx))) | cs |
1 2 3 | import splitfolders splitfolders.ratio(r"D:\work\Pytorch\mnist\MNIST_FINAL", output=r"D:\work\Pytorch\mnist\tt", seed=42, ratio=(.8, .2)) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import torch from PIL import Image import matplotlib.pyplot as plt import torchvision.transforms as transforms import cv2 import os class_label = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # load pth model model = torch.load(r'C:\Users\2\minseo\work\MNIST_TEST\output\model.pth') # set model to inference mode model.eval() #print(model) test_image_name = r"C:\Users\2\minseo\work\MNIST_TEST\2.jpg" # check test image test_image = Image.open(test_image_name) plt.figure(figsize=(5,5)) plt.imshow(test_image) #plt.show() # apply transform to test image transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) img = transform(test_image) #print(img.shape) #plt.figure(figsize=(5,5)) #plt.imshow(img.permute(1, 2, 0)) #plt.show() with torch.no_grad(): pred = model(img.unsqueeze(0).cuda()) print(pred) y_pred = torch.argmax(pred) print(y_pred) #print(class_label[y_pred]) plt.text(0,-10,class_label[y_pred]+':'+f'{pred[0][y_pred]:.4f}',size=20,color='blue') plt.xticks([]) plt.yticks([]) plt.show() | cs |
추가 작성 내용
1. 파이토치 예제에서 사용한 증식방법이 무언인지 찾아서 설명하라.
1 2 3 4 5 6 7 8 | 'train': transforms.Compose([ # 데이터 증강 적용 transforms.RandomAffine(degrees=20, translate=(0.1,0.1), scale=(0.9, 1.1)), # 랜덤 회전, 이동, 확대/축소 transforms.ColorJitter(brightness=0.2, contrast=0.2), # 밝기 및 대비 조정 transforms.Resize((224,224)), # 이미지 크기 조정 transforms.ToTensor(), # 텐서 변환 ]), | cs |
2. 증식을 사용하려면 변환해야 하는 부분
아래 코드는 기존 코드에서 진행한 classification의 train.py 내에 있는 증식 사용한 부분
위 코드에서 사용할 때 presets에서 가지고 오는 걸 확인할 수 있음
classification에 presets.py 코드 내부에 보면 증식 사용하는 함수를 정의한 걸 볼 수 있음
- presets.py 코드에서 수정하거나 위의 train.py에서 함수 호출을 안하면 됨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import torch from torchvision.transforms.functional import InterpolationMode def get_module(use_v2): # We need a protected import to avoid the V2 warning in case just V1 is used if use_v2: import torchvision.transforms.v2 return torchvision.transforms.v2 else: import torchvision.transforms return torchvision.transforms class ClassificationPresetTrain: # Note: this transform assumes that the input to forward() are always PIL # images, regardless of the backend parameter. We may change that in the # future though, if we change the output type from the dataset. def __init__( self, *, crop_size, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), interpolation=InterpolationMode.BILINEAR, hflip_prob=0.5, auto_augment_policy=None, ra_magnitude=9, augmix_severity=3, random_erase_prob=0.0, backend="pil", use_v2=False, ): T = get_module(use_v2) transforms = [] backend = backend.lower() if backend == "tensor": transforms.append(T.PILToTensor()) elif backend != "pil": raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}") transforms.append(T.RandomResizedCrop(crop_size, interpolation=interpolation, antialias=True)) if hflip_prob > 0: transforms.append(T.RandomHorizontalFlip(hflip_prob)) if auto_augment_policy is not None: if auto_augment_policy == "ra": transforms.append(T.RandAugment(interpolation=interpolation, magnitude=ra_magnitude)) elif auto_augment_policy == "ta_wide": transforms.append(T.TrivialAugmentWide(interpolation=interpolation)) elif auto_augment_policy == "augmix": transforms.append(T.AugMix(interpolation=interpolation, severity=augmix_severity)) else: aa_policy = T.AutoAugmentPolicy(auto_augment_policy) transforms.append(T.AutoAugment(policy=aa_policy, interpolation=interpolation)) if backend == "pil": transforms.append(T.PILToTensor()) transforms.extend( [ T.ToDtype(torch.float, scale=True) if use_v2 else T.ConvertImageDtype(torch.float), T.Normalize(mean=mean, std=std), ] ) if random_erase_prob > 0: transforms.append(T.RandomErasing(p=random_erase_prob)) if use_v2: transforms.append(T.ToPureTensor()) self.transforms = T.Compose(transforms) def __call__(self, img): return self.transforms(img) class ClassificationPresetEval: def __init__( self, *, crop_size, resize_size=256, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), interpolation=InterpolationMode.BILINEAR, backend="pil", use_v2=False, ): T = get_module(use_v2) transforms = [] backend = backend.lower() if backend == "tensor": transforms.append(T.PILToTensor()) elif backend != "pil": raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}") transforms += [ T.Resize(resize_size, interpolation=interpolation, antialias=True), T.CenterCrop(crop_size), ] if backend == "pil": transforms.append(T.PILToTensor()) transforms += [ T.ToDtype(torch.float, scale=True) if use_v2 else T.ConvertImageDtype(torch.float), T.Normalize(mean=mean, std=std), ] if use_v2: transforms.append(T.ToPureTensor()) self.transforms = T.Compose(transforms) def __call__(self, img): return self.transforms(img) | cs |
3. 예제코드에서는 검증 로스는 출력해주지 않는다. 검증로스를 추출하는 방법을 설명하라.
학습 후 평가를 진행하는 함수 -> evaluate
여기에서 임의의 변수를 지정한 뒤, 정확도 값을 업데이트 할 때 item() 함수로 값을 받아옴
def evaluate(model, criterion, data_loader, device, print_freq=100, log_suffix=""): model.eval() metric_logger = utils.MetricLogger(delimiter=" ") header = f"Test: {log_suffix}" # 평가 과정에서 사용할 변수 초기화 num_processed_samples = 0 # 처리한 샘플 개수 epoch_loss = 0 # 전체 평가 손실 epoch_acc1 = 0 # Top-1 정확도 합계 epoch_acc5 = 0 # Top-5 정확도 합계 with torch.inference_mode(): for image, target in metric_logger.log_every(data_loader, print_freq, header): image = image.to(device, non_blocking=True) target = target.to(device, non_blocking=True) # 모델의 예측값 계산 (순전파 수행) output = model(image) # 손실 함수 계산 loss = criterion(output, target) # Top-1 및 Top-5 정확도 계산 acc1, acc5 = utils.accuracy(output, target, topk=(1, 2)) # 현재 배치 크기 batch_size = image.shape[0] # 로그 업데이트 (손실 값 추가) metric_logger.update(loss=loss.item()) # 정확도 값 업데이트 metric_logger.meters["acc1"].update(acc1.item(), n=batch_size) metric_logger.meters["acc5"].update(acc5.item(), n=batch_size) # 처리한 샘플 개수 업데이트 num_processed_samples += batch_size # 손실 및 정확도 값 누적 epoch_loss += loss.item() # item() -> tensor에 하나의 값만 존재한다면, item() 함수를 사용해 텐서 형식이 아닌 값을 반환 받음 epoch_acc1 += acc1.item() epoch_acc5 += acc5.item() # 평균 손실 및 정확도 계산 (배치 개수로 나눠서 평균값 구하기) epoch_loss /= len(data_loader) epoch_acc1 /= len(data_loader) epoch_acc5 /= len(data_loader) metric_logger.synchronize_between_processes() print(f"{header} Acc@1 {epoch_acc1:.3f} Acc@5 {epoch_acc5:.3f}") # 최종 손실, Top-1 정확도, Top-5 정확도를 반환 -> 후에 실시간 검증 그래프를 그리기 위함 return epoch_loss, epoch_acc1, epoch_acc5 | cs |
첫댓글 1. 파이토치 예제에서 사용한 증식방법이 무언인지 찾아서 설명하라.
2. 증식을 추가하려면 어느 부분을 수정해야 하는지 설명하라
3. 예제코드에서는 검증 로스는 출력해주지 않는다. 검증로스를 추출하는 방법을 설명하라.
수정했습니다
@신민서 테스트 과제 다시할것 문제를 다시 읽어볼것