seg2vid 迁移使用ucf101数据集

article/2025/3/19 10:06:28

文章目录

    • 在test_refine_w_mask_two_path.py上加载playingviolin数据集的结果
    • 输入参数的调整
    • 修改地址
    • 在test_refine上复现
      • 修改:
        • 使用list文件生成工具产生测试帧目录
        • class UCF101
      • 跑test_refine.py

在test_refine_w_mask_two_path.py上加载playingviolin数据集的结果

报错结果
参数不匹配,应该是预训练模型没有使用区分前景和背景的语义分割图,即下面这个结构没有被使用。
two_path的semantic label map
看来作者应该只是在cityscapes数据集上进行了消融实验,要跑ucf 101的数据集应该在test_refine_w_mask.py上进行。

输入参数的调整

本节使用pythontest_refine_w_mask.py进行测试

num_frames = 15
num_predicted_frames = 14
input_channel = 1
mask_channel = 2

上面参数会影响

self.motion_net = motion_net(opt, int(opt.num_frames*opt.input_channel)+20, 1024)
self.zconv = convbase(256 + 64, 16*self.opt.num_predicted_frames, 3, 1, 1)
self.refine_net = RefineNet(num_channels=opt.input_channel)

更改参数后的报错信息

RuntimeError: Error(s) in loading state_dict for VAE:size mismatch for motion_net.main.0.weight: copying a param of torch.Size([32, 35, 4, 4]) from checkpoint, where the shape is torch.Size([32, 15, 4, 4]) in current model.size mismatch for zconv.main.0.weight: copying a param of torch.Size([224, 320, 3, 3]) from checkpoint, where the shape is torch.Size([64, 320, 3, 3]) in current model.size mismatch for zconv.main.0.bias: copying a param of torch.Size([224]) from checkpoint, where the shape is torch.Size([64]) in current model.size mismatch for refine_net.image_encoder.c1.0.main.0.weight: copying a param of torch.Size([64, 1, 3, 3]) from checkpoint, where the shape is torch.Size([64, 3, 3, 3]) in current model.size mismatch for refine_net.image_decoder.upc6.1.weight: copying a param of torch.Size([64, 1, 3, 3]) from checkpoint, where the shape is torch.Size([64, 3, 3, 3]) in current model.size mismatch for refine_net.image_decoder.upc6.1.bias: copying a param of torch.Size([1]) from checkpoint, where the shape is torch.Size([3]) in current model.

计算得出结论

num_frames = 5
num_predicted_frames = 4
input_channel = 3
mask_channel = 20  #这个不确定,先定为初始值20

注解
checkpoint指的是程序中的检查点,current model 指的是预训练模型

新的报错信息

RuntimeError: Error(s) in loading state_dict for VAE:size mismatch for motion_net.main.0.weight: copying a param of torch.Size([32, 35, 4, 4]) from checkpoint, where the shape is torch.Size([32, 15, 4, 4]) in current model.size mismatch for encoder.econv1.main.0.weight: copying a param of torch.Size([32, 23, 4, 4]) from checkpoint, where the shape is torch.Size([32, 3, 4, 4]) in current model.

源码定义

self.motion_net = motion_net(opt, int(opt.num_frames*opt.input_channel)+20, 1024)  # line 200
self.econv1 = convbase(opt.input_channel + opt.mask_channel, 32, 4, 2, 1)  # 32,64,64

结论

mask_channel = 0
# self.motion_net改为如下(删去+20)
self.motion_net = motion_net(opt, int(opt.num_frames*opt.input_channel), 1024)

注解:mask_channel = 0 的话,貌似使用不带segment mask的测试文件test_refine.py比较好?这个作为下一步计划,目前先试试能不能跑通test_refine_w_mask.py

修改地址

新的报错

