Ejemplo n.º 1
0
    def __init__(self, name="AFEW"):
        super(AFEWImageSequenceDataset, self).__init__(name)

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
            self.picasa_boxes_base_dir)

        self.imagesequences = []
        self.labels = []
        self.trainIndexes = []
        self.validIndexes = []
        # For each emotion subfolder
        idx = 0
        directories = os.listdir(self.absolute_base_directory)
        directories.sort()
        for emotionName in directories:
            # Check if it is a emotion subfolder
            abs_emotionDir = os.path.join(self.absolute_base_directory,
                                          emotionName)
            rel_emotionDir = os.path.join(self.base_dir, emotionName)
            if not os.path.isdir(
                    abs_emotionDir
            ) or emotionName not in self.emotionNames.keys():
                continue
            # abs_picasa_bbox_dir = os.path.join(self.absolute_picasa_boxes_base_directory, emotionName)
            # rel_picasa_bbox_dir = os.path.join(self.picasa_boxes_base_dir, emotionName)

            # Find all images
            fileNames = glob.glob(os.path.join(abs_emotionDir, "*.png"))

            # Find all unique sequences
            uniqueSequence = list(
                set([name.split("-")[0] for name in fileNames]))
            uniqueSequence.sort()

            # For each unique sequence
            for sequence in uniqueSequence:
                # Load the Image Sequence object
                seq = AFEWImageSequence("AFEW", rel_emotionDir,
                                        "{0}-*.png".format(sequence),
                                        self.emotionNames[emotionName])
                seq.set_picasa_path_substitutions(
                    {
                        self.base_dir: self.picasa_boxes_base_dir,
                        '-': '_',
                        '.png': '.txt',
                        '.jpg': '.txt',
                    },
                    csv_delimiter=' ')
                self.imagesequences.append(seq)
                # Save label
                self.labels.append(self.emotionNames[emotionName])
                # Save if in train or valid
                self.trainIndexes.append(idx)

                idx += 1

        return
Ejemplo n.º 2
0
    def __init__(self, name="AFEW"):
        super(AFEWImageSequenceDataset,self).__init__(name)

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
                self.picasa_boxes_base_dir)

        self.imagesequences = []
        self.labels = []
        self.trainIndexes = []
        self.validIndexes = []
        # For each emotion subfolder
        idx = 0
        directories = os.listdir(self.absolute_base_directory)
        directories.sort()
        for emotionName in directories:
            # Check if it is a emotion subfolder
            abs_emotionDir = os.path.join(self.absolute_base_directory, emotionName)
            rel_emotionDir = os.path.join(self.base_dir, emotionName)
            if not os.path.isdir(abs_emotionDir) or emotionName not in self.emotionNames.keys():
                continue
            # abs_picasa_bbox_dir = os.path.join(self.absolute_picasa_boxes_base_directory, emotionName)
            # rel_picasa_bbox_dir = os.path.join(self.picasa_boxes_base_dir, emotionName)

            # Find all images
            fileNames = glob.glob(os.path.join(abs_emotionDir, "*.png"))

            # Find all unique sequences
            uniqueSequence = list(set([name.split("-")[0] for name in fileNames]))
            uniqueSequence.sort()

            # For each unique sequence
            for sequence in uniqueSequence:
                # Load the Image Sequence object
                seq = AFEWImageSequence("AFEW", rel_emotionDir,
                                        "{0}-*.png".format(sequence),
                                        self.emotionNames[emotionName])
                seq.set_picasa_path_substitutions(
                    {self.base_dir:self.picasa_boxes_base_dir,
                     '-':'_',
                     '.png':'.txt',
                     '.jpg':'.txt',
                     }, csv_delimiter=' ')
                self.imagesequences.append(seq)
                # Save label
                self.labels.append(self.emotionNames[emotionName])
                # Save if in train or valid
                self.trainIndexes.append(idx)

                idx += 1

        return
Ejemplo n.º 3
0
 def __init__(self, dataset_name, relative_base_directory=None):
     """
     Initilizes a dataset with the given name, and whose
     constituent files are located in the specified
     directory. This directory is specified only relative to
     some standard dataset root location (found with locate_data_path ) 
     """
     self.dataset_name = dataset_name
     if relative_base_directory is not None:
         self.relative_base_directory = relative_base_directory
         self.absolute_base_directory = locate_data_path(relative_base_directory)
