본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Book

파이토치 딥러닝 마스터 - 1부 - 2장 사전 훈련된 신경망

컴퓨터 비전은 딥러닝 발전으로 많이 영향받은 분야중 하나로 이미지 내용을 분류하고 해석하기 위한 요구사항이 존재했고 엄청난 데이터가 사용가능해졌고 마증유의 정확도로 gpu에서 번개처럼 프로그램을 돌릴 수 있게 됬다.

직접 모델을 훈련시키거나 그렇지 않거나 어찌되었든 간에 모델을 획득하고 실제 데이터로신경망을 돌리며 출력을 시각화하고 평가하는 과정에 익숙해질 필요가 있다.

오픈소스, 최근에는 연구자가 논물발표와 함께 소스코드를 공개하고 참조 데이터셋으로 모델을 훈련시켜 얻은 가중치까지 제공하는 경우가 많아졌다. 남이 훌련시킨 모델을 사용하면 매우 적은 노력으로 이미지 인식이가능한 차세대 웹서비스를 만들 수 있다.

이미지넷
스탠포드 대학에서 관리하는 1400만개의이미지세트. 대규모 영어 어휘 데이터셋인 워크넷 데이터셋 으로서 계층 관계를 지니는 명사로 레이블 되어있다.
https://image-net.org/

 

ImageNet

Mar 11 2021. ImageNet website update.

image-net.org

https://wordnet.princeton.edu/

 

WordNet

Any opinions, findings, and conclusions or recommendations expressed in this material are those of the creators of WordNet and do not necessarily reflect the views of any funding agency or Princeton University.What is WordNet?Current Status of the WordNet

wordnet.princeton.edu

https://standout.tistory.com/1769

 

ImageNet이란?: WordNet 명사개념마다 실제 이미지를 연결한 데이터셋.

ImageNet WordNet 명사개념마다 실제 이미지를 연결한 데이터셋. 2009년 Fei-Fei Li 연구팀이 구축하여 이미지 인식 기술발전에 큰 역할을 함. 컴퓨터 비전 분야에서 가장 유명하고 영향력있는 이미지 데

standout.tistory.com

 

 

ILSVRC

ILSVRC 훈련셋(Training Set)은 ILSVRC 대회에서 참가 모델을 학습시키기 위해 제공된 이미지 데이터 모음
ILSVRC 훈련셋은 120만개 이미지로 각 이미지에 클래스가 강아지같은 1000개의 명사로 레이블링 되어있다.

https://standout.tistory.com/1770

 

ILSVRC이란? : ImageNet 데이터를 이용한 이미지 인식 대회

ILSVRC이란? ImageNet Large Scale Visual Recognition Challenge ImageNet 전체는 2만 개 이상의 카테고리가 있지만, ILSVRC에서는 계산량과 평가의 편의를 위해 약 120만 장의 학습 이미지, 1000개 클래스를 선택하여

standout.tistory.com

 


약 120만장의 이미지의 학습데이터
ILSVRC 훈련셋은 120만개 이미지로 각 이미지에 클래스가 강아지같은 1000개의 명사로 레이블링 되어있다.

모델은 120만장 이미지를 보며 이사진은 '바나나다' 와 같은 정보를 학습한다. 

Golden Retriever
Persian Cat
Airliner
Sports Car
Banana...

 

 

 

딥러닝 모델은 이미지를 그대로 이해할 수없어 이미지를 숫자로 변환하며 rgb이 이미지의 경우 3개의 채널로 구성된다.

빨강(R)
초록(G)
파랑(B)

 

 


입력이미지는 전처리되어 다차원 배열 클래스인 torch.tensor 인스턴스로 변환된다. 

보통의 전처리는 아래와같다 .

이미지 크기 조정 (Resize)
중앙 자르기 (Center Crop)
Tensor 변환
정규화(Normalization)

 

 

 

 

 

만일 이미지 크기가 224*224 라면 아래 형태의 Tesor로 변환된다.

[3, 224, 224]

 

 

 

 

 

위 Tensor모델은 모델 사전훈련된 신경망에 통과시켜 각 클래스에 대해 점수를 계산한다.

모델 내부에서는 수많은 합성곱(Convolution)과 활성화 함수가 적용되어 이미지 특징을 추출된다.

output = model(input_tensor)

 

 

 


출력은 torch.tensor에 포함되어있고 요소는 해당 클래스와 관련된 점수를 대표한다. 

모델의 마지막 출력은 보통 크기 1000의 Tensor이다. 

