之前先用谷歌的colab运行了一下,不过太慢了,就找了一个国内的AutoDL平台,达到了新的进度。
1、首先需要安装xshall和xftp进行连接服务器和传输代码。
2、在AutoDL中选择一个需要的服务器,在Xshall中输入指令和密码,指令的格式有一点小变化
-p 删掉,数字放到最后
ssh root@xxx.x.x shuzi
3、
点这个绿色按钮,跳出xftp
通过xftp将代码传上去
4、首先在mmaction的data/ucf101中创建rawframes、videos、annotations文件夹。
- rawframes:视频提帧后存放的文件目录
- videos:拷贝ucf101数据集中的101个文件目录,放置其中
- annotations:ucf101之后进行分割训练集、测试集的依据文件
5、运行
python build_rawframes.py ../data/ucf101/videos ../data/ucf101/rawframes/ --level 2 --ext avi
生成 视频提帧
6、运行python setup.py install (在mmaction目录下,一定要安装一下,不然会报错!)
7、运行
python data_tools/build_file_list.py ucf101 data/ucf101/rawframes/ --level 2 --format rawframes --shuffle
注:一定要在mmaction层下运行,不能在data_tools下运行,里面的路径会有错误
到此,ucf101数据处理完毕
8、训练
在tsn中修改main.py代码
- 在ucf101类别中,原本代码是101,我们这里复现只使用ucf101三个类型,所以将代码修改为
if args.dataset == 'ucf101'
num_class = 3
- 在TSNDataSet中,为了更好的找到对应文件的位置,建议将args.train_list和args.val_list(这两个输入字符串就是之前生成的file_list的绝对路径)写成指定字符串的形式,所以将代码修改为
TSNDataSet("", "/root/mmaction/data/ucf101/ucf101_train_split_1_rawframes.txt", num_segments=args.num_segments,
new_length=data_length,
modality=args.modality,
image_tmpl="img_{:05d}.jpg" if args.modality in ["RGB", "RGBDiff"] else args.flow_prefix+"{}_{:05d}.jpg",
transform=torchvision.transforms.Compose([
train_augmentation,
Stack(roll=args.arch == 'BNInception'),
ToTorchFormatTensor(div=args.arch != 'BNInception'),
normalize,
]))
TSNDataSet("", "/root/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt", num_segments=args.num_segments,
new_length=data_length,
modality=args.modality,
image_tmpl="img_{:05d}.jpg" if args.modality in ["RGB", "RGBDiff"] else args.flow_prefix+"{}_{:05d}.jpg",
random_shift=False,
transform=torchvision.transforms.Compose([
GroupScale(int(scale_size)),
GroupCenterCrop(crop_size),
Stack(roll=args.arch == 'BNInception'),
ToTorchFormatTensor(div=args.arch != 'BNInception'),
normalize,
]))
对datase.py进行修改
def get(self, record, indices):
images = list()
for seg_ind in indices:
p = int(seg_ind)
for i in range(self.new_length):
seg_imgs = self._load_image('root/mmaction/data/ucf101/rawframes' + record.path, p)
images.extend(seg_imgs)
if p < record.num_frames:
p += 1
process_data = self.transform(images)
return process_data, record.label
9、运行代码
python main.py ucf101 RGB /root/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt /home/ty/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt \
--num_segments 3 \
--gd 20 --lr 0.001 --lr_steps 30 60 --epochs 5 \
-b 16 -j 8 --dropout 0.8 \
--snapshot_pref ucf101_bninception_
遇到的问题:
1、
出现的问题的地方可能是如下的地方:调用DataLoder时注意参数
self.train_dataloader = DataLoader(train_dataset, batch_size=TrainOption.train_batch_size, shuffle=TRUE,num_workers=TrainOption.data_load_worker_num)
shuffle的参数设置错误导致,因为已经有batch_sample了,就不需要shuffle来进行随机的sample了,所以在这里的shuffle应该设置为FALSE才对。
2、
主要是torchvision的版本不一样,新版本的torchvision中的transforms没有Scale属性,改成Resize就好。
3、TypeError: load() missing 1 required positional argument: ‘Loader‘
记录原因:
YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,该load函数也变得更加安全
用以下三种方式都可以
d1=yaml.load(file,Loader=yaml.FullLoader)
d1=yaml.safe_load(file)
d1 = yaml.load(file, Loader=yaml.CLoader)