Too many or too few labels的问题解决

前言

    在用darknet框架训练分类模型时遇到了不停打印Too many or too few labels的错误提示信息,如下所示:

分析

 打印该错误提示信息的相关代码在src/data.c中,如下所示

void fill_truth(char *path, char **labels, int k, float *truth)
{
    int i;
    memset(truth, 0, k*sizeof(float));
    int count = 0;
    for(i = 0; i < k; ++i){
        if(strstr(path, labels[i])){
            truth[i] = 1;
            ++count;
            //printf("%s %s %d\n", path, labels[i], i);
        }
    }
    if(count != 1 && (k != 1 || count != 0)) printf("Too many or too few labels: %d, %s\n", count, path);
}

把代码中的 printf("%s %s %d\n", path, labels[i], i);放开就能看到前言所示的log:前面是jpg文件路径,后面是根据该路径所找到的label。

该函数中for循环的意思是 , 对于每个label(我这里label刚好是0, 1,2,...19之类的数字字符),去对应文件路径匹配到对应的label。 换句话说,对于分类模型而言,每张样本图片会对应一个数字(0~19)label,那么它是怎么知道找到对应label呢? 刚才说了, 就是去文件路径字符串里面来匹配label。

那么问题来了,如果该文件路径刚好带多个数字,那么就会找到对应的多个label,如下所示,这显然和我们的最初设计相悖,毕竟每张图片只可能对应一个label。

解决办法 

网上很多解决办法是,直接修改jpg文件路径和文件名,使得它们刚好只含有一个对应label的数字。 我这里的不想修改文件路径和名字,直接根据实际情况来修改代码。

其原理是在文件路径和名字 字符串中去匹配 "/label/"而不是"label",因为在这里,每个字符串中只有/label/才是唯一和label对应的。代码修改如下所示。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值