Пример #1
0
def draw_weights_of_net(net,
                        img_name_pre="",
                        blank_size=2,
                        img_save_dir="Saved_Virtualizations"):
    """
    绘制网络所有的特征层的内核参数情况
    :param net: 网络
    :param img_name_pre: 存储的图片的前缀
    :param blank_size: 样图之间的间距(pixel)
    :param img_save_dir: 存储的目录
    :return: None
    """
    layer_number = 0
    stat_dict = net.state_dict()
    for dic in stat_dict.keys():
        dic_splited = dic.split(".")
        if dic_splited[0] == 'features' and dic_splited[2] == 'weight':
            img_save_name = img_name_pre + "_weight_layer_" + str(layer_number)
            weights = stat_dict[dic]
            # print(dic, weights)
            out_channel_num = len(weights)
            in_channel_num = len(weights[0])
            kernel_height = len(weights[0][0])
            kernel_width = len(weights[0][0][0])
            img_arr = np.array([[
                0.5 for _ in range(kernel_width * in_channel_num +
                                   (in_channel_num - 1) * blank_size)
            ] for _ in range(kernel_height * out_channel_num +
                             (out_channel_num - 1) * blank_size)])
            # print(img_arr.shape)
            for out_channel_number in range(out_channel_num):
                for in_channel_number in range(in_channel_num):
                    start_row_index, start_col_index = (out_channel_number) * (
                        blank_size + kernel_height), (in_channel_number) * (
                            blank_size + kernel_width)
                    kernel = weights[out_channel_number][in_channel_number]
                    # print(kernel.shape)
                    for row_pixel_index in range(kernel.shape[0]):
                        for col_pixel_index in range(kernel.shape[1]):
                            img_arr[start_row_index + row_pixel_index][
                                start_col_index + col_pixel_index] = kernel[
                                    row_pixel_index][col_pixel_index]
            img = Image.fromarray(img_arr)
            if not os.path.exists(img_save_dir):
                os.mkdir(img_save_dir)
            utils.draw_img(img,
                           os.path.join(img_save_dir, img_save_name),
                           plt_show=False)
            layer_number += 1
Пример #2
0
def build_and_draw_img_of_features(images,
                                   feature_index,
                                   type="",
                                   img_name_pre="",
                                   img_save_dir="Saved_Virtualizations"):
    """
    构建并绘制特征层的图像
    :param images: 钩子函数获取的特征层,[tuple, tuple, ..., tuple]
    :param feature_index: 特征序号
    :param type: 特征类型('in'表示特征层的输入,'out'表示特征层的输出,'end'表示网络最终特征输出)
    :param img_name_pre: 存储的特征层 img 名称前缀
    :param img_save_dir: 存储的特征层 img 路径
    :return: 保存的img路径
    """
    # print(images.shape)
    img_save_name = img_name_pre + "_feature_layer_" + str(
        feature_index) + "_" + type
    for i in range(len(images)):
        # print("-----------img %s------------" % str(i))
        image = images[i]
        start_build_time = time.time()
        img = build_img_of_features(image)
        end_build_time = time.time()
        build_duration = round((end_build_time - start_build_time) * 1000, 2)
        print("build_duration:", build_duration)
        if not os.path.exists(img_save_dir):
            os.mkdir(img_save_dir)
        img_save_path = os.path.join(img_save_dir,
                                     img_save_name + "_of_img_" + str(i))
        start_draw_time = time.time()
        utils.draw_img(img, img_save_path, plt_show=False)
        end_draw_time = time.time()
        draw_duration = round((end_draw_time - start_draw_time) * 1000, 2)
        print("draw_duration:", draw_duration)
        break
    return img_save_path
        读取label分类信息
        :return: 无
        '''
        with open(self.cla_data_file_path) as file:
            lines = file.readlines()
        # 将分类信息处理成map
        for line in lines:
            file_name, classification = line.strip().split(" ")
            file_name = file_name.split(".")[0]
            #     print(file_name, classification)
            self.cla_map[file_name] = int(classification) - 1
            self.cla_num_list[int(classification) - 1] += 1
        print("分类信息读取完毕!")
        print("数据集已分类的图片个数:", len(self.cla_map))
        print("已分类各类图片个数:", self.cla_num_list)


if __name__ == "__main__":
    f1 = RAF_no_fl(is_train=True,
                   img_dir_pre_path="../data/RAF_no_fl",
                   RAF_img_dir_pre_path="../data/RAF")
    f2 = RAF_no_fl(is_train=False,
                   img_dir_pre_path="../data/RAF_no_fl",
                   RAF_img_dir_pre_path="../data/RAF")
    print(f1.__len__(), f2.__len__())

    from utils.utils import draw_img

    draw_img(f1.__getitem__(0)[0])
    draw_img(f2.__getitem__(0)[0])
Пример #4
0
            img, cla = self.test_data[index], self.test_classes[index]

        # 由于存在 random_crop 等的随机处理,应该是读取的时候进行,这样每个epoch都能够获取不同的random处理
        if self.transform is not None:
            img = self.transform(img)
        return img, cla

    def __len__(self):
        """
        Returns:
            int: data num.
        """
        if self.is_train:
            return self.train_data_num
        else:
            return self.test_data_num

    def set_transform(self, transform):
        self.transform = transform


if __name__ == "__main__":
    c1 = CKPlus(is_train=True, img_dir_pre_path="../data/CK+")
    c2 = CKPlus(is_train=False, img_dir_pre_path="../data/CK+")
    print(c1.__len__(), c2.__len__())

    from utils.utils import draw_img

    draw_img(c1.__getitem__(0)[0])
    draw_img(c2.__getitem__(0)[0])
        # 由于存在 random_crop 等的随机处理,应该是读取的时候进行,这样每个epoch都能够获取不同的random处理
        if self.transform is not None:
            img = self.transform(img)

        return img, cla

    def __len__(self):
        """
        Returns:
            int: data num.
        """
        if self.is_train:
            return self.train_data_num
        else:
            return self.test_data_num

    def set_transform(self, transform):
        self.transform = transform


if __name__ == "__main__":
    j1 = JAFFE(is_train=True, img_dir_pre_path="../data/jaffe")
    j2 = JAFFE(is_train=False, img_dir_pre_path="../data/jaffe")
    print(j1.__len__(), j2.__len__())

    from utils.utils import draw_img

    draw_img(j1.__getitem__(0)[0])
    draw_img(j2.__getitem__(0)[0])