(一)里面代码有错,shutil.move是剪切,应该用copyfile。数据集从HOT2020更新为HOT2023。
一、数据transform
1、函数调用在 /ltr/train_settings/bbreg/atom.py processing.ATOMProcessing()
函数定义在 /ltr/data/processing.py class ATOMProcessing
2、首先进行 joint_transformer,将 train_image 和 test_image 灰度化
对于HOT数据,不需要灰度化,在 /ltr/train_settings/bbreg/atom.py 中 transform_joint = None
3、之后对 train 和 test 的 anno 做一个抖动处理,根据 settings.center_jitter_factor = {'train': 0, 'test': 4.5};settings.scale_jitter_factor = {'train': 0, 'test': 0.5}。train 的 anno 不做抖动,test 会产生抖动。个人理解是 train 作为训练样本,要确保正确。test 不会参与模型参数训练,造成抖动可以加大测试难度。HOT 数据集可以保留这部分操作。
4、之后分别对 train 和 test 做处理(如果与代码变量相对应,应该是train和val,HOT官方不提供test,因此将val当作test和val混着用了)。
transform_train = ToTensorAndJitter(0.2) + Normalize
ToTensorAndJitter 实现的功能是将数据转到 tensor,然后进行亮度抖动。具体来说,是数据整体乘上一个亮度因子,该因子在(1-0.2,1+0.2)区间内随机选取,相乘的结果再做一次截取,只保留(0-255)/(0-1)区间的值。
因为RGB的数据类型是Unit8,而HOT的数据类型我设置的是int32,因此代码需要修改,改变归一区间。注意,因为去掉了灰度化,数据没有进行过norm,因此这里的 self.normalize 应设为 False。
Normalize 实现的功能是数据标准化,用的到mean和std是根据RGB数据(ImageNet?)统计得到的普遍值,不适用HOT数据集。且通道数也不对应。这里需要重新统计HOT数据集的mean和std。这个值在 /ltr/train_settings/bbreg/atom.py 中设定。
transform_val = ToTensor() + Normalize
ToTensor 对于HOT是可以保留的
5、最终选择了更改处理顺序
transform_joint = tfm.Transform(tfm.Normalize_HOT(mean=settings.normalize_mean, std=settings.normalize_std))
先对train、test进行标准化+归一化
transform_train = tfm.Transform(tfm.ToTensorAndJitter_HOT(0.2))
transform_val = tfm.Transform(tfm.ToTensor_HOT())
之后转到tensor
6、inchannel设置
RGB模型直接用于HOT存在初始卷积层维度不一致的问题
修改 /ltr/models/backbone/resnet.py
class ResNet(Backbone)
self.conv1 = nn.Conv2d(3, inplanes, kernel_size=7, stride=2, padding=3, bias=False)
将inchannel从3改为16
7、运行即可正常训练
******遇到了代码卡住的问题,删除/user/.cache/torch_extensions/_prroi_pooling/文件夹,再次运行代码重新生成可以解决,原理不清