使用CNN預測HEVC的CU分割 (2) -- 數(shù)據(jù)集的劃分埂伦,隨機抽取幀,優(yōu)化數(shù)據(jù)集結(jié)構(gòu)加快讀取

我自己生成的數(shù)據(jù)集在GitHub思恐,包含了訓練沾谜、測試、驗證集:

GitHub - wolverinn/HEVC-CU-depths-dataset: A dataset that contains the Coding Unit image files and their corresponding depths for HEVC intra-prediction.

關(guān)于數(shù)據(jù)集的準備部分胀莹,還有一些更加細節(jié)的工作需要完成基跑。首先就是訓練集,驗證集和測試集的劃分描焰,在數(shù)據(jù)集中使用的所有YUV序列如下:

type Train Validation Test
4K Bund-Nightscape_3840x2160_30 Campfire-Party_3840x2160_30 Construction-Field_3840x2160_30
Fountains_3840x2160_30 Library_3840x2160_30 Marathon_3840x2160_30
Residential-Building_3840x2160_30 Runners_3840x2160_30 Rush-Hour_3840x2160_30
Scarf_3840x2160_30
Tall-Buildings_3840x2160_30
Traffic-and-Building_3840x2160_30
Traffic-Flow_3840x2160_30
Tree-Shade_3840x2160_30
Wood_3840x2160_30
2K NebutaFestival_2560x1600_60 PeopleOnStreet_2560x1600_30 Traffic_2560x1600_30
SteamLocomotiveTrain_2560x1600_60
1080p BasketballDrive_1920x1080_50 BQTerrace_1920x1080_60 Cactus_1920x1080_50
Kimono1_1920x1080_24
Tennis_1920x1080_24
ParkScene_1920x1080_24
720p FourPeople_1280x720_60 SlideShow_1280x720_20 KristenAndSara_1280x720_60
SlideEditing_1280x720_30
Johnny_1280x720_60
480p BasketballDrill_832x480_50 Flowervase_832x480_30 BQMall_832x480_60
Keiba_832x480_30 Mobisode2_832x480_30 PartyScene_832x480_50
RaceHorses_832x480_30
288 waterfall_352x288_20 akiyo_352x288_20 bridge-close_352x288_20
bridge-far_352x288_20 coastguard_352x288_20 container_352x288_20
flower_352x288_20 foreman_352x288_20 hall_352x288_20
highway_352x288_20 mobile_352x288_20 mother-daughter_352x288_20
news_352x288_20
paris_352x288_20
silent_352x288_20
tempete_352x288_20
240 BasketballPass_416x240_50 BlowingBubbles_416x240_50 BQSquare_416x240_60

由于存儲空間的限制以及相鄰幀之間的高度相似媳否,所以在訓練的時候并不會使用從一個YUV文件中抽取出的所有幀,而是會隨機抽取一些幀荆秦,參考下面的公式來選取幀:

n = (25 + f/40) / 40

每個YUV的第2幀和第27幀都被抽取篱竭,之后的第n個幀就按照上面的公式抽取,f代表YUV文件的總幀數(shù)步绸。代碼:

