Làm thế nào để đơn vị kiểm tra mã xử lý hình ảnh?


14

Tôi đang làm việc trong xử lý hình ảnh (chủ yếu là OCR) và tôi tự hỏi làm thế nào tôi nên tích hợp các bài kiểm tra đơn vị trong sự phát triển của mình.

Tôi đã sử dụng các thử nghiệm đơn vị cho loại mã "phổ biến" hơn nhưng khi xử lý mã xử lý hình ảnh, tôi không chắc chắn làm thế nào để xử lý nó. Loại mã này luôn cần một số đầu vào / đầu ra dữ liệu hình ảnh và việc chế nhạo điều này là không rõ ràng. Hiện tại tôi chủ yếu thực hiện các bài kiểm tra tích hợp nhưng chúng mất một chút thời gian để chạy và tôi muốn có một số ý tưởng về cách chia loại mã này thành các bài kiểm tra đơn vị để tôi có thể chạy chúng nhanh hơn.

Chỉnh sửa: Phân tích một nhân vật có thể trải qua nhiều bước liên quan đến nhiều thao tác xoay, chia tỷ lệ và hình thái. Các bước này thay đổi thường xuyên khi thuật toán đang được phát triển. Do đó, đầu vào và đầu ra dự kiến ​​có thể phát triển rất nhiều trong khi thử nghiệm. Mỗi ký tự có thể là 100x100 pixel, do đó, việc mã hóa chúng trong mã hoặc làm việc với dữ liệu được tạo là không cần thiết.


Bạn có thể phác thảo một ví dụ về một chức năng mà bạn gặp khó khăn khi tạo một bài kiểm tra đơn vị không?
Doc Brown

1
Quá ngắn cho câu trả lời thực sự và không thực sự kiểm tra đơn vị: Chúng tôi đang xử lý dữ liệu bằng tay (như: trải qua số lượng mẫu cao - Tôi thường vượt quá 1000 cho các nhiệm vụ phân loại như vậy, nhưng nó phụ thuộc vào kích thước mẫu chung của bạn ) và tự động so sánh kết quả cuối cùng với dữ liệu được xử lý bằng tay. Tôi đã thiết lập một khung nhỏ để thực hiện điều này, nó sẽ đi vào nguồn mở trong một vài tuần, nhưng đây là mô tả - bạn có thể sao chép quy trình: birgitplays.wordpress.com/2012/09/15/ Thẻ
Birgit P.

Ví dụ của bạn, bạn có thể dễ dàng kiểm tra xoay, chia tỷ lệ vv dưới dạng các đơn vị thử nghiệm nhỏ. Xoay một hình ảnh nhất định 45 độ không nên thay đổi nhiều. Điều này cũng đi cho các hoạt động nhân rộng và hình thái. Tuy nhiên, việc kiểm tra một cái gì đó mà đầu ra dự kiến ​​sẽ phát triển trong quá trình thực hiện là khó. Bạn có thể thử thực hiện một thước đo chất lượng và nói chất lượng> = some_quality. Để đảm bảo chất lượng của bạn không bị suy giảm, nhưng điều này cũng có thể khó khăn. Ngoài ra, tất cả những gì bạn có thể làm là có các bài kiểm tra chứng minh rằng các phần bên dưới của bạn không bị hỏng. Giống như quy mô / xoay / vv.
martiert

@martiert: Tôi không thử nghiệm xoay vòng, chia tỷ lệ, v.v. khi tôi gọi chúng từ thư viện thứ 3 mà tôi tin là đã được kiểm tra tốt. Thuật toán OCR bao gồm nhiều thao tác này. Nhưng như bạn nói, thử nghiệm một cái gì đó mà một đầu ra phát triển là khó khăn. Có lẽ đó là một cảnh báo tốt, chúng tôi không có lựa chọn nào ngoài việc phụ thuộc vào các bài kiểm tra tích hợp ...
rold2007

@Birgit P.: Giải pháp thú vị. Như bạn nói nó vẫn là thử nghiệm tích hợp. Có một khung như của bạn sẽ giúp thiết lập các thử nghiệm này nhanh hơn nhưng chúng sẽ không chạy nhanh hơn ...
rold2007

Câu trả lời:


12

Tôi làm việc với phần mềm ghi / phân tích / phát video và chúng tôi gặp phải một vấn đề rất giống nhau. Dưới đây là giải pháp của chúng tôi, không chắc nó sẽ hoạt động lâu dài như thế nào nhưng bây giờ nó dường như hoạt động.

Lưu hình ảnh đầu vào / đầu ra dưới dạng tài nguyên trong dự án thử nghiệm đơn vị của bạn. Sau đó, kiểm tra đơn vị xác minh rằng khi một đầu vào cụ thể được đưa ra, đầu ra cụ thể đó được tạo ra.

9/10 lần khi bạn cấu trúc lại mã và thêm chức năng khác, bạn sẽ mong đợi hành vi của thói quen xử lý hình ảnh của mình không thay đổi, vì vậy nếu tất cả các thử nghiệm đơn vị đột ngột bắt đầu không thành công, có thể là do lỗi.

Mặt khác, nếu bạn thực hiện các thay đổi trong thuật toán thực tế, điều đó cũng sẽ dẫn đến lỗi thử nghiệm đơn vị. Trong trường hợp này, bạn sẽ phải xác minh bằng tay / trực quan rằng kết quả là chính xác và nếu chúng trông ổn, sau đó cập nhật tài nguyên hình ảnh để làm cho bài kiểm tra đơn vị vượt qua một lần nữa.

Trong dự án của chúng tôi, cuối cùng chúng tôi đã phát triển các nguồn video "giả" (hoặc giả nếu bạn muốn), có thể cung cấp dữ liệu cho chúng tôi cả cho đầu vào và đầu ra. Nhưng bản thân dữ liệu không phải là giả, nó thực sự được ghi lại bằng các lớp ghi dữ liệu của người trợ giúp từ một hệ thống đang chạy khi chúng tôi chạy thử nghiệm thủ công và xác minh rằng mọi thứ đều hoạt động.


Đồng ý, bạn có thể dựa vào một số tệp cụ thể trong các thử nghiệm của mình khi bạn đang kiểm tra các thói quen làm việc với các tệp (bạn sẽ thấy nhiều hơn với các thử nghiệm tích hợp).
Kemoda

1
Nếu bạn chạy một số đầu vào thông qua toàn bộ chuỗi xử lý và sau đó kiểm tra đầu ra, bạn không phải kiểm thử đơn vị mà là kiểm thử tích hợp.
tdammers

@tdammers: Tôi chưa bao giờ nói chạy nó qua toàn bộ chuỗi. Chạy một số đầu vào thông qua một "đơn vị", không phải toàn bộ chuỗi. Và chắc chắn nếu đầu ra của điều đó xảy ra không phải là hình ảnh, thì bạn chỉ cần lưu dữ liệu đầu vào dưới dạng tài nguyên hình ảnh.
DXM

@DXM: Tôi hiểu giải pháp của bạn nhưng tôi nghĩ chúng tôi có thể không có những ràng buộc tương tự. Dữ liệu đầu vào / đầu ra của tôi thay đổi rất nhiều trong khi thuật toán được phát triển. Làm thế nào để bạn đối phó với những thay đổi thường xuyên? Trong OCR tôi có thể có độ chính xác hơn 99% vì vậy chỉ thử nghiệm trên một vài hình ảnh có thể mang lại cho tôi cảm giác thành công sai lầm trong khi các thử nghiệm tích hợp có thể cho tôi biết sau này tôi thực sự làm xấu đi thuật toán ...
rold2007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.