DL-FWI学习之数据(SEG盐数据与OpenFWI数据为例)

目录

一、数据简介

1.1 SEG盐体数据

1.2  SEG盐体数据的模拟数据

1.3 OpenFWI数据集 

1.4 地震数据

二、数据的操作

2.1数据的读取

2.1.1 读取.mat格式数据

2.1.2 读取.npy格式数据

2.2 数据的存储

2.3 数据的展示

2.3.1 SEG盐数据的地震数据展示

2.3.2 SEG盐数据的速度模型展示

2.3.3 OpenFWI的地震数据展示

2.3.4 OpenFWI的速度模型展示


一、数据简介

        数据集本身由若干个{地震数据-速度模型}构成的数据对,任何一个地震数据必然有其对应的速度模型,两者是一 一对应的关系,反之亦然。速度模型描述了地下介质中声波(或地震波)传播的速度分布情况;地震数据是在地震事件中收集的地震波信号。

        速度模型是一张m*n的图片,而地震数据有S张剖面所构成的图形(S=放炮数量),每张图形的尺寸为T*R,地震剖面是从左往右的过程,炮面图的宽度=接收器的个数,高度=采样时长

        对于有N个数据的地震数据集,数据与数据之间存在下面的层级关系,可以进行如下拆分:

1.1 SEG盐体数据

        SEG(国际勘探地球物理学家学会)是国际上最权威的勘探地球物理学术组织,致力于推动应用地球物理学的发展和地球物理学家教育。

        SEG盐数据本身是一个三维数据,类似于切面包,切出了140片数据(这个并不是真实数据,但是与下面的模拟数据有一定的区别),但是并不是所有剖面都有盐体。SEG盐数据描述了一个大约2km*3km的地下二维剖面区域。采样后,地下的像素区域大小为201*301,波在这个地下区域的传播速度为1500 m/s~4482 m/s。 

        上图中黄色部分代表盐体(Salt Body),波在这个介质中的传播速度较快。盐体是指地下储存着盐类矿物质的岩体, 通常由氯化钠、硫酸钠、硼酸盐等组成。这些盐体往往形成在海洋或湖泊的底部,因为这些地方有更多的水分和盐分, 有利于盐类矿物质的沉积和聚集。在一些地方, 盐体可以被开采并用于食品加工、化学工业等领域。

1.2  SEG盐体数据的模拟数据

        该模拟数据集模仿真实数据的分布,采用数学公式进行模拟,形成类似的地层速度模型结构。其中包含1700个与SEG大小相同的合成速度模型,每幅图像都有不同宽度的层,大约5-12层不等,每个速度模型在中部或者底部都随机嵌入了随机形状的盐体,其地层速度也控制在2000 km/s~4500 km/s。

        该模拟数据最早出现于FCNVMB提供的开源数据。

1.3 OpenFWI数据集 

        OpenFWI是近一两年随着DL-FWI的蓬勃发展而诞生的大规模、多结构基准数据集的集合,其中都是合成数据。它包含了12 个根据不同先验合成的数据集,,其中包括一个 3D 数据集。这12个数据集为四类数据:Vel类、Fault类、Style类、 Kimberlina类。 除Style类外,它们都表示不同的地下结构,Style类是一种自然图像的迁移假想地层。

        Vel类:地层面比较平滑,没有断层的单一数据,其中包含平坦的Vel类和光滑的曲面Vel类;

        Fault类:平坦断层+曲面断层;

        Style类:将现实图片经过处理:模糊化、二池化等进行B,将B进行平滑处理、中心填充等形成A;

        Kimberlina类:基于真实的气体存储数据进行构造;

        A/B代表地层的难度分级,A表示简单,B表示复杂。

        速度模型为方形的数据,而地震数据的时间域没有使用下采样,因此图像的纵宽比很大。

