강
[Python] Imagenet grayscale to rgb channel 처리 본문
AWS S3에 있는 Imagenet validation dataset 50000개를 가지고 추론 작업을 해보고 있었다.
작업을 위한 코드는 다음과 같다.
img = read_image_from_s3(file) # s3에서 image를 가져오는 함수
img = img.resize((224, 224), Image.ANTIALIAS) # file의 가로, 세로를 224x224로 resize
img = np.array(img) # 이미지를 numpy type으로 변경
img = img.reshape((1, img.shape[0], img.shape[1], img.shape[2])) # batch size를 추가
위의 코드를 이미지의 개수만큼 반복을 하여 image 전처리를 진행한다. 정상적으로 진행 되는 이미지도 있었지만 에러가 발생하는 이미지도 있었다.
img.reshape을 하는 부분에서 "tuple index out of range" 라는 에러가 발생했다.
우선 잘 진행되었던 이미지와 문제의 이미지의 img.shape을 비교해보았다.
잘 진행이 되었던 이미지는 rgb값이 포함된 (224, 224, 3)로 channel3의 형태를 가지고 있었으나 에러가 발생했던 이미지는 (224, 224)의 형태를 가지고 있었다. 즉 rgb 값이 포함되지 않은 channel 1의 형태였던 것이다.
imagenet의 데이터중 "Airedale.JPEG"라는 데이터가 문제가 되었던 이미지 중 하다였다. 열어보니 grayscale(흑백)의 형태의 이미지 였다.
따라서 문제를 해결하려면 해당 이미지가 rgb 값을 표현할 수 있도록 shape을 바꾸어 주어야 한다.
문제를 해결한 코드는 다음과 같다.
img = read_image_from_s3(file)
img = img.resize((224, 224), Image.ANTIALIAS)
img = np.array(img)
if len(img.shape) != 3: # grayscale image일 경우
img = np.repeat(img[..., np.newaxis], 3, -1) # np.repeat 함수를 이용해 3차원의 형태로 변경
img = img.reshape((1, img.shape[0], img.shape[1], img.shape[2]))
img.shape의 길이가 grayscale의 경우 2일 것이다 따라서 if문으로 구별해주었다. 그다음 데이터 정보를 channel 3으로 변경해주어 rgb 이미지 포멧과 같게 해주었다.
참조
'Python' 카테고리의 다른 글
Slack ChatGPT 연동하기 (19) | 2023.01.28 |
---|---|
[Python] numpy to list 소수점 값이 다른 현상 해결 (0) | 2021.10.17 |
[Python] pip install Killed 해결 (0) | 2021.10.13 |
[python] requirements.txt pip freeze 가상환경으로 정리 (2) | 2021.10.06 |
Comments