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的源码,使得实时的物体检测使用变得非常便捷。
目录
本项目所用电脑环境:
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;
}