行为识别笔记:iDT算法用法与代码解析

转载请注明出处:http://blog.csdn.net/wzmsltw/article/details/53221179

在上一篇笔记:iDT算法 中,对iDT算法的原理做了简单的介绍。由于iDT算法提供了算法源码,自己也用它做了不少实验,因此介绍一下其代码的使用方法,并对源代码做一些解析。iDT算法的代码在作者个人主页可以下载到,也可以点击此处下载:iDT算法源码

除了本篇博客之外,还有iDT用法及源码剖析 这篇文章介绍的也不错,供参考。

基本功能

iDT算法框架中还包括Fisher Vector编码和SVM分类两阶段的工作,但作者提供的代码只包括到输出iDT特征的阶段,后续步骤需要使用其他代码或工具。其中有人编写了专门用与DT特征的FV编码C++程序:DTFV 。SVM则可以使用liblinear,对于高维度数据速度比较快。
因此,此处要讨论的iDT算法代码的输入为一段视频,输出为iDT特征的列表,每行为1个特征,对应视频中的某段轨迹。每个特征的维度为426维:Trajectory-30, HOG-96, HOF-108, MBH-192。每种特征的维数是如何得到的见iDT算法那篇博客。

编译与基本使用

详细内容见文件夹中的README

iDT代码的依赖包括两个库:

  • OpenCV: readme中推荐用2.4.2, 实际上用最新的2.4.13也没问题。但OpenCV3就不知道能不能用了,没有试过。
  • ffmpeg: readme中推荐用0.11.1。实际上装最新的版本也没有问题

这两个库的安装教程网上很多,就不再多做介绍了。而且也都是很常用的库。

在安装完以上两个库后,就可以进行代码编译了。只需要在代码文件夹下make一下就好,编译好的可执行文件在./release/下。

使用时输入 视频文件的路径作为参数即可./release/DenseTrackStab ./test_sequences/person01_boxing_d1_uncomp.avi

代码结构

iDT代码中主要包括如下几个代码文件

  • DenseTrackStab.cpp:iDT算法主程序
  • DenseTrackStab.h:轨迹跟踪的一些参数,以及一些数据结构体的定义
  • Descriptors.h:特征相关的各种函数
  • Initialize.h:初始化相关的各种函数
  • OpticalFlow.h:光流相关的各种函数
  • Video.cpp: 这个程序与iDT算法无关,只是作者提供用来测试两个依赖库是否安装成功的。

bound box相关内容

bound box即提供视频帧中人体框的信息,在计算前后帧的投影变换矩阵时,不使用人体框中的匹配点对。从而排除人体运动干扰,使得对相机运动的估计更加准确。

作者提供的文件中没有bb_file的格式,代码中也没有读入bb_file的接口,若需要用到需要在代码中添加一条读入文件语句(下面的代码解析中已经添加)。bb_file的格式如下所示

frame_id a1 a2 a3 a4 a5 b1 b2 b3 b4 b5

其中frame_id是帧的编号,从0开始。代码中还有检查步骤,保证bb_file的长度与视频的帧数相同。

后面的数据5个一组,为人体框的参数。按顺序分别为:框左上角点的x,框左上角点的y,框右下角点的x,框右下角点的y,置信度。需要注意的是虽然要输入置信度,但实际上这个置信度在代码里也没有用上的样子,所以取任意值也不影响使用。

至于如何获得这些bound box的数据,最暴力的方法当然是手工标注,不过这样太辛苦了。在项目中我们采用了SSD(single shot multibox detector)算法检测人体框的位置。

主程序代码解析

iDT算法代码的大致思路为:

  1. 读入新的一帧
  2. 通过SURF特征和光流计算当前帧和上一帧的投影变换矩阵
  3. 使用求得的投影变换矩阵对当前帧进行warp,消除相机运动影响
  4. 利用warp后的当前帧图像和上一帧图像计算光流
  5. 在各个图像尺度上跟踪轨迹并计算特征
  6. 保存当前帧的相关信息,跳到1

以下通过一些简单的注释对代码进行解析

#include "DenseTrackStab.h"
#include "Initialize.h"
#include "Descriptors.h"
#include "OpticalFlow.h"

#include <time.h>

using namespace cv;

//如果要可视化轨迹,将show_track设置为1
int show_track = 0;

int main(int argc, char** argv)
{
    //读入并打开视频文件
    VideoCapture capture;
    char* video = argv[1];
    int flag = arg_parse(argc, argv);
    capture.open(video);
    if(!capture.isOpened()) {
        fprintf(stderr, "Could not initialize capturing..\n");
        return -1;
    }

    //这句代码是我自己添加的,源代码中没有提供bb_file的输入接口
    char* bb_file = argv[2];

    int frame_num = 0;
    TrackInfo trackInfo;
    DescInfo hogInfo, hofInfo, mbhInfo;

    //初始化轨迹信息变量
    InitTrackInfo(&trackInfo, track_length, init_gap);
    InitDescInfo(&hogInfo, 8, false, patch_size, nxy_cell, nt_cell);
    InitDescInfo(&hofInfo, 9, true, patch_size, nxy_cell, nt_cell);
    InitDescInfo(&mbhInfo, 8, false, patch_size, nxy_cell, nt_cell);

    SeqInfo seqInfo;
    InitSeqInfo(&seqInfo, video);

    //初始化bb信息,将bb_file中的信息加载到bb_list中
    std::vector<Frame> bb_list;
    if(bb_file) {
        LoadBoundBox(bb_file, bb_list);
        assert(bb_list.size() == seqInfo.leng
  • 9
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 86
    评论
评论 86
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值