Ejemplo n.º 4
0
    def __init__(self):
        super(TorontoFaceDataset, self).__init__("TFD", "faces/TFD/")
        # Load original 48x48 images
        tfd_48x48 = sio.loadmat(os.path.join(self.absolute_base_directory, "TFD_48x48.mat"))
        self.images = tfd_48x48["images"]
        self.labels = tfd_48x48['labs_ex']
        self.folds = tfd_48x48['folds']

        # Load mapping file to original dataset
        self.mapping = sio.loadmat(locate_data_path("faces/TFD_extra/TFD_info.mat"))
        self.mapping = [x[0].encode('ascii', 'ignore') for x in self.mapping["tfd_info"]["imfiles"][0, 0].flatten()]
        self.knownDataset = {}
Ejemplo n.º 5
0
 def __init__(self, dataset_name, relative_base_directory=None):
     """
     Initilizes a dataset with the given name, and whose
     constituent files are located in the specified
     directory. This directory is specified only relative to
     some standard dataset root location (found with locate_data_path ) 
     """
     self.dataset_name = dataset_name
     if relative_base_directory is not None:
         self.relative_base_directory = relative_base_directory
         self.absolute_base_directory = locate_data_path(
             relative_base_directory)
Ejemplo n.º 6
0
    def __init__(self):
        super(TorontoFaceDataset, self).__init__("TFD", "faces/TFD/")
        # Load original 48x48 images
        tfd_48x48 = sio.loadmat(
            os.path.join(self.absolute_base_directory, "TFD_48x48.mat"))
        self.images = tfd_48x48["images"]
        self.labels = tfd_48x48['labs_ex']
        self.folds = tfd_48x48['folds']

        # Load mapping file to original dataset
        self.mapping = sio.loadmat(
            locate_data_path("faces/TFD_extra/TFD_info.mat"))
        self.mapping = [
            x[0].encode('ascii', 'ignore')
            for x in self.mapping["tfd_info"]["imfiles"][0, 0].flatten()
        ]
        self.knownDataset = {}
Ejemplo n.º 7
0
    def __init__(self, preload_facetubes=False):
        """
        If preload_facetubes is True, all facetubes will be loaded
        when the dataset is built, which takes around 1.2 GB.
        """
        super(AFEW2ImageSequenceDataset,self).__init__("AFEW2")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
                self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
                self.face_tubes_base_dir)

        self.preload_facetubes = preload_facetubes
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []
        self.validIndexes = []

        # For each split (Train or Val)
        idx = 0
        splits = (("Train", self.trainIndexes),
                  ("Val", self.validIndexes))
        for split_name, split_index in splits:
            #print 'processing %s' % split_name
            for emo_name in sorted(self.emotionNames.keys()):
                #print '  %s' % emo_name
                # Directory containing the images for all clips of that
                # emotion in that split
                abs_img_dir = os.path.join(self.absolute_base_directory,
                                       split_name, emo_name)
                rel_img_dir = os.path.join(self.base_dir,
                                       split_name, emo_name)
                #print 'abs_img_dir:', abs_img_dir
                if not os.path.isdir(abs_img_dir):
                    continue

                # Directory containing the picasa bounding boxes for clips
                # of that emotion in that split
                picasa_bbox_dir = os.path.join(
                        self.absolute_picasa_boxes_base_directory,
                        split_name, emo_name)

                # Find all image names
                img_names = glob.glob(os.path.join(abs_img_dir, '*.png'))
                #print '%s img_names' % len(img_names)

                # Find all clips (sequences)
                unique_seq = sorted(set([img.split('-')[0]
                                         for img in img_names]))
                #print '%s unique_seq' % len(unique_seq)

                # For each clip
                for seq in unique_seq:
                    # Load the Image Sequence object
                    # pdb.set_trace()
                    im_seq = afew.AFEWImageSequence("AFEW2",
                                                    rel_img_dir,
                                                    "{0}-*.png".format(seq),
                                                    self.emotionNames[emo_name])
                    im_seq.set_picasa_path_substitutions(
                        {self.base_dir:self.picasa_boxes_base_dir,
                         '.png':'.txt',
                         '.jpg':'.txt',
                         }, csv_delimiter=',')
                    im_seq.set_ramanan_path_substitutions( {
                        'EmotiW/images/Train/':'EmotiW/ramananExtract/matExtractTrain/',
                        'EmotiW/images/Val/':'EmotiW/ramananExtract/matExtractVal/',                        
                        'Angry/':'1_',
                        'Disgust/':'2_',
                        'Fear/':'3_',
                        'Happy/':'4_',
                        'Neutral/':'5_',
                        'Sad/':'6_',
                        'Surprise/':'7_',
                        '.jpg':'.mat',
                        '.png':'.mat'
                        } )

                    self.imagesequences.append(im_seq)

                    # Save (split, emotion, sequence ID) of sequence
                    seq_id = os.path.basename(seq)
                    self.seq_info.append((split_name, emo_name, seq_id))

                    # If needed, load facetubes
                    if self.preload_facetubes:
                        self.facetubes.append(self.load_facetubes(
                                split_name, emo_name, seq_id))

                    # Save label
                    self.labels.append(self.emotionNames[emo_name])

                    # Save split
                    split_index.append(idx)

                    idx += 1
