目录

  • 论文学习
    • 摘要
    • 介绍
    • 相关研究
    • 网络结构
      • 超参设置
        • 卷积核深度
      • C3D网络
    • sport-1M数据集上表现
    • 网络可视化
    • 动作识别分类
    • 网络compactness(紧密度?)
    • ASLAN动作识别数据集表现
    • 场景识别
    • 耗时比较
    • 附录
    • 参考
    • 下载资源
  • 代码实操
    • C3D网络构建
    • 参考

论文学习

摘要

开篇明义,三点结论:

  1. 3D 卷积网络比2D卷积更适合提取时空特征;
  2. 3x3x3的卷积核是最好的filter结构;
  3. C3D与线性分类器的组合有在UCF101数据集上很好的分类效果

介绍

视频分类在动作识别、非常规动作识别、活动理解、视频内容描述等领域;视频描述器的四个特点:通用、有竞争力、高效、简洁;卷积网络并不适用于处理视频数据,因此提出 C3D.
不同数据集上的表现:

除Sport 1M上,其他数据比之前最好的都要好。
优秀!

相关研究

传统机器视觉领域的SIFTs(spatio-temporal interest points)、SIFT-3D、HOG3D算法。对大规模数据集合表现intractable;
前人在3D卷积网络上的研究对比,突出点提出适用于大规模视频数据集合,具有3D卷积、3Dpooling提取时间信息的深度网络。

网络结构

图一对比了3D卷积的机构特点。对于多帧的视频输入,传统2d卷积核的深度于视频的帧数相同,输出只有一层输出,因此丢失了时域信息(b);相反,3D卷积核的深度d小于输入画面的帧数L,因此一个卷积核操作以后可以得到多特征层,因而保留了时域信息(c).

可以参看最后一张图中的数据维度,一般的conv2d的输入数据维度为(batch, w, h, channels), 卷积核和stride都是二维参数,即在(w, h)维度上进行操作;
对于conv3d为(batch, frames, w, h, channels),卷积核和stride都是三维参数,即在(frames, w, h)维度上进行操作。

超参设置

对于UCF101的视频数据输入,压缩成3x16x128x171的格式

卷积核深度

卷积核的深度d的确定:相同深度(1,3,5,7);不同深度(逐步加深3-3-5-5-7,逐步减小7-5-5-3-3)
对比结果如下:

明显采用相同卷积核深度3的网络性能最好。

C3D网络

通过上面的对该笔提出了C3D网络的基本框架。
3x3x3的卷积核大小,1 x 1 x 1stride
2x2x2的pooling层, 2 x 2 x 2stride
整体结构:

sport-1M数据集上表现


结果上看比文献29的预测准确度低,但作者说这主要是受到输入画面帧数较多的影响。

网络可视化


对conv5b特征层进行可视化,可以发现C3D网络相比2D网络对运动物体更加敏感。

动作识别分类

UCF101数据集的动作识别结果

网络的一些组合和比较,比如C3D (3 nets) 表示三组C3D的fc6同时并联,与SVM结合后能提高预测精度(这里三组C3D训练差别没有太看明白)

网络compactness(紧密度?)

通过提取不同算法的全连接层提取的体征,适用PCA算法降维到10后,对比算法的准确度,进而比较compactness性能。

相同的fc6特征层,使用t-SNE算法降维到2维可视化空间。

可见C3D对不同类型的视频在2维空间中有很好的分离

ASLAN动作识别数据集表现


场景识别

YUPENN(420 videos of 14 scene categories)和Maryland(130 videos of 13 scene categories)数据集。

同样优秀!

耗时比较


一样的优秀!

附录

卷积神经网络,可视化的展示

参考

Learning Spatiotemporal Features with 3D Convolutional Networks

下载资源

http://vlg.cs.dartmouth.edu/c3d/

代码实操

C3D网络构建

