在手动设置锚框是用到的函数kmean_anchors,如何计算自己数据集的anchor已经有诸多教程,不做赘述。使用kmean_anchors需要设置thr的值,thr为数据集中标注框宽高比最大阈值,coco数据集使用的默认值为4.0。
def kmean_anchors(path='./data/coco128.yaml', n=9, img_size=640, thr=4.0, gen=1000, verbose=True):
:
:
:
:
return print_results(k)
使用以下程序统计目标的宽高比,输出最大和最小宽高比以及宽高比的分布范围。
import json
import numpy as np
# 加载COCO数据集标注文件
with open('instances_train2017.json', 'r') as f:
coco_data = json.load(f)
annotations = coco_data['annotations']
# 统计标签框的宽高比
aspect_ratios = []
for annotation in annotations:
bbox_width = annotation['bbox'][2]
bbox_height = annotation['bbox'][3]
aspect_ratio = bbox_width / bbox_height
aspect_ratios.append(aspect_ratio)
# 计算宽高比的主要分布范围
min_aspect_ratio = min(aspect_ratios)
max_aspect_ratio = max(aspect_ratios)
print("主要分布范围:")
print(f"最小宽高比:{min_aspect_ratio}")
print(f"最大宽高比:{max_aspect_ratio}")
# 统计宽高比的分布
bins = [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
hist, _ = np.histogram(aspect_ratios, bins=bins)
print("宽高比分布:")
for i in range(len(hist)):
print(f"{bins[i]} - {bins[i+1]}: {hist[i]}")
结果如下: