APFNet训练+测试复现过程记录

目录

说明

项目

预处理数据集

预训练模型

训练阶段一

训练阶段二

训练阶段三

模型测试


说明

  • 本篇博客是RGBT目标跟踪专题中的其中一篇:

Attribute-based Progressive Fusion Network for RGBT Tracking论文研读笔记

APFNet训练+测试复现过程记录

GTOT和RGBT234测评工具箱使用

项目

        使用GTOT数据集和RGBT234数据集相互训练测试,即一个做训练集,另一个做测试集。但是需要注意查看数据集中是否含有tag属性标签文件,最好从原作者给出的链接中下载。这里介绍使用GTOT数据集作为训练集,RGBT234数据集作为测试集,反之同样。源码结构分析如下:

APFNet源码结构分析
文件夹/文件用途
log存放训练或测试过程的打印信息
models存放预训练权重和训练中间阶段的模型
modules存放网络结构搭建的脚本
pretrain预训练数据集以及预训练模型
results存放测试跟踪结果
tracking用来在测试集上面测试模型
train_stage1.py训练阶段一
train_stage2.py训练阶段二
train_stage3.py训练阶段二

预处理数据集

        首先预处理数据集。打开 APFNet/pretrain/data/prepro_data.py。修改以下参数,其set_type 为数据集名称,设置为 GTOT 或者 RGBT234,seq_home 根据自己数据集所在路径相应修改,challenge_type 为挑战/属性名称,有六个选择,在注释中有标注。6、7、9、10 共四行也需要修改,seqlist_path 为 gtot.txt 和 rgbt234.txt 的路径,两个 txt 文件为两个数据集所含序列名称的文件。output_path 为 pkl 输出文件所要保存的路径。在这一步骤当中,需要不断修改 set_type 和 challenge_type 共 12 种组合,执行 prepro_data.py12 次,最终得到12 个 pkl 文件。

set_type = 'GTOT' # set datasets GTOT or RGBT234.modify it to yourself
#set_type = 'RGBT234'
seq_home = 'xxx/dataset/'+set_type +'/' #modify it to yourself
challenge_type = 'ALL' # set challenge type. FM~Fast	Motion; OCC~Occlusion; SC~Scale; Variation; ILL~Illumination Variation; TC~Thermal Crossover; ALL~Whole dataset
if set_type=='GTOT':  #modify it to yourself
    seqlist_path = 'xxx/dataset/gtot.txt'     #modify it to yourself
    output_path = 'xxx/APFNet/pretrain/data/GTOT_'+challenge_type+'.pkl'   #modify it to yourself
elif set_type == 'RGBT234':
    seqlist_path = 'xxx/dataset/rgbt234.txt'
    output_path = 'xxx/APFNet/pretrain/data/RGBT234_'+challenge_type+'.pkl'

        其中,gtot.txt 文件内容示例如下:

BlackCar
BlackSwan1
BlueCar
BusScale
......

        生成 gtot.txt 文件以及 rgbt234.txt 可使用如下简易的脚本:

import os

#my_path = './RGBT234'
#txt_name = './RGBT234.txt'

my_path = './GTOT'
txt_name = './gtot.txt'

with open(txt_name,"w") as f:
    for name in os.listdir(my_path):
        f.write(str(name) + '\n')

        共生成12个pkl文件,用来存储数据集中不同属性子集的路径。

预训练模型

        首先修改 APFNet/pretrain/data_prov.py 中的 modules 文件夹路径。

import torch
import torch.utils.data as data
import sys
sys.path.insert(0,'xxx/APFNet/modules/')
from sample_generator import SampleGenerator
from utils import crop_image2

        之后修改 APFNet/pretrain/train_mdnet.py 中的三个参数。其中 dataset 为数据集名称,需要设置为 gtot 或者 rgbt234,model_path 为输出的模型的保存路径及名称,init_model_path为预训练权重的路径,这里我们使用./models/mdnet_imagenet_vid.pth 作为预训练权重。在这一步骤当中,需要设置dataset变量的值两次,运行脚本两次,得到两个输出模型:GTOT.pth和 RGBT234.pth,这两个模型之后将会作为第一阶段训练的预训练权重。

parser.add_argument('-d', '--dataset', default='gtot', help='training dataset {gtot, rgbt234}')
parser.add_argument("-model_path", default ="./models/GTOT", help = "model path")
parser.add_argument("-init_model_path", default="./models/mdnet_imagenet_vid.pth")

        根据 train_mdnet.py 脚本中关于路径的代码编写方式,可知,运行该脚本应在其上一层
