@@ -36,11 +36,6 @@ static T SCE(T x, T label) {
36
36
return (x > 0 ? x : 0.0 ) - x * label + std::log (1.0 + std::exp (-std::abs (x)));
37
37
}
38
38
39
- template <typename T>
40
- static T L1Loss (T x, T y) {
41
- return std::abs (y - x);
42
- }
43
-
44
39
template <typename T>
45
40
static T L2Loss (T x, T y) {
46
41
return 0.5 * (y - x) * (y - x);
@@ -51,11 +46,6 @@ static T SCEGrad(T x, T label) {
51
46
return 1.0 / (1.0 + std::exp (-x)) - label;
52
47
}
53
48
54
- template <typename T>
55
- static T L1LossGrad (T x, T y) {
56
- return x > y ? 1.0 : -1.0 ;
57
- }
58
-
59
49
template <typename T>
60
50
static T L2LossGrad (T x, T y) {
61
51
return x - y;
@@ -131,13 +121,13 @@ template <typename T>
131
121
static void CalcBoxLocationLoss (T* loss, const T* input, Box<T> gt,
132
122
std::vector<int > anchors, int an_idx,
133
123
int box_idx, int gi, int gj, int grid_size,
134
- int input_size, int stride, T score ) {
124
+ int input_size, int stride) {
135
125
T tx = gt.x * grid_size - gi;
136
126
T ty = gt.y * grid_size - gj;
137
127
T tw = std::log (gt.w * input_size / anchors[2 * an_idx]);
138
128
T th = std::log (gt.h * input_size / anchors[2 * an_idx + 1 ]);
139
129
140
- T scale = (2.0 - gt.w * gt.h ) * score ;
130
+ T scale = (2.0 - gt.w * gt.h );
141
131
loss[0 ] += SCE<T>(input[box_idx], tx) * scale;
142
132
loss[0 ] += SCE<T>(input[box_idx + stride], ty) * scale;
143
133
loss[0 ] += L2Loss<T>(input[box_idx + 2 * stride], tw) * scale;
@@ -148,14 +138,13 @@ template <typename T>
148
138
static void CalcBoxLocationLossGrad (T* input_grad, const T loss, const T* input,
149
139
Box<T> gt, std::vector<int > anchors,
150
140
int an_idx, int box_idx, int gi, int gj,
151
- int grid_size, int input_size, int stride,
152
- T score) {
141
+ int grid_size, int input_size, int stride) {
153
142
T tx = gt.x * grid_size - gi;
154
143
T ty = gt.y * grid_size - gj;
155
144
T tw = std::log (gt.w * input_size / anchors[2 * an_idx]);
156
145
T th = std::log (gt.h * input_size / anchors[2 * an_idx + 1 ]);
157
146
158
- T scale = (2.0 - gt.w * gt.h ) * score ;
147
+ T scale = (2.0 - gt.w * gt.h );
159
148
input_grad[box_idx] = SCEGrad<T>(input[box_idx], tx) * scale * loss;
160
149
input_grad[box_idx + stride] =
161
150
SCEGrad<T>(input[box_idx + stride], ty) * scale * loss;
@@ -168,24 +157,22 @@ static void CalcBoxLocationLossGrad(T* input_grad, const T loss, const T* input,
168
157
template <typename T>
169
158
static inline void CalcLabelLoss (T* loss, const T* input, const int index,
170
159
const int label, const int class_num,
171
- const int stride, const T pos, const T neg,
172
- T score) {
160
+ const int stride) {
173
161
for (int i = 0 ; i < class_num; i++) {
174
162
T pred = input[index + i * stride];
175
- loss[0 ] += SCE<T>(pred, (i == label) ? pos : neg) * score ;
163
+ loss[0 ] += SCE<T>(pred, (i == label) ? 1.0 : 0.0 ) ;
176
164
}
177
165
}
178
166
179
167
template <typename T>
180
168
static inline void CalcLabelLossGrad (T* input_grad, const T loss,
181
169
const T* input, const int index,
182
170
const int label, const int class_num,
183
- const int stride, const T pos, const T neg,
184
- T score) {
171
+ const int stride) {
185
172
for (int i = 0 ; i < class_num; i++) {
186
173
T pred = input[index + i * stride];
187
174
input_grad[index + i * stride] =
188
- SCEGrad<T>(pred, (i == label) ? pos : neg) * score * loss;
175
+ SCEGrad<T>(pred, (i == label) ? 1.0 : 0.0 ) * loss;
189
176
}
190
177
}
191
178
@@ -201,7 +188,7 @@ static inline void CalcObjnessLoss(T* loss, const T* input, const T* objness,
201
188
T obj = objness[k * w + l];
202
189
if (obj > 1e-5 ) {
203
190
// positive sample: obj = mixup score
204
- loss[i] += SCE<T>(input[k * w + l], 1.0 ) * obj ;
191
+ loss[i] += SCE<T>(input[k * w + l], 1.0 );
205
192
} else if (obj > -0.5 ) {
206
193
// negetive sample: obj = 0
207
194
loss[i] += SCE<T>(input[k * w + l], 0.0 );
@@ -226,8 +213,7 @@ static inline void CalcObjnessLossGrad(T* input_grad, const T* loss,
226
213
for (int l = 0 ; l < w; l++) {
227
214
T obj = objness[k * w + l];
228
215
if (obj > 1e-5 ) {
229
- input_grad[k * w + l] =
230
- SCEGrad<T>(input[k * w + l], 1.0 ) * obj * loss[i];
216
+ input_grad[k * w + l] = SCEGrad<T>(input[k * w + l], 1.0 ) * loss[i];
231
217
} else if (obj > -0.5 ) {
232
218
input_grad[k * w + l] = SCEGrad<T>(input[k * w + l], 0.0 ) * loss[i];
233
219
}
@@ -263,7 +249,6 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
263
249
auto * input = ctx.Input <Tensor>(" X" );
264
250
auto * gt_box = ctx.Input <Tensor>(" GTBox" );
265
251
auto * gt_label = ctx.Input <Tensor>(" GTLabel" );
266
- auto * gt_score = ctx.Input <Tensor>(" GTScore" );
267
252
auto * loss = ctx.Output <Tensor>(" Loss" );
268
253
auto * objness_mask = ctx.Output <Tensor>(" ObjectnessMask" );
269
254
auto * gt_match_mask = ctx.Output <Tensor>(" GTMatchMask" );
@@ -272,7 +257,6 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
272
257
int class_num = ctx.Attr <int >(" class_num" );
273
258
float ignore_thresh = ctx.Attr <float >(" ignore_thresh" );
274
259
int downsample = ctx.Attr <int >(" downsample" );
275
- bool use_label_smooth = ctx.Attr <bool >(" use_label_smooth" );
276
260
277
261
const int n = input->dims ()[0 ];
278
262
const int h = input->dims ()[2 ];
@@ -285,17 +269,9 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
285
269
const int stride = h * w;
286
270
const int an_stride = (class_num + 5 ) * stride;
287
271
288
- T label_pos = 1.0 ;
289
- T label_neg = 0.0 ;
290
- if (use_label_smooth) {
291
- label_pos = 1.0 - 1.0 / static_cast <T>(class_num);
292
- label_neg = 1.0 / static_cast <T>(class_num);
293
- }
294
-
295
272
const T* input_data = input->data <T>();
296
273
const T* gt_box_data = gt_box->data <T>();
297
274
const int * gt_label_data = gt_label->data <int >();
298
- const T* gt_score_data = gt_score->data <T>();
299
275
T* loss_data = loss->mutable_data <T>({n}, ctx.GetPlace ());
300
276
memset (loss_data, 0 , loss->numel () * sizeof (T));
301
277
T* obj_mask_data =
@@ -376,20 +352,19 @@ class Yolov3LossKernel : public framework::OpKernel<T> {
376
352
int mask_idx = GetMaskIndex (anchor_mask, best_n);
377
353
gt_match_mask_data[i * b + t] = mask_idx;
378
354
if (mask_idx >= 0 ) {
379
- T score = gt_score_data[i * b + t];
380
355
int box_idx = GetEntryIndex (i, mask_idx, gj * w + gi, mask_num,
381
356
an_stride, stride, 0 );
382
357
CalcBoxLocationLoss<T>(loss_data + i, input_data, gt, anchors, best_n,
383
- box_idx, gi, gj, h, input_size, stride, score );
358
+ box_idx, gi, gj, h, input_size, stride);
384
359
385
360
int obj_idx = (i * mask_num + mask_idx) * stride + gj * w + gi;
386
- obj_mask_data[obj_idx] = score ;
361
+ obj_mask_data[obj_idx] = 1.0 ;
387
362
388
363
int label = gt_label_data[i * b + t];
389
364
int label_idx = GetEntryIndex (i, mask_idx, gj * w + gi, mask_num,
390
365
an_stride, stride, 5 );
391
366
CalcLabelLoss<T>(loss_data + i, input_data, label_idx, label,
392
- class_num, stride, label_pos, label_neg, score );
367
+ class_num, stride);
393
368
}
394
369
}
395
370
}
@@ -406,7 +381,6 @@ class Yolov3LossGradKernel : public framework::OpKernel<T> {
406
381
auto * input = ctx.Input <Tensor>(" X" );
407
382
auto * gt_box = ctx.Input <Tensor>(" GTBox" );
408
383
auto * gt_label = ctx.Input <Tensor>(" GTLabel" );
409
- auto * gt_score = ctx.Input <Tensor>(" GTScore" );
410
384
auto * input_grad = ctx.Output <Tensor>(framework::GradVarName (" X" ));
411
385
auto * loss_grad = ctx.Input <Tensor>(framework::GradVarName (" Loss" ));
412
386
auto * objness_mask = ctx.Input <Tensor>(" ObjectnessMask" );
@@ -415,7 +389,6 @@ class Yolov3LossGradKernel : public framework::OpKernel<T> {
415
389
auto anchor_mask = ctx.Attr <std::vector<int >>(" anchor_mask" );
416
390
int class_num = ctx.Attr <int >(" class_num" );
417
391
int downsample = ctx.Attr <int >(" downsample" );
418
- bool use_label_smooth = ctx.Attr <bool >(" use_label_smooth" );
419
392
420
393
const int n = input_grad->dims ()[0 ];
421
394
const int c = input_grad->dims ()[1 ];
@@ -428,17 +401,9 @@ class Yolov3LossGradKernel : public framework::OpKernel<T> {
428
401
const int stride = h * w;
429
402
const int an_stride = (class_num + 5 ) * stride;
430
403
431
- T label_pos = 1.0 ;
432
- T label_neg = 0.0 ;
433
- if (use_label_smooth) {
434
- label_pos = 1.0 - 1.0 / static_cast <T>(class_num);
435
- label_neg = 1.0 / static_cast <T>(class_num);
436
- }
437
-
438
404
const T* input_data = input->data <T>();
439
405
const T* gt_box_data = gt_box->data <T>();
440
406
const int * gt_label_data = gt_label->data <int >();
441
- const T* gt_score_data = gt_score->data <T>();
442
407
const T* loss_grad_data = loss_grad->data <T>();
443
408
const T* obj_mask_data = objness_mask->data <T>();
444
409
const int * gt_match_mask_data = gt_match_mask->data <int >();
@@ -450,24 +415,21 @@ class Yolov3LossGradKernel : public framework::OpKernel<T> {
450
415
for (int t = 0 ; t < b; t++) {
451
416
int mask_idx = gt_match_mask_data[i * b + t];
452
417
if (mask_idx >= 0 ) {
453
- T score = gt_score_data[i * b + t];
454
418
Box<T> gt = GetGtBox (gt_box_data, i, b, t);
455
419
int gi = static_cast <int >(gt.x * w);
456
420
int gj = static_cast <int >(gt.y * h);
457
421
458
422
int box_idx = GetEntryIndex (i, mask_idx, gj * w + gi, mask_num,
459
423
an_stride, stride, 0 );
460
- CalcBoxLocationLossGrad<T>(input_grad_data, loss_grad_data[i],
461
- input_data, gt, anchors,
462
- anchor_mask[mask_idx], box_idx, gi, gj, h,
463
- input_size, stride, score);
424
+ CalcBoxLocationLossGrad<T>(
425
+ input_grad_data, loss_grad_data[i], input_data, gt, anchors,
426
+ anchor_mask[mask_idx], box_idx, gi, gj, h, input_size, stride);
464
427
465
428
int label = gt_label_data[i * b + t];
466
429
int label_idx = GetEntryIndex (i, mask_idx, gj * w + gi, mask_num,
467
430
an_stride, stride, 5 );
468
431
CalcLabelLossGrad<T>(input_grad_data, loss_grad_data[i], input_data,
469
- label_idx, label, class_num, stride, label_pos,
470
- label_neg, score);
432
+ label_idx, label, class_num, stride);
471
433
}
472
434
}
473
435
}
0 commit comments