인프런 커뮤니티 질문&답변

anycad11님의 프로필 이미지
anycad11

작성한 질문수

처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part4]

DOGS VS CATS문제에서 흑백사진사용시

작성

·

323

0

선생님 안녕하세요.. 덕분에 파이터치문법에 대해서 이해할수 잇게 되엇습니다 ㅎㅎ

다른 여러가지강의도 들어봣는데, 가장이해하기 쉽게설명해주셔서 드디어 이해햇다라고 느끼게 해주는 강의엿습니다 ㅎㅎ

참고로 질문하나 드리겟습니다 ㅎ, 마지막강의 캐글문제 DOGS VS CATS문제인데요.. 제가 가지고 잇는 이미지파일이 흑백사진파일인데 이 흑백사진파일을 사용할때는 그냥cv2.cvtColor()로 컬러로 변환만 하고 그냥 사용하면 되는지요?

예를들어, 흑백사진을 그대로 사용하니 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])에서는 에러가 나던데....

흑백사진을 사용할때의 코드상의 변경할 부분이 따로 있는지 알고싶습니다 ㅎ

답변 부탁드리겠습니다 ㅎ

 

 

답변 1

0

안녕하세요. 답변 도우미입니다.

파이토치를 사용하는데 도움이 되어 기쁩니다.

흑백 이미지라는 것이, 데이터 포멧등이 다 다르고, 코드도 관련 코드가 여러 코드를 제공해드려서요. 다음 부분을 한번 참고만 해보시면 어떠실까 해요.

우선, OpenCV의 cv2.cvtColor() 함수를 사용해 흑백 이미지를 컬러 이미지로 변환하는 것은 가능한 방법입니다. 다만, 이 경우에는 흑백 이미지가 컬러 이미지로 변환되었을 뿐 실제로는 원래의 컬러 정보가 없기 때문에, 이 변환된 이미지를 사용해 학습하는 것이 실제 컬러 이미지를 사용하는 것보다 성능이 떨어질 수 있습니다.

다음으로, 흑백 이미지의 경우에는 채널이 1개밖에 없기 때문에, transforms.Normalize에서 mean(평균)과 std(표준편차)의 값을 각각 1개만 사용해야 합니다. 예를 들어, ImageNet의 흑백 이미지에 대한 mean과 std를 사용한다면 다음과 같이 코드를 고민해볼 수 있을 것 같습니다.

transforms.Normalize([0.485], [0.229])

 

또는 흑백 이미지를 3 채널 RGB 이미지로 변환하는 함수를 작성하고, 이를 torchvision의 transforms에 추가하는 방법도 고민해볼 수 있을 것 같습니다. 이 때 transforms.Normalize에서 평균과 표준편차는 모든 채널이 동일하게 설정되어야 합니다.

다음은 변환 함수와 흑백 이미지에 대한 데이터 로딩 부분의 수정된 코드입니다:

from torchvision import transforms
from PIL import ImageOps

# New transform to convert grayscale images to RGB
def to_rgb(image):
    return image.convert('RGB')

input_size = 224

transforms_for_train =  transforms.Compose([
        to_rgb, # Add this transform
        transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)),
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
        transforms.RandomRotation(10),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.485, 0.485], [0.229, 0.229, 0.229]) # Change these values
    ])

transforms_for_val_test = transforms.Compose([
        to_rgb, # Add this transform
        transforms.Resize(input_size),
        transforms.CenterCrop(input_size),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.485, 0.485], [0.229, 0.229, 0.229]) # Change these values
    ])

위의 코드에서 to_rgb 함수는 흑백 이미지를 3 채널 RGB 이미지로 변환하고, transforms.Normalize는 모든 채널에 대해 동일한 평균 및 표준편차를 사용합니다. 이렇게 하면 흑백 이미지를 사용할 수 있지만, 원본 데이터가 컬러 이미지로 훈련된 pretrained 모델과 같이 잘 작동할지는 보장할 수 없습니다. 가장 좋은 성능을 얻으려면 원본 데이터와 동일한 형식의 이미지를 사용하는 것이 좋습니다.

감사합니다.

anycad11님의 프로필 이미지
anycad11
질문자

선생님 너무 자세하게 답변해주셔서 너무 감사드립니다 ㅎㅎㅎ 다시한번 해 보겟습니다 ㅎ

선생님 다른 강의도 들을 예정이라서 앞으로도 잘 부탁드리겠습니다 ㅎㅎㅎ

anycad11님의 프로필 이미지
anycad11

작성한 질문수

질문하기