如何对图像处理代码进行单元测试?


14

我正在图像处理(主要是OCR)方面工作,我想知道如何在开发中集成单元测试。

我已经在使用单元测试来处理更多“常见”类型的代码,但是在处理图像处理代码时,我不确定该如何处理。这种代码总是需要一些图像数据输入/输出,而对其进行模拟并不明显。目前,我主要进行集成测试,但是它们需要一段时间才能运行,我想了解一些有关如何将这种代码分解为单元测试的想法,以便我可以更快地运行它们。

编辑:分析角色可以经历许多步骤,包括多次旋转,缩放和形态操作。随着算法的发展,这些步骤经常改变。因此,在测试期间,输入和预期输出会发生很大变化。每个字符可以为100x100像素,因此毫无疑问地在代码中对它们进行编码或处理生成的数据。


您能否在无法创建单元测试的情况下草拟一个函数示例?
布朗

1
对于真正的答案来说太短了,而不是真正的单元测试:我们正在手工处理数据(例如:处理大量样本-对于此类分类任务,我通常超过1000,但是这取决于您的总体样本量),并自动将最终结果与手工处理的数据进行比较。我已经成立了一个小的框架要做到这一点,它会在几个星期内去开源,但是这是描述-你可以克隆过程:birgitplays.wordpress.com/2012/09/15/...
吉特P.

对于您的示例,您可以轻松地将旋转,缩放等作为小型测试单位进行测试。将给定图像旋转45度应该不会有太大变化。这也适用于缩放和形态运算。但是,要在实现过程中测试预期输出会发生变化的东西很困难。您可以尝试进行质量度量,并说质量> = some_quality。确保您的质量不会下降,但这可能也很难。除此之外,您所能做的就是进行测试,证明您的基础部件没有损坏。像缩放/旋转/等。
martiert 2012年

@martiert:我不是在测试旋转,缩放等功能,因为我从第3个库中调用它们,我认为它已经过了很好的测试。OCR算法由许多此类操作组成。但是正如您所说,很难测试输出会发生变化的东西。也许这是一个很好的警告,我们别无选择,只能依靠集成测试...
rold2007

@Birgit P .:有趣的解决方案。如您所说,它仍然是集成测试。拥有像您这样的框架将有助于更快地设置这些测试,但它们将无法更快地运行...
rold2007

Answers:


12

我使用视频记录/分析/流媒体软件,我们遇到了非常相似的问题。下面是我们的解决方案,不确定该解决方案将如何长期运行,但目前看来仍然有效。

将输入/输出图像另存为单元测试项目中的资源。然后进行单元测试,以验证在给出特定输入时是否产生了特定输出。

当您重构代码并添加其他功能的9/10次时,您会期望图像处理例程的行为不会改变,因此,如果突然所有的单元测试开始失败,则很可能是由于错误。

另一方面,如果您更改实际算法,那也将导致单元测试失败。在这种情况下,您将必须手动/视觉验证结果是否正确,如果结果看起来不错,则更新图像资源以使单元测试再次通过。

在我们的项目中,我们最终开发了“伪造的”(如果可以的话,可以模拟)视频源,该源可以为我们提供输入和输出的数据。但是数据本身不是伪造的,实际上是在运行手动测试并验证一切正常后,使用正在运行的系统中的辅助数据记录类捕获的。


同意,在测试使用文件的例程时,可以依赖测试中的某些具体文件(在集成测试中更常见)。
Kemoda 2012年

1
如果在整个处理链中运行一些输入,然后检查输出,则不是单元测试,而是集成测试。
tdammers 2012年

@tdammers:我从未说过要贯穿整个链条。通过一个“单位”而不是整个链条运行一些输入。并且确保该输出不是图像以外的其他东西,那么您只需要将输入另存为图像资源即可。
DXM 2012年

@DXM:我了解您的解决方案,但我认为我们可能没有相同的约束。在算法开发过程中,我的输入/输出数据发生了很大变化。您如何应对这些常规变化?在OCR中,我可以拥有超过99%的准确度,因此仅对几张图像进行测试可能会给我一种错误的成功感觉,而集成测试之后可能会告诉我我实际上使算法更糟了……
rold2007
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.