新開(kāi)一個(gè)坑诗鸭,用ffmpeg工具進(jìn)行一些視頻的處理沮焕,和做一個(gè)新的數(shù)據(jù)集差不多的想法弓坞。這一類(lèi)做法相當(dāng)于是AE隧甚,PR這種的基層工具,學(xué)習(xí)一下也是一個(gè)不錯(cuò)的做法渡冻。
安裝過(guò)程
一些用到的命令會(huì)寫(xiě)在下面以備使用戚扳。
現(xiàn)在根據(jù)原有的一些腳本加以改造后可以做到現(xiàn)在這么兩個(gè)功能:具體的代碼貼到下面:
1.首先是做標(biāo)簽然后把這一個(gè)類(lèi)別的視頻全部放入到對(duì)應(yīng)類(lèi)別的txt文件下:
#!/bin/bash
COUNT=-1
for folder in $1/*
do
for imagesFolder in "$folder"/*
do
echo 'file '"$imagesFolder">> "$folder"-train.txt
done
done
上面功能完成后可以的到講標(biāo)簽做好符合ffmpeg用于處理合成一個(gè)類(lèi)別的所有視頻的功能。比如這個(gè)腳本我定義成2.sh族吻,使用時(shí)bash 2.sh UCF101就可以直接給UCF101做好標(biāo)簽了帽借,下面的腳本也是同理,只不過(guò)下面只遍歷txt文件罷了超歌。
2.將一個(gè)類(lèi)別的視頻合成為一個(gè)視頻:
#bin/bash
for file in $1/*
do
COUNT=$[$COUNT + 1]
ffmpeg -f concat -i $file -c copy output_$COUNT.mp4
done
這個(gè)實(shí)際上是對(duì)ucf101進(jìn)行適配的砍艾,這一次轉(zhuǎn)成MP4的格式。
現(xiàn)在目前仍存在的問(wèn)題是沒(méi)解決讀取每個(gè)視頻的幀率不同的問(wèn)題巍举,然后將其摘除或者說(shuō)直接轉(zhuǎn)到同一幀率的做法辐董。下面需要解決的問(wèn)題有兩點(diǎn):
1.拼接長(zhǎng)視頻之前對(duì)各個(gè)子視頻的幀率,起始時(shí)間和結(jié)束時(shí)間做一次保留禀综,這個(gè)一塊還沒(méi)有處理简烘,可以參考kinetics是如何處理的(用于下載時(shí)的那個(gè)腳本有一些參考價(jià)值)
2.對(duì)于不同幀率的子視頻苔严,要是按現(xiàn)在統(tǒng)一轉(zhuǎn)成25幀的策略來(lái)處理,需要看原來(lái)幀率不一樣的視頻是不是長(zhǎng)短有變化孤澎,影響取幀的時(shí)候標(biāo)簽不一致届氢。(實(shí)際上也可以直接先把所有視頻幀率都轉(zhuǎn)成一樣的,這樣的話倒是不用擔(dān)心幀率不同的問(wèn)題覆旭。)
這里轉(zhuǎn)到MP4用的這個(gè)格式也是說(shuō)用了H.26T4來(lái)改善退子,H.264有四種畫(huà)質(zhì)級(jí)別,分別是baseline, extended, main, high:
1、Baseline Profile:基本畫(huà)質(zhì)型将。支持I/P 幀寂祥,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;
2七兜、Extended profile:進(jìn)階畫(huà)質(zhì)丸凭。支持I/P/B/SP/SI 幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC腕铸;(用的少)
3惜犀、Main profile:主流畫(huà)質(zhì)。提供I/P/B 幀狠裹,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced)虽界,
也支持CAVLC 和CABAC 的支持;
4涛菠、High profile:高級(jí)畫(huà)質(zhì)莉御。在main Profile 的基礎(chǔ)上增加了8x8內(nèi)部預(yù)測(cè)、自定義量化俗冻、 無(wú)損視頻編碼和更多的YUV 格式颈将。
這里對(duì)上面組合視頻的地方有一點(diǎn)問(wèn)題,因?yàn)閷?xiě)的是絕對(duì)路徑所以導(dǎo)致如果找尋的文件夾下沒(méi)有在所指定的文件夾下言疗,也會(huì)報(bào)找不到文件的錯(cuò)誤,需要把整個(gè)處理好的ucf101數(shù)據(jù)集再放到這個(gè)標(biāo)號(hào)list的文件夾下颂砸,這樣做的挺粗糙的噪奄,后續(xù)會(huì)更改。然后在讀取list的時(shí)候在最后95-96的時(shí)候會(huì)不再加count上的數(shù)值人乓,猜測(cè)是因?yàn)槲募A下加了這個(gè)ucf101的大文件夾在下方讀不到勤篮,所以出問(wèn)題,暫時(shí)手動(dòng)更正了后面幾個(gè)錯(cuò)位的文件名色罚。
今天提到了一個(gè)之前沒(méi)注意的細(xì)節(jié)碰缔,xiaolongwang給的kinetics數(shù)據(jù)集命名和官方下載的有一些區(qū)別,不過(guò)這里重新更改文件名也不是什么難題戳护,這一塊確實(shí)是沒(méi)仔細(xì)檢查金抡,后續(xù)這塊考試結(jié)束后和師兄繼續(xù)討論完善瀑焦。(講真復(fù)習(xí)的頭很大,快煩了梗肝,然而又擔(dān)心掛科不得不看榛瓮。然而沒(méi)有想到還是....十分之矛盾)
2019.2.28
2月底我們的工作遇到一個(gè)坎,需要把幀再拼接回視頻巫击,這里就體現(xiàn)了我自己確實(shí)不會(huì)ffmpeg禀晓,最后一條關(guān)鍵的命令是靠師兄給提供的。(師兄老是這么照顧我坝锰,除了感謝我實(shí)在想不出來(lái)別的詞了..)
下面貼一下幀拼接視頻的腳本粹懒,適用于做數(shù)據(jù)集中的多個(gè)視頻。
#!/bin/bash
a=0
for folder in $1/*
do
a=$(($a+1))
for file in "$folder"/*.jpg
do
ffmpeg -r 25 -i $folder/image_%5d.jpg -vcodec mpeg4 compose/$a.mp4
break
done
done
這里我們用的ffmpeg直接拼接圖片顷级,但是這里的問(wèn)題是必須精確到j(luò)pg的命名才可以凫乖,當(dāng)然這個(gè)做法有利有弊,利是圖片格式都有個(gè)明確了解愕把,可以統(tǒng)一處理成image_%5d.jpg的格式拣凹,如果后期發(fā)現(xiàn)了什么新方法會(huì)繼續(xù)更新。統(tǒng)一mp4文件放到compose文件夾下恨豁。
然后配合下面的可以在原始的文件夾下面直接復(fù)制一份原始圖像:
import cv2
import os
import matplotlib.pyplot as plt
load_path='folder'
x=os.walk(load_path)
i=800
for root,dirs,filename in x:
for s in filename:
image=plt.imread(root+'/'+s)
plt.imsave(root+'/'+s[:-7]+'{}.jpg'.format(i),image)
i=i+1
這里還是有弊端嚣镜,因?yàn)閕=800實(shí)際上還是沒(méi)有解決無(wú)限幀的情況或者有重名情況,但是這里因?yàn)榭戳艘幌聅omething2something數(shù)據(jù)集實(shí)際上每一個(gè)視頻都很短橘蜜,不會(huì)超過(guò)100幀菊匿。不過(guò)安全起見(jiàn)還是設(shè)置了一個(gè)閾值到800.如果后面解決了這個(gè)問(wèn)題也可以繼續(xù)補(bǔ)充。
這個(gè)鏈接給的做法很給力计福,這個(gè)庫(kù)還是記著些比較好用的跌捆。AE,PR 這些估計(jì)也是用這些底層的東西進(jìn)行實(shí)現(xiàn)象颖。
上面用os遍歷文件夾佩厚,walk走完整個(gè)load_path,這里三級(jí)文件filename存的是我們二級(jí)文件夾下所有的文件说订,是個(gè)list類(lèi)型抄瓦,這樣再?gòu)睦锩孀咭槐槌鰜?lái)就可以得到對(duì)應(yīng)的文件,用plt.imread就可以解決陶冷。