Tensorflow 2.0 视频分类(四) C3D 3D convolutional Networks
目录
- 论文学习
- 摘要
- 介绍
- 相关研究
- 网络结构
- 超参设置
- 卷积核深度
- C3D网络
- sport-1M数据集上表现
- 网络可视化
- 动作识别分类
- 网络compactness(紧密度?)
- ASLAN动作识别数据集表现
- 场景识别
- 耗时比较
- 附录
- 参考
- 下载资源
- 代码实操
- C3D网络构建
- 参考
论文学习
摘要
开篇明义,三点结论:
- 3D 卷积网络比2D卷积更适合提取时空特征;
- 3x3x3的卷积核是最好的filter结构;
- 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相关推荐
- 视频分类论文阅读笔记——Learning Spatiotemporal Features With 3D Convolutional Networks
论文:Learning Spatiotemporal Features With 3D Convolutional Networks 作者:FaceBook AI研究院 来源:ICCV2015 代码: ...
- 动作识别经典C3D论文Learning Spatiotemporal Features with 3D Convolutional Networks的介绍
关于论文Learning Spatiotemporal Features with 3D Convolutional Networks的介绍 这篇论文提出了一个比较高效的C3D网络来提取视频的空间时间 ...
- 【论文阅读】Learning Spatiotemporal Features with 3D Convolutional Networks
[论文阅读]Learning Spatiotemporal Features with 3D Convolutional Networks 这是一篇15年ICCV的论文,本篇论文提出的C3D卷积网络是 ...
- Learning Spatiotemporal Features with 3D Convolutional Networks 读书笔记
最近读了Learning Spatiotemporal Features with 3D Convolutional Networks这篇文章,下面对文章内容进行简要概括. 摘要 摘要主要介绍在大规模 ...
- 时空特征--Learning Spatiotemporal Features with 3D Convolutional Networks
Learning Spatiotemporal Features with 3D Convolutional Networks ICCV 2015 http://vlg.cs.dartmouth.ed ...
- 论文笔记之C3D(Learning Spatiotemporal Features with 3D Convolutional Networks)
通过构造了对称的3×3×3卷积核来利用3D卷积学习时空特征,计算效率高. 论文地址:http://vlg.cs.dartmouth.edu/c3d/c3d_video.pdf 1. 摘要 本文提出了一 ...
- Tensorflow 2.0 视频分类(一) 数据集
这里写目录标题 数据集 UCF-101(最常见) 关键参数 参考 1 million YouTube videos belonging to 487 classes 关键参数 参考 YouTube-8 ...
- 论文阅读笔记:Graph Convolutional Networks for Text Classification
Abstract 文本分类作为一个经典的自然语言处理任务,已经有很多利用卷积神经网络进行文本分类的研究,但是利用图卷积神经网络进行研究的仍然较少. 本文基于单词共现和文档单词间的关系构建一个text ...
- TensorFlow 2.0 的新增功能:第三、四部分
原文:What's New in TensorFlow 2.0 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑(MTPE)流程来尽可能提 ...
最新文章
- 《深入理解ElasticSearch》——2.4 批量操作
- redis队列缓存 + mysql 批量入库 + php离线整合
- 几天没写代码,就……
- springmvc jpa_使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置
- java数组设置结束_Java 数组最佳指南,快收藏让它吃灰
- 生成器 python0 1 8 27 64_python 生成式和生成器
- Python编写的桌面图形界面程序实现更新检测和下载安装
- datetime默认当前时间_简述Python培训之time和datetime的区别
- 最全中文leetcode解题攻略:思路知识点代码都有,搞定AI大厂笔试
- Python自带函数map(),zip()等
- pb中控件变颜色_基于GDI+技术开发工业仪表盘控件
- linux ps流程,Linux下PS命令详解 (转)
- 职工档案管理系统报告与c语言,[职工档案管理系统C语言.doc
- document操作自定义属性
- 新浪微博长链接字数统计问题
- [matlabpython]01——sort排序的相关内容
- 广丰计算机技术学院,广丰区五都镇中学祝晓旺——信息技术教育的拓荒者
- 使用easygui制作app
- python爬虫登录微博_python爬虫-模拟微博登录功能
- 学员故事|从房产销售转行软件测试工程师,轻松月薪14K
热门文章
- 华为语音解锁设置_华为手机语音转文字怎么设置,如何完成音频在线转换
- [转]Windows CE 6.0(PB6)离线安装版下载
- Excel中ID相同对应表格内容进行合并
- dg打开软件Android,DG 文件扩展名: 它是什么以及如何打开它?
- “好奇号”的火星发展观
- 使用共享收款码系统,打造微商模式经营门店是关键
- Ceph 存储集群5-数据归置
- 微信文章如何采集php,记录微信公众号历史文章采集(二、js代码完善和数据库建立)...
- 完美二叉树、满二叉树、完全二叉树
- hive中关键字作为列名的方法