TF - 數(shù)據(jù)生成器

生成器

  • ADEChallengeData數(shù)據(jù)集

數(shù)據(jù)的下載鏈接: http://sceneparsing.csail.mit.edu/results2016.html

ADEChallengeData
   |
   | - images
   |       |
   |       | - training        20210
   |       | - validation      2000
   |
   | - annotations  
          |
          | - training          20210
          | - validation        2000

訓(xùn)練集和驗證集分開

  • 批次生成數(shù)據(jù)的核心思路
    由于圖像太大趴腋,直接讀入內(nèi)存是不可取的,所以采用將圖像的name和標(biāo)簽mask讀入數(shù)組型檀,然后將圖像名放入任務(wù)隊列怠益,最后將從打亂的任務(wù)隊列中隨機讀取圖像的name九妈,最后根據(jù)name重新open讀取圖片硬爆。
第一步  構(gòu)造任務(wù)隊列  
      
        Image_Obj_1  |   Image_Obj_2 | ... |  Image_Obj_N

       *  Image_Obj : { image : "1.jpg",  "annotation": "1.png"}

第二步  隨機讀取batch_size數(shù)據(jù)
       
       Image_Obj_x | ... |  Image_Obj_x+n
     
第三步 讀取batch_size的實際圖像

      image = read( Image_Obj_x .image)   
      annotation = read( Image_Obj_x .annotation)   
# -*- coding:utf-8 -*-
import numpy as np
import os
import random
from six.moves import cPickle as pickle
from tensorflow.python.platform import gfile
import glob

import TensorflowUtils as utils

# DATA_URL = 'http://sceneparsing.csail.mit.edu/data/ADEChallengeData2016.zip'
DATA_URL = 'http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip'


# input_dir = FLAGS.data_dir = MIT_SceneParsing
# data_dir = MIT_SceneParsing/
def read_dataset(data_dir):
    pickle_filename = "MITSceneParsing.pickle"
    pickle_filepath = os.path.join(data_dir, pickle_filename)
    print pickle_filepath
    if not os.path.exists(pickle_filepath):
        utils.maybe_download_and_extract(data_dir, DATA_URL, is_zipfile=True)
        #splitext 分離文件與擴展名
        SceneParsing_folder = os.path.splitext(DATA_URL.split("/")[-1])[0]
        # 輸入路徑為  MIT_SceneParsing/ADEChallengeData2016
        # result 是訓(xùn)練數(shù)據(jù)和驗證集得到字典組成
        result = create_image_lists(os.path.join(data_dir, SceneParsing_folder))
        print ("Pickling ...")
        with open(pickle_filepath, 'wb') as f:
            pickle.dump(result, f, pickle.HIGHEST_PROTOCOL)
    else:
        print ("Found pickle file!")

    with open(pickle_filepath, 'rb') as f:
        result = pickle.load(f)
        training_records = result['training']
        validation_records = result['validation']
        del result

    # train_records 是訓(xùn)練數(shù)據(jù)集的列表字典
    # validation_records  是驗證數(shù)據(jù)集的列表字典
    return training_records, validation_records


def create_image_lists(image_dir):

    '''
    這個函數(shù)用來返回生成訓(xùn)練和驗證集
    image['training'] = [{'image': f, 'annotation': annotation_file, 'filename': filename},....,...,...]
    :param image_dir:
    :return:
    '''
    if not gfile.Exists(image_dir):
        print("Image directory '" + image_dir + "' not found.")
        return None
    directories = ['training', 'validation']
    image_list = {}

    for directory in directories:
        file_list = []
        image_list[directory] = []
        file_glob = os.path.join(image_dir, "images", directory, '*.' + 'jpg')
        file_list.extend(glob.glob(file_glob))

        if not file_list:
            print('No files found')
        else:
            for f in file_list:
                filename = os.path.splitext(f.split("/")[-1])[0]
                annotation_file = os.path.join(image_dir, "annotations", directory, filename + '.png')
                if os.path.exists(annotation_file):
                    record = {'image': f, 'annotation': annotation_file, 'filename': filename}
                    image_list[directory].append(record)
                else:
                    print("Annotation file not found for %s - Skipping" % filename)

        random.shuffle(image_list[directory])
        no_of_images = len(image_list[directory])
        print ('No. of %s files: %d' % (directory, no_of_images))

    return image_list
