1,结构
(1)生成3个尺度的输出,分别是(13,13,255)(26,26,255)(52,52,255)255=3*(80+4+1)80个类概率,坐标,置信度。3是每个框会生成3个预测框。
2. 训练
(1)创建网络模型 里边设置下输入、输出、损失函数
(2)开始训练,主要是将数据分批输入到模型中。如何分批生成训练数据,以及对初始训练数据转换格式preprocess_true_boxes()用到这个函数。
(3)preprocess_true_boxes()先将每个方框的数据坐标转化为中心坐标,然后进行归一化。
创建y_true张量格式3x [10,gride,gride,3,85]3种尺度, 10个batch,13*13个网格区域,一个区域生成3个预测框,85个元素,也就是生成和网络输出一样的数据格式。
for t, n in enumerate(best_anchor):
for l in range(num_layers):
if n in anchor_mask[l]:
i = np.floor(true_boxes[b,t,0]*grid_shapes[l][1]).astype('int32')
j = np.floor(true_boxes[b,t,1]*grid_shapes[l][0]).astype('int32')
k = anchor_mask[l].index(n)
c = true_boxes[b,t, 4].astype('int32')
y_true[l][b, j, i, k, 0:4] = true_boxes[b,t, 0:4]
y_true[l][b, j, i, k, 4] = 1
y_true[l][b, j, i, k, 5+c] = 1
return y_true
假设一个batch_size N 个框,这N个框可能对应三个尺度,13-13 ,26-26, 52-52,每个尺度3个预测框,为了确定每个boundingbox 对应的最佳anchor,
计算boundingbox 与 9个anchor的IOU,则是N*9个,一个boundingbox9个,选出最佳IOU,得到N个IOU,找到bestIOU对应的boundingbox和对应的anchor的下标。3x [10,gride,gride,3,85],这样两个3的位置就找到了,gride,gride对应之前的坐标位置,置信度与概率都是1. 这是转化待训练的数据。
3. 检测
(1)在yolo_boxes_and_scores()函数中算出 网络模型3层的boxes(?4),box_score(?80)输出,及置信度。意思就是说 可以作画的位置坐标求出来了,对应框的得分,类别也都计算出来了,但是这是所有的网格预测的所有的框,有些得分太低,有些会重复框出来,NMS来解决这个问题,找到最合适的框,然后作图。
运行非极大抑制