画像処理コードを単体テストする方法は?


14

私は画像処理(主にOCR)に取り組んでおり、開発に単体テストをどのように統合すべきか疑問に思っています。

私はすでに、より一般的なタイプのコードに対して単体テストを使用していますが、画像処理コードを処理するとき、その処理方法がわかりません。この種のコードには常に画像データの入出力が必要であり、これを模倣することは明らかではありません。今のところ、主に統合テストを行っていますが、実行には時間がかかります。この種のコードをユニットテストに分割して、より迅速に実行できるようにするためのアイデアが欲しいです。

編集:キャラクターの分析は、複数の回転、スケーリング、および形態学的操作を含む多くのステップを経ることができます。これらの手順は、アルゴリズムの開発中に頻繁に変更されます。したがって、テスト中に入力と期待される出力は大きく変化する可能性があります。各文字は100x100ピクセルにすることができるため、コード内でハードコーディングしたり、生成されたデータを操作したりするのは問題ありません。


単体テストの作成に問題がある関数の例をスケッチできますか?
Doc Brown

1
本当の答えではなく、実際にはユニットテストではありません:私たちはデータを手動で処理しています(例:多数のサンプルを調べます-そのような分類タスクでは通常1000を超えますが、全体のサンプルサイズによって異なります) )そして最終結果を手作業で処理されたデータと自動的に比較します。私はそれが数週間のうちにオープンソースを行くよ、これは説明され、これを行うための小さな枠組みを設定している-あなたは、プロセスのクローンを作成できます。birgitplays.wordpress.com/2012/09/15/...
ビルギットP.

たとえば、小さなテスト単位として、回転、スケーリングなどを簡単にテストできます。特定の画像を45度回転しても、それほど変化しないはずです。これは、スケーリングと形態学的操作にも当てはまります。ただし、実装中に予想される出力が変化する場所をテストするのは困難です。品質の尺度を作成して、品質> = some_qualityと言うことができます。品質が低下していないことを確認するために、これも難しいかもしれません。それ以外は、基礎となる部品が破損していないことを証明するテストを行うだけです。scale / rotate / etcなど。
マルティエット

@martiert:十分にテストされていると思う3番目のライブラリからこれらを呼び出すので、回転、スケーリングなどをテストしていません。OCRアルゴリズムは、これらの操作の多くで構成されています。しかし、あなたが言うように、出力が進化する何かをテストするのは難しいです。多分それは選択の余地はないが、統合テストに依存する良い警告だろう
...-rold2007

@Birgit P .:興味深いソリューション。あなたが言うように、それはまだ統合テストです。あなたのようなフレームワークがあると、これらのテストをより速くセットアップできますが、実行速度は速くなりません
...-rold2007

回答:


12

私はビデオ録画/分析/ストリーミングソフトウェアを使用していますが、非常によく似た問題に直面しました。以下は私たちのソリューションであり、長期的にどのように機能するかはわかりませんが、今のところは機能しているようです。

ユニットテストプロジェクトで、入力/出力イメージをリソースとして保存します。次に、特定の入力が与えられたときにその特定の出力が生成されることを単体テストで検証します。

コードをリファクタリングして他の機能を追加すると、9/10回、画像処理ルーチンの動作が変わらないことが予想されるため、突然のユニットテストがすべて失敗した場合は、おそらくエラーが原因です。

一方、実際のアルゴリズムを変更すると、ユニットテストが失敗します。この場合、結果が正しいことを手動/視覚的に確認し、それらが適切に見える場合は、画像リソースを更新して、ユニットテストを再度パスする必要があります。

私たちのプロジェクトでは、入力と出力の両方にデータを送ることができる「偽の」(または、もしあなたがモックする)ビデオソースを開発することになりました。ただし、データ自体は偽物ではなく、手動テストを実行してすべてが機能していることを確認したときに、実行中のシステムのヘルパーデータ記録クラスを使用して実際にキャプチャされました。


同意します。ファイルを操作するルーチンをテストするときに、テストでいくつかの具体的なファイルに依存しても構いません(統合テストではより頻繁に表示されます)。
ケモダ

1
処理チェーン全体で何らかの入力を実行してから出力を確認すると、ユニットテストではなく統合テストになります。
tdammers

@tdammers:チェーン全体で実行するとは言いませんでした。チェーン全体ではなく、1つの「ユニット」を介して入力を実行します。そして、その出力が画像以外のものである場合は、入力を画像リソースとして保存するだけで済みます。
DXM

@DXM:私はあなたの解決策を理解していますが、私たちは同じ制約を持たないと思う。アルゴリズムが開発されている間、私の入出力データは大きく変わります。これらの定期的な変更にどのように対処しますか?統合テストは、私が実際にアルゴリズムを悪化させていること、後で教えてくださいかもしれないが、画像の夫婦のみでテストすることは私に成功の偽感を与えることができるようにOCR Iで... 99%以上の精度を持つことができます
rold2007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.