我知道编辑这个网站吗?

2013-05-03 - 麦迪逊 ImgLib2 黑客马拉松

从2013年4月27日星期六到2013年5月3日星期五,LOCI在麦迪逊举办了一场黑客马拉松,他们的ImgLib2主要开发为Tobias Pietzsch和Stephan Preibisch。以下是总体和讨论的成就主题人员的简要总结:

以下是我们所做工作的粗略总结:

斯蒂芬·普雷比什

  • 我们和 Johannes 一起从 imglib git 存储库中删除了 imglib1,它现在位于 legacy-imglib1 中。由于与 3d 查看器的循环依赖,它无法直接进入 SPIM_Registration。
  • 我实现了 imglib1 <-> imglib2 的高效包装器,允许在两个库之间、非复制地包装阵列和单元格图像。为了实现这一点,imglib1 现在依赖于 imglib2。允许逐步修改源代码,最终导致删除这个 imglib1。另外,基于 imglib1 的项目中的新实现现在可以在 imglib2 中实现。
  • 我们一直致力于开发一种新的类型层次结构,该层次结构反映了基于整数/浮点类型的相对读写功能。存储库lives on GitHub。另外,它还是不行,因为使用Java泛型来表达它似乎非常困难。我希望这不是真的……

柯蒂斯·鲁登

我开发了一个新的组件来管理有关 N 维图像的额外元数据。特别是,它提供了一种层次结构,用于附加每维元数据作为 Axis 接口的扩展。AnnotatedSpace 接口提供了一个 EuclideanSpace 扩展来管理 Axis 列表。

在一个名为img-metadata的分支上工作,在d3f8e64中完成。该支架支架放置了几个月,并于2013年8月12日被merged to master升降。

约翰·内斯·辛德林

我做了几件事(除了内置的斐济侧轨,在这种情况下主要是 SezPoz 类加载器问题阻止了上传器的上传部分工作):

  • Tobias 向我展示了他的 SPIM 查看器,该查看器预计很快就会在斐济上市。
  • Tobias 和我快速查看了我们是否可以轻松支持将 IJ1 VirtualStacks 封装在 Imgs 中,并决定:不,没有简单的方法。至少不是接入 ImageJFunctions 的小路径。
  • 我们就操作、表达式和性能进行了很多讨论。我目前的想法是,我们需要将 Ops 与 Expressions 分开:为了使开发、理解和维护 Ops 问题变得容易,我们必须更好地分离关注点。 And it is simply easier for everybody if the Ops do one thing, and one thing only, but that one well: evaluate an operation, working on Type variables. Expressions, however, need to know about temporary variables, input and output variables and about being clever not to copy data around too much. But that’s the Expressions’ job, not the Ops’.
  • 性能是另一个问题。经过几次,我开始我们这样依赖JIT是完全错误的:对于简单的事情来说这是可以的,但是实验对于复杂的事情,需要一个知道我们真正想要做什么的预编译器事实。例如,只要凭这个就应该告诉我们,独立的FloatType实例*必须*将其*单个*浮点值引用为1元素浮点数据库*只是这样*当我们访问单个值以及数据库中的像素值时,JIT不会做得非常糟糕。
  • 根据有关性能的研究结果,我提出了一个简单的概念验证,即通过使用 Javassist(一个用于字节码操作的库)可以使事情变得更快。我们已经在 ImageJ2 和 Fiji 中广泛使用这个库来立即修复 ImageJ 1.x 等。使用 Javassist 来尝试优化 ImgLib 也是一个自然的选择。请简单注意,我制作的示例:非常直接构造了一个在 FloatType 的ArrayImgs上工作的类,甚至没有检查任何代码来知道速度要做什么,而是对“+”操作进行硬编码。但它向我们展示了未来如何做事的方法:检查表达式应该做什么,并用优化的字节码重写它。我想如此,的提高令人印象深刻。
  • 很多人都讨论围绕这个问题:“优化应该在哪里进行?”。问题是(通常)你不能完全依赖良好的设计来获得良好的性能。你必须有一个地方,设计好的可以潜在的性能所覆盖。所以必须转型一些东西。但什么?就我而言,出路是利用 scijava-common基础添加和OpService。当然,这将是大量的工作,但与其他人一起进行讨论和实验是非常宝贵的。当你实践将Smashing工具集中在一个房间时,好事就会发生!

巴里·德佐尼亚