1.4 地震数据

        通过正演生成对应的地震数据,蓝色为波谷,红色为波峰: 

         正演过程中的常见参数:

        ①Grid spacing(正演间隔-将波形图放入真实环境下,每个像素点之间的间隔):10m

        ②Source grequency(震源频率):25Hz(出现在FCNVMB论文中,在现实环境中这个数据有点小)

        ③Source spacing(采样间距-水平方向上,相邻震源之间的距离):103.45m

        ④Source numbers(炮数,震源数量):29(103.45*29=3000-表示地震源所覆盖的水平距离)

        ⑤Receiver spacing(接收器范围):10m(10*301=3010-表示地面放置的接收器所覆盖的水平距离)

        ⑥Receiver numbers(接收器数量):301

        ⑦Time spacing(时间采样):间隔为0.001s,共2s,采样点个数为2000个。但是我们做出来的图像为400*301,高宽比不太好处理,因此进行了下采样。有些实验会进行下采样,但是有些实验又不会进行。

二、数据的操作

2.1数据的读取

2.1.1 读取.mat格式数据

        一般来说,地震数据存储常常在.mat中的一个单变量中(.mat也可以存储多个变量)。

import scipy.io
# mat_file指文件路径名;var_name指文件中的变量名
numpy_file = scipy.io.loadmat(mat_file)["var_name"]

2.1.2 读取.npy格式数据

        .npy(常包含多个数据单元)是Python中numpy变量的直接存储格式,直接读取到某个变量。

import numpy as np # 导入numpy库
dataset = np.load(np_file)

2.2 数据的存储

         地震数据的存储操作较少,但是在训练过程中也可能会保存中间变量,建议通过.npy文件进行保存。

import numpy as np
dataset = np.save(np_file)

2.3 数据的展示

        在Python中对数据进行展示,主要用到matplotlib有关的库,如下:

import matplotlib
import numpy as np
matplotlib.use('TkAgg')
import matplotlib.pylab as plt # matplotlib.use('agg')必须在本句执行前运行
from mpl_toolkits.axes_grid1 import make_axes_locatable
  •  matplotlib:Python的一个综合性库,可以创建静态的、动画的和可交互的可视化图像,需要额外安装;
  • numpy:Python中科学计算的基础包,提供多维数组对象、各种派生对象(如掩码数组和矩阵)和用于数组快速操作的各种API,包括数学、逻辑、排序、选择、基本线性代数、基本统计运算等。
  • matplotlib.use('TkAgg'):在Pycharm中不显示绘图;
  • mpl_toolkits.axes_grid1:提供用于调整帮助程序类框架多个固定纵向轴的定位(例如,显示图像),可以与Matplotlib轴的属性形成对比,后者调整单个轴的位置。

部分安装命令:

  • matplotlib:pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 

2.3.1 SEG盐数据的地震数据展示

def pain_seg_seismic_data(para_seismic_data):
'''
    PLotting seismic data images of SEG salt datasets
    : param para_seismic_data: Seismic data (4e0 x 3e1)(numpy)
    : param is_coLorbar:    whether to add a color bar (1 means add,0 is the defauLt,means don't add)
'''
# 创建画布
fig,ax = plt.subplots(figsize=(6.2,8).dpi = 120)

# extend:指定显示范围,表示“左右下上”的坐标
# camp参数:设置图像的色彩映射方式
# vim、vmax参数:控制图像显示的像素值范围,通常在[0,1]之间
im = ax.imshow(para_seismic_data,extent=[0,300,400,0],cmap=plt.cm.seismic,vmin=-0.4,vmax=0.44)

# 设置坐标轴信息
ax.set_xlabel( 'Position (km)',font21)
ax.set_ylabel( 'Time (s)',font21)

ax.set_xticks(np.linspace(0,300,5))
ax.set yticks(np.linspace(e,400,5))
ax.set_xticklabels(1abels = [0,0.75,1.5,2.25,3.0],size=21)
ax.set_yticklabels(labels = [0.0,0.50,1.00,1.50,2.00],size=21)

