格拉姆角场(Gramian Angular Field)是一种将时间序列数据转换为图像-实现代码
本文介绍了使用格拉姆角差场(GADF)技术将一维时序信号转换为图像的方法。GADF通过极坐标编码将时间序列转换为图像,保留时序特征。文章详细说明了实现步骤:1)配置Python环境;2)核心代码实现,包括GADF转换器创建、图像生成和保存;3)批量处理数据集生成图像;4)格式转换。该方法可为深度学习模型构建有效的图像数据集,代码中通过设置随机种子保证结果可重复,并采用jet色彩映射增强特征可视化。
本文介绍了如何使用格拉姆角差场(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色彩映射,增强图像的特征可视化

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