From 56e21c558e37395ead098d588902464cb09c206a Mon Sep 17 00:00:00 2001 From: dengkaipeng Date: Mon, 28 Jan 2019 17:10:47 +0800 Subject: [PATCH] add comments and docs. test=develop --- paddle/fluid/operators/yolov3_loss_op.cc | 7 ++++++- paddle/fluid/operators/yolov3_loss_op.h | 10 +++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/paddle/fluid/operators/yolov3_loss_op.cc b/paddle/fluid/operators/yolov3_loss_op.cc index 46374db49aa..0d13d8fff44 100644 --- a/paddle/fluid/operators/yolov3_loss_op.cc +++ b/paddle/fluid/operators/yolov3_loss_op.cc @@ -98,7 +98,7 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker { "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" "box locations, confidence score and classification one-hot" - "key of each anchor box"); + "keys of each anchor box"); AddInput("GTBox", "The input tensor of ground truth boxes, " "This is a 3-D tensor with shape of [N, max_box_num, 5], " @@ -179,6 +179,11 @@ class Yolov3LossOpMaker : public framework::OpProtoAndCheckerMaker { box coordinates (w, h), and sigmoid cross entropy loss is used for box 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 boxes, box coordinate losses will be mutiplied by scale weight, which is calculated as follow. diff --git a/paddle/fluid/operators/yolov3_loss_op.h b/paddle/fluid/operators/yolov3_loss_op.h index 5c9851232d4..fce81956681 100644 --- a/paddle/fluid/operators/yolov3_loss_op.h +++ b/paddle/fluid/operators/yolov3_loss_op.h @@ -308,13 +308,15 @@ class Yolov3LossKernel : public framework::OpKernel { } } + // If best IoU is greater then ignore_thresh, + // ignore the objectness loss. if (best_iou > ignore_thresh) { int obj_idx = (i * mask_num + j) * stride + k * w + l; obj_mask_data[obj_idx] = static_cast(-1); } - // TODO(dengkaipeng): all losses should be calculated if best IoU - // is bigger then truth thresh should be calculated here, but - // currently, truth thresh is an unreachable value as 1.0. + // all losses should be calculated if best IoU + // is bigger then truth thresh, but currently, + // truth thresh is an unreachable value as 1.0. } } } @@ -341,8 +343,6 @@ class Yolov3LossKernel : public framework::OpKernel { an_box.w = anchors[2 * an_idx] / static_cast(input_size); an_box.h = anchors[2 * an_idx + 1] / static_cast(input_size); float iou = CalcBoxIoU(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) { best_iou = iou; best_n = an_idx; -- GitLab