视频分类之 UCF-101 上的 CNN 方法详解
Code at Github: https://github.com/sujiongming/UCF-101_video_classification
视频分类包括人类行为识别和通用的多标签视频分类等研究内容。用的多标 签视频分类以 2016 年谷歌发布的 youtube-8M 数据集为代表,其中很多视频属于 多个类别,并且在类别上不限于人类行为。人类行为识别主要研究分类视频中包 含的人类行动,一般一个视频中只包含一类人类行为,UCF101 数据集就是其中 的典型代表。UCF-101(2012)包含 13,320 个视频(共 27 个小时),101 个人 类行为类别,如运动、乐器和人物交互等。[1] 国内外研究人员在 UCF-101 数据 集上进行了深入研究,目前最好的准确率已经达到 95%以上。
UCF-101 上的 CNN 方法一般作为其他分类方法的比较基准,也是最简单和 自然的视频分类方法[2]。CNN 方法是将这些视频帧视为一张张静态图像,应用 CNN 识别每一帧,然后对预测结果进行平均处理来作为该视频的最终结果。然 而,这个方法使用的是不完整的视频信息,因此使得分类器可能容易发生混乱而 导致准确度不高。本文 CNN 方法在测试集上的最终准确度为 top1:63.0%,top5: 87.5%。
UCF-101 中 6 类行为的样本图像帧