ValueError: Traceback (most recent call last):File "/home/zhouhh/anaconda3/envs/python35/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 106, in _worker_loopsamples = collate_fn([dataset[i] for i in batch_indices])File "/home/zhouhh/anaconda3/envs/python35/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 106, in <listcomp>samples = collate_fn([dataset[i] for i in batch_indices])File "/home/zhouhh/seg2vid/src/datasets/cityscapes_dataset_w_mask_two_path.py", line 74, in __getitem__sample = imagetoframe(image_dir, self.size, self.num_frame)File "/home/zhouhh/seg2vid/src/datasets/cityscapes_dataset_w_mask_two_path.py", line 47, in imagetoframesamples = [replace_index_and_read(image_dir, indx, size) for indx in range(num_frame)]File "/home/zhouhh/seg2vid/src/datasets/cityscapes_dataset_w_mask_two_path.py", line 47, in <listcomp>samples = [replace_index_and_read(image_dir, indx, size) for indx in range(num_frame)]File "/home/zhouhh/seg2vid/src/datasets/cityscapes_dataset_w_mask_two_path.py", line 21, in replace_index_and_readnew_dir = image_dir[0:-22] + str(int(image_dir[-22:-16]) + indx).zfill(6) + image_dir[-16::]
ValueError: invalid literal for int() with base 10: '1_c01/'

分析
地址不对,new_dir是按照cityscapes数据集的文件名字来定的

修改

# 首先修改opts.py
parser.add_argument('--dataset',default='ucf101',# default='cityscapes_two_path',type=str,help='Used dataset (cityscpes | cityscapes_two_path | kth | ucf101).'
)

报错

