提交 56e21c55 编写于 作者: D dengkaipeng

add comments and docs. test=develop

上级 577424e5
...@@ -98,7 +98,7 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -98,7 +98,7 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker {
"This is a 4-D tensor with shape of [N, C, H, W]." "This is a 4-D tensor with shape of [N, C, H, W]."
"H and W should be same, and the second dimention(C) stores" "H and W should be same, and the second dimention(C) stores"
"box locations, confidence score and classification one-hot" "box locations, confidence score and classification one-hot"
"key of each anchor box"); "keys of each anchor box");
AddInput("GTBox", AddInput("GTBox",
"The input tensor of ground truth boxes, " "The input tensor of ground truth boxes, "
"This is a 3-D tensor with shape of [N, max_box_num, 5], " "This is a 3-D tensor with shape of [N, max_box_num, 5], "
...@@ -179,6 +179,11 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -179,6 +179,11 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker {
box coordinates (w, h), and sigmoid cross entropy loss is used for box box coordinates (w, h), and sigmoid cross entropy loss is used for box
coordinates (x, y), confidence score loss and classification loss. coordinates (x, y), confidence score loss and classification loss.
Each groud truth box find a best matching anchor box in all anchors,
prediction of this anchor box will incur all three parts of losses, and
prediction of anchor boxes with no GT box matched will only incur objectness
loss.
In order to trade off box coordinate losses between big boxes and small In order to trade off box coordinate losses between big boxes and small
boxes, box coordinate losses will be mutiplied by scale weight, which is boxes, box coordinate losses will be mutiplied by scale weight, which is
calculated as follow. calculated as follow.
......
...@@ -308,13 +308,15 @@ class Yolov3LossKernel : public framework::OpKernel<T> { ...@@ -308,13 +308,15 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
} }
} }
// If best IoU is greater then ignore_thresh,
// ignore the objectness loss.
if (best_iou > ignore_thresh) { if (best_iou > ignore_thresh) {
int obj_idx = (i * mask_num + j) * stride + k * w + l; int obj_idx = (i * mask_num + j) * stride + k * w + l;
obj_mask_data[obj_idx] = static_cast<T>(-1); obj_mask_data[obj_idx] = static_cast<T>(-1);
} }
// TODO(dengkaipeng): all losses should be calculated if best IoU // all losses should be calculated if best IoU
// is bigger then truth thresh should be calculated here, but // is bigger then truth thresh, but currently,
// currently, truth thresh is an unreachable value as 1.0. // truth thresh is an unreachable value as 1.0.
} }
} }
} }
...@@ -341,8 +343,6 @@ class Yolov3LossKernel : public framework::OpKernel<T> { ...@@ -341,8 +343,6 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
an_box.w = anchors[2 * an_idx] / static_cast<T>(input_size); an_box.w = anchors[2 * an_idx] / static_cast<T>(input_size);
an_box.h = anchors[2 * an_idx + 1] / static_cast<T>(input_size); an_box.h = anchors[2 * an_idx + 1] / static_cast<T>(input_size);
float iou = CalcBoxIoU<T>(an_box, gt_shift); float iou = CalcBoxIoU<T>(an_box, gt_shift);
// TODO(dengkaipeng): In paper, objectness loss is ignore when
// best IoU > 0.5, but darknet code didn't implement this.
if (iou > best_iou) { if (iou > best_iou) {
best_iou = iou; best_iou = iou;
best_n = an_idx; best_n = an_idx;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册