代码小白,第一次认真看大段大段的代码,基础知识严重欠缺,如有错误望指正。
进入正题:
测试命令示例:
$./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg results/tiny-yolo-voc_6000.weights data/images.jpg
一、main函数
目前最新版本的darknet中,darknet.c和detector.c都在examples文件夹中。
首先,从主函数开始解析命令行参数,然后根据不同的命令行参数进入不同的调用方法。(本文不考虑GPU部分代码)
//darknet.c
int main(int argc, char **argv)
{
//test_resize("data/bad.jpg");
//test_box();
//test_convolutional_layer();
//如果没有任何命令行参数,则打印一句提示信息:Usage: [应用程序名称] <function>,即告诉你要指定一个命令行参数。
if(argc < 2){
fprintf(stderr, "usage: %s <function>\n", argv[0]);
return 0;
}
if (0 == strcmp(argv[1], "average")){
average(argc, argv);
} else if (0 == strcmp(argv[1], "detector")){
run_detector(argc, argv);
}//第一个参数是detector,跳转到run_detector函数
return 0;
}
附:1、fprintf函数
作用:格式化输出到一个流/文件中;
函数原型:
int fprintf( FILE *stream, const char *format, [ argument ]...)
fprintf()函数根据指定的格式(format)向输出流(stream)写入数据(argument)。
2、stderr – 标准错误输出流
作为程序运行过程中的错误显示出来的,默认像屏幕输出,具体看程序执行时stderr重定向到哪。
3、if(argc < 2)语句
argv[0]:第一个命令行参数darknet就是应用程序的名称,因此如果指定了一个命令行参数,那argc就为2。
二、run_detector函数
//detector.c
void run_detector(int argc, char **argv)
{
//检查是否有参数prefix,默认值是0
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
//检查是否有参数thresh参数,thresh为输出的阈值,默认值是0.24
float thresh = find_float_arg(argc, argv, "-thresh", .24