用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.001,burn_in 和 max_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函数
待续。