'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
pandas>=0.19.2
tqdm>=4.11.2
matplotlib>=2.0.0
Pillow>=2.1.0
h5py>=2.7.0

项目文件目录概览:

准备工作

1)下载UCF101数据集压缩包并减压至data文件夹。
2)在data文件夹创建train、test 、sequences、checkpoints四个文件。

提取视频帧

1、UCF101数据集是由101类视频组成的,首先通过运行1_move_files.py将101类视频按照ucfTrainTestlist文件夹下的数据标签将101视频分别移至train、test文件夹。

Lable:

这里有个坑!!
1_move_files.py 第58行:

            if not os.path.exists(filename):print("Can't find %s to move. Skipping." % (filename))continue# Move it.dest = os.path.join(group, classname, filename)print("Moving %s to %s" % (filename, dest))os.rename(filename, dest)print("Done.")

未将UCF101数据集读取!

修改后的代码:

             filename_input = os.path.join('UCF-101', classname, filename)if not os.path.exists(filename_input):print("Can't find %s to move. Skipping." % (filename))continue# Move it.dest = os.path.join(group, classname, filename)print("Moving %s to %s" % (filename, dest))os.rename(filename_input, dest)print("Done.")

2、现在通过运行2_extract_files.py提取train、test文件夹中视频的视频帧,并生成一个CSV文件 。该CSV文件为之后特征提取及网络训练时数据读取提供帮助:

    def get_data():"""Load our data from file."""with open(os.path.join('data', 'data_file.csv'), 'r') as fin:reader = csv.reader(fin)data = list(reader)return data

CNN提取视频帧特征

通过运行extract_features.py提取视频帧特征。

seq_length = 40
class_limit = 101

seq_length:每个视频段考虑的视频帧数目
class_limit:限制分类数
举个例子:一个视频段input_list有240帧,seq_length = 40,首先判断input_list是否大于seq_length即 assert len(input_list) >= seq_length。然后将input_list与seq_length做地板除即: skip = len(input_list) // size,本例中skip = 6,即每隔6帧从input_list中取一帧以列表的形式保存到output即:output = [input_list[i] for i in range(0, len(input_list), skip)],最终取得40帧。

 def rescale_list(input_list, size):assert len(input_list) >= sizeskip = len(input_list) // sizeoutput = [input_list[i] for i in range(0, len(input_list), skip)]return output[:size]

在Imagenet上预训练好的InceptionV3卷积网络提取这40帧特征作为该视频段的特征。并将特征保存在sequences文件夹,numpy会自动在末尾添加 .npy。

path = os.path.join('data', 'sequences', video[2] + '-' + str(seq_length) + \'-features')

LSTM

将提取到的序列特征送入LSTM网络进行训练。通过运行 train.py生成 .hdf5文件,并将模型保存到checkpoints文件夹,并且会在logs文件夹生成一个 .log 训练日志文件,用来可视化训练过程中acc与loss的变化。

获取由CNN提取的序列特征:

 def get_extracted_sequence(self, data_type, sample):"""Get the saved extracted features."""filename = sample[2]path = os.path.join(self.sequence_path, filename + '-' + str(self.seq_length) + \'-' + data_type + '.npy')if os.path.isfile(path):return np.load(path)else:return None

LSTM网络模型:

    def lstm(self):model = Sequential()model.add(LSTM(2048, return_sequences=False,input_shape=self.input_shape,dropout=0.5))model.add(Dense(512, activation='relu'))model.add(Dropout(0.5))model.add(Dense(self.nb_classes, activation='softmax'))return model

用来可视化训练过程的plot_trainlog.py:

import csv
import matplotlib.pyplot as pltdef main(training_log):with open(training_log) as fin:reader = csv.reader(fin)next(reader, None)  # skip the headeraccuracies = []Val_acc = []cnn_benchmark = []  # this is ridiculousfor epoch,acc,loss,val_acc,val_loss in reader:accuracies.append(float(acc))Val_acc.append(float(val_acc))cnn_benchmark.append(0.65)  # ridiculousplt.plot(accuracies)plt.plot(Val_acc)plt.plot(cnn_benchmark)plt.show()if __name__ == '__main__':training_log = 'data/logs/lstm-training-1617251893.3342032.log'main(training_log)

绿线:cnn_benchmark
橘黄线:Val_acc
蓝线:accuracies

验证模型

通过运行validate_rnn.py将保存在checkpoints文件夹的模型加载进来验证模型准确度。结果如图:

扩展

若要将一段视频进行分段处理,十帧作为一个序列,首先送入CNN提取基础特征,后送入LSTM提取时间-空间特征,会遇到什么问题?能否完成视频分段任务?是否过拟合?模型鲁棒性如何?