我参与的讨论包括:

  • 关于新 roi 接口的提议,其中 rois 是 Positionable、Localizing 和 IterableInterval。希望 rois 可以在空间中移动,绑定到现有区间,然后直接迭代区间数据。
  • 一组提议的新直方图类,可以统一各种现有的实现
  • OPS 中数据操作的新方法(通过新的表达式设计和新的 OpsService,包括 Javassist 加速操作)
  • 改进了Imglib2中对轴和布局的支持
  • 数据类型层次结构实验

新的投资回报率讨论导致尝试新的界面设计是否有任何陷阱限制。因此,我花了很多来练习新接口,为一些最通用的PointSet实现实现它。测试接口的布局解决为here as NewPointSet。我现在已经创建了该接口的四个实现,可以在here中找到。另外,我还没有遇到不稳定的问题。新的实现有时比旧的实现慢,不过可以通过其他的来。

我还介绍了我在 Imglib2 中的一组直方图类上所做的工作,这些类可用于统一当前那里找到的各种直方图实现。我们提出了建议,进行了一些更改,代码已merged to master

数据类型层次结构实验,我尝试确定在 ImageJ2 的 Imglib2 中支持 BigInteger 和 BigDecimal 数据类型的后果。作为这项工作的一部分,我模拟了 Haskell 数字类型层次结构的一个版本,以便可以为数据类型的任何未来开发提供信息。它可以在实验类型路径herehere中找到。

现在黑客马拉松已经完成,还有其他相关任务需要完成。它们包括:

  • 将 Mark Hiner 的黑客马拉松工作(支持非常大的图像数据)纳入 IJ2。
  • 帮助 Curtis Rueden 将 imglib2 元数据代码合并到 IJ2 中
  • 将 Existing PointSet 类的其余部分实现为 NewPointSet。
  • 提高NewPointSet接口实现的性能
  • 在整个 Imglib2 中利用新的直方图类
  • 更新 IJ2(也许还有 OPS 的函数)以在 OPS 中使用新的表达式方法(如果它经得起审查)

    马克·海纳

在黑客马拉松和过去的一周里,我一直致力于 SCIFIO 的支持下扩展 Tobias 的 CellImg 结构。这里的目标是 ImageJ2 使用 SCIFIO 进行图像 IO 操作,并根据需要使用 Cell 促进巨大数据集的存储。因为这将取代指定虚拟堆栈的需要,SCIFIO 单元将自动确定最佳图块大小并在请求时加载图块。

这需要对所有三个项目进行工作:

  • ImgLib2
    • made the Cell classes more extensible (adding a Cell interface, refactoring some typing to be more general instead of on concrete implementations)
  • 科幻小说
    • Converted ImgSaver and ImgOpener to use the SCIFIO API.
    • Extended the imglib2 cell components with SCIFIO cell classes. Currently, these components create 2D cells using the optimal tile height/width, as determined by the current SCIFIO reader. The cells are cached per-dataset using soft references to determine when cells are disposed.
  • 图像J2
    • Updated DefaultIOService and SaveImg to use the updated SCIFIO ImgOpener and ImgSaver. This also means that IJ2 can read/write all the formats currently supported in SCIFIO.

      未来计划

  • ImgSaver 使用 SCIFIO API,但仍设置为处理平面图像。需要更新才能使用 SCIFIO 单元图像。
  • SCIFIO 单元存储器当前是串行的,因为当单元被写入时,它们不会写入磁盘,它们只是被 GC 处理。因此,存储器将被更新以允许将已处理的单元写入磁盘。
  • ImgOpener 目前仅打开 SCIFIO 单元图像。如果数据集大小在适当的范围内,我们将重新添加打开平面图像的功能。
  • 另外,目前 IJ2 中的许多操作(包括仅打开数据集……但也运行僵尸/恢复等插件)数据集范围的操作(特别是计算缩小/升级和自动缩放)。这意味着虽然 SCIFIO 单元可用于打开巨大的数据集,因为它并不实用,自动缩放需要很长时间。因此,我们需要如何限制这些范围(例如,到但当前操作平面,或限制到一组已知的流程图)。

限制

这些更改并不能立即允许在 IJ2 中打开大型单机飞机(仅允许打开大量飞机),因为每个整架飞机都会加载到 IJ2 中。不过,我认为单元将在未来 IJ2 测试版支持大型单机奠定基础。

托比亚斯·皮茨奇

参见thread on imagej-devel