Closed mrgloom closed 6 years ago
Nope, I haven't. Pascal VOC is a fairly balanced dataset, so I didn't feel like doing it. Maybe needed in Cityscapes or Camvid.
I count pixels for class for pascal voc 2012 and background
is most frequent class about 70% of all area, so I consider it unbalanced:
('aeroplane', ':', 1780580)
('bicycle', ':', 758311)
('bird', ':', 2232247)
('boat', ':', 1514260)
('bottle', ':', 1517186)
('bus', ':', 4375622)
('car', ':', 3494749)
('cat', ':', 6752515)
('chair', ':', 2861091)
('cow', ':', 2060925)
('diningtable', ':', 3381632)
('dog', ':', 4344951)
('horse', ':', 2283739)
('motorbike', ':', 2888641)
('person', ':', 11995853)
('potted_plant', ':', 1670340)
('sheep', ':', 2254463)
('sofa', ':', 3612229)
('train', ':', 3984238)
('tv/monitor', ':', 2349235)
('background', ':', 182014429)
I don't really understand why class weighting not needed: For exanple in FCN paper they wrote: https://arxiv.org/pdf/1605.06211.pdf
Class balancing
Fully convolutional training can balance classes by weighting or sampling the loss. Although our labels are mildly unbalanced (about 3/4 are back-ground), we find class balancing unnecessary.
But for example in Segnet paper they use weights: https://arxiv.org/pdf/1511.00561.pdf
We use the cross-entropy loss [2] as the objective function for
training the network. The loss is summed up over all the pixels
in a mini-batch. When there is large variation in the number of
pixels in each class in the training set (e.g road, sky and building
pixels dominate the CamVid dataset) then there is a need to weight
the loss differently based on the true class. This is termed class balancing.
We use median frequency balancing [13] where the
weight assigned to a class in the loss function is the ratio of the
median of class frequencies computed on the entire training set
divided by the class frequency. This implies that larger classes in
the training set have a weight smaller than 1 and the weights
of the smallest classes are the highest. We also experimented
with training the different variants without class balancing or
equivalently using natural frequency balancing.
If you have a look at the loss function, it ignores the background class (index 0) altogether.
Yes, I'm aware of the median-frequency balancing used by Segnet. But most recent papers (PSPNet, FRRN and RefineNet) do not use class balancing and hence I'm not too keen on balancing the classes.
Have you balanced\weighted the classes for Pascal VOC 2012? https://discuss.pytorch.org/t/multilabel-classification-under-unbalanced-class-distributions/2950
I can't see any specific code here: https://github.com/meetshah1995/pytorch-semseg/blob/master/ptsemseg/loader/pascal_voc_loader.py