Carvana Screenshot

Kaggle에서 Image Sementation 관련 Competition이 열렸다. 재밌을 것 같다.

데이터를 살펴보자. car origin 그림 1. 원본 이미지 car masked 그림 2. 마스크 이미지

img rle_mask
00087a6bd4dc_03.jpg 864300 9 866217 13 868134 15 …

표 1. 마스크 csv

데이터는 그림1, 그림2, 표1과 같이 원본 이미지와 마스크 이미지, 마스크 csv로 구성되어 있다. 마스크 csv는 원본 이미지 파일 이름과 (position, num of pixel) (position, num of pixel) (position, num of pixel) … 형식으로 되어있다. position은 이미지를 흑백으로 변환하고 1D로 변환한뒤의 position이다. 이런 표현방식은 당연히 submission을 위한 압축을 위해 사용하는 것이다.


Kaggle - Carvana Image Masking Challenge

Research data

train_img_path = "./data/train"
image_list = MultiImageReader(train_img_path,)
img = image_list.__iter__().__next__()
plt.imshow(img[0])

png

맥북에서 테스트하고 있는데 학습데이터 이미지만 5022개다. 맥북에 한번에 메모리에 올리기에는 너무 양이 많다. generater을 사용하여 memory-friendly한 이미지 리더를 만들었다. 한번 iteration 할때마다 batch_size만큼의 이미지를 읽어온다.

class MultiImageReader(object):
    def __init__(self, base_path, batch_size=50):
        self.base_path = base_path
        self.batch_size = batch_size 
        
    def __iter__(self):
        train_img_path_list = [ os.path.join(train_img_path, img_name)
                for img_name in os.listdir(train_img_path)
                if img_name.endswith('.jpg')
            ]
        buff = []
        for i, file_path in enumerate(train_img_path_list):
            buff.append(imread(file_path))
            if (i+1) % self.batch_size == 0:
                yield buff
                buff = []

Calculate Mean Image

sum_i = 0
img_mean = 0
image_list = MultiImageReader(train_img_path,)
for i, img_batch in enumerate(image_list):
    sum_i += 1
    img_batch_mean = np.mean(img_batch, axis=0)
    img_mean = img_mean*((sum_i-1)/sum_i) + img_batch_mean *(1/sum_i)
plt.imshow(img_mean.astype(np.int16))
np.save("data/img_mean.npy", img_mean)

del image_list

Calculate Std Image

sum_i = 0
img_var = 0
image_list = MultiImageReader(train_img_path,)
for i, img_batch in enumerate(image_list):
    sum_i += 1
    img_batch_np = np.array(image_batch, dtype=np.float64)
    
    img_batch_square_sum = np.mean((img_batch_np - img_mean)*(img_batch_np - img_mean), axis=0)
    
    img_var = img_var *((sum_i-1)/sum_i) + img_batch_square_sum * (1/sum_i)
    
img_std = np.sqrt(img_var)
plt.imshow(img_std.astype(np.int16))
np.save("data/img_std.npy", img_std)

del image_list

작성중 …