ImageNet 분류 클래스가 1000개 이기 때문, 각 숫자는 특정 클래스에 대한 점수이다.

torch.Size([1000])

[ 0.12,
  1.45,
 -0.31,
  8.72,
 ...
]

 

 

 

 

클래스점수

고양이 2.3
9.7
자동차 -1.2
비행기 0.4

 

 

 

 

Softmax로 변환하면 전체합이 1인 확률로 변환된다 .

이중 가장 높은 점수는 가중치에 따라 가장 그럴싸한 클래스에 대응한다.

고양이 0.02
개     0.95
자동차 0.01
비행기 0.02

https://standout.tistory.com/1772

 

머신러닝/딥러닝에서의 활성화/데이터전처리: Softmax, Sigmoid, MinMaxScaler, StandardScaler

문득 머신러닝/딥러닝을 공부하는데아래의 내용이 반복해서 나오기 시작했다. 뭔가 정리가 필요하다 .0~1 사이 숫자확률정규화스케일링SigmoidSoftmaxMinMaxScaler Softmax활성화 함수(Activation Function)Sigmo

standout.tistory.com

 

 

 

토치비전 프로젝트

알렉스넷, 레즈넷, 입셉션 등 고성능 신경망 아키텍처를 볼 수 있다. 이미지넷 같은 데이터셋에도 쉽게 접근할 수 있고 파이토치로 컴퓨터 비저 애플리케이션을 빠르게 만들 수 있는 유틸리티도 제공한다. 

https://standout.tistory.com/1774

 

TorchVision : PyTorch 공식 홈페이지에서 제공하는 컴퓨터 비전 전용 라이브러리

TorchVision PyTorch 공식 홈페이지에서 제공하는 컴퓨터 비전 전용 라이브러리https://github.com/pytorch/vision?utm_source=chatgpt.com GitHub - pytorch/vision: Datasets, Transforms and Models specific to Computer VisionDatasets, Transfo

standout.tistory.com

 

 

알렉스넷

초기이미지 인식 신경망

models.AlexNet() 인스턴스를 만든다.  이후 신경망에서 순방향 전파를 수행할 수 있다. 이 경우 사실 훈련되지않는 임의의 값이 들어있어 전체 신경망을 지나 쓰레기가 나온다.  

model = models.alexnet(weights="DEFAULT") 실제로 사전학습 모델을 사용하고 ImageNet, 120만장, 1000개 클래스로 학습된 가중치를 다운로드해 랜덤가중치가 아닌 이미 학습된 가중치를 사용한다.

https://standout.tistory.com/1775

 

초기이미지 인식 신경망, AlexNet: 딥러닝의 가능성을 깨닫기 시작한 순간

AlexNet초기이미지 인식 신경망2012년 이전까지의 이미지 인식분야에서는 사람이 특징을 설계하고 머신러닝이 분류하는 구조였다. 2012년 ILSVRC에서 발표해 큰 격차로 우승, 상위 5위 테스트에서 15.4

standout.tistory.com

 

 

레즈넷 resnet101

2015년 이미지넷 분류, 인식, 측위에서 최고점수을 받은 잔차 신경망

계층 수가 101개인 컨볼루션 신경망. 잔차신경망이 만들어지기 전까지 깊은 신경망을 안정적으로 훈련시키기 매우 어려웠다. 이는 약간의 트릭으로 가능하게 만들었고 결과를 압도했다. 

models.resnet101(prereainded = True) 1000개의 카테고리로 구분한 120만개 이미지 데이터셋인 이미지넷으로 훈련시킨 인스턴스. 다운로드부터 모델을 생성하는데까지 1분이 넘게 걸릴 수있다. 하지만 알아서 4,450만개 파라미터를 최적화돈 값으로 세팅해준다. 

https://standout.tistory.com/1773

 

ResNet, 역전파를 그대로 사용하되 Residual Connection을 추가한 CNN

ResNet역전파를 그대로 사용하되 Residual Connection을 추가한 CNN 잔차연결 Resudual Connection, Skip Connection,일반 CNN이 처음부터 게속 해서 다시 배운다면 ResNet은 입력을 버리지않고 순회시 수정해야할 부

standout.tistory.com

 

 

renet 변수는 함수처럼 사용하며 하나 이상의 이미지를 입력받아 1000개의 이미지넷 클래스별 점수를만든다.  이미지는 먼저 전처리가 필요해 동일한 숫자범위안에 색상 값이 들어올 수 있도록 크기 조정이 필요하다. tochvision 모듈에서 transforms를 제공해 기본적인 전처리 함수로 빠르게 파이프라인을 만들어준다. 

