在AutoDL上运行TSN代码

之前先用谷歌的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)
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值