[Python] Imagenet grayscale to rgb channel 처리 본문

Python

[Python] Imagenet grayscale to rgb channel 처리

최재강 2021. 10. 26. 15:03

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 이미지 포멧과 같게 해주었다.

 

참조

Comments