一、 基本过程和思想
基本思想是将数据集中视频及分类标签转换为图像(视频帧)和其对应的分 类标签,再采用 CNN 网络对图像进行训练学习和测试,将视频分类问题转化为 图形分类问题。具体步骤包括:
(1) 对每个视频(训练和测试视频)以一定的 FPS 截出视频帧(jpegs)保 存为训练集和测试集,将对图像的分类性能作为所对应视频的分类性能: train set 有 1, 788, 425 帧图像,test set 有 697, 865 帧图像
(2) 选择一个预先训练好的 CNN 网络架构和初始权重,迁移学习至 UCF-101,如 inception v3 with pre-trained on ImageNet
(3) 用 train set 对 CNN 网络部分层进行重新训练,获得模型
(4) 训练完成后载入模型对 test set 内所有的视频帧进行检查验证,得出
全测试集上的 top1 准确率和 top5 准确率输出 二、 运行环境简介
(1) 服务器硬件环境:40 核至强 cpu,GeForce GTX 1080 8G 显存 X2, 128G 内存,512G SSD,3TB 机械硬盘
(2) 服务器软件环境:安装 ubuntu16.04、conda(含 python2.7), CUDA,cudnn、tensorflow GPU,keras 等所需 python 包,SSH 服务, screen 包,vim 工具,ffmpeg 包
(3) 客户机:window7 64 位,pycharm,xshell,xftp
(4) 使用模式:客户机远程 SSH 连接服务器进行操作
三、 运行过程和结果
(5) 准备数据(UCF 提供了三种训练/测试划分方案,本实例采用 1#划分 方案)
i. 用 xftp 软件将开源项目程序和 UCF101 数据包上传至服务器谋和目 录下
ii. 将 UCF101 数据包放在开源项目文件夹的 data 目录下,运行命令 “unrar e UCF101.rar”
iii. 运行命令python 1_move_files.py
iv. 运行命令python 2_extract_files.py

(6) 训练 CNN,输出测试集性能
i. 运行 python CNN_train_UCF101.py,命令行输出训练过程信息,在
测试子集上的准确率和 top5 准确率,系统函数默认 k=5。
ii. 训练集:到 41 epoch 时训练自动停止,最好的结果在 29 epoch 时出 现,val_loss 最小为 1.19,采用该模型评价测试集。模型名称为: inception.0.29-1.19.hdf5,需要修改 CNN_evaluate_testset.py 文件加载
该名称模型。
iii. 运行 python CNN_evaluate_testset.py,命令行输出测试集结果 。
iv. 测试集:loss:1.33,accuracy:0.63,top5 accuracy:0.875
v. 运行 python CNN_validate_images.py,命令行输出随机选择的 5 张图 像的分类信息和结果。
需要注意的是,你的运行结果可能与本文有所差异,因此研究者可能需要不 断修改调整模型超参,多次运行,找出最好的一组模型参数,取最好的准确度结 果。
四、 将inception-v3网络迁移学习至UCF-101
假设有数据集 D,不同于数据集 ImageNet,D 有 1024 个输入特征,200 个
输出类别。

include_top=False 因为我们想要重新在数据集 D 上训练 top level,我们移 除了最后三层,暴露的是 mixed10 层的输出。

#因此,需要加三层
from keras.applications.inception_v3 import InceptionV3
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K

create the base pre-trained model

base_model = InceptionV3(weights=‘imagenet’, include_top=False)
#模型最后 4 层的 layer.name, layer.input_shape, layer.output_shape
(‘mixed10’, [(None, 8, 8, 320), (None, 8, 8, 768), (None, 8, 8, 768), (None, 8, 8, 192)
(‘avg_pool’, (None, 8, 8, 2048), (None, 1, 1, 2048)) (‘flatten’, (None, 1, 1, 2048), (None, 2048))
(‘predictions’, (None, 2048), (None, 1000))
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation=‘relu’)(x)#加入 1024 个特征层

predictions = Dense(200, activation=‘softmax’)(x)#输出层,加入数据 集类别
model = Model(input=base_model.input, output=predictions) for layer in base_model.layers:#固定 inceptionv3 模型参数
layer.trainable = False
#编译模型
#模型训练新加的层

训练 the top 2 inception blocks,因此固定前 172 层,训练后面的层

model.compile(optimizer=‘rmsprop’,
loss=‘categorical_crossentropy’)
model.fit_generator(
train_generator,
steps_per_epoch=100, validation_data=validation_generator, validation_steps=10,
epochs=nb_epoch,
callbacks=callbacks)
for layer in model.layers[:172]: layer.trainable = False for layer in model.layers[172:]: layer.trainable = True model.compile(
optimizer=SGD(lr=0.0001, momentum=0.9), loss=‘categorical_crossentropy’,
metrics=[‘accuracy’, ‘top_k_categorical_accuracy’]) model.fit_generator(
train_generator,
steps_per_epoch=100, validation_data=validation_generator, validation_steps=10,
epochs=nb_epoch,
callbacks=callbacks)
这样就在新的数据集上通过迁移学习训练好一个新的网络了。
需要注意的是
(1) InceptionV3 模型的输入为 299X299X3,因此数据集上的图片大小得修改 为该大小格式:
train_generator = train_datagen.flow_from_directory( ‘./data/train/’,
target_size=(299, 299),
batch_size=32, classes=data.classes, class_mode=‘categorical’)
validation_generator = test_datagen.flow_from_directory( ‘./data/test/’,

target_size=(299, 299),
batch_size=32,
classes=data.classes, class_mode=‘categorical’)
image_arr = process_image(image, (299, 299, 3))
#CNN_validate_images
(2) 验证测试数据集时
= model.evaluate_generator(generator=test_generator, steps=test_data_num // batch_size) #参数 steps 为数据生成的批次,一般为数据总 数除以每批产生的数据个数
results
(3) 参数设置 filepath=’./data/checkpoints/inception.{epoch:03d}-{val_loss:.2f}.hdf5’,
verbose=1,
其他代码和使用说明可以详见github项目 UCF-101_video_classification。
五、 附录
(7) Screen 工具:最大的好处在于客户端命令行窗口关闭后,服务器端 程序可以继续运行如抽取特征、训练深度网络等耗时的任务
i. 一般发行版是不带这个软件的,需要自行安装,ubuntu 下面就直接 sudo apt- get ins tall screen 或 者 下 载 安 装 dpkg -i screen_4.3.1-2build1_amd64.deb
ii. 使用过程要点

  1. screen -S name 启动一个名字为 name 的 screen
  2. 输入命令,执行任务
  3. ctrl + a + d(先按下 ctrl 和 a,再按下 d)保存断开当前的 screen,
    当时在当前 screen 运行的程序不会停止,回到前一个 screen
  4. screen -ls 是列出所有的 screen
  5. screen -r name 或者 id,就可以回到某个 screen,继续查看程序运
    行情况
    #每个 epoch 后存入 val_loss 最小的模型
    checkpointer
    = ModelCheckpoint(
    save_best_only=True)

patience: number of epochs with no improvement after which training will

be stopped. 10 个 epoch 模型性能没有改进后训练停止
= EarlyStopping(patience=10)
early_stopper

(8) 训练时常用 ubuntu 命令
i. 监控 GPU 使用情况:nvidia-smi –l
ii. 监控 CPU 使用情况:top
iii. 内存使用情况:free –h
iv. 磁盘使用情况:df –h
v. 查看分区:fdisk -l
(9) Keras 简介
按 1
i. 常用 Model 属性

  1. model.layers:组成模型的各个层

  2. model.inputs:模型的输入张量列表 3. model.outputs:模型的输出张量列表
    ii. 模型方法

  3. model.compile(self, optimizer, loss, metrics=none,)
    a) optimizer 优化器
    b) loss 损失函数
    c) metrics:列表,包含评估模型在训练和测试时的性能指标

  4. model.fit():训练模型

  5. model.fit_generator(self, generator, steps_per_epoch,
    validation_data, validation_steps, )
    a) generator:生成器函数,输出应该为如(inputs,targets)或者
    (inputs,targets,sample_weights)的 tuple
    b) steps_per_epoch:整数,当生成器返回 steps_per_epoch 次数据
    时一个 epoch 结束,执行下一个 epoch
    c) epoches:数据迭代的轮数
    d) validation_data:可以有三种形式,生成验证集的生成器,一
    个如(inp uts,tar gets)或者(i np uts,tar gets,sa mple_weights)
    的 tuple
    e) validation_steps:生成多少批验证数据,一般等于验证集数据
    数除以 batch_size
    f) workers:最大进程数
    g) max_q_size:生成器队列的最大容量
    h) initial_epoch:从该参数指定的 epoch 开始训练,在继续之前
    的训练时有用

  6. model.evaluate()/model.evaluate_generator():评估模型,计算 loss

  7. model.predict()/model.predict_generator:预测分类结果
    [1] Khurram Soomro, Zamir A R, Shah M. UCF101: A dataset of 101 human actions classes from videos in the wild[C]. CRCV-TR-12-01, 2012,
    [2] Karpathy A, Toderici G, Shetty S, et al. Large-scale Video Classification with Convolutional Neural Networks[C]. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2014, 1725–1732.

