yolofastest源码学习记录
主要防止自己忘了,不详细了写了
顺序记录下程序的流程:
1.darknet.c

运行darknet.c,输入以下命令:
//./darknet detector test ./data/voc.data ./Yolo-Fastest/VOC/yolo-fastest-xl.cfg ./Yolo-Fastest/VOC/yolo-fastest-xl.weights data/dog.jpg -thresh 0.55
//./darknet detector train voc.data yolo-fastest.cfg yolo-fastest.conv.109
darknet.c程序中根据命令不同进入不同的函数接口
if (0 == strcmp(argv[1], "average")){
average(argc, argv);}
else if (0 == strcmp(argv[1], "yolo")){
//string compare(字符串比较),strcmp(str1,str2),若str1=str2,则返回零;若str1str2,则返回正数。
} else if (0 == strcmp(argv[1], "detector")){
//argv[1]==“detector”,所以进入的分支函数是run_detector(),并将argv参数一并传入
2.detector.c

//在run_detector()函数内,又会根据参数argv[2]的不同选择执行不同的分支:
//当第二个参数为test时,执行test_detector()

3.detector.c的test_detector()函数

//1.建立网络
network net = parse_network_cfg_custom
//2.对建立好的网络结构加载权重文件。./Yolo-Fastest/VOC/yolo-fastest-xl.weights
load_weights(&net, weightfile);

//3.读取图像input为图像地址,net.c为输入层通道数,然后根据参数,选择缩放的方式:
image im = load_image(input, 0, 0, net.c);
image sized;
if(letter_box) sized = letterbox_image(im, net.w, net.h);
else sized = resize_image(im, net.w, net.h);
//4.模型进行推理,X为输入图像数据
network_predict(net, X);

//5.通过网络提取出检测到的目标的位置以及类别
//5.1 get_network_boxes函数实现的是预测框的获取,位于darknet/src下的network.c
detection *dets = get_network_boxes();
//5.2 完成后,通过do_nms_sort做非极大化抑制。位于box.c
do_nms_sort(dets, nboxes, l.classes, nms);
//6.将目标的位置以及类别标注在图片中。
draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output); save_image(im, "predictions");
整个流程结束,里面最关键是第五步:通过网络提取出检测到的目标的位置以及类别
get_network_boxes函数实现的是预测框的获取,位于darknet/src下的network.c
4.network.c的get_network_boxes()函数

首先通过make_network_boxes()生成检测(dets)信息,然后以fill_network_boxes()过滤boxes。
两者都位于yolo_layer.c,下面进入最关键的yolo.c文件
5.yolo.c的全部函数
这部分过于重要,需要全文学习。
参考:https://zhuanlan.zhihu.com/p/107266500
东西太多,下次发。