I am doing a semantic segmentation project. And since I have an imbalanced class, I should be using weighted cross entropy. I had never used this kind of method ever and according to the forums and articles I’ve read, most of the people using weighted cross entropy knows their class distribution just like in this thread: Weights in weighted loss (nn.CrossEntropyLoss) - PyTorch Forums
Now, I would like to know the class distribution in my dataset too. This is how I generated my dataset:
def getClassName(classID, cats):
for i in range(len(cats)):
if cats[i]['id']==classID:
return cats[i]['name']
return None
def getImage(imageObj, img_folder, input_image_size):
# Read and normalize an image
dataset_img = io.imread(img_folder + '/' + imageObj['file_name'])/255.0
# Resize
dataset_img = cv2.resize(dataset_img, input_image_size)
if (len(dataset_img.shape)==3 and dataset_img.shape[2]==3): # If it is a RGB 3 channel image
return dataset_img
else: # To handle a black and white image, increase dimensions to 3
stacked_img = np.stack((dataset_img,)*3, axis=-1)
return stacked_img
def getNormalMask(imageObj, classes, coco, catIds, input_image_size):
annIds = coco.getAnnIds(imageObj['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
cats = coco.loadCats(catIds)
dataset_mask = np.zeros(input_image_size)
for a in range(len(anns)):
className = getClassName(anns[a]['category_id'], cats)
pixel_value = classes.index(className)+1
new_mask = cv2.resize(coco.annToMask(anns[a])*pixel_value, input_image_size)
dataset_mask = np.maximum(new_mask, dataset_mask)
# Add extra dimension for parity with train_img size [X * X * 3]
dataset_mask = dataset_mask.reshape(input_image_size[0], input_image_size[1], 1)
return dataset_mask
def dataGeneratorCoco(images, classes, coco, folder,
input_image_size, total_batch, mode, mask_type):
img_folder = '{}/Images/'.format(folder)
dataset_size = len(images)
catIds = coco.getCatIds(catNms=classes)
c = 0
while(True):
img = np.zeros((total_batch, input_image_size[0], input_image_size[1], 3)).astype('float')
mask = np.zeros((total_batch, input_image_size[0], input_image_size[1], 1)).astype('float')
for i in tqdm(range(c, c+total_batch)): #initially from 0 to total_batch, when c = 0
imageObj = images[i]
### Retrieve Image ###
dataset_img = getImage(imageObj, img_folder, input_image_size)
if mask_type=="normal":
dataset_mask = getNormalMask(imageObj, classes, coco, catIds, input_image_size)
# Add to respective batch sized arrays
img[i-c] = dataset_img
mask[i-c] = dataset_mask
print(c)
return img, mask
total_batch = 1500
input_image_size = (224,224)
mask_type = 'normal'
img_all, mask_all = dataGeneratorCoco(images_all, classes, coco_all, folder,
input_image_size, total_batch, mode, mask_type)
what approach should I use? I tried looking up on the internet but most method doesnt suit my data generator