Darknet 代码分析(之一,准备工作)

用yolo v3检测图片中的某种植物,没找到网络定义文件中的说明,看一下darknet的代码,做个笔记。

代码来源:

Alexey AB维护的Darknet 版本:
https://github.com/AlexeyAB/darknet
关于训练自己的数据,说明见 https://github.com/AlexeyAB/darknet#how-to-use

1. 网络配置文件.cfg

只有一个类areca,所以我拷贝yolov3.cfg,改名yolov3-areca.cfg。

内容修改:
Line 3: batch=64
Line 4: subdivisions=8
Line 610, 696, 783 :classes=1
Line 603, 689, 776: filters=18 (只改这三行,filters=(classes + 5)x3)

2. 分类名文件

文件名: areca.names,里面只有一行

areca

3. areca.data文件

classes= 1
train  = ./train.txt
valid  = ./test.txt
names = ./areca.names
backup = backup/

4. 训练

1) 下载预训练的数据:

http://pjreddie.com/media/files/darknet53.conv.74

2) 执行训练

darknet.exe detector train ./areca.data ./yolov3-areca.cfg darknet53.conv.74

注意,学习率应该为0.001,如果用多GPU训练,则learning_rate * GPUs = 0.001burn_inmax_batches 的值乘以GPU数量。
网上几乎找不到关于.cfg文件中网络定义的相关说明,这里分析一下代码,整理一下思路,主要也是为了搞清楚训练用的图片文件应该要注意什么,怎样才能更有效率。

代码逻辑

main函数在darknet.c中,如运行darknet的第一参数是"detector",则调用run_detector函数,如下:

... 
 } else if (0 == strcmp(argv[1], "detector")){
        **run_detector(argc, argv);**
    } else if (0 == strcmp(argv[1], "detect")){
        float thresh = find_float_arg(argc, argv, "-thresh", .24);
		int ext_output = find_arg(argc, argv, "-ext_output");
        char *filename = (argc > 4) ? argv[4]: 0;
        test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, ext_output);
    }
...

run_detector函数在detector.c中,第二个参数是"train",转到train_detector函数,同在detector.c,在这里,parse_network_cfg函数负责解析网络配置文件。

在parser.c中,parse_network_cfg函数包装了另外一个函数parse_network_cfg_custom函数

待续。

猜你喜欢

转载自blog.csdn.net/weixin_41665225/article/details/82946465
今日推荐