用于视频回归任务的长期循环卷积网络

简介: 用于视频回归任务的长期循环卷积网络

基本概念

通过深度学习进行视频处理是一个非常复杂的领域,因为它需要处理空间和时间两个方面。为了总结现代比较流行的方法是什么,在这篇文章中我们将对视频回归任务的深度学习方法进行一些研究。

处理视频意味着处理图像,所以这里需要cnn。但是,有不同的方法来处理时态组件。我试着概括出主要的几点:

现有的方法

1、只使用CNN的回归

斯坦福大学的一篇非常有趣的论文(http://vision.stanford.edu/pdf/karpathy14.pdf)讨论了视频分类任务中可能遇到的挑战,并提供了处理这些挑战的方法(这些方法也可以应用于有轻微变化的回归问题)。简而言之,作者尝试了各种CNNs架构来跨时间组件融合信息,并学习时空特征。

640.png

2、3d CNN

这种方法背后的逻辑非常直观,因为卷积中的第三维可以对应于时间域,从而可以直接从一个网络学习时空特征。

3、长期循环卷积网络(LRCN)

2016年,一组作者提出了用于视觉识别和描述的端到端可训练类架构。其主要思想是使用CNNs从视频帧学习视觉特征,使用LSTMs将图像嵌入序列转换为类标签、句子、概率或任何您需要的东西。因此,我们用CNN对原始的视觉输入进行处理,CNN的输出被输入到一堆递归序列模型中。

640.png

在我看来,LRCN架构在实现方面似乎比其他架构更有吸引力,因为您必须同时练习卷积和循环网络。

我是个电影迷,已经看了大约一千部电影。基于此,我决定对电影预告片进行深度学习,预测预告片的收视率。不幸的是,收集训练数据集非常困难,因为除了下载视频之外,我还需要对它们进行标记。为了扩展数据集,我们可以应用一些数据增强,对于视频可以旋转,添加不同种类的噪声,改变速度等。然而,最初的相机角度、图像质量和电影速度都是未来评级的一部分,所以保留分数而改变这些特征似乎是错误的。我决定从一个视频中取几个不重叠的部分然后将每个部分分割成帧最终得到n个训练样本

640.png

defpreprocess(movie_name, train=True, n_subclips=3, subclip_duration=30, frequency=45, verbose=False):
"""Preprocesses a movie trailer making subclips and then extracting sequences of frames:param movie_name: movie name:train: boolean flag to determine whether preprocessing is performed for training videos or not:param n_subclips: number of subclips to make from the trailer:param subclip_duration: duration of a subclip:param frequency: frequency of extracting frames from subclips:param verbose: increase verbosity if True"""name='.'.join(movie_name.split('.')[:-1])
format_=movie_name.split('.')[-1]
ifnotformat_ok(format_):
print('Skipping file, which is not a video...')
returniftrain==True:
ifnotos.path.isdir(TRAINING_PATH):
os.mkdir(TRAINING_PATH)
DEST=TRAINING_PATHelse:
ifnotos.path.isdir(PREDICTION_PATH):
os.mkdir(PREDICTION_PATH)
DEST=PREDICTION_PATHifformat_=='flv':   #Decorddoesnotworkwithflvformatformat_='mov'#Extractingsubclipfromtrailerbase=10os.makedirs(f"{FPATH}/{name}", exist_ok=True)
foriinrange(n_subclips):
ifverbose:
print(f"{i} iteration...")
print("....Making subclip....")
try:
ffmpeg_extract_subclip(f"{FPATH}/{movie_name}", base, base+subclip_duration, targetname=f"{FPATH}/{name}/{i}.{format_}")
base=base+subclip_durationexceptBaseException:
print(f"Some error occured during {i+1} extraction")
continue#Checkifallsubclipswerecorrectlycreatedtry:
video=moviepy.editor.VideoFileClip(f"{FPATH}/{name}/{i}.{format_}")
ifint(video.duration) <=subclip_duration//2:raiseDurationErrorexcept:
print(f"The {i} subclip was not correctly created, deleting...")
os.remove(f"{FPATH}/{name}/{i}.{format_}")
continue#Creatingframesifverbose:
print("....Extracting frames....")
os.makedirs(f"{DEST}/{name+'_'+str(i)}", exist_ok=True)   #CreatingdirectoryforTraindatasettry:
video_to_frames(f"{FPATH}/{name}/{i}.{format_}", f"{DEST}/{name+'_'+str(i)}", overwrite=False, every=frequency)
except:
print("Error occured while executing VIDEO_TO_FRAMES")
os.rmdir(f"{DEST}/{name+'_'+str(i)}/{i}")
os.rmdir(f"{DEST}/{name+'_'+str(i)}")
continue#Deletedirectorywithsubclipsifnameinos.listdir(f"{FPATH}"):  
shutil.rmtree(f"{FPATH}/{name}")

现在我们可以开始构建网络架构并训练模型。原论文中的CNN base是对CaffeNet的修改,但为了简单和更快的训练,我只创建了两个卷积层(batch normalization) dropout和max pooling作为编码器,两个稠密层作为解码器。虽然该技术通过平均LSTM输出用于视觉识别,但我们只要将结果使用softmax函数去掉就可以使用相同的方法进行视频回归,。

classCNN(torch.nn.Module):
def__init__(self, channels1=10, channels2=20, embedding_size=15, activation='relu'):
super(CNN, self).__init__()
self.layer1=torch.nn.Sequential(torch.nn.Conv2d(3, channels1, kernel_size=5, padding=2),
activation_func(activation), torch.nn.BatchNorm2d(num_features=channels1),
torch.nn.MaxPool2d(2, 2))
self.layer2=torch.nn.Sequential(torch.nn.Conv2d(channels1, channels2, kernel_size=3, padding=1),
torch.nn.Dropout2d(p=0.2), activation_func(activation),
torch.nn.BatchNorm2d(num_features=channels2), torch.nn.MaxPool2d(2, 2))
self.encoder=torch.nn.Sequential(self.layer1, self.layer2)
self.decoder=torch.nn.Sequential(torch.nn.Linear(56*56*channels2, 6000), activation_func(activation),
torch.nn.Linear(6000, 500), activation_func(activation), torch.nn.Linear(500, embedding_size))
defforward(self, x):
x=self.encoder(x)
#flattenheatmapbeforeutilizingdenselayersx=x.view(x.size(0), x.size(1) *x.size(2) *x.size(3))
out=self.decoder(x)
returnoutclassLRCN(torch.nn.Module):
def__init__(self, channels1=10, channels2=20, embedding_size=15, LSTM_size=64, LSTM_layers=1, activation='relu'):
super(LRCN, self).__init__()
self.cnn=CNN(channels1, channels2, embedding_size, activation)
#batchfirst: dataformattedin (batch, seq, feature)
self.rnn=torch.nn.LSTM(input_size=embedding_size, hidden_size=LSTM_size, num_layers=LSTM_layers, batch_first=True)
self.linear=torch.nn.Linear(LSTM_size, 1)
defforward(self, x):
heatmaps= []
forseqinx:
heatmaps.append(self.cnn.forward(seq))
heatmaps=torch.stack(heatmaps)
out, (_, _) =self.rnn(heatmaps)
out=self.linear(out)
returnout[:,-1,:]

一旦我们准备好了数据和模型,就该开始训练了。我选择的默认参数不会导致高质量但快速的训练。

deffit(self, dir_names, X_test, y_test, lr=3e-4, loss_name='mse', n_epoch=5, batch_size=10, device='cpu', saving_results=False, use_tensorb=False, verbose=False):
optimizer=torch.optim.Adam(self.parameters(), lr=lr)
loss=loss_choice(loss_name) #Specifyinglossfunctiondir_names=list(filter(lambdax: os.path.isdir(f"{TRAINING_PATH}/{x}"), dir_names)) #Filteringwastefilesrandom.shuffle(dir_names)
train_loss_history= []
test_loss_history= []
learning_dir_names=dir_names.copy()
#Trainingmodelprint('---------------TRAINING----------------')
forepochinrange(n_epoch):
dir_names=learning_dir_names.copy()
train_loss=0foriinrange(0, len(learning_dir_names), batch_size):
optimizer.zero_grad()
print(dir_names)
X_batch, y_batch, dir_names=load_data(dir_names, train=True, verbose=verbose, batch_size=batch_size)  
X_batch=X_batch.to(device).float()
y_batch=y_batch.to(device).float()
preds=self.forward(X_batch).view(y_batch.size()[0])
loss_value=loss(preds, y_batch)
loss_value.backward()
train_loss+=loss_value.data.cpu()
optimizer.step()
train_loss_history.append(train_loss)
withtorch.no_grad():
test_preds=self.forward(X_test).view(y_test.size()[0])
test_loss_history.append(loss(test_preds, y_test).data.cpu())
print(f"{epoch+1}: {loss_name} = {test_loss_history[-1]}")
ifsaving_results==True:
torch.save(self.state_dict(), MODEL_WEIGHTS)
print('---------------------------------------')
return [train_loss_history, test_loss_history]

     

即使训练一个简单的端到端LRCN模型也需要大量的计算能力和时间,因为我们的任务包括图像和序列。此外,训练数据集必须相当大,z这样模型可以很好地推广。从下图可以看出,经过训练后的模型存在明显的拟合不足。

640.png

总结

LRCN是一种用于处理视觉和时间输入的模型,它提供了很大的灵活性,可应用于计算机视觉的各种任务,并可合并到CV处理管道中。然后这种方法可用于各种时变视觉输入或序列输出的问题。LRCN提供了一个易于实现和训练的端到端模型体系结构。

目录
相关文章
|
8天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
1天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
12天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
15 2
|
12天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
20 1
|
15天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
56 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
16天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
23天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
70 1
|
2天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
9 0
|
5天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
下一篇
无影云桌面