目录
数据集准备
数据集介绍
PySOT支持多种数据集混合训练,其中包括以下四种数据集:
VIDhttp://image-net.org/challenges/LSVRC/2017/
- VID数据集(Visual Object Tracking benchmark for Large-scale MOTion Analysis)是一种用于视频目标跟踪的公共数据集。该数据集由微软研究院和清华大学合作创建,并在2015年发布。该数据集是用于评估视频目标跟踪算法性能的重要基准。
- VID数据集包含3862个视频序列,其中3000个视频序列来自互联网,另外862个视频序列来自于更专业的摄影器材,这些序列具有更高的图像质量和更复杂的背景。每个视频序列都包含了一个或多个目标,包括动物、车辆、人等等。VID数据集的总长度为50个小时,总共包含510,026帧图像,每个视频序列的长度和帧率不同。
- 在VID数据集中,每个目标都被标注了一个矩形边界框,用于表示目标的位置和大小。此外,每个目标在整个视频序列中都被标注了一个唯一的标识符,用于跟踪该目标。VID数据集的标注信息还包括目标类别,例如“汽车”、“人”、“狗”等。
- VID数据集旨在评估视频目标跟踪算法在真实场景下的性能,包括目标的运动模式、背景复杂性、光照变化、尺度变化、遮挡等因素。该数据集已经成为视频目标跟踪领域的重要基准,许多最先进的视频目标跟踪算法都在VID数据集上进行了测试和评估。
YOUTUBEBBhttps://research.google.com/youtube-bb/
- YouTube-BB数据集(YouTube-Bounding Boxes)是一种用于视频目标检测和跟踪的公共数据集。该数据集由谷歌研究团队于2016年发布,是谷歌在YouTube视频平台上搜集而来的。
- 该数据集包含了3800个YouTube视频,每个视频的长度在30秒到5分钟不等,总共包含了240万帧图像。这些视频涵盖了各种场景和环境,包括室内和室外、日间和夜间、不同天气和照明条件下的场景等。每个视频中都包含了一个或多个目标,包括人、动物、车辆等等。每个目标都被标注了一个矩形边界框,用于表示目标的位置和大小。
- YouTube-BB数据集中的目标类别包括人、动物、车辆、家具、电子设备、室内物品等等,共有23个类别。在每个视频中,所有目标都被标注了一个唯一的标识符,用于跟踪该目标。此外,该数据集还提供了每个视频中的场景类别,例如“室内”、“室外”、“城市”、“乡村”等等。
- YouTube-BB数据集旨在提供一个用于评估视频目标检测和跟踪算法的大规模、真实场景的数据集。该数据集的规模和多样性使得它成为视频目标检测和跟踪领域的重要基准之一。许多最先进的视频目标检测和跟踪算法都在该数据集上进行了测试和评估。
DEThttp://image-net.org/challenges/LSVRC/2017/
- DET数据集(PASCAL VOC Detection Challenge)是一个用于图像目标检测的公共数据集,由牛津大学、德国马克斯普朗克研究所以及荷兰阿姆斯特丹大学联合创建。该数据集首次发布于2007年,自那以后已经成为图像目标检测领域的标准基准数据集之一。
- DET数据集包含了20个不同的类别,例如人、车、飞机等等。该数据集包含了多个图像集,每个集合中包含了大约5000张图像。每个图像都被标注了一个或多个目标,包括目标类别和位置信息,即一个或多个矩形边界框。每个图像集还包含了训练集和测试集两部分。
- DET数据集的目标是评估图像目标检测算法的性能,包括准确率、召回率等指标。该数据集已经被广泛用于评估各种图像目标检测算法的性能,如Fast R-CNN、YOLO等。随着时间的推移,该数据集已经进行了多次更新和扩展,以适应不断发展的图像目标检测技术和应用场景。
- COCO数据集(Common Objects in Context)是一个用于目标检测、分割和关键点检测的大规模公共数据集。该数据集由微软公司于2014年发布,旨在提供一个丰富多样的真实场景图像数据集,以促进计算机视觉领域的研究和发展。
- COCO数据集包含超过330,000张图片,其中大约有2.5万张图像包含了超过8.5万个不同的物体实例。这些物体实例包括80个不同的物体类别,如人、车、动物、食品、电子产品等等。每个物体实例都被标注了一个矩形边界框,表示物体的位置和大小,以及一个语义分割掩码,用于表示物体的像素级别的分割。此外,该数据集还提供了与每个图像相关的场景和情境信息,如天气、场景、时间等等。
- COCO数据集旨在提供一个真实场景的大规模、多样化的数据集,以评估和推动目标检测、分割和关键点检测算法的发展。在该数据集上,许多最先进的目标检测、分割和关键点检测算法都已经得到了测试和评估。同时,COCO数据集还推动了许多新的算法的发展,如Mask R-CNN、Cascade R-CNN等。
PySOT中使用的是处理过的图片,经过裁剪后的数据集百度网盘链接:
链接:https://pan.baidu.com/s/1kvEDkNfzgLW7j5PfefC_tA?pwd=wocz
提取码:wocz
打开链接可以看到,一共有6个数据集,分别是youtube,vid,lasot,got10k,det,coco。官方代码里只用到了4个 youtube,vid,det,coco。如果显卡资源不足,可以在配置文件中设置使用的数据集,这一点在训练阶段会详细介绍。
数据集下载解压
这里以vid数据集为例,其他数据集可参考vid数据集。
下载完数据集,我们可以看到,文件中有三个.json文件,分别是:train.json,val.json和vid.json,这三个文件保存了数据集所有图片的文件名、类别和ground truth(真实框,记录目标在图片中的位置)。下面有vid_zip.z01-vid_zip.z06和vid_zip.zip,这七个文件是数据集本体,由于文件过大,进行了分卷压缩。
有两种方式可以解压,一种是在linux上进行合并,然后解压,这里我们用另一种方法,在windows上用360压缩右键单击vid_zip.zip——解压到当前文件夹,解压完成后,可以得到一个名为vid_crop.tar的文件。
tar文件是linux常用的压缩包格式,我们需要将vid_crop.tar文件复制到linux系统上,然后使用
tar -xvf vid_crop.tar
将压缩包解压,由于文件数量很大,所以解压时间需要几个小时,耐心等待解压完,可以得到最终的数据集如下:
代码部署
可以用git获取,也可以直接下载.zip文件,然后解压到本地,在PyCharm中打开。
打开后项目文件如下:
使用Anaconda安装好pytorch环境后,右下角解释器切换为自己的环境,然后打开terminal,输入
pip install -r requirements.txt -i https://pypi.douban.com/simple
(使用豆瓣源) 批量安装所需环境。
重要:第一大坑!!!
由于本项目测试代码test.py涉及到C++库,所以初次使用需要在terminal(终端)运行setup.py编译,编译指令为:
python setup.py build_ext --inplace
如果没有安装Visual Studio C++,编译时会报错:error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
安装完成后,重新输入指令,编译完成。
训练
打开项目,我们首先对项目的文件结构有个大概的了解,在这里我只介绍训练、测试和验证需要用到的代码。
需要用到的文件夹是experiments,pysot和tools文件夹。
experiments文件夹是实验部分,包含了支持的11种实验。
siammask是带蒙版的跟踪,siamrpn_alex是SiamRPN网络,siamrpn_r50是SiamRPN++网络。前者使用AlexNet作为编码器提取特征,后者使用ResNet50作为编码器提取特征,性能更强。论文链接如下:
SiamRPN:High Performance Visual Tracking With Siamese Region Proposal Network (thecvf.com)
SiamRPN++:
接下来以siamrpn_r50_l234_dwxcorr为例,说明siamrpn++的训练过程:
首先是下载backbone权重和模型权重,本人已放在百度网盘,方便下载:
链接:https://pan.baidu.com/s/1k3e8x3r0Gnub_lmS9IAbKA?pwd=raa1
提取码:raa1
下载后可以看到:
alexnet-bn.pth是AlexNet编码器的权重,resnet50.model是ResNet50编码器的权重。
然后打开PySOT文件夹下的siamrpn_r50_l234_dwxcorr文件夹,可以发现,这些目录跟experiments文件夹一一对应,显而易见,它们是每个实验对应的配置(config.yaml,不要使用这个,要用PySOT项目内原有的congfig.yaml文件)和模型权重(model.pth,训练可以加载预训练模型,加速训练)。
下载resnet50.model,在项目下新建pretrained_models文件夹,将resnet50.model放入文件夹;
下载model.pth,放入experiments/siamrpn_r50_l234_dwxcorr文件夹。
修改配置文件
有两个配置文件与训练相关,一个是experiments/siamrpn_r50_l234_dwxcorr/config.yaml,这个文件主要设定了网络模型的一些参数,不需要修改;另一个是pysot/core/config.py,这个文件设定了网络训练的参数 ,需要根据需要修改。
打开pysot/core/config.py,写入模型权重路径,可以加载预训练模型进行训练。
__C.TRAIN.PRETRAINED = './model.pth'
以下几个参数也比较重要,分别是epoch,start epoch(加载模型时使用,可以继续训练,例如之前保存到第十个eopch,后面可以从11开始),batch_size和num_workers(多线程处理数据,根据CPU性能设置,CPU性能好可以设置成8,16等,不好则设置为0)
__C.TRAIN.EPOCH = 20 __C.TRAIN.START_EPOCH = 0 __C.TRAIN.BATCH_SIZE = 32 __C.TRAIN.NUM_WORKERS = 8
以下是训练集的设置部分,包括所使用的数据集名称,数据集路径和数据集训练总数。
默认是四个数据集一起训练,也可以设成单个数据集,例如['VID']就是只用VID一个数据集,只用一个数据集时,其他的数据集设置需要注释掉。
__C.DATASET.VIDEOS_PER_EPOCH = 600000代表训练的总数,设置的越小训练越快。建议设置的数目与所用数据集总数保持一致,这样每个epoch只用训练一次,不需要重复训练。
以下是backbone预训练权重的路径及其他配置:
__C.BACKBONE.TRAIN_EPOCH = 10 (从0开始) 这个参数也比较重要,它规定了backbone开始训练的epoch数,在此之前,网络会冻结backbone的参数,仅仅调整编码器后面的分类和回归分支的参数。例如,总的训练轮数设为20个epoch,__C.BACKBONE.TRAIN_EPOCH = 10 的作用是第1-10个epoch只调整分类和回归分支的参数,从第11个epoch开始调整backbone的权重。
开始训练
打开terminal,cd到experiments/siamrpn_r50_l234_dwxcorr
重要!!!
第二个坑:运行前需要将项目路径添加到环境变量,linux和windows不同。
如果是linux,直接在terminal输入:
export PYTHONPATH=自己的项目路径:$PYTHONPATH
如果是windows,在 terminal输入:
set PYTHONPATH=%PYTHONPATH%;自己的项目路径
也可以在对应的python文件里加上两条语句,以下以tools/train.py作为例子,其他.py文件运行前,都需要有类似的操作,第一种方法每次重新打开项目都需要,第二种方法只需要添加一次:
环境变量添加完成后,输入运行指令。
原项目使用了8块GPU,本人所在实验室算力不足,只有2块3090,所以--nproc_per_node参数设置成2(根据自己的显卡数量调整)
单个设备,2块GPU的指令如下,linux系统上需要输入CUDA_VISIBLE_DEVICES=0,1,windows上可以跳过这条语句:
CUDA_VISIBLE_DEVICES=0,1
python -m torch.distributed.launch \
--nproc_per_node=2 \
--master_port=2333 \
../../tools/train.py --cfg config.yaml
运行完成后,会在Siamrpn_r50_l234_dwxcorr/snapshot文件夹下保存每个epoch的权重文件。