视频分类之 UCF-101 上的 CNN 方法详解相关推荐

  1. java播放wma格式的音频文件,两种可将WMA文件在iPhone上播放的方法详解

    WMA是微软开发的一款音频数据压缩技术,也是现今使用非常广泛的音频格式之一.然而,由于它与苹果的iOS系统不兼容,所以该格式文件不能够在苹果系列数码产品如iPhone手机上播放.不过,只要有了方便快捷 ...

  2. datagrip mysql乱码_DataGrip和IDEA无法连接上Mysql问题解决方法详解

    DataGrip无法连接上Mysql问题解决方案[08001] 该方法也适用于IDEA中的MYSQL插件无法连接的问题 一.软件版本 1.IDEA 2020.1.1 2.DataGrip 2019.1 ...

  3. 畅想软件显示无法连接服务器,投屏神器怎么连接不上 连接电视方法详解

    投屏神器是小米官方推出的手机同屏软件,专为小米智能设备打造,畅想大屏视觉体验,运用在电视上可以省下不小的电视费呢,下面就跟小编一起了解下吧. 类别:影音播放   大小:33.65M    语言:简体中 ...

  4. fileupload的回调方法_jQuery File Upload文件上传插件使用详解

    本篇教程介绍了jQuery File Upload文件上传插件使用详解,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < jQuery File Upload 是一个 ...

  5. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

  6. html页面在ie上出现404怎么解决,ie浏览器网页上有错误解决方法详解

    ie浏览器网页上有错误解决方法详解 最近网友反馈我的浏览器左下角总显示"网页上有错误",我已经修复过IE了,可是不管用.然后在浏览器上看不到网上的视频和图片的播放.在QQ空间上输入 ...

  7. linux上连接ftp服务器,linux下lftp连接ftp服务器进行上传与下载的方法详解

    摘要 腾兴网为您分享:linux下lftp连接ftp服务器进行上传与下载的方法详解,中英翻译,中建在线,掌上看家,银行帮等软件知识,以及微信一键转发工具,小学英语冀教版,正是在下表情包,易问电信,万能 ...

  8. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  9. SpringBoot (6)---RestTemplate方法详解(2)

    SpringBoot (6)---RestTemplate方法详解(2) 说明 上一篇SpringBoot 2.1 | 第三篇:RestTemplate请求HTTP(1)简单运用了RestTempla ...

最新文章

  1. 单张图像重建3D人手、人脸和人体
  2. Joiner的简单了解
  3. 图解opengl 3D 图形绘制实例
  4. 将下图的nfa确定化为dfa_作业8 非确定的自动机NFA确定化为DFA
  5. C++数组与指针的区别
  6. CodeForces - 1480D1 Painting the Array I(贪心)
  7. C# 泛型多种参数类型与多重约束 示例
  8. java类spring加载_spring的加载机制?
  9. springboot 远程调用shell脚本,环境为windows
  10. 使用Protobuf推动微服务和REST API的开发
  11. linux pae内核安装,CentOS6.9 32位 编译无 pae 内核
  12. 用C语言写的爬虫项目
  13. switch如何更新大气层,和进入hekate界面
  14. 笔记本检测工具(全)
  15. Python超市进销存管理系统!老妈开超市有系统了!
  16. 请问如何让路由器信号增强
  17. 50种编程语言打印hello world
  18. 海信合作徕卡首款激光电视将于9月亮相;SK海力士成功研发全球最高层238层4D NAND闪存 | 美通企业日报...
  19. 远程桌面树莓派【内网穿透】
  20. 教师博客能不能改成学生博客_学生应该博客吗?

热门文章

  1. 来来来,一起去看临泉王冲林岗的红枫叶
  2. 大数据与人工智能系列文章
  3. 干货|以产品要素设计解读线上小微信贷
  4. C语言编写程序求1到100的和,C语言菜鸟基础教程之求1到100的和
  5. 用python计算100以内所有奇数的和_python如何求1到100的奇数和
  6. 为什么我的服务器没有信号,服务器显示器无信号
  7. gitlab找回已删除的分支
  8. python如何拼读英语单词怎么写_怎么用英标快速拼读英语单词,这些技巧你知道吗...
  9. RocketMQ-顺序消息Demo及实现原理分析
  10. 【python】算术运算报错can‘t multiply sequence by non-int of type ‘float‘