FileNotFoundError: Traceback (most recent call last):File "/home/zhouhh/anaconda3/envs/python35/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 106, in _worker_loopsamples = collate_fn([dataset[i] for i in batch_indices])File "/home/zhouhh/anaconda3/envs/python35/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 106, in <listcomp>samples = collate_fn([dataset[i] for i in batch_indices])File "/home/zhouhh/seg2vid/src/datasets/ucf_dataset.py", line 34, in __getitem__item = np.load(os.path.join(self.datapath, self.datalist[idx].split(' ')[0]).strip())File "/home/zhouhh/anaconda3/envs/python35/lib/python3.5/site-packages/numpy/lib/npyio.py", line 384, in loadfid = open(file, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '/home/zhouhh/pytorch-deeplab-xception/frames/v_PlayingViolin_g01_c01/frame0000000.jpg'

修改
playingviolin.txt文件中frame后面多写了一个0

新报错
np.load无法加载.jpg文件

分析
可能是使用test_refine_w_mask.py这个文件测试的时候,使用的数据不是用的.jpg格式的,要使np.load可以读取的话,应是.npz。这里作者也没有特别说明,暂且搁下吧。且结合之前的推论预训练模型中对应mask_channel为0,显然是不使用segment_mask的,用test_refine_w_mask.py这个文件测试无法得到正确的结果。

结论
想在ucf-101数据集上得到使用mask情况下的预测结果,必须重新训练。

在test_refine上复现

不使用mask。

修改:

opt.py:

--dataset ucf101

dataset.py get_test_set():

# line 74
datalist=os.path.join(UCF_101_DATA_LIST, 'test_%s.txt' % (opt.category.lower()))

使用list文件生成工具产生测试帧目录

utils.ucf101_gen_list.py:

# line 13
listfile = open("../file_list/test_playingviolin.txt", 'a')

注:视频转帧由项目pytorch-deeplab-xception的video2frame.py实现:

import numpy as np
import cv2
import torch
from torch.autograd import Variablefrom os.path import join
from glob import globimport torch
from torchvision import transforms, models
from PIL import Image
import os.pathimport multiprocessing
multiprocessing.set_start_method('spawn', True)'''
Func name: video2frame
Description: clip video to frames with setted interval
Author: Wei Wei, zhouhongh
Input param: video_src_path: 视频存放路径frame_save_path: 保存路径frame_width: 保存帧宽frame_height: 保存帧高interval: 保存帧间隔
Time: 2019.9
'''
def video2frame(video_src_path, frame_save_path, frame_width, frame_height, interval):videos = os.listdir(video_src_path)formats = [".mp4", ".avi"]def filter_format(x, all_formats):if x[-4:] in all_formats:return Trueelse:return Falsevideos = filter(lambda x: filter_format(x, formats), videos)for each_video in videos:print ("正在读取视频:", each_video)each_video_name = each_video[:-4]each_video_save_full_path = os.path.join(frame_save_path, each_video_name)if not os.path.exists(each_video_save_full_path):os.makedirs(each_video_save_full_path)each_video_full_path = os.path.join(video_src_path, each_video)cap = cv2.VideoCapture(each_video_full_path)frame_index = 0frame_count = 0if not cap.isOpened():print("读取视频失败!")while(1):success, frame = cap.read()if not success:print("---> 已保存%d帧至%s." % (frame_count, each_video_save_full_path))breakif frame_index % interval == 0:resize_frame = cv2.resize(frame, (frame_width, frame_height), interpolation=cv2.INTER_AREA)cv2.imwrite(each_video_save_full_path + "/" + each_video_name +"_" + ("%d.jpg" % frame_count).zfill(10), resize_frame)frame_count += 1frame_index += 1cap.release()video2frame("/home/zhouhh/DATAshare/UCF-101/PlayingViolin/", "/home/zhouhh/DATAshare/UCF-101/PlayingViolin/", 128, 128, 2)

class UCF101

理解
作者对于ucf101数据集使用了和cityscapes不同的处理策略。
cityscapes的.txt中存放的是视频帧的文件名。而ucf101的.txt中存放的应该是一个个的.npy文件名,每个.npy代表一个视频,.npy文件里面是一个个数组,用空格隔开,每个数组代表一帧的数据。这里没找到作者将.avi处理为.npy的程序,因此按照cityscapes数据集下加载数据的方式,迁移到ucf101中使用,使得仍然可以在ucf101数据集上使用直接读取图片的方式加载数据。
更改
datasets.ucf_datasets中定义了加载ucf101数据的类,名为UCF101,在dataset.get_test_set函数中被调用。
调用时赋值如下:

# UCF_101_DATA_PATH = '/home/zhouhh/DATAshare/UCF-101/PlayingViolin/'
# UCF_101_DATA_LIST = '/home/zhouhh/seg2vid/src/file_list'
test_Dataset = UCF101(datapath=UCF_101_DATA_PATH,datalist=os.path.join(UCF_101_DATA_LIST, 'test_%s.txt' % (opt.category.lower())),returnpath=True)

将 cityscapes_dataset_w_mssk.py的__getitem__及其用到的函数复制到ucf_dataset.py中。

更改replace_index_and_read的new_dir

new_dir = image_dir[0:-10] + str(int(image_dir[-10:-4]) + indx).zfill(6) + image_dir[-4::]

更改complete_full_list的dir_list

dir_list = [image_dir[0:-10] + str(int(image_dir[-10:-4]) + i).zfill(6) + '_' + output_name for i inrange(num_frames)]

更改__getitem__使得其不返回mask

if self.returnPath:return sample, complete_full_list(self.datalist[idx].strip(), self.num_frame, 'pred.jpg')
else:return sample

使用如下代码进行测试:

if __name__ == '__main__':start_time = time.time()# v_IceDancing_g06_c01.npyUCF_101_DATA_PATH = '/home/zhouhh/DATAshare/UCF-101/PlayingViolin/'UCF_101_DATA_LIST = '/home/zhouhh/seg2vid/src/file_list'# train_Dataset = UCF101(datapath=os.path.join(Path, 'IceDancing'),#                        datalist=os.path.join(Path, 'list/trainicedancing.txt'))test_Dataset = UCF101(datapath=UCF_101_DATA_PATH,datalist=os.path.join(UCF_101_DATA_LIST, 'test_playingviolin.txt'), returnpath=True)dataloader = DataLoader(test_Dataset, batch_size=32, shuffle=True, num_workers=8)sample= iter(dataloader).next()print(sample.shape)

根据提示更改一些变量名,将size改成和cityscapes一样的数组形式即可。

跑test_refine.py

问题:RuntimeError: CUDA error: out of memory
解决:减少batch_size ,在opts.py中将其设置为4

问题:保存的路径不存在
解决:在test_refine.py中改写 make_save_dir函数

def make_save_dir(output_image_dir):val_video = 'v_PlayingViolin_g01_c01'pathOutputImages = os.path.join(output_image_dir, val_video)if not os.path.isdir(pathOutputImages):os.makedirs(pathOutputImages)

然后删除原来生成的ucf101_results文件夹


http://chatgpt.dhexx.cn/article/P6IKkjWt.shtml

相关文章

Ubantu16.04+CUDA10.0安装mmaction以及提取UCF101的frame和optical flow

Ubantu16.04CUDA10.0安装mmaction以及提取UCF101的frame和optical flow 研一刚转到视频动作识别方向&#xff0c;因为很多模型都需要光流输入&#xff0c;因此不得不安装第三方库提取光流。尽管现在该领域何凯明大佬的最新成果&#xff0c;Non-Local模块以及SlowFast-Net只用视…

UCF101视频分类之CNN-LSTM-Code总结

harvitronix/five-video-classification-methods视频分类-Code总结 环境要求准备工作提取视频帧CNN提取视频帧特征LSTM验证模型扩展 Code: https://github.com/harvitronix/five-video-classification-methods. 环境要求 requirements: Keras>2.0.2 numpy>1.12.1 pand…

使用Pytorch实现UCF101视频分类

开源代码&#xff1a;https://github.com/jfzhang95/pytorch-video-recognition 系统&#xff1a;Ubuntu16.04 显卡1070 编译器&#xff1a;pycharm UCF数据集包括101类视频&#xff0c;分别是&#xff1a; 1 ApplyEyeMakeup 2 ApplyLipstick 3 Archery 4 BabyCrawling 5 B…

动作识别0-02:mmaction2(SlowFast)-官方数据训练测试-ucf101

以下链接是个人关于mmaction2(SlowFast-动作识别) 所有见解&#xff0c;如有错误欢迎大家指出&#xff0c;我会第一时间纠正。有兴趣的朋友可以加微信&#xff1a;17575010159 相互讨论技术。若是帮助到了你什么&#xff0c;一定要记得点赞&#xff01;因为这是对我最大的鼓励。…

01【C3D 行为识别】项目下载 环境配置 数据集转化视频帧 UCF101数据集处理

目录 一&#xff0c;创建实例二&#xff0c;环境的快速搭建三&#xff0c;UCF101数据集处理3.1 准备视频文件3.2 下载标注文件3.3 抽取视频帧3.4 生成文件列表最后结构 四&#xff0c;参考 【C3D 行为识别】总目录 实战 复现代码解析自定义数据集 B站视频&#xff1a; https:/…

我的AI之路(52)--如何制作自己的UCF101数据集

前面说过如何用自己的UCF101数据集训练3D识别模型video-caffe&#xff0c;那么怎么制作自己的UCF101数据集呢&#xff1f;这个稍微有点复杂。 UCF101数据集其实是按101个动作类别分类了的短视频的集合&#xff0c;每类动作对应一个目录&#xff0c;每个目录下有很多avi格式的视…

时空行为检测数据集 JHMDB UCF101_24 详解

文章目录 0. 前言1. JHMDB1.1. 基本情况1.2. 数据准备以及标签详解 2. UDF101_242.1. 基本情况2.2. 数据准备与标签详解 3. 数据集可视化代码 0. 前言 现在常用的时空行为检测数据集只有AVA/JHMDB/UCF101_24。 AVA数据集是每一秒标一帧&#xff0c;更多信息可以参考我的笔记。…

行为识别TSM训练ucf101数据集

序言 最近有个行为检测的需求&#xff0c;打算用行为识别做&#xff0c;纯小白入这个方向&#xff0c;啃了两周的TSM原理和源码&#xff0c;训练好自己的数据集后&#xff0c;发现好像没法应用到自己的需求场景&#xff1f;&#xff1f;玛德&#xff01;算了&#xff0c;还是要…

UCF101数据集处理

UCF101数据集处理 在复现动作识别类的算法时&#xff0c;常需要用到数据集。ucf101就是其中一个。 之前复现代码时所用的ucf101数据集是直接将原数据集中的视频处理成图片。数据集目录如下&#xff1a; UCF101/ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01/img_00001.jpg (此时通过…

深度学习视频数据集(动作识别):UCF-101

UCF-101 官网&#xff1a;https://www.crcv.ucf.edu/research/data-sets/ucf101/ 网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1RsJuykWyUlQ4_c1TwqxR_Q 提取码&#xff1a;909g 官方解释 UCF101是一个现实动作视频的动作识别数据集&#xff0c;收集自YouTub…

UCF101数据集提取帧+TDN部署(Anaconda+Python3.7+Pytorch)

UCF101数据集提取帧TDN部署&#xff08;AnacondaPython3.7Pytorch&#xff09; 前言一、安装MMAction21.引入库2.环境搭建3.安装4.准备原始数据集5.制作视频提取帧数据集 二、部署TDN1.引入库2.读入数据3.训练模型4.查看结果 本人实测结果 前言 将TDN部署在个人电脑上&#xf…

UCF101动作识别数据集简介绍及数据预处理

文章目录 一、数据集简介&#xff1a;二、数据集获取及解压缩&#xff1a;1. 数据下载2. 数据集解压缩&#xff1a; 三、数据集划分四、数据集预处理1. 生成pkl文件2. 直接对视频文件处理 一、数据集简介&#xff1a; UCF101是一个现实动作视频的动作识别数据集&#xff0c;收…

【Java】内部类的定义

目录 一、前言 二、内部类 语法格式&#xff1a; static修饰内部类 内部类未被static修饰时&#xff1a; 内部类被static修饰后 演示操作&#xff1a; 一、前言 前面我们学习了一个小的项目&#xff0c;现在我们来学习新的知识点&#xff0c;关于内部类的描述&#xff0…

Java类的定义、声明及使用

1、 class 类名称{属性方法} 2、声明一个类需要通过一个关键字class 3、类与对象的关系 1&#xff09;类是对某一类事物的描述&#xff0c;是抽象的、概念上的意义&#xff0c;对象是实际存在的该类事物的每一个个体&#xff0c;也被称为实例。 package classdemo; class …

C#类的定义

在C#语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 类的访问修饰符&#xff1a;用于设定对类的访问限制&#xff0c;包括 public、internal 或者不写&#xff0c;用 internal 或者不写时代表只能在当前项目中访问类…

C#类的定义和声明及使用

类的定义 类的成员 } 例如&#xff0c;以水果为例来声明一个类&#xff0c;代码如下&#xff1a;在 C# 语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 简单的来说&#xff0c;在C#编程里&#xff0c;类是一种数据结…

