Bagaimana cara menguji kode pemrosesan gambar?

14

Saya bekerja dalam pemrosesan gambar (terutama OCR) dan saya bertanya-tanya bagaimana saya harus mengintegrasikan tes unit dalam pengembangan saya.

Saya sudah menggunakan unit test untuk jenis kode yang lebih "umum" tetapi ketika berurusan dengan kode pemrosesan gambar, saya tidak yakin bagaimana menghadapinya. Jenis kode ini selalu memerlukan input / output data gambar dan mengejek ini tidak jelas. Untuk saat ini saya lebih banyak melakukan tes integrasi tetapi butuh beberapa saat untuk menjalankan dan saya ingin beberapa ide tentang cara memecah kode semacam ini menjadi unit test sehingga saya dapat menjalankannya lebih cepat.

Sunting: Menganalisis karakter dapat melalui banyak langkah yang melibatkan banyak rotasi, penskalaan dan operasi morfologis. Langkah-langkah ini sering berubah ketika algoritma sedang dikembangkan. Dengan demikian input dan output yang diharapkan dapat berevolusi banyak saat pengujian. Setiap karakter dapat berukuran 100x100 piksel sehingga hardcoding dalam kode atau bekerja dengan data yang dihasilkan tidak perlu dipertanyakan.

rold2007
sumber
Bisakah Anda membuat sketsa contoh fungsi di mana Anda kesulitan membuat unit test?
Doc Brown
1
Terlalu pendek untuk jawaban nyata dan tidak benar-benar pengujian unit: Kami sedang mengolah data (seperti pada: melalui sampel dalam jumlah besar - saya biasanya melampaui 1000 untuk tugas klasifikasi seperti itu, tetapi itu tergantung pada ukuran sampel Anda secara keseluruhan ) dan membandingkan hasil akhir dengan data yang diproses secara otomatis. Saya telah menyiapkan kerangka kerja kecil untuk melakukan ini, ini akan menjadi open source dalam beberapa minggu, tetapi ini adalah deskripsi - Anda dapat mengkloning proses: birgitplays.wordpress.com/2012/09/15/…
Birgit P.
Misalnya, Anda dapat dengan mudah menguji rotasi, penskalaan, dll sebagai unit pengujian kecil. Memutar gambar yang diberikan 45 derajat seharusnya tidak banyak berubah. Ini juga berlaku untuk operasi penskalaan dan morfologi. Namun, menguji sesuatu di mana output yang diharapkan berkembang selama implementasi adalah sulit. Anda dapat mencoba membuat ukuran kualitas, dan mengatakan kualitas> = some_quality. Untuk memastikan kualitas Anda tidak menurun, tetapi ini mungkin juga sulit. Selain itu, yang dapat Anda lakukan adalah melakukan tes yang membuktikan bahwa bagian-bagian yang mendasarinya tidak rusak. Seperti skala / putar / dll.
martiert
@martiert: Saya tidak menguji rotasi, penskalaan, dll karena saya memanggil ini dari perpustakaan ke-3 yang saya percaya sudah teruji dengan baik. Algoritma OCR terdiri dari banyak operasi ini. Tetapi seperti yang Anda katakan, menguji sesuatu di mana output berkembang sulit. Mungkin ini peringatan yang baik bahwa kita tidak punya pilihan selain bergantung pada tes integrasi ...
rold2007
@ Bilg P .: Solusi menarik. Seperti yang Anda katakan itu masih pengujian integrasi. Memiliki kerangka kerja seperti milik Anda akan membantu menyiapkan tes ini lebih cepat tetapi tidak akan berjalan lebih cepat ...
rold2007

Jawaban:

12

Saya bekerja dengan perangkat lunak perekaman / analitik / streaming video dan kami menghadapi masalah yang sangat mirip. Di bawah ini adalah solusi kami, tidak yakin bagaimana itu akan berhasil dalam jangka panjang, tetapi untuk saat ini tampaknya berhasil.

Simpan gambar input / output sebagai sumber daya dalam proyek unit test Anda. Kemudian minta unit test memverifikasi bahwa ketika input tertentu diberikan, output spesifik tersebut dihasilkan.

9/10 kali ketika Anda memperbaiki kode dan menambahkan fungsionalitas lain, Anda akan mengharapkan perilaku rutin penanganan gambar Anda tidak berubah, jadi jika semua unit test tiba-tiba mulai gagal, kemungkinan karena kesalahan.

Di sisi lain, jika Anda membuat perubahan dalam algoritma yang sebenarnya, itu juga akan mengakibatkan kegagalan unit test. Dalam hal ini, Anda harus memverifikasi secara manual / visual bahwa hasilnya benar dan jika hasilnya bagus, perbarui sumber daya gambar untuk membuat unit test lulus lagi.

Dalam proyek kami, kami akhirnya mengembangkan sumber video "palsu" (atau mengejek jika Anda mau), yang dapat memberi kami data baik untuk input maupun output. Tetapi data itu sendiri tidak palsu, itu sebenarnya ditangkap menggunakan kelas rekaman data pembantu dari sistem yang berjalan ketika kami menjalankan tes manual dan memverifikasi bahwa semuanya bekerja.

DXM
sumber
Setuju, tidak apa-apa untuk bergantung pada beberapa file konkret dalam pengujian Anda ketika Anda menguji rutinitas yang bekerja dengan file (Anda melihatnya lebih sering dengan tes integrasi).
Kemoda
1
Jika Anda menjalankan beberapa input melalui seluruh rantai pemrosesan dan kemudian memeriksa output, Anda bukan pengujian unit tetapi pengujian integrasi.
tdammers
@tdammers: Saya tidak pernah mengatakan untuk menjalankannya melalui seluruh rantai. Jalankan beberapa input melalui satu "unit", bukan seluruh rantai. Dan tentu saja jika output yang terjadi adalah sesuatu selain gambar, maka Anda hanya perlu memiliki input yang disimpan sebagai sumber daya gambar.
DXM
@DXM: Saya mengerti solusi Anda, tetapi saya pikir kami mungkin tidak memiliki kendala yang sama. Input / output data saya banyak berubah saat algoritma dikembangkan. Bagaimana Anda mengatasi perubahan reguler ini? Dalam OCR saya dapat memiliki akurasi lebih dari 99% sehingga pengujian hanya pada beberapa gambar dapat memberi saya perasaan keberhasilan yang salah sementara tes integrasi mungkin memberi tahu saya nanti bahwa saya benar-benar memperburuk algoritme ...
rold2007