视频分类之 UCF-101 上的 CNN 方法详解
視頻分類之 UCF-101 上的 CNN 方法詳解
Code at Github: https://github.com/sujiongming/UCF-101_video_classification
視頻分類包括人類行為識(shí)別和通用的多標(biāo)簽視頻分類等研究內(nèi)容。用的多標(biāo) 簽視頻分類以 2016 年谷歌發(fā)布的 youtube-8M 數(shù)據(jù)集為代表,其中很多視頻屬于 多個(gè)類別,并且在類別上不限于人類行為。人類行為識(shí)別主要研究分類視頻中包 含的人類行動(dòng),一般一個(gè)視頻中只包含一類人類行為,UCF101 數(shù)據(jù)集就是其中 的典型代表。UCF-101(2012)包含 13,320 個(gè)視頻(共 27 個(gè)小時(shí)),101 個(gè)人 類行為類別,如運(yùn)動(dòng)、樂器和人物交互等。[1] 國內(nèi)外研究人員在 UCF-101 數(shù)據(jù) 集上進(jìn)行了深入研究,目前最好的準(zhǔn)確率已經(jīng)達(dá)到 95%以上。
UCF-101 上的 CNN 方法一般作為其他分類方法的比較基準(zhǔn),也是最簡單和 自然的視頻分類方法[2]。CNN 方法是將這些視頻幀視為一張張靜態(tài)圖像,應(yīng)用 CNN 識(shí)別每一幀,然后對(duì)預(yù)測(cè)結(jié)果進(jìn)行平均處理來作為該視頻的最終結(jié)果。然 而,這個(gè)方法使用的是不完整的視頻信息,因此使得分類器可能容易發(fā)生混亂而 導(dǎo)致準(zhǔn)確度不高。本文 CNN 方法在測(cè)試集上的最終準(zhǔn)確度為 top1:63.0%,top5: 87.5%。
UCF-101 中 6 類行為的樣本圖像幀
一、 基本過程和思想
基本思想是將數(shù)據(jù)集中視頻及分類標(biāo)簽轉(zhuǎn)換為圖像(視頻幀)和其對(duì)應(yīng)的分 類標(biāo)簽,再采用 CNN 網(wǎng)絡(luò)對(duì)圖像進(jìn)行訓(xùn)練學(xué)習(xí)和測(cè)試,將視頻分類問題轉(zhuǎn)化為 圖形分類問題。具體步驟包括:
(1) 對(duì)每個(gè)視頻(訓(xùn)練和測(cè)試視頻)以一定的 FPS 截出視頻幀(jpegs)保 存為訓(xùn)練集和測(cè)試集,將對(duì)圖像的分類性能作為所對(duì)應(yīng)視頻的分類性能: train set 有 1, 788, 425 幀圖像,test set 有 697, 865 幀圖像
(2) 選擇一個(gè)預(yù)先訓(xùn)練好的 CNN 網(wǎng)絡(luò)架構(gòu)和初始權(quán)重,遷移學(xué)習(xí)至 UCF-101,如 inception v3 with pre-trained on ImageNet
(3) 用 train set 對(duì) CNN 網(wǎng)絡(luò)部分層進(jìn)行重新訓(xùn)練,獲得模型
(4) 訓(xùn)練完成后載入模型對(duì) test set 內(nèi)所有的視頻幀進(jìn)行檢查驗(yàn)證,得出
全測(cè)試集上的 top1 準(zhǔn)確率和 top5 準(zhǔn)確率輸出 二、 運(yùn)行環(huán)境簡介
(1) 服務(wù)器硬件環(huán)境:40 核至強(qiáng) cpu,GeForce GTX 1080 8G 顯存 X2, 128G 內(nèi)存,512G SSD,3TB 機(jī)械硬盤
(2) 服務(wù)器軟件環(huán)境:安裝 ubuntu16.04、conda(含 python2.7), CUDA,cudnn、tensorflow GPU,keras 等所需 python 包,SSH 服務(wù), screen 包,vim 工具,ffmpeg 包
(3) 客戶機(jī):window7 64 位,pycharm,xshell,xftp
(4) 使用模式:客戶機(jī)遠(yuǎn)程 SSH 連接服務(wù)器進(jìn)行操作
三、 運(yùn)行過程和結(jié)果
(5) 準(zhǔn)備數(shù)據(jù)(UCF 提供了三種訓(xùn)練/測(cè)試劃分方案,本實(shí)例采用 1#劃分 方案)
i. 用 xftp 軟件將開源項(xiàng)目程序和 UCF101 數(shù)據(jù)包上傳至服務(wù)器謀和目 錄下
ii. 將 UCF101 數(shù)據(jù)包放在開源項(xiàng)目文件夾的 data 目錄下,運(yùn)行命令 “unrar e UCF101.rar”
iii. 運(yùn)行命令python 1_move_files.py
iv. 運(yùn)行命令python 2_extract_files.py
(6) 訓(xùn)練 CNN,輸出測(cè)試集性能
i. 運(yùn)行 python CNN_train_UCF101.py,命令行輸出訓(xùn)練過程信息,在
測(cè)試子集上的準(zhǔn)確率和 top5 準(zhǔn)確率,系統(tǒng)函數(shù)默認(rèn) k=5。
ii. 訓(xùn)練集:到 41 epoch 時(shí)訓(xùn)練自動(dòng)停止,最好的結(jié)果在 29 epoch 時(shí)出 現(xiàn),val_loss 最小為 1.19,采用該模型評(píng)價(jià)測(cè)試集。模型名稱為: inception.0.29-1.19.hdf5,需要修改 CNN_evaluate_testset.py 文件加載
該名稱模型。
iii. 運(yùn)行 python CNN_evaluate_testset.py,命令行輸出測(cè)試集結(jié)果 。
iv. 測(cè)試集:loss:1.33,accuracy:0.63,top5 accuracy:0.875
v. 運(yùn)行 python CNN_validate_images.py,命令行輸出隨機(jī)選擇的 5 張圖 像的分類信息和結(jié)果。
需要注意的是,你的運(yùn)行結(jié)果可能與本文有所差異,因此研究者可能需要不 斷修改調(diào)整模型超參,多次運(yùn)行,找出最好的一組模型參數(shù),取最好的準(zhǔn)確度結(jié) 果。
四、 將inception-v3網(wǎng)絡(luò)遷移學(xué)習(xí)至UCF-101
假設(shè)有數(shù)據(jù)集 D,不同于數(shù)據(jù)集 ImageNet,D 有 1024 個(gè)輸入特征,200 個(gè)
輸出類別。
include_top=False 因?yàn)槲覀兿胍匦略跀?shù)據(jù)集 D 上訓(xùn)練 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)
(‘a(chǎn)vg_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 個(gè)特征層
predictions = Dense(200, activation=‘softmax’)(x)#輸出層,加入數(shù)據(jù) 集類別
model = Model(input=base_model.input, output=predictions) for layer in base_model.layers:#固定 inceptionv3 模型參數(shù)
layer.trainable = False
#編譯模型
#模型訓(xùn)練新加的層
訓(xùn)練 the top 2 inception blocks,因此固定前 172 層,訓(xùn)練后面的層
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=[‘a(chǎn)ccuracy’, ‘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)
這樣就在新的數(shù)據(jù)集上通過遷移學(xué)習(xí)訓(xùn)練好一個(gè)新的網(wǎng)絡(luò)了。
需要注意的是
(1) InceptionV3 模型的輸入為 299X299X3,因此數(shù)據(jù)集上的圖片大小得修改 為該大小格式:
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) 驗(yàn)證測(cè)試數(shù)據(jù)集時(shí)
= model.evaluate_generator(generator=test_generator, steps=test_data_num // batch_size) #參數(shù) steps 為數(shù)據(jù)生成的批次,一般為數(shù)據(jù)總 數(shù)除以每批產(chǎn)生的數(shù)據(jù)個(gè)數(shù)
results
(3) 參數(shù)設(shè)置 filepath=’./data/checkpoints/inception.{epoch:03d}-{val_loss:.2f}.hdf5’,
verbose=1,
其他代碼和使用說明可以詳見github項(xiàng)目 UCF-101_video_classification。
五、 附錄
(7) Screen 工具:最大的好處在于客戶端命令行窗口關(guān)閉后,服務(wù)器端 程序可以繼續(xù)運(yùn)行如抽取特征、訓(xùn)練深度網(wǎng)絡(luò)等耗時(shí)的任務(wù)
i. 一般發(fā)行版是不帶這個(gè)軟件的,需要自行安裝,ubuntu 下面就直接 sudo apt- get ins tall screen 或 者 下 載 安 裝 dpkg -i screen_4.3.1-2build1_amd64.deb
ii. 使用過程要點(diǎn)
當(dāng)時(shí)在當(dāng)前 screen 運(yùn)行的程序不會(huì)停止,回到前一個(gè) screen
行情況
#每個(gè) epoch 后存入 val_loss 最小的模型
checkpointer
= ModelCheckpoint(
save_best_only=True)
patience: number of epochs with no improvement after which training will
be stopped. 10 個(gè) epoch 模型性能沒有改進(jìn)后訓(xùn)練停止
= EarlyStopping(patience=10)
early_stopper
(8) 訓(xùn)練時(shí)常用 ubuntu 命令
i. 監(jiān)控 GPU 使用情況:nvidia-smi –l
ii. 監(jiān)控 CPU 使用情況:top
iii. 內(nèi)存使用情況:free –h
iv. 磁盤使用情況:df –h
v. 查看分區(qū):fdisk -l
(9) Keras 簡介
按 1
i. 常用 Model 屬性
model.layers:組成模型的各個(gè)層
model.inputs:模型的輸入張量列表 3. model.outputs:模型的輸出張量列表
ii. 模型方法
model.compile(self, optimizer, loss, metrics=none,)
a) optimizer 優(yōu)化器
b) loss 損失函數(shù)
c) metrics:列表,包含評(píng)估模型在訓(xùn)練和測(cè)試時(shí)的性能指標(biāo)
model.fit():訓(xùn)練模型
model.fit_generator(self, generator, steps_per_epoch,
validation_data, validation_steps, )
a) generator:生成器函數(shù),輸出應(yīng)該為如(inputs,targets)或者
(inputs,targets,sample_weights)的 tuple
b) steps_per_epoch:整數(shù),當(dāng)生成器返回 steps_per_epoch 次數(shù)據(jù)
時(shí)一個(gè) epoch 結(jié)束,執(zhí)行下一個(gè) epoch
c) epoches:數(shù)據(jù)迭代的輪數(shù)
d) validation_data:可以有三種形式,生成驗(yàn)證集的生成器,一
個(gè)如(inp uts,tar gets)或者(i np uts,tar gets,sa mple_weights)
的 tuple
e) validation_steps:生成多少批驗(yàn)證數(shù)據(jù),一般等于驗(yàn)證集數(shù)據(jù)
數(shù)除以 batch_size
f) workers:最大進(jìn)程數(shù)
g) max_q_size:生成器隊(duì)列的最大容量
h) initial_epoch:從該參數(shù)指定的 epoch 開始訓(xùn)練,在繼續(xù)之前
的訓(xùn)練時(shí)有用
model.evaluate()/model.evaluate_generator():評(píng)估模型,計(jì)算 loss
值
model.predict()/model.predict_generator:預(yù)測(cè)分類結(jié)果
[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.
總結(jié)
以上是生活随笔為你收集整理的视频分类之 UCF-101 上的 CNN 方法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32标准库工程中移植Tencent
- 下一篇: 艺术类职称计算机考试,2017年职称计算