IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【代码学习】C3D提取视频特征 -> 正文阅读

[人工智能]【代码学习】C3D提取视频特征

学习目标

  1. 理论补充:C3D网络特点
  2. 动手能力 :用C3D提取目标数据集(Charades-STA、ActivityNet Captions、TVR)的滑动窗口(64、128、256、512祯,各个窗口间80%的重叠)特征

目标回答

  1. 特点1):使用3D卷积网络,能够在卷积过程中考虑时序信息,从而进行motion modeling;这是通过将frame视作通道来达到的,比如卷积核大小为 3 ? 3 ? 3 3*3*3 3?3?3,那么每次的深度感受野就是 3 3 3,也就是说,网络每次能在3帧之间建立起联系 特点2)使用同质的 3 ? 3 ? 3 3*3*3 3?3?3大小的卷积核,这种卷积核被证明是最有效的卷积核大小
  2. 见项目实施部分

网络结构

网络层卷积核padding(conv) stride(pool)输入输出激活函数
conv1 64 ? 3 ? 3 ? 3 64*3*3*3 64?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 3 , 16 , 112 , 112 3, 16, 112, 112 3,16,112,112 64 , 16 , 112 , 112 64, 16, 112, 112 64,16,112,112ReLU
pool1 1 ? 2 ? 2 1*2*2 1?2?2 1 ? 2 ? 2 1*2*2 1?2?2 64 , 16 , 112 , 112 64, 16, 112, 112 64,16,112,112 64 , 16 , 56 , 56 64, 16, 56, 56 64,16,56,56
conv2 128 ? 3 ? 3 ? 3 128*3*3*3 128?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 64 , 16 , 56 , 56 64, 16, 56, 56 64,16,56,56 128 , 16 , 56 , 56 128, 16, 56, 56 128,16,56,56ReLU
pool2 2 ? 2 ? 2 2*2*2 2?2?2 2 ? 2 ? 2 2*2*2 2?2?2 128 , 16 , 56 , 56 128, 16, 56, 56 128,16,56,56 128 , 8 , 28 , 28 128, 8, 28, 28 128,8,28,28
conv3a 256 ? 3 ? 3 ? 3 256*3*3*3 256?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 128 , 8 , 28 , 28 128, 8, 28, 28 128,8,28,28 256 , 8 , 28 , 28 256, 8, 28, 28 256,8,28,28ReLU
conv3b 256 ? 3 ? 3 ? 3 256*3*3*3 256?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 256 , 8 , 28 , 28 256, 8, 28, 28 256,8,28,28 256 , 8 , 28 , 28 256, 8, 28, 28 256,8,28,28ReLU
pool3 2 ? 2 ? 2 2*2*2 2?2?2 2 ? 2 ? 2 2*2*2 2?2?2 256 , 8 , 28 , 28 256, 8, 28, 28 256,8,28,28 256 , 4 , 14 , 14 256, 4, 14, 14 256,4,14,14
conv4a 512 ? 3 ? 3 ? 3 512*3*3*3 512?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 256 , 4 , 14 , 14 256, 4, 14, 14 256,4,14,14 512 , 4 , 14 , 14 512, 4, 14, 14 512,4,14,14ReLU
conv4b 512 ? 3 ? 3 ? 3 512*3*3*3 512?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 512 , 4 , 14 , 14 512, 4, 14, 14 512,4,14,14 512 , 4 , 14 , 14 512, 4, 14, 14 512,4,14,14ReLU
pool4 2 ? 2 ? 2 2*2*2 2?2?2 2 ? 2 ? 2 2*2*2 2?2?2 512 , 4 , 14 , 14 512, 4, 14, 14 512,4,14,14 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7
conv5a 512 ? 3 ? 3 ? 3 512*3*3*3 512?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7ReLU
conv5b 512 ? 3 ? 3 ? 3 512*3*3*3 512?3?3?3 1 ? 1 ? 1 1*1*1 1?1?1 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7ReLU
pool5 2 ? 2 ? 2 2*2*2 2?2?2 2 ? 2 ? 2 2*2*2 2?2?2, 0 ? 1 ? 1 0*1*1 0?1?1(padding) 512 , 2 , 7 , 7 512, 2, 7, 7 512,2,7,7 512 , 1 , 4 , 4 512, 1, 4, 4 512,1,4,4
view 512 , 1 , 4 , 4 512, 1, 4, 4 512,1,4,4 1 , 8192 1, 8192 1,8192
fc6 1 , 8192 1, 8192 1,8192 1 , 4096 1, 4096 1,4096ReLU+dropout 0.5 0.5 0.5
fc7 1 , 4096 1, 4096 1,4096 1 , 4096 1, 4096 1,4096ReLU+dropout 0.5 0.5 0.5
fc8 1 , 4096 1, 4096 1,4096 1 , 487 1, 487 1,487softmax

