根據樣本種類分布使用圖像調用頻率不同的方法解決。
1、將樣本中的groundtruth讀出來,存為一個列表;
2、統計訓練樣本列表中不同類別的矩形框個數,然后給每個類別按相應目標框數的倒數賦值,(數目越多的種類權重越小),形成按種類的分布直方圖;
3、對於訓練數據列表,每個epoch訓練按照類別權重篩選出每類的圖像作為訓練數據,如使用random.choice(population, weights=None, *, cum_weights=None, k=1)更改訓練圖像索引,可達到樣本均衡的效果。
Yolov5中此段代碼解決了樣本不均衡問題:
model.class_weights = labels_to_class_weights(dataset.labels, nc).to(device) * nc # attach class weights cw = model.class_weights.cpu().numpy() * (1 - maps) ** 2 / nc # class weights iw = labels_to_image_weights(dataset.labels, nc=nc, class_weights=cw) # image weights dataset.indices = random.choices(range(dataset.n), weights=iw, k=dataset.n) # rand weighted idx