yolov3调用mysql_yolo源码解析(3):视频检测流程

本文详细介绍了如何使用Yolov3进行视频检测,从调用命令到源码解析,探讨了CPU处理视频的局限性和解决方法。同时,展示了如何在Ubuntu系统上安装libmysqlclient-dev库,并提供了一个简单的MySQL连接C++示例,成功实现与数据库的连接。
摘要由CSDN通过智能技术生成

代码在自己电脑中!!!!不在服务器

根据前文所说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函数内容如下

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

void run_detector(int argc, char **argv)

{char *prefix = find_char_arg(argc, argv, "-prefix", 0);float thresh = find_float_arg(argc, argv, "-thresh", .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);int avg = find_int_arg(argc, argv, "-avg", 3);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);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;inti;for(i = 0; i < len; ++i){if (gpu_list[i] == ',') ++ngpus;

}

gpus= calloc(ngpus, sizeof(int));for(i = 0; i < ngpus; ++i){

gpus[i]=atoi(gpu_list);

gpu_list= strchr(gpu_list, ',')+1;

}

}else{

gpu=gpu_index;

gpus= &gpu;

ngpus= 1;

}int clear = find_arg(argc, argv, "-clear");int fullscreen = find_arg(argc, argv, "-fullscreen");int width = find_int_arg(argc, argv, "-w", 0);int height = find_int_arg(argc, argv, "-h", 0);int fps = find_int_arg(argc, argv, "-fps", 0);//int class = find_int_arg(argc, argv, "-class", 0);

View Code

代码中定义了frame_skip等变量,默认值为0.然后继续调用demo函数,demo函数位于/darknet/src/demo.c文件中,内容如下。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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, intfullscreen)

{//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, 0);

set_batch_network(net,1);

pthread_t detect_thread;

pthread_t fetch_thread;

srand(2222222);inti;

demo_total=size_network(net);

predictions= calloc(demo_frame, sizeof(float*));for (i = 0; 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, 0, 0, 0, 0);

}else{

cap= open_video_stream(0, cam_index, w, h, frames);

}if(!cap) error("Couldn't connect to webcam.\n");

buff[0] =get_image_from_stream(cap);

buff[1] = copy_image(buff[0]);

buff[2] = copy_image(buff[0]);

buff_letter[0] = letterbox_image(buff[0], net->w, net->h);

buff_letter[1] = letterbox_image(buff[0], net->w, net->h);

buff_letter[2] = letterbox_image(buff[0], net->w, net->h);int count = 0;if(!prefix){

make_window("Demo", 1352, 1013, fullscreen);

}

demo_time=what_time_is_it_now();while(!demo_done){

buff_index= (buff_index + 1) %3;if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed");if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed");if(!prefix){

fps= 1./(what_time_is_it_now() -demo_time);

demo_time=what_time_is_it_now();

display_in_thread(0);

}else{char name[256];

sprintf(name,"%s_%08d", prefix, count);

save_image(buff[(buff_index+ 1)%3], name);

}

pthread_join(fetch_thread,0);

pthread_join(detect_thread,0);++count;

}

}

View Code

yolo视频处理的参考:https://blog.csdn.net/sinat_33718563/article/details/79964758

只用cpu的情况下处理视频是在太慢,添加GPU支持,编译时遇到问题

a770f2c859303154baab58317264a004.png

首先查看安装的cuda版本:

hpclib@liu:~$ cat /usr/local/cuda/version.txt

CUDA Version9.0.176

然后查看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:36: check_error: Assertion `0'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

编写代码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include#include

int main (int argc, char *argv[])

{

MYSQL*conn;//步骤1: 初始化连接句柄

conn =mysql_init(NULL);if (conn == NULL) { //如果返回NULl说明初始化失败

printf("mysql_init failed!\n");returnEXIT_FAILURE;

}//步骤2:实际进行连接//参数分别为,conn连接句柄,host是MySQL所在主机或地址,user用户名,password密码,database_name数据库名,后面的都是默认

conn = mysql_real_connect(conn, "192.168.1.6", "root", "TJU55b425", "rdshare", 0, NULL, 0);if (conn) { //连接成功

printf("Connection success!\n");

}else{

printf("Connection failed!\n");

}//步骤3: 退出前关闭连接

mysql_close(conn);return 0;

}

View Code

编译 gcc -I/usr/include/mysql tmysqlest.c -L/usr/lib/mysql -lmysqlclient -o mysqltest 并执行:./mysqltest

成功连接。

然后考虑将代码添加到yolo源码中。

资源为视频检测算法代码包括算法的模型,算法实现的原理是:首先在视频检测跟踪之前,对所有目标已经完成检测,那么当第一帧进来时,以检测到的目标初始化并创建新的跟踪器,标注ID,输出行人图片,输出一组向量,通过比对两个向量之间的距离,来判断两副输入图片是否是同一个行人。在后面帧进来时,先到卡尔曼滤波器中得到由前面帧box产生的状态预测和协方差预测,并且使用确信度较高的跟踪结果进行预测结果的修正。求跟踪器所有目标状态与本帧检测的box的IOU,通过匈牙利算法寻找二分图的最大匹配,在多目标检测跟踪问题中为寻找前后两帧的若干目标的匹配最优解,得到IOU最大的唯一匹配,在去掉匹配值小于iou_threshold的匹配对。 用本帧中匹配到的目标检测box去更新卡尔曼跟踪器,计算卡尔曼增益,状态更新和协方差更新。并将状态更新值输出,作为本帧的跟踪box,再对于本帧中没有匹配到的目标重新初始化跟踪器。 yolo v3首先通过特征提取网络对输入图像提取特征,得到一定size的feature map,通过尺寸聚类确定anchor box。对每个bounding box网络预测4个坐标偏移。如果feature map某一单元偏移图片左上角坐标,bounding box预选框尺寸为,即anchor尺寸,那么生成对预测坐标为,此为feature map层级.而为真值在feature map上的映射,通过预测偏移使得与一致。类别预测方面为多标签分类,采用多个scale融合的方式做预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值