import numpy as np
import scipy.misc as misc

class BatchDatset:
    files = []
    images = []
    annotations = []
    image_options = {}
    batch_offset = 0
    epochs_completed = 0

    def __init__(self, records_list, image_options={}):
        """
        Intialize a generic file reader with batching for list of files
        :param records_list: list of file records to read -
        sample record: {'image': f, 'annotation': annotation_file, 'filename': filename}
        :param image_options: A dictionary of options for modifying the output image
        Available options:
        resize = True/ False
        resize_size = #size of output image - does bilinear resize
        color=True/False
        """
        print("Initializing Batch Dataset Reader...")
        print(image_options)
        self.files = records_list
        self.image_options = image_options
        self._read_images()

    def _read_images(self):
        self.__channels = True
        self.images = np.array([self._transform(filename['image']) for filename in self.files])
        self.__channels = False
        self.annotations = np.array(
            [np.expand_dims(self._transform(filename['annotation']), axis=3) for filename in self.files])
        print (self.images.shape)
        print (self.annotations.shape)

    def _transform(self, filename):
        image = misc.imread(filename)
        if self.__channels and len(image.shape) < 3:  # make sure images are of shape(h,w,3)
            image = np.array([image for i in range(3)])

        if self.image_options.get("resize", False) and self.image_options["resize"]:
            resize_size = int(self.image_options["resize_size"])
            resize_image = misc.imresize(image,
                                         [resize_size, resize_size], interp='nearest')
        else:
            resize_image = image

        return np.array(resize_image)

    def get_records(self):
        return self.images, self.annotations

    def reset_batch_offset(self, offset=0):
        self.batch_offset = offset

    def next_batch(self, batch_size):
        start = self.batch_offset
        self.batch_offset += batch_size
        if self.batch_offset > self.images.shape[0]:
            # Finished epoch
            self.epochs_completed += 1
            print("****************** Epochs completed: " + str(self.epochs_completed) + "******************")
            # Shuffle the data
            perm = np.arange(self.images.shape[0])
            np.random.shuffle(perm)
            self.images = self.images[perm]
            self.annotations = self.annotations[perm]
            # Start next epoch
            start = 0
            self.batch_offset = batch_size

        end = self.batch_offset
        return self.images[start:end], self.annotations[start:end]

    def get_random_batch(self, batch_size):
        indexes = np.random.randint(0, self.images.shape[0], size=[batch_size]).tolist()
        return self.images[indexes], self.annotations[indexes]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末古瓤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亮靴,更是在濱河造成了極大的恐慌,老刑警劉巖于置,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧吊,死亡現(xiàn)場離奇詭異贞岭,居然都是意外死亡,警方通過查閱死者的電腦和手機搓侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門瞄桨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讶踪,你說我怎么就攤上這事芯侥。” “怎么了乳讥?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵柱查,是天一觀的道長。 經(jīng)常有香客問我云石,道長唉工,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任汹忠,我火速辦了婚禮淋硝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宽菜。我一直安慰自己谣膳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布铅乡。 她就那樣靜靜地躺著继谚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隆判。 梳的紋絲不亂的頭發(fā)上犬庇,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音侨嘀,去河邊找鬼臭挽。 笑死,一個胖子當(dāng)著我的面吹牛咬腕,可吹牛的內(nèi)容都是我干的欢峰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼涨共,長吁一口氣:“原來是場噩夢啊……” “哼纽帖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起举反,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤懊直,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后火鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體室囊,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雕崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了融撞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盼铁。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尝偎,靈堂內(nèi)的尸體忽然破棺而出饶火,到底是詐尸還是另有隱情,我是刑警寧澤致扯,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布肤寝,位于F島的核電站,受9級特大地震影響急前,放射性物質(zhì)發(fā)生泄漏醒陆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一裆针、第九天 我趴在偏房一處隱蔽的房頂上張望刨摩。 院中可真熱鬧,春花似錦世吨、人聲如沸澡刹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罢浇。三九已至,卻和暖如春沐祷,著一層夾襖步出監(jiān)牢的瞬間嚷闭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工赖临, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胞锰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓兢榨,卻偏偏與公主長得像嗅榕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吵聪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349