文件夹内,即:

cd APFNet/
python3 ./pretrain/train_mdnet.py

        执行两次之后,将会在 APFNet/models/下得到 GTOT.pth 和 RGBT234.pth 两个模型。

训练阶段一

        三个训练阶段均以训练 GTOT 数据集为例,RGBT234 数据集训练过程同理。

        修改APFNet/pretrain/pretrain_option.py 中的模式,设置为阶段一:

#stage1 common
opts['ft_layers'] = ['parallel','fc']
opts['lr_mult'] = {'parallel':10,'fc':5}
opts['n_cycles'] = 500

##stage2 ensemble sknet
#opts['ft_layers'] = ['ensemble','fc6']
#opts['lr_mult'] = {'ensemble':10,'fc6':5}
#opts['n_cycles'] = 500

#stage3 ensemble Transformer fine-tune all
#opts['ft_layers'] = ['transformer','fc','layer','parallel','ensemble']
#opts['lr_mult'] = {'transformer':10,'fc':1,'fc6':5,'layer':1,'parallel':1,'ensemble':1}
#opts['n_cycles'] = 500

        修改 APFNet/train_stage1.py 中以下参数,其中 set_type 表示要训练的属性的分支,model_path 表示生成的模型的输出位置及名称,init_model_path 为预训练权重位置,这里使用之前生成的 GTOT.pth。batch_frames、lr、batch_pos、batch_neg、n_cycles 是一些超参数,可以自己改动,也可以使用原设置。

