YOLOv3 自动计算各个数据集中每个类别的数量
虽然功能实现了,方法也很简单,但算不是最上层的方法。
步骤0:
已知:
进行批量测试的时候,使用./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights
输出文本检测结果后,会在darknet/results
文件夹中生成comp4_det_test_类名.txt
(一个类别对应一个txt文件,有多少类别,就产生多少个txt文件)。
随便打开一个txt文件,里面的内容简单示例如下。每行都是一个目标。这样的话,看一下文件总共有多少行,就能得到这个类别对应的目标个数(直接打开每个类别的txt文件,鼠标点到最后一行,看一下右下角的行数)。
008681 0.999982 565.763733 1311.388672 633.671326 1377.522949
008683 0.999982 565.872070 1315.253906 635.104248 1377.797363
008690 0.999984 523.559265 1306.766113 585.476746 1366.243652
008692 0.999964 523.111206 1306.916748 586.848389 1367.439697
008705 0.999984 530.645020 1291.177368 596.593750 1356.693970
008724 0.999983 533.842834 1291.449829 603.227844 1355.802612
以下是darknet/example/detector.c
中的validate_detector
函数。如下第43行处的“comp4_det_test_
“是最终生成的文件的前缀名,是哪个种类,后面就会加上种类名。
void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
{
int j;
list *options = read_data_cfg(datacfg);
char *valid_images = option_find_str(options, "valid", "data/test.list");
char *name_list = option_find_str(options, "names", "data/names.list");
char *prefix = option_find_str(options, "results", "results");
char **names = get_labels(name_list);
char *mapf = option_find_str(options, "map", 0);
int *map = 0;
if (mapf) map = read_map(mapf);
network *net = load_network(cfgfile, weightfile, 0);
set_batch_network(net, 1);
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
srand(time(0));
list *plist = get_paths(valid_images);
char **paths = (char