입력이미지를 256*256크기로 조정하고 중심으로부터 224*224로 잘라낸 뒤 파이토치 다차원배열인 텐서 형태로 전환한다. 지정된 평균과 표준편차를 가지도록 rgb를 정규화하고 이는 훈련된 이미지형식과 일치하게 만들 기위한 작업이다. 

from torchvision import transforms

preprocess = 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]
    )
])

 

 

 

사전훈련된 여러 모델을 실제로 볼 수 있다. 

from torchvision import models

dir(models)

 

 

 

이미지 조작 모듈 필로우, 로컬 파일시스템에 있는 이미지를 바로 불러올 수 있다. 

필로우 라이브러리로 이미지를 불러와 preprocess 텐서형태로 변환하고 정규화해 CNN 입력형식에 맞게 batch차원을 추가 torch.unsqueeze, eval()모드로 설정해 resnet() 모델에 넣어 예측 점수를 출력한다.

from PIL import Image
import torch
from torchvision import models

# 이미지 로드
img = Image.open("../data/plch2/bobby.jpg")

img.show()

# 전처리 적용
img_t = preprocess(img)

# 배치 차원 추가
batch_t = torch.unsqueeze(img_t, 0)

# 모델 로드
resnet = models.resnet18(pretrained=True)
resnet.eval()

# 추론
out = resnet(batch_t)

print(out)

 

 

 

이미지넷 데이터 클래스에 대한 1000개의 레이블이 담긴 파일읽어보기

with open ('../data/plch2/imagnet_classes.txt') as f: labels = [line.strip() for line in f.readlines()]

 

 

out 텐서에서 가장 높은 점수에 대응하는 색인 찾기

_, index = torch.max(out, 1)

 

 

 

직전에 출력한 인덱스에 정수를 얻기위해 index[0]을 사용하며 출력을 [0,1] 사이의 값으로 정규화하고 전체 합으로 나누기 위해 torch.nn.functional.softmax 를 사용한다. 이로 나torch.nn.예측에 대한 신뢰도와 거의 비슷하다. 

모델은 입력 이미지가 골든리트리버일 확률이 96%라고 확신한다.

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index[0]], percentage[index[0]].item()

 

 

 

모델은 여러 점수를 출력함으로 두번째 세번째 등의 결과도 알아낼 수 있다.  이를 위해 sort 함수를 쓸 수 있다.

_, indices = torch.sort(out, descending = True) 
[(labels[idx], percentage[idx], item()) for idx in indices[0][:5]]

 

 

 

출력값을 확인해보자. 네가지 결과는 강아지, 다섯번째는 테니스공이다. 강아지와 같이 있는 이미지가 굉장히 많기 때문인듯한데 인간과 신경망이 사물을 바라보는 근본적인 차이를 알 수 있다. 동시에 이상하거나 기이한 값을 슬쩍 끼워넣기도 얼마나 쉬운지 알 수 있다.

[('golden retriever', 96...),
('Labrador retriever', 2.80),
('cocker spaniel, English cocker spaniel, coer', 2.82)
('redbone', 0.20...)
('tennis ball', 0.11..)
]

 

 

 

 

 

 

이 resNet과 닮은 신경망이 있다면 GAN/CycleGAN이다. 

전차학습, 즉 함수를 직접 새로 만드는 것이 아니라 기존 입력을 기준으로 변화량을 학습한다. 

특히 CycleGAN은 특히 ResNet이랑 더 직접적으로 강하게 연결되는데 변환함수가 정보를 크게 파괴하지않고 복원 가능한 수준의 변화만 하기 때문이다 .

https://standout.tistory.com/1773

 

ResNet, 역전파를 그대로 사용하되 Residual Connection을 추가한 CNN

ResNet역전파를 그대로 사용하되 Residual Connection을 추가한 CNN 잔차연결 Resudual Connection, Skip Connection,일반 CNN이 처음부터 게속 해서 다시 배운다면 ResNet은 입력을 버리지않고 순회시 수정해야할 부

standout.tistory.com

 

 

 

 

 

GAN게임

생성적 적대 신경망 Generative adversarial network

GAN은 최근 딥러닝 연구중 가장 독창적인 결과물중 하나

용어의 순서대로 만들어지고 서로 더 뛰어나기 위해 결쟁하는 adverserial network 신경망이다. 

 