UCF101视频分类之CNN-LSTM-Code总结相关推荐

  1. 视频分类之 UCF-101 上的 CNN 方法详解

    视频分类之 UCF-101 上的 CNN 方法详解 Code at Github: https://github.com/sujiongming/UCF-101_video_classificatio ...

  2. 【视频课】行为识别课程更新!CNN+LSTM理论与实践!

    前言 欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下: 第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用. 第2层 ...

  3. 吴良超 融合 cnn+lstm

    吴良超 融合 cnn+lstm 链接 from keras.applications.vgg16 import VGG16 from keras.models import Sequential, M ...

  4. CNN+LSTM+CTC

    需求:调研CNN+LSTM+CTC的实现 解决方案; 参考github实现 示例代码: #!/usr/bin/env python2 # -*- coding: utf-8 -*- "&qu ...

  5. 基于神经网络的黄金、外汇价格预测(RNN、LSTM、GRU、CNN+LSTM、BP)

    价格预测研究分析 价格预测作为一种复杂的回归问题,可以使用神经网络模拟其复杂的函数表示来解决,对黄金和外汇而言,它们在未来某一时间节点的价格与历史数据存在着紧密的联系,具备极强的时间关联性,对这种与时 ...

  6. CNN+LSTM多通道特征组合模型

    1.摘要 本文主要讲解:CNN+LSTM多通道特征组合模型 2.包版本 pip install tensorflow-gpu==2.3.0 pip install keras==2.4.3 3.相关技 ...

  7. cnn 预测过程代码_【交通+AI】使用CNN+LSTM实时出租车出行预测(上)

    这篇论文主要讲述了使用成都的出租车轨迹数据进行建模后生成出行强度图,使用CNN和LSTM进行学习之后通过反卷积生成出行强度预测图.非常适合上手这个领域,主要有两点原因:第一 出租车出行强度只包含了上车 ...

  8. 用lstm模型做预测_深度学习模型 CNN+LSTM 预测收盘价

    -- 本篇文章 by HeartBearting 上一篇浏览量很大,感谢各位的关注! 能够在这里分享一些实验,一起领略 数据科学之美,也很开心. 以后,这个实验的模型会不断深化. 之后,也会分享一些 ...

  9. CNN+LSTM:看图说话

    看图说话--CNN和LSTM的联合应用 https://blog.csdn.net/xinzhangyanxiang/article/details/79117869 看图说话是深度学习波及的领域之一 ...

  10. 深度学习实战——CNN+LSTM+Attention预测股票

    前言 本文使用pytorch实现,根据历史股票的open,low,close,high数据预测未来股票的变化趋势. 代码在文末 用xgboost也跑了一下:机器学习实战--股票close预测 拟合结果 ...

最新文章

  1. 用Servlet获取表单数据
  2. Determine whether an integer is a palindrome. Do this without extra space.
  3. 第十六章、Raid及mdadm命令
  4. 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程(转)
  5. Lesson 14.3 Batch Normalization综合调参实战
  6. python标准日期正则表达式_Python 正则表达式验证传统日期
  7. Eclipse编辑器字体大小的设置
  8. centos mysql安装
  9. 监督计算机控制系统的应用,计算机智能控制系统的应用类型
  10. 如何通过组织管理提升团队战斗力?每个CTO都需要了解的三大支柱
  11. 【入门】Pytorch实现简单的图片分类器
  12. 将qq目录下文件写如qq.txt
  13. js获取当前时间写入HTML,html获取当前时间 js获取当前日期的前后4天
  14. Java常用命令汇总(笔记)
  15. Visio转化为png
  16. SDS:一个简易动态字符串库
  17. freeRTOS学习(三)
  18. 计算机网络电缆被拔出是怎么办,网络电缆被拔出是什么意思
  19. html5实现圆圈里带一个三角形,Fabric.js - 详细使用教程1(绘制图形:矩形、圆形、三角形、不规则图形)...
  20. 【EMC电磁兼容】01.06——标准测试类目之EMS

热门文章

  1. 1156 Sexy Primes – PAT甲级真题
  2. 倍福--软件界面介绍
  3. Windows系统怎么将dmg文件转换为iso格式
  4. JAVA写入与读取GPX文件工具类
  5. Java中的list集合排序方法
  6. intel 9260AC网卡修改成Killer 1550
  7. 软件环境整理(pro、sit、test、pre、dev)
  8. python猜数字游戏实验报告_猜数字游戏实验报告
  9. 基于python的猜大小游戏
  10. 兴东机器人_福州市松下机器人维保中心