import  tensorflow as tf
from    tensorflow import keras
from    tensorflow.keras import layers, models, Input
from    tensorflow.keras.models import Model
from    tensorflow.keras.layers import Conv3D, MaxPooling3D, Dense, Flatten, Dropout, ZeroPadding3Ddef C3Dnet(nb_classes, input_shape):input_tensor = Input(shape=input_shape)# 1st blockx = Conv3D(64, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv1')(input_tensor)x = MaxPooling3D(pool_size=(1,2,2), strides=(1,2,2), padding='valid', name='pool1')(x)# 2nd blockx = Conv3D(128, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv2')(x)x = MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool2')(x)# 3rd blockx = Conv3D(256, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv3a')(x)x = Conv3D(256, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv3b')(x)x = MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool3')(x)# 4th blockx = Conv3D(512, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv4a')(x)x = Conv3D(512, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv4b')(x)x= MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool4')(x)# 5th blockx = Conv3D(512, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv5a')(x)x = Conv3D(512, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv5b')(x)x = ZeroPadding3D(padding=(0,1,1),name='zeropadding')(x)x= MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool5')(x)# full connectionx = Flatten()(x)x = Dense(4096, activation='relu',  name='fc6')(x)x = Dropout(0.5)(x)x = Dense(4096, activation='relu', name='fc7')(x)x = Dropout(0.5)(x)output_tensor = Dense(nb_classes, activation='softmax', name='fc8')(x)model = Model(input_tensor, output_tensor)return modelmodel=C3Dnet(487, (16, 112, 112, 3))
model.summary()

输入一个篮球视频

from C3D_model import C3Dnet
import numpy as npimport matplotlib
matplotlib.use('Agg')
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import sysdef main():model =C3Dnet(487, (16, 112, 112, 3))model.summary()try:model.load_weights('models/C3D_Sport1M_weights_keras_2.2.4.h5')except OSError as err:print('Check path to the model weights\' file!\n\n', err)# 16 black frames with 3 channelsprint("[Info] Loading labels...")with open('labels.txt', 'r') as f:labels = [line.strip() for line in f.readlines()]print('Total labels: {}'.format(len(labels)))print("[Info] Loading a sample video...")cap = cv2.VideoCapture('dM06AMFLsrc.mp4')vid = []while True:ret, img = cap.read()if not ret:breakvid.append(cv2.resize(img, (171, 128)))vid = np.array(vid, dtype=np.float32)start_frame = 2000X = vid[start_frame:(start_frame + 16), :, :, :]mean_cube = np.load('models/train01_16_128_171_mean.npy')mean_cube = np.transpose(mean_cube, (1, 2, 3, 0))X -= mean_cube# center cropX = X[:, 8:120, 30:142, :] # (l, h, w, c)X = np.expand_dims(X, axis=0)prediction_softmax = model.predict(X)predicted_class = np.argmax(prediction_softmax)print('Success, predicted class is: {}'.format(labels[predicted_class]))top_inds = prediction_softmax[0].argsort()[::-1][:5]  # reverse sort and take five largest itemsprint('\nTop 5 probabilities and labels:')for i in top_inds:print('{1}: {0:.5f}'.format(prediction_softmax[0][i], labels[i]))if __name__ == "__main__":main()

预测结果

Top 5 probabilities and labels:
basketball: 0.71757
streetball: 0.10378
volleyball: 0.05549
greco-roman wrestling: 0.02388
freestyle wrestling: 0.02178

参考

https://github.com/Forrest-Gan/Tensorflow2.-C3D-sport1m

