Yolo v3 的数据流分析与移植说明

 

Yolo又名you only look ones,果如其名,这个是端到端的图像识别深度学习模型。它是一个前沿的,实时的物体检测系统,在Pascal Tiatan X上的表现能达到30FPS的处理帧率,在COCO测试集上的mAP(mean average precision)达到57.9%。

这个开源库有个什么特点?使用c语言手撸代码,不依赖其他库,强爆了好吧。后续操作步骤图中你可以看到,darknet框架的代码完全是.c和.h文件,对于移植不要太方便!我当前先写写怎么去使用yolo v3,主要是怎么调用,也会写写怎么训练自己的数据。未来有机会再研究一下源码怎么实现深度框架的(希望有机会)。

                                                                        

                                          图1-1 Darknet会徽                                                        图1-2 作者Joe Redmen本人

官网:https://pjreddie.com/darknet/yolo

github地址:https://github.com/pjreddie/darknet

在学习和使用Yolo v3的过程中,参考了网上非常多优秀的资料,所以在此统一申明,表示感谢:

首先感谢Joe Redmen公布的由c语言写就的Yolo v3的源码,使得实时的物体检测使用变得非常便捷。

目录

1.源码的目录结构

2.图片数据的流向

3.关键语句的分析

4.输出结果的控制

5.怎么在Qt中移植

6.怎么训练自己的数据 


本项目所用电脑环境:

win10       VS2015

1.源码的目录结构

yolo v3的工程文件在darknet-master-->build-->darknet中。

从下图可以看出,yolo v3的所有依赖文件都是.c和.h文件,因此非常方便用于移植。

                                

2.图片数据的流向

程序的主函数在darknet.c中,下面我们从官网推荐的调用语句开始,分析图片处理的过程。

2.1 调用darknet.exe可执行文件进行图片中物品检测

(1)进行图片检测前

(2)使用官方推荐语句进行图片中物体检测

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

第一段./darknet  用于调用darknet.exe可执行文件
第二段detect 用于说明程序的用途,检测
第三段cfg/yolov3.cfg 用于说明调用的检测算法结构,这里是yolo v3
第四段yolov3.weights 用于填充所用算法的权重参数
第五段data/dog.jpg 用于指明需要进行检测的图片

最终处理后的图片,会保存为prediction.jpg

         

(3)在vs2015中怎么添加输入参数呢?如下,在属性页中添加 使用空格分隔各个参数

对于main入口函数中参数的分离,argc是int类型变量,存储这输入参数的个数。argv则是字符串类型,存储着输入参数。

其中需要注意,第一个参数始终为生成exe文件的路径

3.关键语句的分析

3.1  函数char *option_find_str(list *l, char *key, char *def)

list *read_data_cfg(char *filename)
{
	
    FILE *file = fopen(filename, "r");
    if(file == 0) file_error(filename);
    char *line;
    int nu = 0;
    list *options = make_list();//初始化链表
    while((line=fgetl(file)) != 0){
        ++nu;
        strip(line);
        switch(line[0]){
            case '\0':
            case '#':
            case ';':
                free(line);
                break;
            default:
                if(!read_option(line, options)){
                    fprintf(stderr, "Config file error line %d, could parse: %s\n", nu, line);
                    free(line);
                }
                break;
        }
    }
    fclose(file);
    return options;
}
char *option_find_str(list *l, char *key, char *def)
{
    char *v = option_find(l, key);
    if(v) return v;
    if(def) fprintf(stderr, "%s: Using default '%s'\n", key, def);
    return def;
}
char **get_labels_custom(char *filename, int *size)
{
    list *plist = get_paths(filename);
    if(size) *size = plist->size;
    char **labels = (char **)list_to_array(plist);
    free_list(plist);
    return labels;
}

4.输出结果的控制

 

5.怎么在Qt中移植

6.怎么训练自己的数据 

发布了70 篇原创文章 · 获赞 48 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/kissgoodbye2012/article/details/102881407