(27)python类的定义和使用

面向对象初步 面向对象&#xff08;Object oriented Programming&#xff0c;OOP&#xff09;编程的思想主要是针对大型软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好&#xff0c;使的编程可以像搭积木一样简单。 面向对象编程将数据和操作数据相关的方法封装…

类的认识和定义

前言 C为啥要引入类这个概念呢&#xff0c;以C实现栈为例说明。 typedef int STDataType; typedef struct Stack { . . . .int top; . . . .STDataType* data; . . . .int capacity; }Stack; void StackInit(Stack* ps); //栈的初始化 void StackDestory(Stack* ps); //栈的销…

Python类的定义

类的定义&#xff1a;我们把对象比作一个“饼干”&#xff0c;类就是制造这个饼干的模具。通过类定义数据类型的属性和方法&#xff0c;也就是说&#xff0c;“类将行为和状态打包在一起”。 类的结构 方法&#xff08;函数&#xff09;..............行为 属性&#xff08;…

java类的定义

目录 一、概念二、使用1.成员变量2.成员方法3.权限修饰符4.静态方法 三、重写toString方法 一、概念 我们不能将一个事物称之为一类事物&#xff0c;例如一只鸟我们不能称为鸟类&#xff0c;但是我们需要给一类事物统称&#xff0c;例如大雁&#xff0c;麻雀&#xff0c;燕子&…