利用 SARScape 中的哨兵-1 数据完成 SBAS-InSAR 流程 (1/2)
SARScape中用sentinel-1数据做SBAS-InSAR完整流程
- 1 SABA-InSAR原理简述
- 2 数据采集和预设
- 2.1 SAR数据采集
- 2.2 DEM数据下载与放置
- 2.3 精密轨道数据下载与放置
- 2.4 制作研究区范围矢量
- 2.5 SARscape Preferences预设
- 3 SAR数据预处理
- 3.1 导入数据
- 3.2 optional files设置
- 3.3 参数设置
- 4 生成连接图Connection Graph
- 4.1 输入数据
- 4.2 optional files设置
- 4.3 参数设置
- 4.4 查看输出文件和连接图
- 5 干涉工作流Interferometric Process
- 5.1 Input Files中选择上一步得到的工程文件auxiliary.sml
- 5.2 制作参考DEM
- 5.3 optional files设置
- 5.3.1 Geometry GCP file ,控制点文件,可选
- 5.3.2 Avoid Moving Area File ,无位移区域,可选
- 5.3.3 Optional Water Vapour File List,水蒸气数据,可用GACOS数据,可选
- 5.3.4 Classification Mask File,分类掩膜文件
- 5.4 parameters设置
- 5.5 输出文件
- 6 连接图编辑SBAS Edit Connection Graph
- 6.1 打开auxiliary.sml文件,会自动加载连接图,自动选择主影像
- 6.2 连接图编辑的参数说明
- 6.3 连接图编辑操作
- 6' 轨道精炼和重去平,SARscape562集成在干涉数据流中,560及以下版本在SABS工具路径中
1 SABA-InSAR原理简述
**差分干涉测量短基线集时序分析技术(SmallBaselineSubsetInSAR,SBAS-InSAR)**由Berardino等人于2002年提出,不同于PS - InSAR的单主影像,该方法是一种基于多主影像的InSAR时间序列方法。它通过短基线原则,将大量SAR数据组合为具有多个主影像的干涉子集,每个子集内的干涉对基线长度均低于临界基线值,时间基线也尽可能短,集合间的 SAR影像基线距大,通过这种方式克服了时间和空间上的失相关,因此SBAS - InSAR可以通过较少的数据量来获取较可靠的监测结果。
基于短基线集原则,SBAS - InSAR具有多个主影像,但仍需选取其中一景影像作为公共主影像进行配准;组成各干涉子集后,利用外部参考数字高程模型(Digital Elevation Model,DEM)数据模拟并去除每个干涉相对的地形相位,然后生成时间序列差分干涉图集;相位解缠后得到每个相干目标的相位信息,包括形变相位、大气延迟相位、轨道误差相位等信息,各误差相位可在时间序列上采用滤波方法或多项式模型予以去除;由于SBAS - InSAR具有多个主影像,各干涉子集在联合求解时容易出现方程秩亏现象,因此引入奇异值分解方法,利用最小二乘原理得到地表时间序列形变信息。
下图为SBAS-InSAR的技术路线,图源ESRI的ENVI SARscape教程
2 数据采集和预设
实验所用的软件版本为SARScape5.6.2教育版
实验所用到的数据如下:
- SAR数据,即sentinel-1的SLC数据
- 对应的轨道数据
- DEM数据
2.1 SAR数据采集
目前免费的,还在更新的,比较容易下载的SAR数据就是sentinel-1数据,sentinel-1本来有2颗星,但是1B出故障,停止运行了,以前也有很多SAR卫星,比如ASAR
有很多个网站可以下载Sentinel-1数据,本文以ASF网站为例,下载教程参考文章:
哨兵-1 Sentinel-1数据下载(ASF)
也可以在欧空局下载Sentinel-1数据
哨兵-2 Sentinel-2 数据下载(欧空局)
2.2 DEM数据下载与放置
做DInSAR有多个方法,本文使用是两期SAR数据+DEM,因此要事先准备DEM数据,通常使用SRTM数据,具体来说是SRTM-1 V3,分辨率30m。
虽然SARscape理论上可以自动下载DEM,但是国内的网络经常出故障,因此还是需要手动下载。
如果不知道SAR数据对应的DEM怎么下载,不知道DEM的位置是哪里,不知道DEM切片编号,可以参考文章:
SARscape手动下载30mDEM(SRTM1 V3)切片数据-[EC: 40008]
2.3 精密轨道数据下载与放置
精密轨道数据不是必须的,一般来说,SAR数据自带参考轨道数据,但是精度稍低,精密轨道一般在数据发布后的一个礼拜后才会公布,因此,在处理突发情况的SAR数据时,短时间内无法获取到相应的精密轨道数据。
精密轨道下载教程见:
3种方法下载Sentinel-1精密轨道数据
精密轨道需要放置在特定的文件夹路径下面才能被SARscape识别并使用,放置教程见:
SARscape存放sentinel-1精密轨道数据并自动读取
2.4 制作研究区范围矢量
一景SAR数据很大,如果电脑性能不足,处理起来需要很多时间,为了提高处理速度和效率,建议提前制作研究区范围矢量,在SARscape中,可以导入.shp
.kml
.kmz
格式的矢量作为处理范围。
直接在GIS软件中新建一个矢量面图层,然后画一个即可,或者在Google Earth里面圈一个kml也可以,这一步很简单,就不
这个不是必须的,如果不导入范围,那么默认处理整个数据。
2.5 SARscape Preferences预设
首先选择适用于 Sentinel-1的一套系统参数。打开SARscape----Preferences----Perference specific
,单 击 Load Preferences
,选择Sentinel TOPSAR,在弹出的对话框上选择“是”。在参数设置面板上点击 OK。
3 SAR数据预处理
3.1 导入数据
工具路径为:/SARscape/Import Data/SAR Spaceborne/Single Sensor/Sentinel-1
由于是SARScape562,直接导入zip压缩包即可,不用解压
3.2 optional files设置
这一步就是添加
- 兴趣区矢量文件,kml、kmz或者shp格式都行,作者亲测矢量名必须是英文且不可以有下划线!!可选,不选择矢量文件就直接处理整景的数据
- 和处理过程文件
_progress.txt
,可选
3.3 参数设置
极化方式这里可以选择你需要的,一般是用VV
输出的时候直接选择文件夹就行
查看输出的文件
如果最后提示complete的同时又有一个警告,内容是无法找到有效的轨道数据,但其实你已经将轨道数据存放在合适的位置了,那可能是软件的bug,我遇到过很多次。在无法连接到指定的下载轨道数据的网址的时候,我们就不得不忽略轨道数据了。
其实从这一步开始才是真正的SBAS-InSAR核心流程
对输入的数据进行干涉像对的配对,像对结果图表方式输出到屏幕,输入 N 景数据,能得到的最大配对数是(N*(N-1))/2,生成连接图工具会选择最优的组合方式进行配对。这些像对会进行干涉工作流处理,然后用于 SBAS 反演。
程序会自动选择超级主影像,在整个处理中,超级主影像作为参考影像,所有的像对都会配准到超级主影像上。用户也可以自己选择超级主影像,超级主影像的选择也不是很严格因为对结果不会有什么影响,不过可能会导致较少的配对,所以还是建议自动选择超级主影响,这样有足够的像对,在像对编辑的时候,就可以去掉相干性小的像对。
工具路径:/SARscape/Interferometric Stacking/SBAS/1 - Connection Graph
4.1 输入数据
选择上一步处理好的VV数据
4.2 optional files设置
选择超级主影像super master file,这里不选择,程序会自动判断最适合的影像
4.3 参数设置
单击 Parameters 面板,选择 Principal Parameters,设置以下参数:
- Min Normal Baseline (%):0,临界基线最小百分比。
- Max Normal Baseline (%):2,临界基线最大百分比。
提示:建议把空间和时间基线阈值调大一些,最大临界基线推荐值为 45%~50%,主要依
赖传感器类型和经验,目的是避免完全空间失相关。 - Min Temporal Baseline:0,最小时间基线。
- Max Temporal Baseline:180,最大时间基线。
- Degree of Redundancy:冗余度
在对连接(干涉图)选择的最小和最大时间基线和正常基线应用阈值后,可以指定进一步的冗余度选择标准: - 高,接受与先前基线阈值相关的所有干涉图。
- 低,程序根据图形冗余标准和每次采集的最小连接数,尽量减少保留的干涉图数量
- Redundacy Criteria:冗余标准
当冗余度较低时,预计以下选择标准用于删除冗余连接: - 最小正常基线,通过仅保留具有最小空间基线的连接,将连接数最小化。
- 最大正常基线,通过仅保留具有最大空间基线的连接,将连接数最小化。
- 最小时间基线,通过仅保留具有最小时间基线的连接,将连接数最小化。
- Max Connections per Acquisition:最大连接数,撇除后每个采集剩余的连接数(干涉图),以减少冗余。此参数表示连接图的平均冗余,参考文献建议设置大于5的值以获得可靠的反演解。
- Allow Disconnected Blocks:False。不允许孤立的像对连接。
输出面板
填写一个文件的根名,后续处理的数据会据此根名自动命名
选择输出路径即可
查看报告
4.4 查看输出文件和连接图
- 在输出目录中可以看到如下的文件,重点看connection_graphy里面的plot和report
- auxiliary.sml文件记录相关的处理信息,包括处理进度、步骤和生成的文件记录等,后面会用到
- 连接图中,黄点是超级主影像super master ,这个在报告中也能看到,打开CG_report.txt文件,可以看到super master的信息。绿点是从影像,如果有红点,就是在限制条件外的影像。
- 像对连接时间基线图
像对连接空间基线图
SARscape562
版本的干涉工作流里面可以自动进行轨道精炼和重去平,这一步有点复杂,处理时间也比较久
- 工具路径:
/SARscape/Interferometric Stacking/SBAS/2 - Interferometric Process
5.1 Input Files中选择上一步得到的工程文件auxiliary.sml
对所有的配对的干涉像对进行干涉处理,从相干性生成,去平、滤波和相位解缠,所有的数据对都配准到超级主影像上,为下一步轨道精炼和重去平,以及 SBAS 反演做好数据准备。包括:
- 干涉图生成 Interferogram Generation
- 干涉图去平 Interferogram Flattening
- 自适应滤波和相干系数生成 Adaptive Filter and Coherence Generation
- 相位解缠 Phase Unwrapping
生成一系列解缠之后的相位图。所有的干涉图最终都与超级主影像进行了配准,为下一
步轨道精炼、重去平以及 SBAS 的反演做准备。
5.2 制作参考DEM
为啥要提前制作DEM呢?因为之前的步骤都不需要用到DEM,但是optional files里面的GCP需要DEM
- 在工具的DEM/Cartographic System中,点击DEM file 右边的望远镜符号
- 选择SRTM-1,会跳出一个新的工具DEM Erxtraction-SRTM1 Version3,
- 输入位置参考数据,也就是上一步处理好的数据,随便选一个就行,我选的是超级主影像
- 选择输出文件的坐标GEO-GLOBAL
- 设定好输出路径之后就点击exec开始运行
- 日常报错
- 其实这一步的过程和前文提到的文章里面一模一样
SARscape手动下载30mDEM(SRTM1 V3)切片数据-[EC: 40008] - 打开
SARscape----Administration----View Files----Log File
拉到最下面,查看DEM切片的名称 去USGS下载这两个切片,不再赘述,看链接里面的文章即可
SARscape手动下载30mDEM(SRTM1 V3)切片数据-[EC: 40008]- 制作好了之后点击文件夹图标直接加载进来
5.3 optional files设置
5.3.1 Geometry GCP file ,控制点文件,可选
加载先前创建的地面控制点文件(.xml)(加载 GCP 文件)或自动加载创建新地面控制点文件的界面(创建 GCP 文件)
- 点击望远镜,创建GCP
-
点击之后,会自动打开Generate Ground Control Points界面
- Input File:必选项。用于 GCP 定位。这里选择上一步做好的解缠结果文件或者干涉文件。
- DEM File:可选项。用于检测 GCP 对应的高程值。这里选择 DEM 文件。
- Reference File:可选项。为选择 GCP 提供一个参考依据,可以选择相干系数图、干涉图等。Reference File 与 Input File 同时显示在一个窗口中。
- 点击Next,进入下一步,Insert指插入GCP,Edit/Modify可以删除或者移动GCP
说明:选择 GCP 重要的标准包括:
1、没有残余地形条纹;
2、没有形变条纹,远离形变区域,除非已知这个点的形变速率;
3、没有相位跃变,如果 GCP 点位于一个孤立相位上,并且解缠的值非常差,这个位置可能是斜坡相位(phase ramp)的一部分,那么选择的这个 GCP 是不对的;
4、由于在 SBAS 中,很难找到完美的 GCP 可以全部用在所有的数据对中,因为数据对拥有不同的相干性。因此建议多选择一些 GCP,至少 20-30 个点。 - -参考着cc影像插入GCP完成之后,在fint里面看看有无位于相位孤岛的地方,如果有就删掉或移动
- 这种点就应该删掉或者移动,点击GCPs下面的黑色X就是删除选中的GCP点,如果点击四个红色X就是删除所有的GCP点
- 编辑完之后点击在Cartographic System界面选择坐标系,在export界面选择数据出路径,最后点击finsh
- 我这一步的GCP在导出的时候一直失败,输出文件夹里面没有GCP.xml文件,不知道是版本的原因还是因为SARScape562版本的SBAS Interferometric Process可以自动进行轨道精炼和重去平,所以做不了GCP,但我更觉得是软件的bug ????
所以后面的我也不知是如何操作的,不过先不管这个GCP吧
5.3.2 Avoid Moving Area File ,无位移区域,可选
- 如果已知受位移影响的区域,建议创建包含移动区域的 shapefile (.shp),必须对此 shapefile 进行地理编码(使用与参考 DEM 相同的 carto 系统)。在光谱分集估计阶段,将避免与此形状文件相交的所有扫描SAR或TOPSAR突发(否则,在地震等强烈运动的情况下,这些脉冲将被破坏)。此外,后续的自动细化步骤还将考虑此形状,以避免在细化掩膜中使用移动区域上的像素。
5.3.3 Optional Water Vapour File List,水蒸气数据,可用GACOS数据,可选
- 包含 GACOS 产品水蒸气数据的文件列表(_filename_list.txt; _bil)。初始化并编译列表后,软件将从干涉图中删除水蒸气成分(_clean_fint)。必须为每个输入影像插入 GACOS 栅格(采集日期和时间相同)。联轴器由软件自动制造。有关GACOS数据的下载和使用细节请参考文章:
SARScape使用GACOS数据
5.3.4 Classification Mask File,分类掩膜文件
- 地理编码几何分类地图,用于在 SBAS 处理期间遮盖特定区域。屏蔽区域在整个相干堆栈上的值为零,并且不会被展开考虑,也不会成为最终覆盖图的一部分。“分类掩码 ID 列表”ID 被视为要掩码的区域。
5.4 parameters设置
在 Parameters 面板中,选择 Principal Parameters,设置以下参数:
- Rebuild All:重建所有,如果中断了运算,就重新运算所有的影像,这里选择False
- Range Looks 和 Azimuth Looks:多视视数,分别设置 7 和 2,地面分辨就是接近30m,设置视数太低可以提高地面分辨率,但也会提高运算压力。
- Grid Size for suggested Looks:网格大小(以米为单位)用于调整距离和方位角外观。如果其他参数是手动设置的,栅格大小将不意味着它们的值发生变化。
- Number of Parallel Unwrapping:2 解缠次数,定义将并行执行的解缠次数(每个线程一个干涉图)。此参数不得超过 CPU 线程的总数。在增加并行进程数之前,用户应考虑可用的系统内存,因为内存消耗与并行执行的解包数直接相关。
- Apply Layover and Shadow mask:应用分层和阴影遮罩,遮罩覆盖和阴影区域中的结果。
- Atmosphere External Sensors:大气外部传感器,选择GACOS,有关GACOS数据的使用方法请阅读文章:
- Atmosphere Height Correlation Flag:大气高度相关标志,通过选择此标志,算法使用“高度相关窗口大小[m]”(大气部分)参数定义过滤器的大小,从每个干涉图中估计并移除大气的高度相关分量。这里暂不需要,选择False。
- Coregistration With DEM:True
- Unwrapping Method Type:Minimum Cost Flow 解缠方法,有三种方法供选择
- Unwrapping 3D:False
- Unwrapping Decomposition Level:1,解缠分解等级。
- 分解等级:(Unwrapping Decomposition Level):该分解是为了用迭代的方法对数据做多视和疏采样:干涉图以一个较低的分辨率被解缠然后被重采样成原来的分辨率。使用了分解可减少解缠错误,提高处理效率。用户可以指定迭代的次数,每个迭代相当于3次采样过疏。这里可以填的数有:-1、0、1、2、3。其中,-1和0代表不执行分解,用原始的像素采样,当形变很大或是地形很陡峭的情况下(多相位/高密度分布),分解可引起交迭效应,建议设置为-1或0;1代表最小的分解等级。3:最大的分解等级。建议这个次数不要超过3。通常情况设置原始的像素采样(如-1)或者最小的分解等级(1)。
对大范围分布的低相干性区域,这里设置分解等级为 2,提高解缠的质量及处理效率,减少解缠错误
————————————————
引用声明:该段文字引用自文章:ENVI-IDL技术殿堂,用哨兵1A干涉数据对DInSAR测量*地震引起的地表形变信息
- Unwrapping Coherence Threshold:0.2,解缠相关系数阈值。
- Filtering method:Goldstein 滤波方法
- 运行成功
- 这一步是 SBAS 处理中运行时间最长的一步。这一步做完后,会生成一系列结果,包括各个像对去平和滤波后的干涉图(_fint),相干系数图 (_cc) 、解缠结果 (_upha)和斜距下的强度数(_slant_pwr),干涉处理的文件夹在根目录下面( interferogram_stacking),包含一个索引文件(meta file),能打开所有的干涉处理的结果。生成一个 “interf_tiff”的文件夹,包含所有结果的 TIFF 格式结果,存放在 interferogram_stacking 文件夹下面,便于可视化查看。
- 查看解缠结果(IS_upha_list_meta)和相应的相干性图(IS_cc_list_meta),看有无相干性低和解缠结果不好的像对。
说明:这一步之后,检查数据和调整相应的参数可以参考下面几点说明:
- 查看去平和滤波后的干涉图,可以确定对干涉滤波器的调整,如果很多干涉图都是低相干的区域,可以增加滤波强度,如果高相干区域太多,如有大量干的区域存在,可以减小滤波的强度。Goldstein 是推荐的滤波方法。如果要增强滤波效果,
在设置参数的滤波面板下(Adaptive Filter Default Values),增加 alphas values 值和/或窗口大小 (窗口大小和条纹频率有关:密集的条纹应该用较小的窗口)- 查看解缠后的图,可以确定相干性阈值、解缠方法、分解等级等
- 相干性阈值:如果解缠的结果中有很多噪声的话,可以增加相干性阈值,如果解缠结果比较少,可以减少相干性阈值。
- SBAS 推荐的默认解缠方法是 Delaunay MCF (如果选择 3D 解缠方法的话,这个方法是必执行的), 因为这种方法可以很好的处理两个较孤立的相干性高的区域,这对潮湿或植被区域是常见的,在绝大多数情况下都是可行的解缠方法,如果有特殊情况比如存在很大的残余地形或形变,可以尝试经典的 MCF 方法。
- 分解等级:通常执行原始的像素采样(如-1 或者 0)或者最小的分解等级(1),该分解是为了用迭代的方法对数据做多视和疏采样:干涉图以一个较低的分辨率被解缠然后被重采样成原来的分辨率。
- 使用分解可减少解缠错误(对分布的低相干性的区域),提高处理效率。用户可以指定迭代的次数,每个迭代相当于 3 次采样过疏,建议这个次数不要超过 3。当形变很大或是地形很陡峭的情况下(相位变化快/密度大的干涉条纹),分解可引起交迭效应,在这种情况下,设置值为-1,不执行分解。
- 对大范围分布的低相干性区域,这里设置分解等级为 2,提高解缠的质量及处理效率,减少解缠错误。
- 需要注意的是:分解等级设置较大的话,宏观上的效果比较好(如数据处理速度提高),但是会引起局部区域的不连续,等级设置高可能会引起假信号问题,在第一次解缠的时候用这个等级,在第二次解缠的时候就在简化了的去平和滤波后的干涉图(去除了位移速率和地形残差)上进行,这种情况下,推荐设置解缠等级为 2。
————————————————
引用声明:该段文字引用自文档:[ENVI-SARscape入门教程-第8章短基线SBAS]
如果侵权请联系我删除,谢谢!
5.5 输出文件
- 这一步的处理虽然没有标识输出文件目录,但也可以找到,位于
SBAS_processing
文件夹中
- interferogram_stacking文件夹
包含以下产品的目录:
由于输出产品大量元数据(_meta)。并生成时间序列 (.series).文件,因此能够同时加载所有相关的输出产品:
“interf_tiff”子文件夹,其中包含中间干涉测量 SBAS 结果的 tiff 文件。
生成的元数据和时间序列文件:
IS_cc_meta,IS_cc.series,指的是所有相干图像。
IS_fint_meta,IS_fint.series,指的是所有去平地和滤波的干涉图。
IS_clean_fint_meta,IS_clean_fint.series,指的是所有去平地,过滤和合并平滑噪点(由可选过程输出)的干涉图。
IS_upha_meta,IS_upha.series,指的是所有相位解缠。请注意,此扩展用于在 SBAS 反演第一步中生成的第 2 级未解缠的产品。
IS_pwr_meta,IS_pwr.series,指的是所有斜距影像。
IS_ls_mask:斜距影像中的叠掩和阴影(用作永久掩膜)。
IS_geo_ls_mask:地理投影影像中的叠掩和阴影掩膜。
IS_srlia:斜距影像的局部入射角图。
IS_geo_lia:地理投影影像的局部入射角图。
IS_cls_mask:斜距影像的分类图(用作特定ID上的永久掩膜)。
IS_elevation_mask:斜距影像的高程掩膜(用作用户指定的开始和结束月份之间的间歇性掩膜)。
- work_interferogram_stacking文件夹
用于存储中间处理结果的目录。
- 为了区分每个输出产品的来源输入SAR影像对(以及在连接网络中识别它),将添加一个包含主从采集日期(即yyyymmdd)和主从关系的前缀。
- 依次查看上一步生成的各个像对的相干性图(_cc)和解缠结果图(upha),若有相干性低的,就用连接图编辑工具对该像对移除。
- 可以直接查看…\interferogram_stacking\ interf_tiff 中的 Tiff 格式文件。或者在 ENVI 中打开解缠结果(IS_upha_meta)、相干性图(IS_cc_meta)、滤波后干涉图(IS_fint_meta),在 ENVI 中浏览这些结果。
- 由于每个人的经验不一样,判断需要移除的数据对也会不一样。这里总结一下需要剔
除的像对的常用标准:
1.如果干涉处理时候用了 3D 解缠的方法,建议保留(得到的结果含有 3D_del_upha 结果的说明进行的是 3D 解缠);
2.相干系数图、滤波后的干涉图、相位解缠图,只要其中一个结果较好,建议保留;
3.得到的结果含有明显的大气相位,建议剔除;
工具路径:/SARscape/Interferometric Stacking/Stacking Tools/SBAS Edit Connection Graph
6.1 打开auxiliary.sml文件,会自动加载连接图,自动选择主影像
6.2 连接图编辑的参数说明
在工具页面,我们可以看到很多参数,尤其是SARScape5.6.2版本,有更多的可设置项目
Automatic 自动
点击删除影像对编辑对将相应地使用 “自动剔除强不连续性 (%)”、“自动剔除高标准差 (%)”和“自动剔除低重叠率 (%)”参数自动完成。丢弃和保留stacking元数据/时间序列作为自动编辑工具行为的可视化描述生成。相应的最后处理的解缠元数据/时间序列也会更新。Add Pairs 添加影像对
在“主列表”和“从列表”中选择的对将添加到原始连接网络中。必须从干涉工作流中重新运行该过程。不处理上一次迭代中处理的干涉对;只有新条目才会被处理。Remove Pairs 删除影像对
仅在“从列表”中选择的影像将从原始连接网络中删除。可多选。Add Images 添加影像
输入影像列表将添加到原始连接网络中。必须从干涉工作流中重新运行该过程。不处理上一次迭代中处理的干涉对;只有新条目才会被处理。Remove Images 删除影像
在“主列表”或“从列表”中选择的影像将从原始连接网络中删除。Reject Automatic Strong Discontinuities (%) 自动剔除强不连续性 (%)
通过将剔除阈值设置为高于零并单击“ SBAS 编辑连接图”面板的“自动”按钮,最差的干涉图(整个干涉图stacking的百分比)将从stacking中剔除。解缠干涉图排序的衡量指标是相对于有效像素数的间断相位周期数。Edit Reject Automatic High Std (%) 自动剔除高标准差 (%)
通过将剔除阈值设置为高于零并单击“ SBAS 编辑连接图”面板的“自动”按钮,最差的干涉图(整个干涉图stacking的百分比)将从stacking中剔除。相应的最后处理的解缠元数据/时间序列也会更新。展开干涉图排序的度量是标准差。Edit Reject Automatic Poor Coverage (%)自动剔除低重叠率 (%)
通过将剔除阈值设置为高于零并单击“ SBAS 编辑连接图”面板的“自动”按钮,最差的干涉图(整个干涉图stacking的百分比)将从stacking中丢弃。相应的最后处理的解缠元数据/时间序列也会更新。展开干涉图排序的衡量指标是有效像素覆盖率。Undo 撤销
恢复以前的连接网络。
6.3 连接图编辑操作
再次说明:
由于每个人的经验不一样,判断需要移除的数据对也会不一样。这里总结一下需要剔
除的像对的常用标准:
1.如果干涉处理时候用了 3D 解缠的方法,建议保留(得到的结果含有 3D_del_upha 结果的说明进行的是 3D 解缠);
2.相干系数图_cc,一般亮度值比较高的相干性好;滤波后的干涉图_fint;相位解缠图_upha,最好是没有空洞和相位孤岛;只要其中一个结果较好,建议保留;
3.得到的结果含有明显的大气相位,建议剔除;在
\interferogram_stacking\interf_tiff
文件夹中可以看到干涉工作流处理的结果,打开文件夹,打开查看,选择超大图标,这样就能在文件夹中预览结果了,当然也可以一张张放大了仔细看.- 从数据名中解读影像对,数据名中的m代表master,表示主影像,m_0表示编号为0的主影像,20200110_m_0表示主影像是编号为0的日期为20200110的影像,s表示slave,从影像,20200122_s_1表示日期为20200122编号为1的从影像。
- 删除效果不好的数据对,先点击主影像列,在点击从影像列,最后点击删除对
- 点击之后会弹出计算窗口,很快就会显示编辑完成
- Actual Step显示编辑次数,编辑好了之后即可关闭窗口
由于我用的是SARscape562,这一步已经集成在第五节-干涉工作流Interferometric Process中了
如果读者使用的是SARscape560及以前版本,请参考如下内容:
下面的内容是在【ENVI-SARscape新手教程中的摘抄】
这一步的目的是估算和去除残余的恒定相位和解缠后还存在的相位坡道。
(1) 在 Toolbox 中,打开/SARscape/Interferometric Stacking/SBAS/3 - Refinement and Re-Flattening。
(2) 在 Input Files 面板中,在 Auxiliary file 选项中选择 auxiliary.sml。
(3) 在 Refinement GCP file 选择中,单击
上一篇: 驾驶考试科目一地图阅读问题
下一篇: 交通法规理论知识点科目一速记口诀
推荐阅读
-
正负偏差变量 即 d2+、d2- 分别表示决策值中超出和未达到目标值的部分。而 di+、di- 均大于 0 刚性约束和目标约束(柔性目标约束有偏差) 在多目标规划中,>=/<= 在刚性约束中保持不变。当需要将约束条件转换为柔性约束条件时,需要将 >=/<= 更改为 =(因为已经有 d2+、d2- 用来表示正负偏差),并附加上 (+dii-di+) 注意这里是 +di、-di+!之所以是 +di,-di+,是因为需要将目标还原为最接近的原始刚性约束条件 优先级因素和权重因素 对多个目标进行优先排序和优先排序 目标规划的目标函数 是所有偏差变量的加权和。值得注意的是,这个加权和都取最小值。而 di+ 和 dii- 并不一定要出现在每个不同的需求层次中。具体分析需要具体问题具体分析 下面是一个例子: 题目中说设备 B 既要求充分利用,又要求尽可能不加班,那么列出的时间计量表达式即为:min z = P3 (d3- + d3 +) 使用 + 而不是 -d3 + 的原因是:正负偏差不可能同时存在,必须有 di+di=0 (因为判定值不可能同时大于目标值和小于目标值),而前面是 min,所以只要取 + 并让 di+ 和 dii- 都为正值即可。因此,得出以下规则: 最后,给出示例和相应的解法: 问题:某企业生产 A 和 B 两种产品,需要使用 A、B、C 三种设备。下表显示了与工时和设备使用限制有关的产品利润率。问该企业应如何组织生产以实现下列目标? (1) 力争利润目标不低于 1 500 美元; (2) 考虑到市场需求,A、B 两种产品的生产比例应尽量保持在 1:2; (3)设备 A 是贵重设备,严禁超时使用; (4)设备 C 可以适当加班,但要控制;设备 B 要求充分利用,但尽量不加班。 从重要性来看,设备 B 的重要性是设备 C 的三倍。 建立相应的目标规划模型并求解。 解:设企业生产 A、B 两种产品的件数分别为 x1、x2,并建立相应的目标计划模型: 以下为顺序求解法,利用 LINGO 求解: 1 级目标: 模型。 设置。 variable/1..2/:x;! s_con_num/1...4/:g,dplus,dminus;!所需软约束数量(g=dplus=dminus 数量)及相关参数; s_con(s_con_num);! s_con(s_con_num,variable):c;!软约束系数; 结束集 数据。 g=1500 0 16 15. c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(1);!第一个目标函数;!对应于 min=z 的第一小部分;! 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); !使用设置完成的数据构建软约束表达式; ! !软约束表达式 @for(variable:@gin(x)); !将变量约束为整数; ! 结束 此时,第一级目标的最优值为 0,第一级偏差为 0: 第二级目标: !求 dminus(1)=0,然后求解第二级目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(2)+dplus(2);!第二个目标函数 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标结果 @for(variable:@gin(x)); ! 结束 此时,第二个目标的最优值为 0,偏差为 0: 第三目标 !求 dminus(2)=0,然后求解第三个目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=3*dminus(3)+3*dplus(3)+dminus(4);!第三个目标函数。 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标约束条件; ! dminus(2)+dplus(2)=0; !第二个目标约束条件 @for(variable:@gin(x));! 结束 最终结果为 x1=2,x2=4,dplus(1)=100,最优利润为
-
什么是数据库事物?为什么需要数据库事物,事物有哪些特征?事物的隔离级别是什么?-1.什么是数据库事务? 1.事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须具备四个属性,即ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为事务: 原子性 2.事务必须是一个原子工作单元;它的数据修改要么全部执行,要么全部不执行。 一致性 3.事务完成时,所有数据必须保持一致。在相关数据库中,所有规则都必须适用于事务的修改,以保持所有数据的完整性。事务结束时,所有内部数据结构(如 B 树索引或双向链接表)必须正确无误。 隔离 4.并发事务的修改必须与其他并发事务的修改隔离。一个事务会在另一个并发事务修改之前或之后查看某一状态下的数据,而不会查看中间状态下的数据。这就是所谓的可序列化,因为它允许重新加载起始数据和重放一系列事务,从而使数据最终处于与原始事务执行时相同的状态。 持久性 5.事务完成后,它对系统的影响是永久性的。即使在系统发生故障的情况下,修改也会保留。 2. 为什么需要数据库事物,事物有哪些特征? 事物对数据库的作用是对数据进行一系列操作,要么全部成功,要么全部失败,防止出现中间状态,确保数据库中的数据始终处于正确、和谐的状态。 特征:原子性、一致性、隔离性、持久性,以及其他特征 原子性(Atomicity):所有操作在事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出现错误时,会回滚到事务开始前的状态,所有操作就像没有发生一样。也就是说,事务是一个不可分割的整体,就像化学中的原子一样,是物质的基本单位。 一致性(Consistency):在事务开始之前和结束之后,数据库的完整性约束都没有被破坏。例如,如果 A 转钱给 B,A 不可能扣除这笔钱,但 B 却没有收到这笔钱。 隔离:在同一时间内,只允许一个事务请求相同的数据,不同事务之间没有干扰。例如,甲正在从一张银行卡上取款,在甲取款过程结束之前,乙不能向这张卡转账。 持久性(耐用性):事务完成后,事务对数据库的所有更新都将保存到数据库中,无法回滚 3.事务的隔离级别有哪些? 数据库事务有四种隔离级别,从低到高分别是未提交读取(Read uncommitted)、已提交读取(Read committed)、可重复读取(Repeatable read)、可序列化(Serializable)。此外,事务的并发操作中可能会出现脏读、不可重复读、幽灵读等情况。事务并发问题 脏读:事务 A 读取事务 B 更新的数据,然后事务 B 回滚操作,那么事务 A 读取的数据就是脏数据。 不可重复读取:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取期间更新并提交数据,导致事务 A 多次读取同一数据时结果不一致。 幻影读取:系统管理员 A 将数据库中所有学生的具体分数改为 ABCDE 等级,但系统管理员 B 在此时插入了具体分数的记录,当系统管理员 A 更改结束后发现仍有一条记录未被更改,仿佛发生了幻觉,这称为幻影读取。 小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于增删。解决不可重复读问题只需锁定满足条件的行,解决幻读问题则需要锁定表 MySQL 事务隔离级别
-
epoll简介及触发模式(accept、read、send)-epoll的简单介绍 epoll在LT和ET模式下的读写方式 一、epoll的接口非常简单,一共就三个函数:1. int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close关闭,否则可能导致fd被耗尽。2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);epoll的事件注册函数,它不同与select是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create的返回值,第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */};events可以是以下几个宏的集合:EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭); EPOLLIN事件:EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。 EPOLLOUT:表示对应的文件描述符可以写; EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那要先准备好下面条件:1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!其实,如果真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。1. 缓冲区由满变空.2.同时注册EPOLLIN | EPOLLOUT事件,也会触发一次EPOLLOUT事件这个两个也会触发EPOLLOUT事件 EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);EPOLLERR:表示对应的文件描述符发生错误;EPOLLHUP:表示对应的文件描述符被挂断;EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);等待事件的产生,类似于select调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。-------------------------------------------------------------------------------------------- 从man手册中,得到ET和LT的具体描述如下EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)假如有这样一个例子:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作4. 然后我们读取了1KB的数据5. 调用epoll_wait(2)......Edge Triggered 工作模式:如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。最好以下面的方式调用ET模式的epoll接口,在后面会介绍避免可能的缺陷。 i 基于非阻塞文件句柄 ii 只有当read(2)或者write(2)返回EAGAIN时才需要挂起,等待。但这并不是说每次read时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。Level Triggered 工作模式相反的,以LT方式调用epoll接口的时候,它就相当于一个速度比较快的poll(2),并且无论后面的数据是否被使用,因此他们具有同样的职能。因为即使使用ET模式的epoll,在收到多个chunk的数据的时候仍然会产生多个事件。调用者可以设定EPOLLONESHOT标志,在 epoll_wait(2)收到事件后epoll会与事件关联的文件句柄从epoll描述符中禁止掉。因此当EPOLLONESHOT设定后,使用带有 EPOLL_CTL_MOD标志的epoll_ctl(2)处理文件句柄就成为调用者必须作的事情。然后详细解释ET, LT:LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认(这句话不理解)。在许多测试中我们会看到如果没有大量的idle -connection或者dead-connection,epoll的效率并不会比select/poll高很多,但是当我们遇到大量的idle- connection(例如WAN环境中存在大量的慢速连接),就会发现epoll的效率大大高于select/poll。(未测试)另外,当使用epoll的ET模型来工作时,当产生了一个EPOLLIN事件后,读数据的时候需要考虑的是当recv返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取: 这里只是说明思路(参考《UNIX网络编程》) while(rs) {buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);if(buflen < 0){// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读// 在这里就当作是该次事件已处理处.if(errno == EAGAIN)break; else return; }else if(buflen == 0) { // 这里表示对端的socket已正常关闭. } if(buflen == sizeof(buf) rs = 1; // 需要再次读取 else rs = 0; } 还有,假如发送端流量大于接收端的流量(意思是epoll所在的程序读比转发的socket要快),由于是非阻塞的socket,那么send函数虽然返回,但实际缓冲区的数据并未真正发给接收端,这样不断的读和发,当缓冲区满后会产生EAGAIN错误(参考man send),同时,不理会这次请求发送的数据.所以,需要封装socket_send的函数用来处理这种情况,该函数会尽量将数据写完再返回,返回-1表示出错。在socket_send内部,当写缓冲已满(send返回-1,且errno为EAGAIN),那么会等待后再重试.这种方式并不很完美,在理论上可能会长时间的阻塞在socket_send内部,但暂没有更好的办法. ssize_t socket_send(int sockfd, const char* buffer, size_t buflen) { ssize_t tmp; size_t total = buflen; const char *p = buffer; while(1) { tmp = send(sockfd, p, total, 0); if(tmp < 0) { // 当send收到信号时,可以继续写,但这里返回-1. if(errno == EINTR) return -1; // 当socket是非阻塞时,如返回此错误,表示写缓冲队列已满, // 在这里做延时后再重试. if(errno == EAGAIN) { usleep(1000); continue; } return -1; } if((size_t)tmp == total) return buflen; total -= tmp; p += tmp; } return tmp; } 二、epoll在LT和ET模式下的读写方式 在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是: * EAGAIN: 再试一次 * EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block * perror输出: Resource temporarily unavailable 总结: 这个错误表示资源暂时不够, 可能read时, 读缓冲区没有数据, 或者, write时,写缓冲区满了 。 遇到这种情况, 如果是阻塞socket, read/write就要阻塞掉。 而如果是非阻塞socket, read/write立即返回-1, 同 时errno设置为EAGAIN. 所以, 对于阻塞socket, read/write返回-1代表网络出错了. 但对于非阻塞socket, read/write返回-1不一定网络真的出错了. 可能是Resource temporarily unavailable. 这时你应该再试, 直到Resource available. 综上, 对于non-blocking的socket, 正确的读写操作为: 读: 忽略掉errno = EAGAIN的错误, 下次继续读 写: 忽略掉errno = EAGAIN的错误, 下次继续写 对于select和epoll的LT模式, 这种读写方式是没有问题的. 但对于epoll的ET模式, 这种方式还有漏洞. epoll的两种模式 LT 和 ET
-
纯干货分享 | 研发效能提升——敏捷需求篇-而敏捷需求是提升效能的方式中不可或缺的模块之一。 云智慧的敏捷教练——Iris Xu近期在公司做了一场分享,主题为「敏捷需求挖掘和组织方法,交付更高业务价值的产品」。Iris具有丰富的团队敏捷转型实施经验,完成了企业多个团队从传统模式到敏捷转型的落地和实施,积淀了很多的经验。 这次分享主要包含以下2个部分: 第一部分是用户影响地图 第二部分是事件驱动的业务分析Event driven business analysis(以下简称EDBA) 用户影响地图,是一种从业务目标到产品需求映射的需求挖掘和组织的方法。 在软件开发过程中可能会遇到一些问题,比如大家使用不同的业务语言、技术语言,造成角色间的沟通阻碍,还会导致一些问题,比如需求误解、需求传递错误等;这会直接导致产品的功能需求和要实现的业务目标不是映射关系。 但在交付期间,研发人员必须要将这些需求实现交付,他们实则并不清楚这些功能需求产生的原因是什么、要解决客户的哪些痛点。研发人员往往只是拿到了解决方案,需要把它实现,但没有和业务侧一起去思考解决方案是否正确,能否真正的帮助客户解决问题。而用户影响地图通常是能够连接业务目标和产品功能的一种手段。 我们在每次迭代里加入的假设,也就是功能需求。首先把它先实现,再逐步去验证我们每一个小目标是否已经实现,再看下一个目标要是什么。那影响地图就是在这个过程中帮我们不断地去梳理目标和功能之间的关系。 我们在软件开发中可能存在的一些问题 针对这些问题,我们如何避免?先简单介绍做敏捷转型的常规思路: 先做团队级的敏捷,首先把产品、开发、测试人员,还有一些更后端的人员比如交互运维的同学放在一起,组成一个特训团队做交付。这个团队要包含交付过程中所涉及的所有角色。 接着业务敏捷要打通整个业务环节和研发侧的一个交付。上图中可以看到在敏捷中需求是分层管理的,第一层是业务需求,在这个层级是以用户目标和业务目标作为输入进行规划,同时需要去考虑客户的诉求。业务人员通过获取到的业务需求,进一步的和团队一起将其分解为产品需求。所以业务需求其实是我们真正去发布和运营的单元,它可以被独立发布到我们的生产环境上。我们的产品需求其实就是产品的具体功能,它是我们集成和测试的对象,也就是我们最终去部署到系统上的一个基本单元。产品需求再到了我们的开发团队,映射到迭代计划会上要把它分解为相应的技术任务,包括我们平时所说的比如一些前端的开发、后端的开发、测试都是相应的技术任务。所以业务敏捷要达到的目标是需要去持续顺畅高质量的交付业务价值。 将这几个点串起来,形成金字塔结构。最上层我们会把业务目标放在整个金字塔的塔尖。这个业务目标是通过用户的目标以及北极星指标确立的。确认业务目标后再去梳理相应的业务流程,最后生产。另外产品需求包含了操作流程和业务规则,具需求交付时间、工程时间以及我们的一些质量标准的要求。 谈到用户影响的地图,在敏捷江湖上其实有一个传说,大家都有一个说法叫做敏捷需求的“任督二脉”。用户影响地图其实就是任脉,在黑客马拉松上用过的用户故事地图其实叫督脉。所以说用户影响地图是在用户故事地图之前,先帮我们去梳理出我们要做哪些东西。当我们真正识别出我们要实现的业务活动之后,用户故事地图才去梳理我们整个的业务工作流,以及每个工作流节点下所要包含的具体功能和用户故事。所以说用户影响地图需要解决的问题,我们包括以下这些: 首先是范围蔓延,我们在整张地图上,功能和对应的业务目标是要去有一个映射的。这就避免了一些在我们比如有很多干系人参与的会议上,那大家都有不同想法些立场,会提出很多需求(正确以及错误的需求)。这个时候我们会依据目标去看这些需求是否真的是会影响我们的目标。 这里提到的错误需求,比如是利益相关的人提出的、客户认为产品应该有的、某个产品经理需求分析师认为可以有的....但是这些功能在用户影响地图中匹配不到对应目标的话,就需要降低优先级或弃掉。另外,通常我们去制定解决方案的时候,会考虑较完美的实现,导致解决方案括很多的功能。这个时候关键目标至关重要,会帮助我们梳理筛选、确定优先级。 看一下用户影响到地图概貌 总共分为一个三层的结构: 第一层why,你的业务目标哪个是最重要的,为什么?涉及到的角色有哪些? 第二层how ,怎样产生影响?影响用户角色什么样的行为? (不需要去列出所有的影响,基于业务目标) 第三层what,最关键的是在梳理需求时不需一次把所有细节想全,这通常团队中经常遇到的问题。 我们用这个例子来看一下 这是一个客服中心的影响地图,业务目标是 3个月内不增加客服人数的前提下能支持1.5倍的用户数。此业务目标设定是符合 smart 原则的,specific非常的具体,miserable 是可以衡量的,action reoriented是面向活动的, real list 也是很实际的。 量化的目标会指引我们接下来的行动,梳理一个业务目标,尽量去量化,比如 :我们通过打造一条什么样的流水线,能够提高整个部署的效率,时间是原来的 1/2 。这样才是一个能量化的有意义的目标。 回到这幅图, how 层级识别出来的内容,客服角色:想要对它施加的影响,把客户引导到论坛上,帮助客户更容易的跟踪问题,更快速的去定位问题。初级用户:方论坛上找到问题。高级用户:在论坛上回答问题。通过我们这些用户角色,进行活动,完成在不增加客户客服人数的前提下支持更多的用户数量。 最后一个层级,才是我们日常接触比较多的真正的功能的特性和需求,比如引导到客户到论坛上,其实这个产品就需要有一个常见问题的论坛的链接。这个层次需要我们团队进一步地在交付,在每个迭代之前做进一步的梳理,细化成相应的用户故事。 这个是云智慧团队中,自己做的影响地图的范例,可以看下整个的层级结构。序号表示优先级。 那我们用户影响地图可以总结为:
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
利用 SARScape 中的哨兵-1 数据完成 SBAS-InSAR 程序 (2/2)
-
利用 SARScape 中的哨兵-1 数据完成 SBAS-InSAR 流程 (1/2)
-
旷视天元开源图像比对工具 MegSpot,助力图像算法研发 - 1.多样化图像比对:可提供叠加比对、拖拽比对等多种比对方式,支持缩放、移动等同步操作,并可生成 GIF 保存比对结果。2. 2.专业呈现:支持像素级图像查看、图像直方图、RGB 查看;支持预览亮度、对比度、饱和度、灰度等指标。3. 视频对比:Cognizant Megapixel 可提供多种图像对比方法,如拖放对比等。 3.视频对比:除了支持视屏的所有图像对比功能外,CCTV MegSpot 还支持同步回放、回放暂停和快进、回放速度设置等功能。 4.跨平台支持:CCTV MegSpot 提供对 Mac、Linux 和 Windows 系统的跨平台支持,借助 Electron 框架,可以低成本完成跨平台应用的开发,并保证各平台体验的一致性。 此外,央视网MegSpot支持跨平台自动更新和数据持久化,确保用户体验的连续性,并支持中、英、日三种语言:MegSpot为大尺寸图像文件的对比提供了本地解决方案。 MegSpot 是一种用于比较大型图像文件的本地解决方案。
-
统计学习 04:假设检验(以 t 检验为例)和 P 值 - 要点 I. 假设检验的一般思路 假设检验 清楚你的问题是什么?期望得出什么结论? 例如,两种药物的疗效是否存在差异,自变量与因变量之间是否存在回归关系 .... 请始终牢记,假设检验回答的是是否存在某种关系的问题:它并不衡量这种关系有多大。 提出两种假设:零假设 (H0) 和备择假设 (H1) 零假设与备择假设相反,一般来说,研究的目的是证明原假设是错误的,即得出备择假设的结论。 例如,如果实验预期希望两种药物的疗效存在差异,那么 H0:μ1 - μ2 = 0;H1:μ1 - μ2 ≠ 0 H0:μ1-μ2 = 0 的一般形式称为双侧检验,而 >、<等零假设称为单侧检验。一般来说双侧检验更为常见,下面也主要介绍这种方法。 单尾或双尾测试 根据原始数据计算零假设概率分布的统计量(t 值、Z 值、F 值等)。 根据问题的性质选择合适的概率检验方法,从而计算出相应的统计量值;因此,不同情况的统计量值有不同的计算方法。 根据计算出的统计量值,利用统计软件,可以知道相应的 p 值是多少 也可以先确定一个合适的显著性水平(0.0.001....),并计算其临界值,再与我们计算出的统计量值进行比较,从而做出判断。 根据第四步的比较结果,如果 p 值小于预期的显著性水平(α,通常设定为 0.05),则认为该统计量远离原假设分布,属于小概率事件,则拒绝原假设,从而接受备择假设。 决定 要点 2:以 t 检验为例,演示上述假设检验思路。 t 检验基于 t 分布,常见的 t 检验有三种,如下图所示,但我认为第三种配对设计可能更常用(零假设:差异是否为零),下面介绍的例子就是一种配对设计 三次 t 检验 举例测量两组大鼠肝脏中维生素 A 的含量,比较两组大鼠维生素 A 含量是否有差异。数据如下 数据 (1) 预计两组大鼠的维生素 A 水平存在差异 (2) H0:μd=0,H1:μd≠0,α=0.05,双侧检验 (3) t 统计量的计算 配方 计算 上述程序计算的是*度为 7 的 t 分布情况下的 t 值。只需理解公式即可,不同的方法有不同的公式,这些交给统计软件即可。
-
windows下进程间通信的(13种方法)-摘 要 本文讨论了进程间通信与应用程序间通信的含义及相应的实现技术,并对这些技术的原理、特性等进行了深入的分析和比较。 ---- 关键词 信号 管道 消息队列 共享存储段 信号灯 远程过程调用 Socket套接字 MQSeries 1 引言 ---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口,用户可以方便地在程序中实现这种通信;应用程序间通信的主要目的是实现不同计算机系统中的相互协作的应用程序之间的数据共享与信息交换,由于应用程序分别运行在不同计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换。进程间通信和应用程序间通信及相应的实现技术有许多相同之处,也各有自己的特色。即使是同一类型的通信也有多种的实现方法,以适应不同情况的需要。 ---- 为了充分认识和掌握这两种通信及相应的实现技术,本文将就以下几个方面对这两种通信进行深入的讨论:问题的由来、解决问题的策略和方法、每种方法的工作原理和实现、每种实现方法的特点和适用的范围等。 2 进程间的通信及其实现技术 ---- 用户提交给计算机的任务最终都是通过一个个的进程来完成的。在一组并发进程中的任何两个进程之间,如果都不存在公共变量,则称该组进程为不相交的。在不相交的进程组中,每个进程都独立于其它进程,它的运行环境与顺序程序一样,而且它的运行环境也不为别的进程所改变。运行的结果是确定的,不会发生与时间相关的错误。 ---- 但是,在实际中,并发进程的各个进程之间并不是完全互相独立的,它们之间往往存在着相互制约的关系。进程之间的相互制约关系表现为两种方式: ---- (1) 间接相互制约:共享CPU ---- (2) 直接相互制约:竞争和协作 ---- 竞争——进程对共享资源的竞争。为保证进程互斥地访问共享资源,各进程必须互斥地进入各自的临界段。 ---- 协作——进程之间交换数据。为完成一个共同任务而同时运行的一组进程称为同组进程,它们之间必须交换数据,以达到协作完成任务的目的,交换数据可以通知对方可以做某事或者委托对方做某事。 ---- 共享CPU问题由操作系统的进程调度来实现,进程间的竞争和协作由进程间的通信来完成。进程间的通信一般由操作系统提供编程接口,由程序员在程序中实现。UNIX在这个方面可以说最具特色,它提供了一整套进程间的数据共享与信息交换的处理方法——进程通信机制(IPC)。因此,我们就以UNIX为例来分析进程间通信的各种实现技术。 ---- 在UNIX中,文件(File)、信号(Signal)、无名管道(Unnamed Pipes)、有名管道(FIFOs)是传统IPC功能;新的IPC功能包括消息队列(Message queues)、共享存储段(Shared memory segment)和信号灯(Semapores)。 ---- (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。 ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ---- 其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。 ---- (2) 无名管道和有名管道 ---- 无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。 ---- 无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。 ---- 系统提供了许多标准管道库函数,如: pipe——打开一个可以读写的管道; close——关闭相应的管道; read——从管道中读取字符; write——向管道中写入字符; ---- 有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。 ---- (3) 消息队列(MQ) ---- 消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。 ---- 消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型——这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。 ---- 系统提供了许多有关创建、使用和管理消息队列的系统调用,如: ---- int msgget(key,flag)——创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符); ---- int msgsnd(msqid,msgp,msgsz,msgtyp,flag)——向队列中发送信息; ---- int msgrcv(msqid,cmd,buf)——从队列中接收信息; ---- int msgctl(msqid,cmd,buf)——对MQ的控制操作; ---- (4) 共享存储段(SM) ---- 共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有: ---- int shmget(key,size,flag)——创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid; ---- char shmat(shmid,address,flag)——将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段; ---- int shmdr(address)——从进程地址空间删除SM段; ---- int shmctl (shmid,cmd,buf)——对SM的控制操作; ---- SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。 ---- (5) 信号灯 ---- 在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。 ---- 信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。 ---- 进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。 3 应用程序间的通信及其实现技术 ---- 同进程之间的相互制约一样,不同的应用程序之间也存在竞争和协作的关系。UNIX操作系统也提供一些可用于应用程序之间实现数据共享与信息交换的编程接口,程序员可以通过自己编程来实现。如远程过程调用和基于TCP/IP协议的套接字(Socket)编程。但是,相对普通程序员来说,它们涉及的技术比较深,编程也比较复杂,实现起来困难较大。 ---- 于是,一种新的技术应运而生——通过将有关通信的细节完全掩盖在某个独立软件内部,即底层的通讯工作和相应的维护管理工作由该软件内部来实现,用户只需要将通信任务提交给该软件去完成,而不必理会它的具体工作过程——这就是所谓的中间件技术。 ---- 我们在这里分别讨论这三种常用的应用程序间通信的实现技术——远程过程调用、会话编程技术和MQSeries消息队列技术。其中远程过程调用和会话编程属于比较低级的方式,程序员参与的程度较深,而MQSeries消息队列则属于比较高级的方式,即中间件方式,程序员参与的程度较浅。 ---- 4.1 远程过程调用(RPC)