#Change it by yourslef to train different attribute branches
parser.add_argument("-set_type", default = 'GTOT_FM') # OCC SC TC FM ILL
#your path for saving attribute branch
parser.add_argument("-model_path", default =xxx/APFNet/models/GTOT_FM.pth", help = "model path") # # OCC SC TC FM ILL 要同时改!!!
#load the backbone model GTOT.pth use the GTOT datasets pretain, and the RGBT234.pth usze the RGBT234 dataset pretrain the backbone.
parser.add_argument("-init_model_path", default="xxx/APFNet/models/GTOT.pth")
parser.add_argument("-batch_frames", default = 8, type = int)
parser.add_argument("-lr", default=0.0001, type = float)   #you can set it by yourself
parser.add_argument("-batch_pos",default = 32, type = int)
parser.add_argument("-batch_neg", default = 96, type = int)
parser.add_argument("-n_cycles", default = 200, type = int )  #you can set it by yourself

        根据其代码编写的路径配置,可知运行路径为当前脚本所在路径。需要修改 set_type和 model_path,并重复运行脚本共五次,得到五个模型:GTOT_OCC.pth、GTOT_SC.pth、GTOT_TC.pth、GTOT_FM.pth、GTOT_ILL.pth。其中不同的分支,也可能会得到多个模型,因为除了存储最终模型之外,平均精确度大于一定阈值如 0.95 的模型也会被保存下来。第一阶段到此完成。

cd APFNet/
python3 ./train_stage1.py

训练阶段二

        修改 APFNet/pretrain/pretrain_option.py 中的模式,设置为阶段二,同上。
        修改 APFNet/train_stage2.py 中以下参数,其中 logger 表示日志文件存储的位置及其名称,set_type 表示要训练的属性的分支,model_path 表示生成的模型的输出位置及名称,init_model_path 为预训练权重位置,这里使用之前生成的 GTOT.pth。batch_frames、lr、batch_pos、batch_neg、n_cycles 是一些超参数,可以自己改动,也可以使用原设置。

logger = get_logger('./log/trainGTOTSKALL.log')
parser = argparse.ArgumentParser()
#set yourdataset
parser.add_argument("-set_type", default = 'GTOT_ALL')
#Saving model path
parser.add_argument("-model_path", default ="xxx/APFNet/models/GTOT_ALL", help = "model path")
#your backbone model 
parser.add_argument("-init_model_path", default="xxx/APFNet/models/GTOT.pth")
parser.add_argument("-batch_frames", default = 8, type = int)
parser.add_argument("-lr", default=0.0001, type = float)     #set it bysourself
parser.add_argument("-batch_pos",default = 32, type = int)
parser.add_argument("-batch_neg", default = 96, type = int)
parser.add_argument("-n_cycles", default = 500, type = int ) #set it bysourself

        根据其代码编写的路径配置,可知运行路径为当前脚本所在路径。运行脚本共一次,得到一个模型:GTOT_ALL.pth。第二阶段到此完成。

训练阶段三

        修改 APFNet/pretrain/pretrain_option.py 中的模式,设置为阶段三,同上。
        修改 APFNet/train_stage3.py 中以下参数,其中 logger 表示日志文件存储的位置及其名称,set_type 表示要训练的属性的分支,model_path 表示生成的模型的输出位置及名称,init_model_path 为预训练权重位置,这里使用之前生成的 GTOT.pth。batch_frames、lr、batch_pos、batch_neg、n_cycles 是一些超参数,可以自己改动,也可以使用原设置。

logger = get_logger('./log/Train_GTOT_ALL_Transformer.log')
parser = argparse.ArgumentParser()
parser.add_argument("-set_type", default = 'GTOT_ALL')
parser.add_argument("-model_path", default ="xxx/APFNet/models/GTOT_ALL_Transformer", help = "model path")
parser.add_argument("-init_model_path", default="xxx/APFNet/models/GTOT_ALL.pth")
parser.add_argument("-batch_frames", default = 8, type = int)
parser.add_argument("-lr", default=0.0001, type = float)
parser.add_argument("-batch_pos",default = 32, type = int)
parser.add_argument("-batch_neg", default = 96, type = int)
parser.add_argument("-n_cycles", default = 1000, type = int )

        根据其代码编写的路径配置,可知运行路径为当前脚本所在路径。运行脚本共一次,得到最终模型:GTOT_ALL_Transformer.pth。第三阶段到此完成。

模型测试

        介绍使用 GTOT 数据集训练得到的模型测试 RGBT234 数据集,反之亦然。

        首先需要修改 APFNet/tracking/Run.py 中显卡指定一行:

os.environ["CUDA_VISIBLE_DEVICES"] = '0'

        再修改 APFNet/tracking/Run.py 中其他参数,其中,logger 表示日志文件保存的位置及其名称,dataset 表示待被测试的数据集,我们这里选择 RGBT234,model_path 表示使用加载哪一个模型,作为输入,result_path 表示测试结果保存的位置,dataset_path 表示待测试数据集存储在的位置,mylist 表示数据集序列名称文件的路径。

logger = get_logger('./log/GTOT_ALL_Transformer.log')    #Record your log files
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--seq', default='', help='input seq')
parser.add_argument('-j', '--json', default='', help='input json')
parser.add_argument('-f', '--savefig', action='store_true')
parser.add_argument('-d', '--display', action='store_true')
parser.add_argument("-dataset", default = 'RGBT234' )             #testing dataset
parser.add_argument("-model_path", default ='./models/GTOT_ALL_Transformer.pth')   # your model
parser.add_argument("-result_path", default ='xxx/APFNet/results/') #your result path
args = parser.parse_args()
##your result path
args.result_path = 'xxx/APFNet/results/'+args.dataset+'/'+args.model_path.split('/')[-1].split('.')[0]+'/'
#assert args.seq != '' or args.json != ''
print(opts)
dataset_path = os.path.join('xxx/dataset/', args.dataset)     #dataset path
mylist='xxx/dataset/rgbt234.txt'

        运行之后,将在APFNet/results/RGBT234/GTOT_ALL_Transformer/下得到跟踪结果,每个txt里面都是八列,前四列表示RGB图像上的跟踪框,后四列则是相对应的热红外图像的跟踪框。

 

### 回答1: 好的,以下是使用PyTorch复现PointNet++的步骤: 1. 安装PyTorch和其他必要的库,如numpy、scipy、h5py等。 2. 下载PointNet++的代码和数据集。可以从官方GitHub仓库下载代码,数据集可以从官方网站下载。 3. 将数据集转换为PyTorch可以处理的格式。可以使用h5py库读取数据集,然后将数据转换为PyTorch张量。 4. 编写模型代码。PointNet++的模型代码可以在PointNet++的GitHub仓库中找到。将代码转换为PyTorch版本并进行必要的修改。 5. 训练模型。使用PyTorch的优化器和损失函数训练模型。可以使用PyTorch的DataLoader加载数据集,并使用PyTorch的GPU加速训练过程。 6. 测试模型。使用测试测试模型的性能。可以使用PyTorch的评估函数计算模型的准确率和其他指标。 7. 调整模型。根据测试结果调整模型的参数和架构,以提高模型的性能。 以上是使用PyTorch复现PointNet++的基本步骤。需要注意的是,这只是一个大致的指导,具体的实现过程可能会因为数据集和模型的不同而有所不同。 ### 回答2: PointNet 是一种用于点云数据的深度学习模型,其对点云进行全局池化(global pooling)以及局部特征学习(local feature learning)的方法使得其在各种场景中取得了非常好的结果。本文将介绍如何使用 PyTorch 复现 PointNet 模型。 首先,我们需要准备数据。PointNet 接收的输入是点云,我们可以通过采样或者转换方法将 mesh 数据转换为点云数据。在转换为点云后,我们可以将点云转换为 numpy array,并使用 PyTorch 的 DataLoader 进行数据预处理。在这里我们使用 ModelNet40 数据集进行实验。 接下来,我们需要定义 PointNet 模型的结构。PointNet 包括两个编码器和一个分类器。编码器用于从点云中提取特征信息,分类器用于将提取的特征映射到具体的分类标签。这里我们定义一个函数 PointNetCls,将编码器和分类器都封装在这个函数中。 ```python import torch.nn as nn import torch.nn.functional as F import torch.optim as optim class PointNetCls(nn.Module): def __init__(self, k=40): super(PointNetCls, self).__init__() self.k = k self.conv1 = nn.Conv1d(3, 64, 1) self.conv2 = nn.Conv1d(64, 128, 1) self.conv3 = nn.Conv1d(128, 1024, 1) self.fc1 = nn.Linear(1024, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, k) def forward(self, x): batchsize = x.size()[0] x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = torch.max(x, 2, keepdim=True)[0] x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return F.log_softmax(x, dim=1) ``` 具体来讲,我们先使用三个卷积层提取特征信息,然后使用 max pooling 进行池化,最后通过三个全连接层将提取的特征映射到具体的分类标签。特别的,我们将最后一层的输出使用 softmax 函数来进行分类。 训练过程如下: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = PointNetCls().to(device) optimizer = optim.Adam(model.parameters(), lr=0.001) for epoch in range(300): model.train() for batch_id, (data, label) in enumerate(train_loader): optimizer.zero_grad() data, label = data.to(device), label.to(device) pred = model(data) loss = F.nll_loss(pred, label) loss.backward() optimizer.step() print(f'Epoch {epoch}: Training Loss: {loss.item()}') model.eval() correct = 0 for data, label in test_loader: data, label = data.to(device), label.to(device) pred = model(data) pred = pred.data.max(1)[1] correct += pred.eq(label.data).cpu().sum() accuracy = correct.item() / float(len(test_loader.dataset)) print(f'Epoch {epoch}: Testing Accuracy: {accuracy}') ``` 可以看到,在训练阶段我们使用 Adam 优化器来优化模型,并使用负对数似然对数函数作为损失函数。在测试阶段我们将模型设置为评价模式,并使用预测结果和真实标签的比对结果计算准确率。 通过以上步骤,我们已经完成了一个 PointNet 的 PyTorch 实现。当然,为了提高准确率我们还可以对模型结构进行优化,如引入 dropout、batch normalization 等结构,或者将模型拓展到 PointNet++ 等更加优秀的架构。 ### 回答3: PointNet是一种针对点云数据进行分类和分割的深度学习模型,其在处理三维几何数据方面具有很好的效果,也被广泛应用于许多领域。为了复现PointNet模型,我们可以使用Pytorch框架进行实现。下面是针对PointNet复现的详细步骤: 一、准备数据 首先需要准备点云数据集,我们可以使用ShapeNet数据集中的某些部分进行测试。我们需要将点云数据转化为numpy数组形式,并将其划分为训练集和验证集。 二、数据预处理 在进行训练工作之前,我们需要将点云数据进行预处理,包括点云的标准化和噪声过滤等操作。处理后的数据可以使用dataloader以batch的形式进行加载。 三、搭建模型 我们可以按照PointNet的论文中的模型结构进行搭建。线性变换、最大池化和ReLU激活层的堆叠是构成模型的主要部分。我们需要使用Pytorch中定义模型的方法实现PointNet模型。 四、训练模型 我们可以使用Pytorch自带的优化器,如Adam优化器来训练PointNet模型。在每个epoch结束后,我们可以计算模型在验证集上的精度和准确度,以评估模型性能。 五、测试模型 完成模型训练后,我们可以使用Pytorch中的模型预测方法对新的未见数据进行分类和分割预测。 这些就是复现PointNet模型的详细步骤。此外,还需要注意一些细节问题,例如使用GPU加速训练、采用KNN算法处理最近邻等。借助Pytorch框架,我们可以轻松地实现PointNet模型,从而应用到更多的实际场景中。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值