yolo源码解析(3):视频检测流程
代码在自己电脑中!!!!不在服务器
根据前文所说yolo代码逻辑:
├── examples
│ ├── darknet.c(主程序)
│ │── xxx1.c
│ └── xxx2.c
│
├── include
│ ├── darknet.h
│
│
├── Makefile
│
│
└── src
├── yyy1.c
├── yyy2.h
└──......
视频检测入口时darknet.c文件。
输入视频检测命令,如: ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights ~/dataset/ca3.mp4 ,darknet.c中根据detector参数,调用detector.c中的 run_detector(int argc, char **argv); 函数.
run_detector函数内容如下
void run_detector(int argc, char **argv)
{
char *prefix = find_char_arg(argc, argv, "-prefix", );
float thresh = find_float_arg(argc, argv, "-thresh", .);
float hier_thresh = find_float_arg(argc, argv, "-hier", .);
int cam_index = find_int_arg(argc, argv, "-c", );
int frame_skip = find_int_arg(argc, argv, "-s", );
int avg = find_int_arg(argc, argv, "-avg", );
if(argc < ){
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[], argv[]);
return;
}
char *gpu_list = find_char_arg(argc, argv, "-gpus", );
char *outfile = find_char_arg(argc, argv, "-out", );
int *gpus = ;
int gpu = ;
int ngpus = ;
if(gpu_list){
printf("%s\n", gpu_list);
int len = strlen(gpu_list);
ngpus = ;
int i;
for(i = ; i < len; ++i){
if (gpu_list[i] == ',') ++ngpus;
}
gpus = calloc(ngpus, sizeof(int));
for(i = ; i < ngpus; ++i){
gpus[i] = atoi(gpu_list);
gpu_list = strchr(gpu_list, ',')+;
}
} else {
gpu = gpu_index;
gpus = &gpu;
ngpus = ;
} int clear = find_arg(argc, argv, "-clear");
int fullscreen = find_arg(argc, argv, "-fullscreen");
int width = find_int_arg(argc, argv, "-w", );
int height = find_int_arg(argc, argv, "-h", );
int fps = find_int_arg(argc, argv, "-fps", );
//int class = find_int_arg(argc, argv, "-class", 0);
代码中定义了frame_skip等变量,默认值为0.然后继续调用demo函数,demo函数位于/darknet/src/demo.c文件中,内容如下。
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen)
{
//demo_frame = avg_frames;
image **alphabet = load_alphabet();
demo_names = names;
demo_alphabet = alphabet;
demo_classes = classes;
demo_thresh = thresh;
demo_hier = hier;
printf("Demo\n");
net = load_network(cfgfile, weightfile, );
set_batch_network(net, );
pthread_t detect_thread;
pthread_t fetch_thread; srand(); int i;
demo_total = size_network(net);
predictions = calloc(demo_frame, sizeof(float*));
for (i = ; i < demo_frame; ++i){
predictions[i] = calloc(demo_total, sizeof(float));
}
avg = calloc(demo_total, sizeof(float)); if(filename){
printf("video file: %s\n", filename);
cap = open_video_stream(filename, , , , );
}else{
cap = open_video_stream(, cam_index, w, h, frames);
} if(!cap) error("Couldn't connect to webcam.\n"); buff[] = get_image_from_stream(cap);
buff[] = copy_image(buff[]);
buff[] = copy_image(buff[]);
buff_letter[] = letterbox_image(buff[], net->w, net->h);
buff_letter[] = letterbox_image(buff[], net->w, net->h);
buff_letter[] = letterbox_image(buff[], net->w, net->h); int count = ;
if(!prefix){
make_window("Demo", , , fullscreen);
} demo_time = what_time_is_it_now(); while(!demo_done){
buff_index = (buff_index + ) %;
if(pthread_create(&fetch_thread, , fetch_in_thread, )) error("Thread creation failed");
if(pthread_create(&detect_thread, , detect_in_thread, )) error("Thread creation failed");
if(!prefix){
fps = ./(what_time_is_it_now() - demo_time);
demo_time = what_time_is_it_now();
display_in_thread();
}else{
char name[];
sprintf(name, "%s_%08d", prefix, count);
save_image(buff[(buff_index + )%], name);
}
pthread_join(fetch_thread, );
pthread_join(detect_thread, );
++count;
}
}
yolo视频处理的参考:https://blog.csdn.net/sinat_33718563/article/details/79964758
只用cpu的情况下处理视频是在太慢,添加GPU支持,编译时遇到问题

