ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PyTorch] 파이토치 transforms 모듈로 이미지 전처리하기 (torchvision)
    Python/딥러닝 2023. 10. 17. 16:50
    반응형

    파이토치의 transforms 모듈을 이용한 이미지 전처리 알아보기 (torchvision)


    파이썬(Python)으로 기계학습(Machine Learning, ML)을 하다 보면, 이미지 데이터를 변환할 때가 생깁니다. 사람은 이미지를 지나치게 확대-축소하지만 않으면 이미지들의 인식과 구분이 가능하지만, 컴퓨터는 같은 이미지라도 크기와 방향 등이 달라지면 다른 이미지로 인식할 수도 있기 때문이지요.

     

     

    그런데, 우리가 가지고 있는 이미지는 촬영 상황이나 기기, 그리고 배포하는 사람에 따라서 다양한 형태로 주어집니다. 그래서 파이썬 기계학습 모델의 이미지 학습을 할 경우, 이미지의 전처리가 꼭 필요하지요. 이번에는 파이토치의 transforms 모듈을 이용한 이미지 전처리를 알아보겠습니다.

     

     

    transforms.Compose


    파이토치 프로젝트에는 torchvision이라는 패키지가 있습니다. 이건 이미지와 관련된 모듈을 포함하고 있는데요, 이 중에서 transforms 모듈을 이용하면 손쉽게 이미지 조절이 가능합니다. 자주 쓰이는 몇 가지 기능을 보여드리겠습니다.

     

     

    만약, 이미지 크기를 조절하고 싶다면 Resize 기능을 이용할 수 있습니다. 가로 세로 픽셀값만 입력해 주면 어떤 이미지가 주어지더라도 지정된 크기로 변환되는데요, 이 기능은 아래 코드로 구현할 수 있습니다.

     

     

    # 패키지 및 이미지 불러오기
    from torchvision import transforms
    from PIL import Image
    import os
    
    img = Image.open('./fig/tabbycat.jpg')
    print(img.size)  # 1280*853px 크기의 이미지
    (1280, 853)

     

    img

     

     

    transforms.Resize


    transforms.Resize 기능을 이용하면 이미지 크기 조절을 할 수 있습니다. 이 때, 자유롭게 크기 조절을 할 수 있지만 이미지의 비율은 유지되지 않는다는 점 참고해 주세요. 한번 원하는 해상도로 초기화를 해 놓으면, 이후로는 해당 클래스를 이용해서 대량의 이미지를 한꺼번에 전처리할 수 있습니다.

     

     

    # 128*128px로 이미지 크기 변경
    resize = transforms.Compose([transforms.Resize(size=(128,128))])
    print(resize(img).size)
    (128, 128)

     

    resize(img)

     

     

    transforms.RandomVerticalFlip & RandomHorizontalFlip


    transforms.RandomVerticalFlip 및 RandomHorizontalFlip 기능을 이용하면 각각 이미지를 좌우 또는 상하반전을 시킬 수 있습니다. 그런데, 여기에는 특이한 구석이 하나 있는데 바로 일정 확률로 좌우 또는 상하반전을 할 수 있다는 점입니다. 매개변수 중 p를 원하는 확률로 지정(1.0을 100%로 합니다)하면 됩니다. 이 기능은 학습 데이터가 부족하거나 이미지의 방향에 의존하지 않는 학습을 원할 때 유용하게 사용할 수 있습니다.

     

     

    flip = transforms.Compose([transforms.Resize(size=(128,128)), 
                               transforms.RandomVerticalFlip(p=1)])
    flip(img)

     

     

    flip = transforms.Compose([transforms.Resize(size=(128,128)), 
                               transforms.RandomVerticalFlip(p=1),
                               transforms.RandomHorizontalFlip(p=1)])
    flip(img)

     

     

    transforms.ToTensor


    transforms.ToTensor는 이미지 형태의 데이터를 파이토치 tensor 형태로 변형해 주는 기능입니다. 원래 파이썬에서 이미지는 각 색상별로 밝기를 0~255 사이에서 표현하는 array 형태인데, 이를 기계학습에 적합한 0~1 범위로 조절하는 기능이지요. 이 기능을 이용하면 파이썬에서 이미지 대상 기계학습을 할 때, 스케일링(scaling) 절차를 대체할 수 있는 편리함이 있습니다.

     

     

    tensor = transforms.Compose([transforms.Resize(size=(128,128)), 
                               transforms.RandomVerticalFlip(p=1),
                               transforms.RandomHorizontalFlip(p=1),
                               transforms.ToTensor()])
    
    print(tensor(img))
    tensor([[[0.3255, 0.3098, 0.3725,  ..., 0.7137, 0.7412, 0.7216],
             [0.2941, 0.3412, 0.3725,  ..., 0.6863, 0.7020, 0.7059],
             [0.3020, 0.3333, 0.3412,  ..., 0.6941, 0.6980, 0.7098],
             ...,
             [0.0078, 0.0039, 0.0078,  ..., 0.2863, 0.2863, 0.2941],
             [0.0078, 0.0078, 0.0039,  ..., 0.3020, 0.3020, 0.3294],
             [0.0706, 0.0353, 0.0000,  ..., 0.3098, 0.3137, 0.3294]],
    
            [[0.3412, 0.3294, 0.4000,  ..., 0.7373, 0.7647, 0.7451],
             [0.3098, 0.3647, 0.3961,  ..., 0.7098, 0.7216, 0.7255],
             [0.3216, 0.3529, 0.3608,  ..., 0.7137, 0.7098, 0.7216],
             ...,
             [0.2588, 0.1686, 0.0667,  ..., 0.2863, 0.2863, 0.2941],
             [0.2471, 0.1294, 0.0078,  ..., 0.3020, 0.3020, 0.3294],
             [0.3020, 0.1725, 0.0078,  ..., 0.3098, 0.3137, 0.3294]],
    
            [[0.3490, 0.3412, 0.4000,  ..., 0.7373, 0.7647, 0.7451],
             [0.3216, 0.3686, 0.3961,  ..., 0.7098, 0.7255, 0.7255],
             [0.3255, 0.3608, 0.3686,  ..., 0.7137, 0.7137, 0.7294],
             ...,
             [0.3686, 0.2784, 0.1137,  ..., 0.2863, 0.2863, 0.2941],
             [0.3569, 0.2235, 0.0275,  ..., 0.3020, 0.3020, 0.3294],
             [0.3765, 0.2353, 0.0196,  ..., 0.3098, 0.3137, 0.3294]]])
    반응형

    댓글

문의: jwkang3929@naver.com