YOLOv3的损失函数是什么

时间:2019-03-28 10:22:44

标签: machine-learning deep-learning computer-vision object-detection yolo

我将编写自己的YOLOv3实现,并提出损失函数的一些问题。最初的论文提到他在类预测部分使用了二进制交叉熵,这就是我所做的。

我尝试通过原始的Darknet代码读取一些代码,但没有找到与BCE丢失有关的任何信息。我还使用Keras,Pytorch和TensorFlow进行了一些阅读。每个人似乎对损失函数都有自己的看法。有些只采用MSE进行宽度和高度估算,其余的则采用BCE,有些采用MSE的x,y,w,h,其余的采用BCE。

这是我的一些代码:

map = new google.maps.Map(document.getElementById("map"), {
    zoom: 1,
    center: {lat: 50.84, lng: 4.35},//belgium center in this example(you set your center predefined)

});

由于损失功能在训练中起着重要作用。我希望有人能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:1)

Yolo v3的丢失功能,请查看src / yolo_layer.c

框的增量,第93行

float delta_yolo_box(box truth, float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, float *delta, float scale, int stride)
{
    box pred = get_yolo_box(x, biases, n, index, i, j, lw, lh, w, h, stride);
    float iou = box_iou(pred, truth);

    float tx = (truth.x*lw - i);
    float ty = (truth.y*lh - j);
    float tw = log(truth.w*w / biases[2*n]);
    float th = log(truth.h*h / biases[2*n + 1]);

    delta[index + 0*stride] = scale * (tx - x[index + 0*stride]);
    delta[index + 1*stride] = scale * (ty - x[index + 1*stride]);
    delta[index + 2*stride] = scale * (tw - x[index + 2*stride]);
    delta[index + 3*stride] = scale * (th - x[index + 3*stride]);
    return iou;
}

班级的差异,第111行

void delta_yolo_class(float *output, float *delta, int index, int class, int classes, int stride, float *avg_cat)
{
    int n;
    if (delta[index]){
        delta[index + stride*class] = 1 - output[index + stride*class];
        if(avg_cat) *avg_cat += output[index + stride*class];
        return;
    }
    for(n = 0; n < classes; ++n){
        delta[index + stride*n] = ((n == class)?1 : 0) - output[index + stride*n];
        if(n == class && avg_cat) *avg_cat += output[index + stride*n];
    }
}

出于客观性的考虑因素,第178行

l.delta[obj_index] = 0 - l.output[obj_index];
                    if (best_iou > l.ignore_thresh) {
                        l.delta[obj_index] = 0;

l.delta[obj_index] = 1 - l.output[obj_index];

损失=平方和

*(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2);

无论如何,我只是向您简要介绍了Yolo V3中的损失函数。有关详细说明,请遵循以下github讨论:
https://github.com/AlexeyAB/darknet/issues/1695#issuecomment-426016524

https://github.com/AlexeyAB/darknet/issues/1845#issuecomment-434079752