https://github.com/AlexeyAB/darknet/issues/894 参考解决方案
首先查看安装的cuda版本:
hpclib@liu:~$ cat /usr/local/cuda/version.txt
CUDA Version 9.0.
然后查看gedit ~/.bashrc中的变量设置
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
发现与当前版本不对应,改为9.0即可
编译通过。
然而检测时会出现如下错误
CUDA Error: out of memory darknet: ./src/cuda.c:: check_error: Assertion `' failed.
已放弃 (核心已转储)
先用yolo3-tiny即可
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
如若扔出现此错误,加sudo试试
视频检测
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights
二、mysql访问
首先安装软件包libmysqlclient-dev sudo apt-get install libmysqlclient-dev
然后根据教程https://blog.csdn.net/tennysonsky/article/details/53984818
编写代码
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h> int main (int argc, char *argv[])
{ MYSQL *conn; // 步骤1: 初始化连接句柄
conn = mysql_init(NULL); if (conn == NULL) { // 如果返回NULl说明初始化失败
printf("mysql_init failed!\n");
return EXIT_FAILURE;
} // 步骤2:实际进行连接
// 参数分别为,conn连接句柄,host是MySQL所在主机或地址,user用户名,password密码,database_name数据库名,后面的都是默认
conn = mysql_real_connect(conn, "192.168.1.6", "root", "TJU55b425", "rdshare", , NULL, ); if (conn) { // 连接成功
printf("Connection success!\n");
} else {
printf("Connection failed!\n");
} // 步骤3: 退出前关闭连接
mysql_close(conn); return ;
}
编译 gcc -I/usr/include/mysql tmysqlest.c -L/usr/lib/mysql -lmysqlclient -o mysqltest 并执行:./mysqltest
成功连接。
然后考虑将代码添加到yolo源码中。
yolo源码解析(3):视频检测流程的更多相关文章
- 第三十六节,目标检测之yolo源码解析
在一个月前,我就已经介绍了yolo目标检测的原理,后来也把tensorflow实现代码仔细看了一遍.但是由于这个暑假事情比较大,就一直搁浅了下来,趁今天有时间,就把源码解析一下.关于yolo目标检测的 ...
- yolo源码解析(一)
原文:https://www.cnblogs.com/zyly/p/9534063.html yolo源码来源于网址:https://github.com/hizhangp/yolo_tensorfl ...
- yolo源码解析(1):代码逻辑
一. 整体代码逻辑 yolo中源码分为三个部分,\example,\include,以及\src文件夹下都有源代码存在. 结构如下所示 ├── examples │ ├── darknet.c(主程序 ...
- Mybatis 系列10-结合源码解析mybatis 的执行流程
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Android短彩信源码解析-短信发送流程(二)
转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...
- Flask源码解析:Flask应用执行流程及原理
WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...
- Android View体系(七)从源码解析View的measure流程
前言 在上一篇我们了解了Activity的构成后,开始了解一下View的工作流程,就是measure.layout和draw.measure用来测量View的宽高,layout用来确定View的位置, ...
- Hbase flusher源码解析(flush全代码流程解析)
版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明. 在介绍HBASE flush源码之前,我们先在逻辑上大体梳理一下,便于后续看代码.flush的整体流程分三个阶段 1.第一 ...
- Qemu/kvm虚拟化源码解析学习视频资料
地址链接:tao宝搜索:Linux云计算KVM Qemu虚拟化视频源码讲解+实践https://item.taobao.com/item.htm?ft=t&id=646300730262 L ...
随机推荐
- 微信图片不可显示java解决方法
先看知乎:https://www.zhihu.com/question/35044484 场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. ...
- C#微信公众号的开发——服务配置
最近因为需要用C#开发微信公众号的一些功能,记录一下开发公众号的一些坑..... 首先先介绍一下,微信公众号的官方文档.虽然这个文档我感觉比较糙,但是还是可以借鉴一下让我们摸着石头过河的. 首先我们得 ...
- JQuery 使用.show()和.hide()做的可爱动画
只是最基本的东西,没啥稀奇的,只是今天看jquery教程的时候偶然看到show()和hide()是可以写两个参数的, 第一个参数是元素隐藏/显示的速度(单位:毫秒),另一个是一个function类型. ...
- 在mac上截屏的几种方式
方法 1: 对屏幕的一部分进行截图 按下Command+Shift+4 方法 2: 对整个屏幕进行截图 按下Command+Shift+3 方法 3: 把截图保存到粘贴板 按下Command+ ...
- Asp.net MVC4 Step by Step (2)-参数数据的传递
首先创建一个表单,不同于WebForm,框架提供了一系列HMTL帮助方法来生成HTML标签. 下面创建一个Create.cshtml为文件名的视图. <h2> Create Auction ...
- Android 概览屏幕
文章照搬过来的:原文地址https://developer.android.google.cn/guide/components/recents.html 概览屏幕(也称为最新动态屏幕.最近任务列表或 ...
- 【PLSQL】游标
Oracle中的SQL在执行时需要分配一块内存区域,这块内存区域叫做上下文区. 上下文区中记录了SQL语句的处理信息,这些信息包括:查询返回的数据行.查询所处理的数据的行号.指向共享池中的已分析的SQ ...
- nginx_安装测试
首先安装环境: [root@local nginx-1.9.14]# yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl op ...
- springboot 的 @Async
/** * Created by zhiqi.shao on 2018/4/3. */ @EnableAsync @Configuration public class TaskPoolConfig ...
- 25-Ubuntu-文件和目录命令-其他命令-重定向
重定向 Linux允许将命令执行结果重定向到一个文件. 将本应显示到终端上的内容输出或追加到指定文件中. 重定向命令 含义 > 表示输出,会覆盖原有文件. >> 表示追加,会将内容追 ...