Ejemplo n.º 8
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded when the
        data set is built.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir%(size[0], size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Use the bounding-boxes smoothed version of the face tubes.
                self.face_tubes_base_dir = ("faces/new_clips/smooth_picasa_face_tubes_%s_%s"
                                            "/numpy_arr_concatenated")%(size[0], size[1])
                self.face_tubes_boxes_base_dir = ("faces/new_clips/smooth_picasa_face_tubes_%s_%s"
                                                  "/picasa_tubes_pickles")%(size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/new_clips")
                filename = os.path.join(abs_dir, "background_info.pkl")
                try:
                    f = open(filename, 'rb')
                    self.facetubes_to_filter = cPickle.load(f)
                    f.close()
                except IOError as e:
                    print e

        super(afew.AFEWImageSequenceDataset, self).__init__("NewClips")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
                self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
                self.face_tubes_base_dir)
        self.face_tubes_boxes_base_directory = locate_data_path(
                self.face_tubes_boxes_base_dir)
        self.emodict_base_directory = locate_data_path(
                self.emodict_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []
        self.validIndexes = []
        self.emo2numDict = {}
        self.num2emoDict = {}

        # Dictionary that gives a mapping from emotion name to clip id.
        file = open(os.path.join(self.emodict_base_directory,
                    "newFilenameTranslate.txt"), 'r')
        line = file.readline()

        while line != '':
            if line[0] != '=':
                ln = line.split(':')
                emo = ln[0].strip()
                num = ln[1].strip().split(' ')[0]
                self.emo2numDict[emo] = num
                self.num2emoDict[num] = emo
            line = file.readline()

        # No validation split for this dataset
        # Find all clips to keep (not marked "REJECT" during labeling)
        labels_file = os.path.join(self.absolute_base_directory, 'labels.txt')
        f = open(labels_file, 'r')
        clips_and_targets = [(clip_name[:-4], target)
                             for clip_name, target in [
                                 l.split() for l in f.readlines()]
                             if target != 'REJECT']

        idx = 0
        for clip_name, target in clips_and_targets:
            if clip_name in self.seq_info:
                # Due to a mistake, some clips have been labeled twice,
                # so the same clip_name appears more than once in the list.
                # The simplest solution is to only use the first instance.
                continue

            #abs_img_dir = os.path.join(self.absolute_base_directory,
            #                           clip_name)
            rel_img_dir = os.path.join(self.base_dir,
                                       clip_name)
            im_seq = afew.AFEWImageSequence(
                "NewClips",
                rel_img_dir,
                '*.png',
                self.emotionNames[target])

            im_seq.set_picasa_path_substitutions(
                {self.base_dir: self.picasa_boxes_base_dir,
                 '.png': '.txt'},
                csv_delimiter=',')

            #im_seq.set_ramanan_path_substitutions(
            #    # ???
            #    )

            self.imagesequences.append(im_seq)

            # Save clip_name of sequence
            self.seq_info.append(clip_name)

            # If needed, load facetubes
            if self.preload_facetubes:
                self.facetubes.append(self.load_facetubes(clip_name))

            # Save label
            self.labels.append(self.emotionNames[target])

            # Save split
            self.trainIndexes.append(idx)

            idx += 1
Ejemplo n.º 9
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded
        when the dataset is built, which takes around 1.2 GB.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir % (size[0],
                                                               size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Smoothed face tubes directory.
                self.face_tubes_base_dir = (
                    "faces/EmotiW/smooth_picasa_face_tubes_%s_%s"
                    "/numpy_arr/concatenate") % (size[0], size[1])
                # Smoothed bounding boxes directory.
                self.face_tubes_boxes_base_dir = (
                    "faces/EmotiW/"
                    "smooth_picasa_face_tubes_%s_%s/picasa_tubes_pickles") % (
                        size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/EmotiW")
                filename = os.path.join(abs_dir,
                                        "background_faces_info_v2.pkl")
                try:
                    # Retrieve the list of background faces (clip_id, facetube_id)
                    # for the given dataset that will be filtered out.
                    f = open(filename, 'rb')
                    info = cPickle.load(f)
                    f.close()
                    self.facetubes_to_filter = info
                except IOError as e:
                    print e

        super(afew.AFEWImageSequenceDataset, self).__init__("AFEW2")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
            self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
            self.face_tubes_base_dir)
        self.absolute_face_tubes_boxes_base_directory = locate_data_path(
            self.face_tubes_boxes_base_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []
        self.validIndexes = []

        # For each split (Train or Val)
        idx = 0
        splits = (("Train", self.trainIndexes), ("Val", self.validIndexes))
        seqnum = 0
        for split_name, split_index in splits:
            #print 'processing %s' % split_name
            for emo_name in sorted(self.emotionNames.keys()):
                #print '  %s' % emo_name
                # Directory containing the images for all clips of that
                # emotion in that split
                abs_img_dir = os.path.join(self.absolute_base_directory,
                                           split_name, emo_name)
                rel_img_dir = os.path.join(self.base_dir, split_name, emo_name)
                #print 'abs_img_dir:', abs_img_dir
                if not os.path.isdir(abs_img_dir):
                    continue

                # Directory containing the picasa bounding boxes for clips
                # of that emotion in that split
                picasa_bbox_dir = os.path.join(
                    self.absolute_picasa_boxes_base_directory, split_name,
                    emo_name)

                # Find all image names
                img_names = glob.glob(os.path.join(abs_img_dir, '*.png'))
                #print '%s img_names' % len(img_names)

                # Find all clips (sequences)
                unique_seq = sorted(
                    set([img.split('-')[0] for img in img_names]))
                #print '%s unique_seq' % len(unique_seq)

                # For each clip
                for seq in unique_seq:
                    # Load the Image Sequence object
                    # pdb.set_trace()
                    im_seq = afew.AFEWImageSequence(
                        "AFEW2_%d" % seqnum, rel_img_dir,
                        "{0}-*.png".format(seq), self.emotionNames[emo_name])

                    im_seq.cache_directory = os.path.join(
                        self.absolute_base_directory,
                        "cache_dir/seq_%04d" % seqnum)

                    im_seq.set_picasa_path_substitutions(
                        {
                            self.base_dir: self.picasa_boxes_base_dir,
                            '.png': '.txt',
                            '.jpg': '.txt',
                        },
                        csv_delimiter=',')
                    im_seq.set_ramanan_path_substitutions({
                        'EmotiW/images/Train/':
                        'EmotiW/ramananExtract/matExtractTrain/',
                        'EmotiW/images/Val/':
                        'EmotiW/ramananExtract/matExtractVal/',
                        'Angry/':
                        '1_',
                        'Disgust/':
                        '2_',
                        'Fear/':
                        '3_',
                        'Happy/':
                        '4_',
                        'Neutral/':
                        '5_',
                        'Sad/':
                        '6_',
                        'Surprise/':
                        '7_',
                        '.jpg':
                        '.mat',
                        '.png':
                        '.mat'
                    })

                    self.imagesequences.append(im_seq)

                    # Save (split, emotion, sequence ID) of sequence
                    seq_id = os.path.basename(seq)
                    self.seq_info.append((split_name, emo_name, seq_id))

                    # If needed, load facetubes
                    if self.preload_facetubes:
                        self.facetubes.append(
                            self.load_facetubes(split_name, emo_name, seq_id))

                    # Save label
                    self.labels.append(self.emotionNames[emo_name])

                    # Save split
                    split_index.append(idx)

                    idx += 1
                    seqnum += 1
Ejemplo n.º 10
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded
        when the dataset is built.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir%(size[0], size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Use the bounding-boxes smoothed version of the face tubes.
                self.face_tubes_base_dir = ("faces/EmotiWTest/smooth_picasa_face_tubes_%s_%s"
                                            "/v2/numpy_arr_concatenated")%(size[0], size[1])
                self.face_tubes_boxes_base_dir = ("faces/EmotiWTest/smooth_picasa_face_tubes_%s_%s"
                                                  "/picasa_tubes_pickles")%(size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/EmotiWTest")
                filename = os.path.join(abs_dir, "test_background_info.txt")
                try:
                    f = open(filename)
                    lines = f.readlines()
                    f.close()
                    self.facetubes_to_filter = []
                    for line in lines:
                        self.facetubes_to_filter.append(line.strip())
                except IOError as e:
                    print e

        super(afew.AFEWImageSequenceDataset, self).__init__("AFEW2Test")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
                self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
                self.face_tubes_base_dir)
        self.face_tubes_boxes_base_directory = locate_data_path(
                self.face_tubes_boxes_base_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []  # unused
        self.validIndexes = []  # unused
        self.testIndexes = []

        idx = 0
        # find all clips
        clip_names = glob.glob(os.path.join(self.absolute_base_directory, '*'))
        clip_names.sort()

        # For each clip
        for clip_name in clip_names:
            rel_img_dir = os.path.join(self.base_dir, clip_name)
            im_seq = afew.AFEWImageSequence(
                "AFEW2Test",
                rel_img_dir,
                '*.png',
                None)

            im_seq.set_picasa_path_substitutions(
                {self.base_dir: self.picasa_boxes_base_dir,
                 '_.png': '.txt',
                 '_.jpg': '.txt'},
                csv_delimiter=',')

            #im_seq.set_ramanan_path_substitutions(
            #    # ???
            #    )

            self.imagesequences.append(im_seq)

            # Save clip_name of sequence
            self.seq_info.append(clip_name)

            # If needed, load facetubes
            if self.preload_facetubes:
                self.facetubes.append(self.load_facetubes(clip_name))

            # No label
            self.labels.append(None)

            # Save split
            self.trainIndexes.append(idx)

            idx += 1
Ejemplo n.º 11
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded
        when the dataset is built.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir % (size[0],
                                                               size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Use the bounding-boxes smoothed version of the face tubes.
                self.face_tubes_base_dir = (
                    "faces/EmotiWTest/smooth_picasa_face_tubes_%s_%s"
                    "/v2/numpy_arr_concatenated") % (size[0], size[1])
                self.face_tubes_boxes_base_dir = (
                    "faces/EmotiWTest/smooth_picasa_face_tubes_%s_%s"
                    "/picasa_tubes_pickles") % (size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/EmotiWTest")
                filename = os.path.join(abs_dir, "test_background_info.txt")
                try:
                    f = open(filename)
                    lines = f.readlines()
                    f.close()
                    self.facetubes_to_filter = []
                    for line in lines:
                        self.facetubes_to_filter.append(line.strip())
                except IOError as e:
                    print e

        super(afew.AFEWImageSequenceDataset, self).__init__("AFEW2Test")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
            self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
            self.face_tubes_base_dir)
        self.face_tubes_boxes_base_directory = locate_data_path(
            self.face_tubes_boxes_base_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []  # unused
        self.validIndexes = []  # unused
        self.testIndexes = []

        idx = 0
        # find all clips
        clip_names = glob.glob(os.path.join(self.absolute_base_directory, '*'))
        clip_names.sort()

        # For each clip
        for clip_name in clip_names:
            rel_img_dir = os.path.join(self.base_dir, clip_name)
            im_seq = afew.AFEWImageSequence("AFEW2Test", rel_img_dir, '*.png',
                                            None)

            im_seq.set_picasa_path_substitutions(
                {
                    self.base_dir: self.picasa_boxes_base_dir,
                    '_.png': '.txt',
                    '_.jpg': '.txt'
                },
                csv_delimiter=',')

            #im_seq.set_ramanan_path_substitutions(
            #    # ???
            #    )

            self.imagesequences.append(im_seq)

            # Save clip_name of sequence
            self.seq_info.append(clip_name)

            # If needed, load facetubes
            if self.preload_facetubes:
                self.facetubes.append(self.load_facetubes(clip_name))

            # No label
            self.labels.append(None)

            # Save split
            self.trainIndexes.append(idx)

            idx += 1
Ejemplo n.º 12
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded when the
        data set is built.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir % (size[0],
                                                               size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Use the bounding-boxes smoothed version of the face tubes.
                self.face_tubes_base_dir = (
                    "faces/new_clips/smooth_picasa_face_tubes_%s_%s"
                    "/numpy_arr_concatenated") % (size[0], size[1])
                self.face_tubes_boxes_base_dir = (
                    "faces/new_clips/smooth_picasa_face_tubes_%s_%s"
                    "/picasa_tubes_pickles") % (size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/new_clips")
                filename = os.path.join(abs_dir, "background_info.pkl")
                try:
                    f = open(filename, 'rb')
                    self.facetubes_to_filter = cPickle.load(f)
                    f.close()
                except IOError as e:
                    print e

        super(afew.AFEWImageSequenceDataset, self).__init__("NewClips")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
            self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
            self.face_tubes_base_dir)
        self.face_tubes_boxes_base_directory = locate_data_path(
            self.face_tubes_boxes_base_dir)
        self.emodict_base_directory = locate_data_path(self.emodict_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []
        self.validIndexes = []
        self.emo2numDict = {}
        self.num2emoDict = {}

        # Dictionary that gives a mapping from emotion name to clip id.
        file = open(
            os.path.join(self.emodict_base_directory,
                         "newFilenameTranslate.txt"), 'r')
        line = file.readline()

        while line != '':
            if line[0] != '=':
                ln = line.split(':')
                emo = ln[0].strip()
                num = ln[1].strip().split(' ')[0]
                self.emo2numDict[emo] = num
                self.num2emoDict[num] = emo
            line = file.readline()

        # No validation split for this dataset
        # Find all clips to keep (not marked "REJECT" during labeling)
        labels_file = os.path.join(self.absolute_base_directory, 'labels.txt')
        f = open(labels_file, 'r')
        clips_and_targets = [
            (clip_name[:-4], target)
            for clip_name, target in [l.split() for l in f.readlines()]
            if target != 'REJECT'
        ]

        idx = 0
        for clip_name, target in clips_and_targets:
            if clip_name in self.seq_info:
                # Due to a mistake, some clips have been labeled twice,
                # so the same clip_name appears more than once in the list.
                # The simplest solution is to only use the first instance.
                continue

            #abs_img_dir = os.path.join(self.absolute_base_directory,
            #                           clip_name)
            rel_img_dir = os.path.join(self.base_dir, clip_name)
            im_seq = afew.AFEWImageSequence("NewClips", rel_img_dir, '*.png',
                                            self.emotionNames[target])

            im_seq.set_picasa_path_substitutions(
                {
                    self.base_dir: self.picasa_boxes_base_dir,
                    '.png': '.txt'
                },
                csv_delimiter=',')

            #im_seq.set_ramanan_path_substitutions(
            #    # ???
            #    )

            self.imagesequences.append(im_seq)

            # Save clip_name of sequence
            self.seq_info.append(clip_name)

            # If needed, load facetubes
            if self.preload_facetubes:
                self.facetubes.append(self.load_facetubes(clip_name))

            # Save label
            self.labels.append(self.emotionNames[target])

            # Save split
            self.trainIndexes.append(idx)

            idx += 1
Ejemplo n.º 13
0
    def __init__(self, preload_facetubes=False, preproc=[], size=(96, 96)):
        """
        If preload_facetubes is True, all facetubes will be loaded
        when the dataset is built, which takes around 1.2 GB.
        """
        self.face_tubes_base_dir = self.face_tubes_base_dir%(size[0], size[1])
        self.facetubes_to_filter = None
        for opt in preproc:
            if opt == "smooth":
                # Smoothed face tubes directory.
                self.face_tubes_base_dir = ("faces/EmotiW/smooth_picasa_face_tubes_%s_%s"
                                            "/numpy_arr/concatenate")%(size[0], size[1])
                # Smoothed bounding boxes directory.
                self.face_tubes_boxes_base_dir = ("faces/EmotiW/"
                    "smooth_picasa_face_tubes_%s_%s/picasa_tubes_pickles")%(size[0], size[1])

            if opt == "remove_background_faces":
                # Remove background faces as many as possible from the dataset.
                # Path to the dictionary giving for each dataset, the list of
                # face tubes corresponding to background faces/objects.
                abs_dir = locate_data_path("faces/EmotiW")
                filename = os.path.join(abs_dir, "background_faces_info_v2.pkl")
                try:
                    # Retrieve the list of background faces (clip_id, facetube_id)
                    # for the given dataset that will be filtered out.
                    f = open(filename, 'rb')
                    info = cPickle.load(f)
                    f.close()
                    self.facetubes_to_filter = info
                except IOError as e:
                    print e


        super(afew.AFEWImageSequenceDataset,self).__init__("AFEW2")

        self.absolute_base_directory = locate_data_path(self.base_dir)
        self.absolute_picasa_boxes_base_directory = locate_data_path(
                self.picasa_boxes_base_dir)
        self.face_tubes_base_directory = locate_data_path(
                self.face_tubes_base_dir)
        self.absolute_face_tubes_boxes_base_directory = locate_data_path(
                self.face_tubes_boxes_base_dir)

        self.preload_facetubes = preload_facetubes
        self.preproc = preproc
        self.size = size
        self.imagesequences = []
        self.labels = []
        self.seq_info = []
        self.trainIndexes = []
        self.validIndexes = []

        # For each split (Train or Val)
        idx = 0
        splits = (("Train", self.trainIndexes),
                  ("Val", self.validIndexes))
        seqnum = 0
        for split_name, split_index in splits:
            #print 'processing %s' % split_name
            for emo_name in sorted(self.emotionNames.keys()):
                #print '  %s' % emo_name
                # Directory containing the images for all clips of that
                # emotion in that split
                abs_img_dir = os.path.join(self.absolute_base_directory,
                                       split_name, emo_name)
                rel_img_dir = os.path.join(self.base_dir,
                                       split_name, emo_name)
                #print 'abs_img_dir:', abs_img_dir
                if not os.path.isdir(abs_img_dir):
                    continue

                # Directory containing the picasa bounding boxes for clips
                # of that emotion in that split
                picasa_bbox_dir = os.path.join(
                        self.absolute_picasa_boxes_base_directory,
                        split_name, emo_name)

                # Find all image names
                img_names = glob.glob(os.path.join(abs_img_dir, '*.png'))
                #print '%s img_names' % len(img_names)

                # Find all clips (sequences)
                unique_seq = sorted(set([img.split('-')[0]
                                         for img in img_names]))
                #print '%s unique_seq' % len(unique_seq)

                # For each clip
                for seq in unique_seq:
                    # Load the Image Sequence object
                    # pdb.set_trace()
                    im_seq = afew.AFEWImageSequence("AFEW2_%d"%seqnum,
                                                    rel_img_dir,
                                                    "{0}-*.png".format(seq),
                                                    self.emotionNames[emo_name])

                    im_seq.cache_directory = os.path.join(self.absolute_base_directory,"cache_dir/seq_%04d"%seqnum)

                    im_seq.set_picasa_path_substitutions(
                        {self.base_dir:self.picasa_boxes_base_dir,
                         '.png':'.txt',
                         '.jpg':'.txt',
                         }, csv_delimiter=',')
                    im_seq.set_ramanan_path_substitutions( {
                        'EmotiW/images/Train/':'EmotiW/ramananExtract/matExtractTrain/',
                        'EmotiW/images/Val/':'EmotiW/ramananExtract/matExtractVal/',
                        'Angry/':'1_',
                        'Disgust/':'2_',
                        'Fear/':'3_',
                        'Happy/':'4_',
                        'Neutral/':'5_',
                        'Sad/':'6_',
                        'Surprise/':'7_',
                        '.jpg':'.mat',
                        '.png':'.mat'
                        } )

                    self.imagesequences.append(im_seq)

                    # Save (split, emotion, sequence ID) of sequence
                    seq_id = os.path.basename(seq)
                    self.seq_info.append((split_name, emo_name, seq_id))

                    # If needed, load facetubes
                    if self.preload_facetubes:
                        self.facetubes.append(self.load_facetubes(
                                split_name, emo_name, seq_id))

                    # Save label
                    self.labels.append(self.emotionNames[emo_name])

                    # Save split
                    split_index.append(idx)

                    idx += 1
                    seqnum += 1