plt.rcParams ['font.size']= 14  #set colorbar font size
divider = make_axes_locatable(ax)
cax = divider.append_axes("top",size="3%",pad=0.32)
plt.colorbar(im,ax=ax,cax=cax,orientation='horizontal')

# 设置图像留白区域,在0-1之间
plt.subplots_adjust(bottom=0.08,top=0.98,left=0.11,right=0.99)

plt.show
  • fig,ax = plt.subplots():创建总画布/figure窗口
matpltlib.pyplot.figure(
num = None,               # 设定figure名称。系统默认按数字升序命名的figure_num(透视表输出窗口)e.g. “figure1”。可自行设定figure名称,名称或是INT,或是str类型;
figsize=None,             # 设定figure尺寸(图像长宽比)。系统默认命令是rcParams["figure.fig.size"] = [6.4, 4.8],即figure长宽为6.4 * 4.8;
dpi=None,                 # 设定figure像素密度,调整可以修改图片大小。系统默命令是rcParams["sigure.dpi"] = 100;
facecolor=None,           # 设定figure背景色。系统默认命令是rcParams["figure.facecolor"] = 'w',即白色white;
edgecolor=None, frameon=True,    # 设定要不要绘制轮廓&轮廓颜色。系统默认绘制轮廓,轮廓染色rcParams["figure.edgecolor"]='w',即白色white;
FigureClass=<class 'matplotlib.figure.Figure'>,   # 设定使不使用一个figure模板。系统默认不使用;
clear=False,                     # 设定当同名figure存在时,是否替换它。系统默认False,即不替换。
**kwargs)
  •  ax.set_xlabel()、ax.set_ylabel():设置坐标轴标签,返回值为Text对象
matplotlib.pyplot.xlabel(
xlabel,          # 设置标签的文本,类型为字符串
fontdict=None,
labelpad=None,   # 设置标签与坐标轴的距离,类型为浮点数,默认值为None
*,
loc=None,        # 设置标签的位置,取值范围为{'left', 'center', 'right'},默认值为rcParams["xaxis.labellocation"]('center')
**kwargs         # 设置Text 对象关键字属性,用于控制文本的外观属性,如字体、文本颜色等。
)  
  •  subplots_adjust:控制留白区域、调整子图布局
  • tight_layout函数的功能为调整子图的内边距,但是axes()函数生成的子图无效
matplotlib.pyplot.subplots_adjust(
left=None,    # 调整所有子图整体相对于图像的左外边距,距离单位为图像宽度的比例(小数)。可选参数。浮点数。默认值为0.125
bottom=None,  # 调整下外边距,默认值为0.11
right=None,   # 调整右外边距,默认值为0.0
top=None,     # 调整上外边距,默认值为0.88
wspace=None,  # 调整子图间宽度内边距,距离单位为子图平均宽度的比例(小数)。浮点数。默认值为0.2
hspace=None   # 调整子图间高度内边距,距离单位为子图平均高度的比例(小数)。可选参数。浮点数。默认值为0.2
)

2.3.2 SEG盐数据的速度模型展示

def pain_seg_velocity_model(para_velocity_model):
    '''
    :param para_velocity_model: Velocity model (200 x 301) (numpy)
    :param min_velocity:        Upper limit of velocity in the velocity model
    :param max_velocity:        Lower limit of velocity in the velocity model
    :return:
    '''
    fig, ax = plt.subplots(figsize=(5.8, 4.3), dpi=150)
    im = ax.imshow(para_velocity_model, extent=[0, 3, 2, 0])

    ax.set_xlabel('Position (km)', font18)
    ax.set_ylabel('Depth (km)', font18)

    ax.tick_params(labelsize=14)
    plt.rcParams['font.size'] = 14  # Set colorbar font size
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("top", size="3%", pad=0.32)
    plt.colorbar(im, ax=ax, cax=cax, orientation='horizontal')
    plt.subplots_adjust(bottom=0.12, top=0.95, left=0.11, right=0.99)

    plt.show()

 