사이클 GAN

훈련셋에서 매칭된 쌍을 제공하지않아도 도메인에 대한 이미지를 다른 도메인으로 바꿔준다.

말 사진을 얼룩말로 만들거나 얼룩말을 말사진으로 만들거나.

다른 이미지 분포값을 가진 그림에서 시작해 목표에 맞는 이미지 분포값과 일치하는 이미지를 만들도록 학습한다. 여기서 생성자와 식별자 또한 있다. 두 식별자 신경망은 모두 속일때까지 훈련하는 사이클 GAN.

각도가 동일한 말과 얼룩말 사진이 필요하지않다는 점이 재미있다. 서로 관련없는 말과 얼룩말 이미지 모음만으로 충분히 생성자가 학습을 하고 이는 지도학습 설정과 그 불편함을 뛰어넘는다. 

사이클 GAN 신경망은 이미지넷 데이터셋에 있는 말과 얼룩말 이미지로 훈련된 상태이다. 신경망은 이미지의 다른 부분을 최대한 건들이지 않으며 말 사진을 얼룩말 사진으로 바꾸도록 학습한다. 이 는 인류가 수천년동안 숨죽여 기다려왔다.

ResNetGenerator()를 만들어 말과 얼룩말 사진으로 학습된 모델을 가져와 eval(), 정확한 형태와 크기를 가지도록 transforms.Compose(), img를 open해본뒤 preprogress() 전처리 후 batch_t = torch.unsqueeze , batch_t 전달. 그리고 이미지로 변환해 출력해보면 말 사진이 얼룩말로 포토샵하듯 바뀌어있다.  이런 모델은 앞으로 여러 창작과정을 돕는 미래 지향적인 도구로 사용될 것이다. 

https://standout.tistory.com/1791

 

상대적 적대신경망 GAN게임 & 순환 일관성이 보장되는 포토샵신경망 사이클 GAN

앞서 resNet은 출력을 처음부터 만드는게 아닌 입력에서 얼마나 수정할지만 학습하는 잔차학습이라했다 .https://standout.tistory.com/1773 ResNet, 역전파를 그대로 사용하되 Residual Connection을 추가한 CNNResN

standout.tistory.com

 

 

 

 

뉴럴토크

data 디렉토리에 이미지 몇개를 놓고 스크립트를 실행하면 이미지에 대해 설명한다. 앞선 말사진을 올리면 잘 설명하나 변환된 얼룩말을 탄 사람사진을 보고는 얼룩말을 두마리 이상일것이라고 예상했다. 얼룩말에 탄 인간을 본적이 없기때문이라 유추되는데 불가능한 상황을 적어도 주제를 제대로 파악할 정도로 충분히 유연한 인식이 가능해졌다는 점을 이해해보자. 

https://standout.tistory.com/1792

 

뉴럴토크 NeuralTalk: 이미지를 보고 문장으로 설명을 생성하는 모델

앞선 GAN은 생성모델으로 진짜같은 이미지를 생성하는 모델이라고 했다 .그러면 이 이미지가 가짜인지 혹은 이 엉터리 그림들이 어떤 그림인지 설명하는 모델도 있을까? 있다!Neural Talk은 이미지

standout.tistory.com

 

 

토치허브 Torch Hub

PyTorch란 딥러닝 모델을 만들고 학습시키기 위한 파이썬 라이브러리라 했다. 

Torch Hub는 다른 사람이 만든 모델을 쉽게 가져다 쓰기 위한 시스템으로 원래 딥러닝 모델은 코드따로, 학습된 가중치.pth 따로 실행방법 따로 남이 만든 모델 쓰기 너무 불편했다 .

Torch Hub는 github  깃허브 저장소 최상위 디렉토리에 “이 모델 이렇게 로드하세요” 설명서인 hubconf.py파일을 실행해 빠르게 모델을 쓸수있도록 도와주는 기능이다. 

사용자 코드 - torch.hub.load() - girhub repo 다운 - hubconf.실행 - model+weight 로드 - pytorch 모델 반환!

 

 

 

현재 교재를 작성하는 기준으로는 다소 생소하고 공개되는 모델이 많지않다. 

https://pytorch.org/hub/

 

PyTorch HubFor Researchers – PyTorch

Explore and extend models from the latest cutting edge research. Discover and publish models to a pre-trained model repository designed for research exploration. Check out the models for Researchers, or learn How It Works. Contribute Models. *This is a

pytorch.org