./utils/autoanchor.py中的
def check_anchors(dataset, model, thr=10.0, imgsz=640):
函数的thr参数是指 数据集中标注框宽高比最大阈值,默认的是4.0。 由于火灾数据集中的火灾由呈现一片连续的状态,因此标注的宽高比阈值应当设置的大一些。
首先可以首先可以自行编写一个程序,统计一下你所训练的数据集所有标签框宽高比,看下宽高比主要分布在哪个范围、最大宽高比是多少? 比如:你使用的数据集中目标宽高比最大达到了 5:1(甚至 10:1) ,那肯定需要重新计算锚定框了,针对 coco 数据集的最大宽高比是 4:1 。
新建Python文件Calculates_anchor_frame_ratio.py,手动计算锚定框。可以多运行几次试一试,每次的结果都会有些区别。
import utils.autoanchor as autoAC
# 对数据集重新计算 anchors
new_anchors = autoAC.kmean_anchors('./data/fire.yaml', 9, 640, 10.0, 1000, True)
print(new_anchors)
'''
kmean_anchor()函数参数含义:
path:包含数据集文件路径等相关信息的 yaml 文件(比如 coco128.yaml), 或者 数据集张量(yolov5 自动计算锚定框时就是用的这种方式,先把数据集标签信息读取再处理)
n:锚定框的数量,即有几组;默认值是 9
img_size:图像尺寸。计算数据集样本标签框的宽高比时,是需要缩放到 img_size 大小后再计算的;默认值是 640
thr:数据集中标注框宽高比最大阈值,默认是使用 超参文件 hyp.scratch.yaml 中的 “anchor_t” 参数值;默认值是 4.0;自动计算时,会自动根据你所使用的数据集,来计算合适的阈值。
gen:kmean 聚类算法迭代次数,默认值是 1000
verbose:是否打印输出所有计算结果,默认值是 true
'''
thr=5.0 的时候bpr=0.9980
new_anchors = autoAC.kmean_anchors('./data/fire.yaml', 9, 640, 5.0, 1000, True)
输出部分结果如下:
autoanchor: Evolving anchors with Genetic Algorithm: fitness = 0.7804: 100%|██████████| 1000/1000 [00:00<00:00, 5714.26it/s] autoanchor: thr=0.20: 0.9980 best possible recall, 6.39 anchors past thr autoanchor: n=9, img_size=640, metric_all=0.377/0.781-mean/best, past_thr=0.477-mean: 24,30, 55,33, 36,61, 112,80, 92,122, 168,110, 187,193, 280,167, 310,301 [[ 23.817 30.341] [ 55.273 33.362] [ 35.716 61.354] [ 111.5 80.082] [ 91.683 122.09] [ 168 110.4] [ 186.52 193.02] [ 279.83 167.17] [ 310.29 300.89]] |
因为我做的是火灾检测,会有一大片连续的火灾,因此我会把 thr设置的大一些,以备计算出更符合火灾检测的锚框。
当我把参数thr设置为10.0的时候 bpr=1.0000
autoanchor: Evolving anchors with Genetic Algorithm: fitness = 0.7673: 100%|██████████| 1000/1000 [00:00<00:00, 5649.72it/s] autoanchor: thr=0.10: 1.0000 best possible recall, 8.20 anchors past thr autoanchor: n=9, img_size=640, metric_all=0.368/0.767-mean/best, past_thr=0.397-mean: 26,28, 37,55, 102,62, 78,111, 169,107, 167,182, 254,169, 330,204, 306,339 [[ 25.524 28.062] [ 36.765 55] [ 101.96 61.546] [ 77.876 111.24] [ 169.04 106.65] [ 168.15 182.63] [ 254.3 168.58] [ 329.94 204.82] [ 307.08 338.76]] |
最后就可以把输出的9组锚框,替换到自己的yaml文件中,就可以开始训练了。