2.3.3 OpenFWI的地震数据展示

def pain_openfwi_seismic_data(para_seismic_data):
'''
PLotting seismic data images of openfwi dataset
: param para_seismic_data: Seismic data (1eee x 70)(numpy)
'''

# 调用cv2.resize()通过插值的方式改变图像尺寸
data = cv2.resize(para_seismic_data,dsize=(400,301),interpolation=cv2.INTER_CUBIC)

fig, ax = plt.subplots(figsize=(6.1,8),dpi = 120)
im = ax.imshon(data,extent=[0,0.7,1.0,0],cmap=plt.cm.seismic,vmin=-18,vmax=19)

ax.set_xlabel( 'Position(km)' , font21)
ax.set_ylabel( 'Time (s)', font21)

ax.set_xticks(np.linspace(0,0.7,5))
ax.set_yticks(np.linspace(0,1.0,5))
ax.set_xticklabels(labels=[0,0.17,0.35,0.52,0.7],size=21)
ax.set_yticklabels(1abels=[0,0.25,0.5,0.75,1.0], size=21)
 
plt.rcParams ['font.size']= 14     # Set colorbar font size
divider = make_axes_locatable(ax)
cax = divider.append_axes( "top", size="3%", pad=0.3)
plt.colorbar(im, ax=ax, cax=cax, orientation='horizontal')
plt.subplots_adjust(bottom=0.08,top=0.98,1eft=0.11,right=0.99)
 
plt.show()

 cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])->dst参数说明:

  • src:原始图像
  • dst:目标图像,可以不传入,函数会自动创建—个。当参数dsize不为0时,dst的大小为dsize;否则,它的大小需要根据src的大小,参数fx和fy决定(dst的类型与src图像类型相同)
  • dsize:目标图像大小
  • fx:水平方向上的比例因子
  • fy:垂直方向上的比例因子
  • interpolation:插值方法,可选值包括①cv2.INTER_NEAREST-最近邻插值法、②cv2.INTER_LINEAR-双线性插值法(默认)、③cv2.INTER_AREA-基于局部像素的重采样、④cv2.INTER_CUBIC-基于4x4像素邻域的3次插值法、⑤cv2.INTER_LANCZOS4-基于8x8像素邻域的Lanczos插值等。

2.3.4 OpenFWI的速度模型展示

ef pain_openfwi_velocity_model(para_velocity_model):
    '''
    Plotting seismic data images of openfwi dataset
    :param para_velocity_model: Velocity model (70 x 70) (numpy)
    param min_velocity:        Upper limit of velocity in the velocity model
    :param max_velocity:        Lower limit of velocity in the velocity model
    :param is_colorbar:         Whether to add a color bar (1 means add, 0 is the default, means don't add)
    :return:
    '''
    fig, ax = plt.subplots(figsize=(5.8, 6), dpi=150)
    im = ax.imshow(para_velocity_model, extent=[0, 0.7, 0.7, 0])

    ax.set_xlabel('Position (km)', font18)
    ax.set_ylabel('Depth (km)', font18)

    ax.set_xticks(np.linspace(0, 0.7, 8))
    ax.set_yticks(np.linspace(0, 0.7, 8))
    ax.set_xticklabels(labels=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7], size=18)
    ax.set_yticklabels(labels=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7], size=18)

    plt.rcParams['font.size'] = 14      # Set colorbar font size
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("top", size="3%", pad=0.35)
    plt.colorbar(im, ax=ax, cax=cax, orientation='horizontal', format = mpl.ticker.StrMethodFormatter('{x:.0f}'))
    plt.subplots_adjust(bottom=0.10, top=0.95, left=0.13, right=0.95)

    plt.show()

猜你喜欢

转载自blog.csdn.net/m0_53096519/article/details/133826304