Jak przetestować kod przetwarzania obrazu jednostki?

14

Pracuję nad przetwarzaniem obrazu (głównie OCR) i zastanawiam się, jak powinienem zintegrować testy jednostkowe w moim rozwoju.

Już używam testów jednostkowych dla bardziej „powszechnego” typu kodu, ale w przypadku kodu przetwarzania obrazu nie jestem pewien, jak sobie z tym poradzić. Ten rodzaj kodu zawsze wymaga wejścia / wyjścia danych obrazu, a kpienie z tego nie jest oczywiste. Na razie głównie przeprowadzam testy integracyjne, ale ich uruchomienie zajmuje trochę czasu i chciałbym kilka pomysłów, jak rozbić ten rodzaj kodu na testy jednostkowe, aby móc je szybciej uruchomić.

Edycja: Analiza postaci może przechodzić przez wiele etapów obejmujących wielokrotne obracanie, skalowanie i operacje morfologiczne. Kroki te zmieniają się często w miarę opracowywania algorytmu. W ten sposób dane wejściowe i oczekiwane wyniki mogą się znacznie zmieniać podczas testowania. Każdy znak może mieć rozmiar 100 x 100 pikseli, więc zakodowanie go na stałe w kodzie lub praca z wygenerowanymi danymi nie wchodzi w rachubę.

rold2007
źródło
Czy możesz naszkicować przykład funkcji, w której masz problemy z utworzeniem testu jednostkowego?
Doc Brown,
1
Zbyt krótki na prawdziwą odpowiedź, a nie na testowanie jednostkowe: przetwarzamy dane ręcznie (jak w: przechodzimy przez dużą liczbę próbek - zwykle przekraczam 1000 dla takich zadań klasyfikacyjnych, ale zależy to od ogólnej wielkości próby ) i automatyczne porównywanie wyników końcowych z danymi przetwarzanymi ręcznie. Skonfigurowałem mały framework, aby to zrobić, za kilka tygodni przejdzie na open source, ale taki jest opis - możesz sklonować ten proces: birgitplays.wordpress.com/2012/09/15/...
Birgit P.
Na przykład możesz łatwo przetestować rotację, skalowanie itp. Jako małe jednostki testów. Obracanie danego obrazu o 45 stopni nie powinno wiele zmieniać. Dotyczy to również skalowania i operacji morfologicznych. Testowanie czegoś, w przypadku czego oczekiwany wynik ewoluuje podczas wdrażania, jest jednak trudne. Możesz spróbować zmierzyć jakość i powiedzieć jakość> = some_quality. Aby upewnić się, że jakość nie pogarsza się, ale może to być również trudne. Poza tym wszystko, co możesz zrobić, to mieć testy, które dowodzą, że części leżące u podstaw nie są zepsute. Jak skala / obrót / itp.
martiert
@martiert: Nie testuję rotacji, skalowania itp., ponieważ wywołuję je z trzeciej biblioteki, która moim zdaniem jest dobrze przetestowana. Algorytm OCR składa się z wielu z tych operacji. Ale jak mówisz, testowanie czegoś, co ewoluuje, jest trudne. Może to dobre ostrzeżenie, że nie mamy wyboru, ale musimy polegać na testach integracyjnych ...
rold2007
@Birgit P .: Ciekawe rozwiązanie. Jak mówisz, nadal są to testy integracyjne. Posiadanie takiego frameworka pomogłoby w szybszym konfigurowaniu tych testów, ale nie będą one działać szybciej ...
rold2007

Odpowiedzi:

12

Pracuję z oprogramowaniem do nagrywania wideo / analizy / przesyłania strumieniowego i napotkaliśmy bardzo podobny problem. Poniżej znajduje się nasze rozwiązanie, nie jestem pewien, jak to się uda na dłuższą metę, ale na razie wydaje się, że działa.

Zapisz obrazy wejściowe / wyjściowe jako zasoby w projekcie testu jednostkowego. Następnie sprawdź, czy w teście jednostkowym podano konkretne dane wejściowe, że dane wyjściowe są generowane.

9/10 razy, kiedy refaktoryzujesz kod i dodajesz inne funkcje, możesz oczekiwać, że zachowanie procedur obsługi obrazu nie zmieni się, więc jeśli wszystkie nagłe testy jednostkowe zaczną się nie powieść, prawdopodobnie jest to spowodowane błędem.

Z drugiej strony, jeśli wprowadzisz zmiany w faktycznym algorytmie, spowoduje to również niepowodzenie testu jednostkowego. W takim przypadku należy ręcznie / wizualnie sprawdzić, czy wyniki są poprawne, a jeśli wyglądają dobrze, należy zaktualizować zasoby obrazu, aby ponownie przejść test jednostkowy.

W naszym projekcie opracowaliśmy „fałszywe” (lub fałszywe, jeśli chcesz) źródła wideo, które mogą dostarczać nam dane zarówno do wejścia, jak i do wyjścia. Ale same dane nie są fałszywe, w rzeczywistości zostały przechwycone za pomocą klas rejestrujących dane pomocnicze z działającego systemu, gdy przeprowadziliśmy testy ręczne i zweryfikowaliśmy, że wszystko działa.

DXM
źródło
Zgadzam się, możesz polegać na niektórych konkretnych plikach w testach podczas testowania procedur pracy z plikami (częściej niż w przypadku testów integracyjnych).
Kemoda,
1
Jeśli uruchomisz jakieś dane wejściowe w całym łańcuchu przetwarzania, a następnie sprawdzisz dane wyjściowe, nie przeprowadzasz testów jednostkowych, ale testy integracyjne.
tdammers
@tdammers: Nigdy nie mówiłem, aby przeprowadzić go przez cały łańcuch. Przeprowadź część danych wejściowych przez jedną „jednostkę”, a nie cały łańcuch. I pewnie, jeśli wyjściowym rezultatem jest coś innego niż obrazy, to wystarczy zapisać dane wejściowe jako zasoby obrazu.
DXM
@DXM: Rozumiem twoje rozwiązanie, ale myślę, że możemy nie mieć takich samych ograniczeń. Moje dane wejściowe / wyjściowe bardzo się zmieniają podczas opracowywania algorytmu. Jak radzisz sobie z tymi regularnymi zmianami? W OCR mogę mieć ponad 99% dokładności, więc testowanie tylko kilku zdjęć może dać fałszywe poczucie sukcesu, podczas gdy testy integracyjne mogą mi później powiedzieć, że faktycznie pogorszyłem algorytm ...
rold2007