1.yolo训练数据准备
darknet训练数据比较繁琐,数据准备参考 [yolo训练数据制作](http://blog.csdn.net/burning_keyboard/article/details/71055557)
2.网络准备
1.修改 cfg/voc.data:
classes= 10 //类别数量
train = ../your_save_path/trainImagePath.txt //相对路径设置为
validate = ../zifu1/validateImagePath.txt
names = data/voc.names // voc.names 类别的名称,这个文件去改一下
backup = backup // 记录每迭代100次得到的模型 .weights文件
2.修改网络结构 cfg/yolo-voc.cfg:
(1)最后一个卷积层
[convolutional]
size=1
stride=1
pad=1
filters=125 // 125 = 5(anchor box) * (20(class) + 4(coor) + 1(confidence))
... // 根据class数算好filters个数
(2)[region]
anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52
bias_match=1
classes=10 // 改成目标分类数量
coords=4
num=5 // anchor box 数量
...
(3)预训练文件cfg/darknet19_448.conv.23:在其他数据集上pretrain的模型做为初值
3.训练命令
cd darknet
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg cfg/darknet19_448.conv.23
每train一个batch会用validate检测数据检测一次,显示迭代次数,学习率,recall值,已训练图片数等,
每100次会在backup里存一次 weights
4.检测命令
./darknet detector test cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_400.weights testImage/738780.jpg
5.yolo-darknet主函数入口
1.所有脚本在src文件夹。主函数入口在darknet.c中。其中有run_yolo和run_detector都能用于训练检测。
2.进入detector.c文件可以找到解析训练和检测命令的函数:
void run_detector(int argc, char **argv)//dark.c中如果命令如果第二个参数是detector,则调用这个
{
//寻找是否有参数prefix
char *prefix = find_char_arg(argc, argv, "-prefix", 0);//prefix默认参数是0,argv为二维数组,存储了参数字符串
//寻找是否有参数thresh参数,thresh为输出的阈值
float thresh = find_float_arg(argc, argv, "-thresh", .24);//0.24,thresh默认参数为0.24
//寻找是否有参数hier_thresh,默认为0.5
float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
//类似上面的
int cam_index = find_int_arg(argc, argv, "-c", 0);
//类似上面的
int frame_skip = find_int_arg(argc, argv, "-s", 0);
//如果输入参数小于4个,输出正确语法如何使用
//printf 应该等价于 fprintf(stdout, ...),这里stderr和stdout默认输出设备都是屏幕,但是stderr一般指标准出错输入设备
if(argc < 4){
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
return;
}
//类似上面
char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
//检查是否指定GPU运算
char *outfile = find_char_arg(argc, argv, "-out", 0);
int *gpus = 0;
int gpu = 0;
int ngpus = 0;
if(gpu_list){
printf("%s\n", gpu_list);
int len = strlen(gpu_list);
ngpus = 1;
int i;
for(i = 0; i < len; ++i){
if (gpu_list[i] == ',') ++ngpus;
}
gpus = calloc(ngpus, sizeof(int));
for<