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