这个礼拜把GOTURN源码扫了一遍,特此总结一下。先附上文章以及源码地址:
Abstract:http://davheld.github.io/GOTURN/GOTURN.html
Github源码:https://github.com/davheld/GOTURN
下面开始漫长的总结
BoundingBox Class(help目录下)
Draw(): 调用opencv的绘制方法
DrawBoundingBox():绘制方法(调用了Draw)
Scale():归一化方法,归一到0-kScaleFactor
Unscale():归一化的反向方法
Recenter():在crop-patch的重定位方法
Uncenter():重定位的反向方法
Shift():crop-box的随机增广方法
Video Class(looader目录下)视频序列的基类
Path:图像序列的目录路径(Header)
Vector< string> all_frames: 目录下所有图片的名称集合
Vector< Frame> annotations: 所有图片的标注集合,和all_frames的长度不一定相同
Frame{ int frame_num; BoundingBox bbox; }
LoadAnnotation():根据标记idx返回帧的ID/image/bbox;
LoadFirstAnnotation():返回第一帧的ID/image/bbox;
LoadFrame():根据帧ID,返回image/bbox,返回值为是否存在标记;(源码貌似漏写返回bbox了)
ShowVideo():视频序列的可视化
VideoLoader 视频序列加载器的基类
ShowVideos(): 所有视频序列可视化方法,使用了Video的方法;
ShowVideosShift(): 所有视频序列增广及可视化;
-ExampleGenerator example_generator(1, 5, -0.4, 0.4);
-example_generator.Reset(bbox_prev, bbox, image_prev, raw_image);
-example_generator.set_indices(video_index, frame_index);
-example_generator.MakeTrainingExampleBBShift(visualize, &image_rand_focus, &target_pad, &bbox_gt_scaled);
Get_videos(): 获取视频集合的方法,可以根据TRAIN/TEST获取部分或全部视频的集合(return videos_; })
LoaderVOT: from VideoLoader
使用目录进行初始化即可,在初始化构造过程中,会执行以下内容:
每个子目录代表一个video序列
遍历子目录下的.jpg文件,名称集合为video.all_frames
获取/groundtruth.txt文件,取出所有的gtbox列表
为每一条标注生成一条Frame,结束。
生成一个video对象;
生成整个videos_对象
初始化结束
LoaderAlov: from VideoLoader
ALOV视频序列加载器
使用图片目录和标注目录进行初始化即可
类似VOT,只不过还加入了cat的视频序列子集,总体来说没什么区别;
最终的目的也是为了生成video对象,然后组合成整个videos_对象;
这些派生类的构造方法都是为了初始化其基类VideoLoader中的成员videos_
LoaderImagenetDet: 图片加载类
每一张图片基于如下的标注结构Annotation:{image_path, bbox, w/h}
该类构造:使用图片路径和标注路径进行初始化
LoadImage(): 加载某一ID的图片
LoadAnnotation(): 加载某一ID图片的某一ID标记的内容:image/bbox
ShowImages(): 显示图片
ShowAnnotations(): 显示图片和标记
ShowAnnotationsRand(): 随机显示图片和标记
ShowAnnotationsShift(): 显示随机数据增广
Get_images(): 获取所有图像内容:标记列表
Path_:图片目录
Images_:vector
RegressorBase: 回归器的基类
Net_: 内部的神经网络
Regress(): 该类提供了一个通用的估计方法,用于预测,其派生类务必实现此方法;
Init(): 在使用该类进行Track前,调用此方法初始化神经网络,其派生类务必实现此方法;
这是一个基类,其支持的方法务必在派生类中重载。
Regressor: from RegressorBase
成员:
Num_inputs_: 网络的输入blobs
Input_geometry_:网络的输入size:height x width
Num_channels_: 3
Mean_:图像的中值图像{104,117,123}
Caffe_model_: 权值模型路径方法:
构造方法:使用网络文件/权值文件/GPU/输入blobs数初始化神经网络;
Regress(): 回归方法,用于实现估计。
保护方法:
Setimages(): 将图片序列映射到网络输入
Getoutput(): 获取网络输出;
ReshapeImagesInputs(): 重设网络的输入样本数
Estimate(): 网络估计的执行方法;
WrapInputLayer(): 输入图片映射到网络输入的方法
Preprocess(): 输入图片的预处理方法,resize/均值
Init(): 初始化方法
私有方法:
SetupNetwork(): 设置神经网络的方法
SetMean(): 设置中值图像的方法
RegressorTrainBase: 回归器的训练器基类
需要solver的支持,内部集成了一个solver的对象;
构造方法:需要一个solverfile进行初始化,用于初始化内部的神经网络
Train(): 使用外部提供的图像列表/gtboxes列表进行训练;外部的派生类务必实现此方法。
RegressorTrain: from RegressorTrainBase
构造方法:使用网络文件/权值模型/solver文件/GPU初始化
Train(): 训练方法,实际实现
私有化方法:
Step(): 调用了solver的step方法完成一次训练;
Set_gtboxes_gt(): 训练器所有的,因为需要gtboxes作为监督值。该方法为网络的input_blobs()[2]提供输入
Test_net_: 测试网络,如果存在的话。
该类是实际回归器训练的时候的主体对象。
ExampleGenerator: 样本发生器
BBParams{}: 发生器的构造参数
Reset(): 使用prev/curr的images/bbox进行复位,样本发生器将根据此对象进行样本生成。
MakeTrainingExampleBBShift(): 生成一个新的对象:curr的patch,prev的patch,以及新的gtbox结果;
MakeTrueExample(): 生成一个真实的结果,这主要针对于视频序列,生成一个实际对象,而不是人工增广生成的。
MakeTrainingExamples(): 批量生成指定数量的样本列表;
成员:
Lambda_shift/scale-min/max_scale:参数
Image_curr: 当前图像;
Bbox_curr_gt/Bbox_prev_gt: 位置
Target_pad: prev的裁剪patch对象
Video/frame_idx: 视频序号和帧序号
Tracker
Track(): Tracking方法,使用当前图像和指定的回归器即可完成Tracking;
Init(): 使用当前图像和gtbox初始化Tracker
Init(): 使用图片路径和VOTRegion初始化Tracker
ShowTracking(): 使用prev和curr的patch可视化Tracker
Bbox_curr_prior_tight/bbox_prev_tight: 历史bbox位置
Image_prev: 历史图像;
Bool show_trakcing: 是否可视化
TrackerManager: 实际使用的Tracker类
构造:使用videos对象/回归器/Tracker进行初始化
TrackerAll(): 跟踪指定的视频序列集合
VideoInit(): 视频序列初始化
SetupEstimate():在Track前的准备工作
ProcessTrackOutput(): Track后的处理工作
PostProcessVideo(): 视频Track完成后的工作
PoseProcessAll(): 所有视频Track完成后的工作
Videos_: 视频序列列表
Regressor_: 回归器
Tracker_: tracker对象
TrackerVisualizer: from TrackerManager
通用的视频跟踪类
TrackerTesterAlov: from TrackerManager
ALOV的Tracker的测试类
还具有其它的一些成员:
Output_folder: 输出文件地址
Output_file_ptr: 输出文件指针
hrt: 定时器
Num_frames: 帧数
Video_writer: 视频输出流
TrackerTrainer: Tracker训练类
构造:使用样本发生器/回归训练器进行初始化
Train(): 使用prev/curr的images/bbox进行训练
Get_num_batches(): 返回已经训练的batches数
私有化方法:
MakeTrainingExamples(): 使用外部图像序列/gtbox序列构造训练batches,用于训练
ProcessBatch(): 训练一个batch
Images/targets_batch: 一个batch的prev/curr列表
Bboxes_gt: gtbox列表
样本发生器和回归训练器的指针
Train on images
Image_loader: 图片加载器
Images: vector< vector< Annotations>>标注
TrackerTrainer: Tracker训练器
随机选取一副图片,随机选取该图片中的某个box进行训练
调用训练器的Train(image,image,bbox,bbox)进行训练
Train on videos
Videos: 视频集合
TrackerTrainer: Tracker训练器
随机选取一个视频序列
随机选取序列中的一帧,以及它的下一帧
调用训练器的Train(image_prev,image_curr,bbox_prev,bbox_curr)进行训练
Train
图片目录
图片标注目录
ALOV的视频序列目录
ALOV的视频标注目录
Caffe的network/caffemodel/solver
样本发生器参数:scale/shift
GPU和seed
Train Process
使用提供的路径完成:
图片加载器
图片标注集合
视频序列加载器: 视频对象列表
创建样本发生器
创建回归训练器
创建Tracker训练器(样本发生器,回归训练器)
开始指定batches的训练过程{train_on_images;train_on_videos;}
参数(待补充)
-bounding_box.h
const double kContextFactor = 2; //pad size
const double kScaleFactor = 10; // 把bounding box coordinates scale到0-kScaleFactor
-bounding_box.cpp
const int kMaxNumTries = 10; // Number of times to try shifting the bounding box.
-regressor.cpp
// We need 2 inputs: one for the current frame and one for the previous frame.
const int kNumInputs = 2;
oid Regressor::SetMean() {
// Set the mean image.
mean_ = cv::Mat(input_geometry_, CV_32FC3, cv::Scalar(104, 117, 123));
}