本文介绍了如何使用格拉姆角差场(Gramian Angular Difference Field, GADF)技术将一维时序信号转换为图像,并构建适用于深度学习模型的图像数据集。

1. 什么是格拉姆角场(GAF)?

格拉姆角场(Gramian Angular Field)是一种将时间序列数据转换为图像表示的技术,它通过将时间序列编码到极坐标系统中,然后计算角度和的余弦或正弦值来生成图像。这种方法能够保留时间序列的时序依赖性和相关性。

GAF主要有两种变体:

  • GASF(Gramian Angular Summation Fields):使用余弦函数

  • GADF(Gramian Angular Difference Fields):使用正弦函数

本文重点介绍GADF的实现和应用。

2. 环境配置与依赖库

在开始之前,确保安装了以下Python库:

pip install torch pyts pillow matplotlib numpy scikit-learn joblib

3. 完整代码实现

以下是使用GADF将一维信号转换为图像的完整代码:


import os
import matplotlib.pyplot as plt
import torch
from pyts.image import GramianAngularField
import numpy as np
from PIL import Image
import warnings
from matplotlib import MatplotlibDeprecationWarning

# 忽略警告信息
warnings.filterwarnings("ignore", category=MatplotlibDeprecationWarning)

def makeTimeFrequencyImage(data, img_path, img_size):
    """
    生成GADF时频图像
    
    参数:
    data: 一维时序数据
    img_path: 图像保存路径
    img_size: 图像尺寸
    """
    data = np.array(data)
    # 创建Gramian Angular Field对象,使用difference方法(GADF)
    gaf = GramianAngularField(image_size=1024, method='difference')
    # 将时序数据转换为GAF图像
    gaf_image = gaf.fit_transform(data.reshape(1, -1))

    # 生成图像
    plt.imshow(gaf_image[0], cmap='jet', origin='lower')
    plt.axis('off')  # 设置图像坐标轴不可见
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)
    plt.gcf().set_size_inches(img_size / 100, img_size / 100)
    plt.savefig(img_path, dpi=100)
    plt.clf()  # 清除当前图形,避免内存溢出
    plt.close()  # 释放内存

def GenerateImageDataset(path_list, data_set):
    """
    生成图像数据集
    
    参数:
    path_list: 图像保存路径列表
    data_set: 数据集列表
    """
    # 遍历数据集和对应目录
    for index in range(len(data_set)):
        dataset = data_set[index]
        # 更改列名(注意:类型名称中不要出现'_'符号)
        dataset.columns = ['denormal', 'de7inner', 'de7ball', 'de7outer', 'de14inner',
                           'de14ball', 'de14outer', 'de21inner', 'de21ball', 'de21outer']

        path = path_list[index]
        # 遍历数据集每一列
        for column_name, column_data in dataset.items():
            # 行名计数器,对应每个数据名称
            count = 1
            # 遍历数据列每一行,生成对应的时频图像
            for row_data in dataset[column_name]:
                # 图片名称和路径
                img_path = path + column_name + '_' + str(count) + '.png'
                # 生成时频图像
                makeTimeFrequencyImage(row_data, img_path, 224)
                # 图片名称+1
                count += 1

def ConvertRGB(path_list):
    """
    将4通道图像转换为3通道RGB图像
    
    参数:
    path_list: 图像路径列表
    """
    for path in path_list:
        all_images = os.listdir(path)
        for image in all_images:
            if image.endswith('.png'):
                image_path = os.path.join(path, image)
                img = Image.open(image_path)
                # 4通道转化为RGB三通道
                img = img.convert("RGB")
                img.save(os.path.join(path, image))

if __name__ == '__main__':
    # 参数与配置
    torch.manual_seed(100)  # 设置随机种子,使实验结果可重复

    # 导入数据
    from joblib import dump, load
    
    # 加载数据集(假设已经预处理好的数据集)
    train_set = load('train_set')
    val_set = load('val_set')
    test_set = load('test_set')
    
    data_set = [train_set, val_set, test_set]

    # 数据集路径
    train_path = 'GADFImages/train/'
    val_path = 'GADFImages/val/'
    test_path = 'GADFImages/test/'
    
    # 创建目录(如果不存在)
    os.makedirs(train_path, exist_ok=True)
    os.makedirs(val_path, exist_ok=True)
    os.makedirs(test_path, exist_ok=True)
    
    path_list = [train_path, val_path, test_path]

    # 第一步:生成图像
    GenerateImageDataset(path_list, data_set)
    
    # 第二步:转换为RGB格式
    ConvertRGB(path_list)
    
    print("图像数据集生成完成!")

4. 代码解析与关键点

4.1 GADF图像生成核心函数

makeTimeFrequencyImage函数是核心实现,其中:

  • GramianAngularField(image_size=1024, method='difference')创建GADF转换器

  • image_size参数决定输出图像的分辨率

  • method='difference'指定使用GADF方法(区别于summation的GASF方法)

  • cmap='jet'使用jet色彩映射,增强图像的特征可视化

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