def crop_image_to_ctu(video_number):
    frames = len(os.listdir("{}\\temp-frames".format(WORKSPACE_PATH))) # 當前視頻一共有多少幀
    random_frames = [2,27]
    n = int((25+frames/40)//4)
    for i in range(frames//n):
        f_index = 27 + n*(i+1)
        if f_index > frames:
            break
        else:
            random_frames.append(f_index) # 隨機抽取幀掺逼,有一個公式得出抽取的幀的編號
    for image_file in os.listdir("{}\\temp-frames".format(WORKSPACE_PATH)):
        frame_number = int(image_file.split('_')[2])-1 # ffmpeg生成幀編號是從1開始,這里減1將編號變成從0開始和ctu分割信息對應
        if frame_number in random_frames:
            img = Image.open(os.path.join("{}\\temp-frames".format(WORKSPACE_PATH),image_file))
            img_width, img_height = img.size
            ctu_number_per_img = math.ceil(img_width / 64) * math.ceil(img_height / 64)
            for ctu_number in range(ctu_number_per_img):
                img_row = ctu_number // math.ceil(img_width / 64)
                img_colonm = ctu_number % math.ceil(img_height / 64)
                start_pixel_x = img_colonm * 64
                start_pixel_y = img_row * 64
                cropped_img = img.crop((start_pixel_x, start_pixel_y, start_pixel_x + 64, start_pixel_y + 64)) # 依次對抽取到的幀進行裁剪
                cropped_img.save("{}\\v_{}_{}_{}_.jpg".format(IMG_PATH,video_number,str(frame_number),str(ctu_number)))
            img.close()
            dump_ctu_file(video_number, str(frame_number)) # 將當前幀的所有ctu分割信息保存到新的文件瓤介,只保存抽取的幀的信息
        os.remove(os.path.join("{}\\temp-frames".format(WORKSPACE_PATH),image_file)) # 裁剪過后的幀就刪掉
    print("Total frames extracted from video_{} : {}".format(video_number,len(random_frames)))

在生成數(shù)據(jù)集的過程中吕喘,我發(fā)現(xiàn)對于CTU的分割信息,如果將YUV的所有幀的分割信息保存到txt文件刑桑,這樣一個YUV就會產(chǎn)生幾十兆甚至1080P的YUV會產(chǎn)生一百多兆的文本文件氯质,這樣會導致訓練的時候每加載一個CTU分割信息都會花費一定的時間,影響訓練的效率祠斧。所以首先想到的是不用保存所有的分割信息闻察,只需要保存之前抽取出的幀的CTU劃分信息就可以了,這樣可以大大減少存儲空間梁肿。其次,還可以對保存的數(shù)據(jù)結(jié)構(gòu)進行優(yōu)化觅彰,如果保存在文本文件中吩蔑,每次的讀取方式就只能從第一行開始遍歷,直到找到對應的幀的CTU填抬,效率也很低烛芬。所以我將需要保存的CTU劃分信息保存到了Python的字典(dict)中,結(jié)構(gòu)如下:

video_0 = {
    "frame_2":{
        "ctu_0":[...] # 16x16的劃分信息
        "ctu_1":[...]
        .
        .
        .
        "ctu_103":[...]
    }
    "frame_27":{
        ...
    }
}

這樣可以快速根據(jù)圖片是第幾幀,第幾個CTU找到對應的劃分信息赘娄。將這個字典使用Python自帶的持久化庫pickle保存到v_0.pkl仆潮,在使用的時候可以方便地進行讀取。代碼如下:

def dump_ctu_file(video_number,frame_number):
    # 將抽取到的幀的所有ctu分割信息保存到pickle:{"frame_number_1":{"ctu_number_1":[...];"ctu_number_2":[...]};"frame_number_2":...}
    frame_detected = 0
    ctu_number = "0"
    temp_ctu = []
    f_pkl = open("v_{}.pkl".format(video_number), 'rb')
    video_dict = pickle.load(f_pkl)
    f_pkl.close()
    video_dict[frame_number] = {}
    with open(CtuInfo_FILENAME,'r') as f:
        for i,line in enumerate(f):
            if frame_detected == 0:
                if "frame" in line:
                    current_frame = line.split(':')[1]
                    if int(frame_number) == int(current_frame):
                        frame_detected = 1
            elif "frame" in line:
                break
            elif "ctu" in line:
                temp_ctu = []
                ctu_number = int(line.split(':')[1])
                video_dict[frame_number][str(ctu_number)] = []
            else:
                line_depths = line.split(' ')
                for index in range(16):
                    temp_ctu.append(int(line_depths[index]))
                    video_dict[frame_number][str(ctu_number)] = temp_ctu
    f_pkl = open("v_{}.pkl".format(video_number), 'wb')
    pickle.dump(video_dict, f_pkl)
    f_pkl.close()

數(shù)據(jù)預處理是神經(jīng)網(wǎng)絡(luò)訓練中的一個很重要也很花費時間的環(huán)節(jié)遣臼,必須考慮到神經(jīng)網(wǎng)絡(luò)所需要的格式化的輸入性置,如何將圖片與標簽對應,以及讀取所花費的時間的優(yōu)化揍堰。根據(jù)這些去對原始數(shù)據(jù)使用一定的規(guī)則進行處理鹏浅。只有數(shù)據(jù)預處理部分做好了,才能在訓練部分專注于神經(jīng)網(wǎng)絡(luò)而不是一些瑣碎的數(shù)據(jù)處理規(guī)則屏歹。

我自己生成的數(shù)據(jù)集GitHub地址:

HEVC-CU-depths-dataset

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隐砸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝙眶,更是在濱河造成了極大的恐慌季希,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幽纷,死亡現(xiàn)場離奇詭異式塌,居然都是意外死亡,警方通過查閱死者的電腦和手機霹崎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門珊搀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尾菇,你說我怎么就攤上這事境析。” “怎么了派诬?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵劳淆,是天一觀的道長。 經(jīng)常有香客問我默赂,道長沛鸵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任缆八,我火速辦了婚禮曲掰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奈辰。我一直安慰自己栏妖,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布奖恰。 她就那樣靜靜地躺著吊趾,像睡著了一般宛裕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上论泛,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天揩尸,我揣著相機與錄音,去河邊找鬼屁奏。 笑死岩榆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的了袁。 我是一名探鬼主播朗恳,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼载绿!你這毒婦竟也來了粥诫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤崭庸,失蹤者是張志新(化名)和其女友劉穎怀浆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怕享,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡执赡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了函筋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙合。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跌帐,靈堂內(nèi)的尸體忽然破棺而出首懈,到底是詐尸還是另有隱情,我是刑警寧澤谨敛,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布究履,位于F島的核電站,受9級特大地震影響脸狸,放射性物質(zhì)發(fā)生泄漏最仑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一炊甲、第九天 我趴在偏房一處隱蔽的房頂上張望泥彤。 院中可真熱鬧,春花似錦卿啡、人聲如沸吟吝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爸黄。三九已至,卻和暖如春揭鳞,著一層夾襖步出監(jiān)牢的瞬間炕贵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工野崇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留称开,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓乓梨,卻偏偏與公主長得像鳖轰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扶镀,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容