Tensorflow 2.0 视频分类(四) C3D 3D convolutional Networks相关推荐

  1. 视频分类论文阅读笔记——Learning Spatiotemporal Features With 3D Convolutional Networks

    论文:Learning Spatiotemporal Features With 3D Convolutional Networks 作者:FaceBook AI研究院 来源:ICCV2015 代码: ...

  2. 动作识别经典C3D论文Learning Spatiotemporal Features with 3D Convolutional Networks的介绍

    关于论文Learning Spatiotemporal Features with 3D Convolutional Networks的介绍 这篇论文提出了一个比较高效的C3D网络来提取视频的空间时间 ...

  3. 【论文阅读】Learning Spatiotemporal Features with 3D Convolutional Networks

    [论文阅读]Learning Spatiotemporal Features with 3D Convolutional Networks 这是一篇15年ICCV的论文,本篇论文提出的C3D卷积网络是 ...

  4. Learning Spatiotemporal Features with 3D Convolutional Networks 读书笔记

    最近读了Learning Spatiotemporal Features with 3D Convolutional Networks这篇文章,下面对文章内容进行简要概括. 摘要 摘要主要介绍在大规模 ...

  5. 时空特征--Learning Spatiotemporal Features with 3D Convolutional Networks

    Learning Spatiotemporal Features with 3D Convolutional Networks ICCV 2015 http://vlg.cs.dartmouth.ed ...

  6. 论文笔记之C3D(Learning Spatiotemporal Features with 3D Convolutional Networks)

    通过构造了对称的3×3×3卷积核来利用3D卷积学习时空特征,计算效率高. 论文地址:http://vlg.cs.dartmouth.edu/c3d/c3d_video.pdf 1. 摘要 本文提出了一 ...

  7. Tensorflow 2.0 视频分类(一) 数据集

    这里写目录标题 数据集 UCF-101(最常见) 关键参数 参考 1 million YouTube videos belonging to 487 classes 关键参数 参考 YouTube-8 ...

  8. 论文阅读笔记:Graph Convolutional Networks for Text Classification

    Abstract 文本分类作为一个经典的自然语言处理任务,已经有很多利用卷积神经网络进行文本分类的研究,但是利用图卷积神经网络进行研究的仍然较少. 本文基于单词共现和文档单词间的关系构建一个text ...

  9. TensorFlow 2.0 的新增功能:第三、四部分

    原文:What's New in TensorFlow 2.0 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑(MTPE)流程来尽可能提 ...

最新文章

  1. 《深入理解ElasticSearch》——2.4 批量操作
  2. redis队列缓存 + mysql 批量入库 + php离线整合
  3. 几天没写代码,就……
  4. springmvc jpa_使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置
  5. java数组设置结束_Java 数组最佳指南,快收藏让它吃灰
  6. 生成器 python0 1 8 27 64_python 生成式和生成器
  7. Python编写的桌面图形界面程序实现更新检测和下载安装
  8. datetime默认当前时间_简述Python培训之time和datetime的区别
  9. 最全中文leetcode解题攻略:思路知识点代码都有,搞定AI大厂笔试
  10. Python自带函数map(),zip()等
  11. pb中控件变颜色_基于GDI+技术开发工业仪表盘控件
  12. linux ps流程,Linux下PS命令详解 (转)
  13. 职工档案管理系统报告与c语言,[职工档案管理系统C语言.doc
  14. document操作自定义属性
  15. 新浪微博长链接字数统计问题
  16. [matlabpython]01——sort排序的相关内容
  17. 广丰计算机技术学院,广丰区五都镇中学祝晓旺——信息技术教育的拓荒者
  18. 使用easygui制作app
  19. python爬虫登录微博_python爬虫-模拟微博登录功能
  20. 学员故事|从房产销售转行软件测试工程师,轻松月薪14K

热门文章

  1. 华为语音解锁设置_华为手机语音转文字怎么设置,如何完成音频在线转换
  2. [转]Windows CE 6.0(PB6)离线安装版下载
  3. Excel中ID相同对应表格内容进行合并
  4. dg打开软件Android,DG 文件扩展名: 它是什么以及如何打开它?
  5. “好奇号”的火星发展观
  6. 使用共享收款码系统,打造微商模式经营门店是关键
  7. Ceph 存储集群5-数据归置
  8. 微信文章如何采集php,记录微信公众号历史文章采集(二、js代码完善和数据库建立)...
  9. 完美二叉树、满二叉树、完全二叉树
  10. hive中关键字作为列名的方法