이미지 처리 코드를 단위 테스트하는 방법?


14

이미지 처리 (주로 OCR)에서 일하고 있으며 개발시 단위 테스트를 어떻게 통합해야하는지 궁금합니다.

이미 "일반적인"코드 유형에 대해 단위 테스트를 사용하고 있지만 이미지 처리 코드를 처리 할 때는 어떻게 처리해야할지 잘 모르겠습니다. 이러한 종류의 코드에는 항상 일부 이미지 데이터 입력 / 출력이 필요하며이를 조롱하는 것은 분명하지 않습니다. 지금은 주로 통합 테스트를 수행하고 있지만 실행하는 데 시간이 걸리며 이러한 종류의 코드를 단위 테스트로 분류하여 더 빨리 실행할 수있는 방법에 대한 아이디어가 필요합니다.

편집 : 캐릭터 분석은 다중 회전, 스케일링 및 형태 학적 작업과 관련된 많은 단계를 거칠 수 있습니다. 이 단계는 알고리즘이 개발 될 때 자주 변경됩니다. 따라서 입력 및 예상 출력은 테스트하는 동안 많이 발전 할 수 있습니다. 각 문자는 100x100 픽셀이 될 수 있으므로 코드에서 하드 코딩하거나 생성 된 데이터 작업에 문제가 없습니다.


단위 테스트 작성에 문제가있는 함수의 예를 스케치 할 수 있습니까?
Doc Brown

1
실제 답변이 너무 짧고 실제로 단위 테스트가 아님 : 우리는 데이터를 직접 처리하고 있습니다 (예 : 많은 수의 샘플을 통과하십시오-일반적으로 이러한 분류 작업의 경우 1000을 초과하지만 전체 샘플 크기에 따라 다릅니다) ) 및 최종 결과를 수동으로 처리 된 데이터와 자동으로 비교합니다. 이 작업을 수행하기 위해 작은 프레임 워크를 설정했습니다. 몇 주 후에 오픈 소스로 이동하지만 설명입니다. birgitplays.wordpress.com/2012/09/15/…
Birgit P.

예를 들어 회전, 스케일링 등을 작은 테스트 단위로 쉽게 테스트 할 수 있습니다. 주어진 이미지를 45도 회전하면 크게 변하지 않아야합니다. 이것은 또한 스케일링 및 형태 학적 작업에도 적용됩니다. 그러나 구현 중에 예상되는 출력이 발전하는 것을 테스트하는 것은 어렵습니다. 품질 측정을 시도하고 품질> = some_quality라고 말할 수 있습니다. 품질이 저하되지 않는지 확인하기는 어려울 수도 있습니다. 그 외에는 기본 부품이 파손되지 않았 음을 입증하는 테스트 만 있으면됩니다. 스케일 / 회전 등
martiert

@ martiert : 잘 테스트 된 것으로 생각되는 세 번째 라이브러리에서 이것을 회전시킬 때 회전, 스케일링 등을 테스트하지 않습니다. OCR 알고리즘은 이러한 많은 작업으로 구성됩니다. 그러나 당신이 말했듯이, 출력이 진화하는 것을 테스트하는 것은 어렵습니다. 선택의 여지가 없지만 통합 테스트에 의존해야한다는 것은 좋은 경고 일 것입니다.
rold2007

@ Birgit P .: 흥미로운 솔루션. 당신이 말했듯이 그것은 여전히 ​​통합 테스트입니다. ... 당신 같은 프레임 워크가 빠른 테스트를 설정 도움이 될하지만 빨리 실행되지 않습니다 가졌
rold2007

답변:


12

비디오 녹화 / 분석 / 스트리밍 소프트웨어를 사용하면서 비슷한 문제에 직면했습니다. 아래는 우리의 해결책이었습니다. 어떻게 장기적으로 작동하는지 확실하지 않지만 현재는 효과가있는 것 같습니다.

단위 테스트 프로젝트에서 입력 / 출력 이미지를 리소스로 저장하십시오. 그런 다음 특정 입력이 제공 될 때 특정 출력이 생성되는지 단위 테스트를 확인하십시오.

코드를 리팩토링하고 다른 기능을 추가하면 9/10 번 이미지 처리 루틴의 동작이 변경되지 않을 것으로 예상되므로 갑작스러운 단위 테스트가 모두 실패하면 오류로 인한 것일 수 있습니다.

반면에 실제 알고리즘을 변경하면 단위 테스트가 실패합니다. 이 경우 결과가 올바른지 수동 / 시각적으로 확인하고 결과가 양호하면 이미지 리소스를 업데이트하여 단위 테스트를 다시 통과해야합니다.

우리 프로젝트에서 우리는 입력 및 출력에 대한 데이터를 제공 할 수있는 "가짜"비디오 소스를 개발했습니다. 그러나 데이터 자체는 가짜가 아니며 수동 테스트를 실행하고 모든 것이 작동하는지 확인했을 때 실제로 실행중인 시스템의 도우미 데이터 기록 클래스를 사용하여 캡처되었습니다.


파일로 작업하는 루틴을 테스트 할 때 테스트에서 일부 구체적인 파일을 사용하는 것이 좋습니다 (통합 테스트에서는 더 자주 나타납니다).
Kemoda

1
전체 처리 체인을 통해 일부 입력을 실행 한 다음 출력을 확인하면 단위 테스트가 아니라 통합 테스트입니다.
tdammers

@ tdammers : 전체 체인을 통해 실행한다고 말한 적이 없습니다. 전체 체인이 아닌 하나의 "장치"를 통해 일부 입력을 실행하십시오. 그리고 그 출력이 이미지가 아닌 다른 것이면 입력을 이미지 리소스로 저장하면됩니다.
DXM

@ DXM : 귀하의 솔루션을 이해하지만 동일한 제약 조건이 없을 수도 있습니다. 알고리즘이 개발되는 동안 입력 / 출력 데이터가 많이 변경됩니다. 이러한 정기적 인 변화에 어떻게 대처하십니까? OCR에서는 99 % 이상의 정확도를 가질 수 있으므로 몇 개의 이미지 만 테스트하면 잘못된 결과를 얻을 수 있지만 통합 테스트를 통해 나중에 알고리즘을 실제로 악화
시켰다는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.