项目准备

  1. 下载写好的项目:c3d-pytorch
  2. 下载预训练好的特征(项目中也有)
  3. 修改predict.py代码

代码逐行注释

""" How to use C3D network. """
import numpy as np

import torch
from torch.autograd import Variable

from os.path import join
# python标准库中的一个重要模块,主要用来查找符合特定规则(通配符)的目录和文件
from glob import glob

# 用于导入和处理视频的帧,因此项目的输入是视频提好的帧
import skimage.io as io
from skimage.transform import resize

from C3D_model import C3D


def get_sport_clip(clip_name, verbose=True):
    """
    Loads a clip to be fed to C3D for classification.
    TODO: should I remove mean here?
    
    Parameters
    ----------
    clip_name: str
        the name of the clip (subfolder in 'data'). 此处为'roger'
    verbose: bool
        if True, shows the unrolled clip (default is True).
    Returns
    -------
    Tensor
        (batch_size, channels, frames, height, weight)
        a pytorch batch (n, ch, fr, h, w).
    """

    # glob.glob返回符合匹配条件的所有文件的路径,list形式
    # ./data/roger/*.png
    clip = sorted(glob(join('data', clip_name, '*.png')))
    # 将每一帧转化为(112, 200, 3)的shape,并转为np.array形式
    # (frames, 112, 200, 3),论文中将frames设为16,即以16帧为单位进行特征提取
    # 所以如果要提取滑动窗口特征,就应该将提前准备好输入图片
    # 每个特征提取单位放在一个文件夹中(如此处的'roger')
    clip = np.array([resize(io.imread(frame), output_shape=(112, 200), preserve_range=True) for frame in clip])
    # 把weight中间的112拿出来(这应该对应论文中的jittering)
    clip = clip[:, :, 44:44+112, :]  # crop centrally

    # 这一步会将所有clip以视频序列的形式展示出来(如下图)
    # 如果要处理的视频比较多或者没有可视化需求,就设为false吧
    if verbose:
        clip_img = np.reshape(clip.transpose(1, 0, 2, 3), (112, 16 * 112, 3))
        io.imshow(clip_img.astype(np.uint8))
        io.show()

    # 增加batch_size维度,并转化为tensor
    clip = clip.transpose(3, 0, 1, 2)  # ch, fr, h, w
    clip = np.expand_dims(clip, axis=0)  # batch axis
    clip = np.float32(clip)

    return torch.from_numpy(clip)


def read_labels_from_file(filepath):
    """
    Reads Sport1M labels from file
    
    Parameters
    ----------
    filepath: str
        the file.
        
    Returns
    -------
    list
        list of sport names.
    """
    with open(filepath, 'r') as f:
        labels = [line.strip() for line in f.readlines()]
    return labels


def main():
    """
    Main function.
    """

    # load a clip to be predicted
    X = get_sport_clip('roger')
    # X: batch_size, channels, frames, height, weight
    # X: 1, 3, 16, 112, 112
    X = Variable(X)
    X = X.cuda()

    # get network pretrained model
    net = C3D()
    net.load_state_dict(torch.load('c3d.pickle'))
    net.cuda()
    net.eval()

    # perform prediction
    # prediction: 1, 487(这里是指有487个类,)
    # 如果是提特征的话,后面这些都可以不要,只把fc6的拿出来就可以
    prediction = net(X)
    prediction = prediction.data.cpu().numpy()

    # read labels
    labels = read_labels_from_file('labels.txt')

    # print top predictions
    top_inds = prediction[0].argsort()[::-1][:5]  # reverse sort and take five largest items
    print('\nTop 5:')
    for i in top_inds:
        print('{:.5f} {}'.format(prediction[0][i], labels[i]))


# entry point
if __name__ == '__main__':
    main()

项目实施

  1. 根据视频名称、窗口值 [ 64 , 128 , 256 , 512 ] [64,128,256,512] [64,128,256,512]和滑动值 [ 13 , 26 , 51 , 102 ] [13,26,51,102] [13,26,51,102],准备好视频的输入帧

  2. 修改网络输出,只要fc6的输出来表示视频特征

  3. 输出为.npy格式的文件,存入特征、其他属性

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:39:40  更:2022-05-09 12:45:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:37:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码