Để tính được tỉ lệ chính xác thì chúng ta phải có phương pháp đúng để ra con số % chính xác. Phương pháp tính độ chính xác trong nhận diện hình ảnh thường là Precision và Recall. Bài viết này sẽ giải thích vì sao sử dụng 2 công thức đó và ý nghĩa trong bài toán xử lý ảnh thực tế.
Ngoài ra còn rất nhiều phương pháp tính khác phức tạp hơn. Tuy nhiên với kinh nghiệm của mình thì 2 chỉ số Precision và Recall là đủ áp dụng cho các bài toán nhỏ, ít tốn công mà lại hiệu quả.
Chúng ta luôn muốn tỉ lệ chính xác 100%, tuy nhiên đó là quá lý tưởng, thậm chí trong phòng thí nghiệm mà được 100% là nghi ngờ ngay. Đạt được 100% độ chính xác là ước mơ của tất cả lập trình viên, tuy nhiên chỉ đạt được với hệ thống phần mềm tiền tỷ trở lên (lưu ý chỉ riêng phần mềm). Còn lại hầu như vài ngàn sản phẩm, vài ngàn tấm hình thường sẽ có sai sót 1-2 tấm gì đó, nguyên nhân có thể do khách quan lẫn chủ quan.
Với bài toán nhận diện khuôn mặt ta sẽ cần tìm 2 chỉ số chính:
- Tỉ lệ nhận diện đúng bao nhiêu ảnh?
- Tỉ lệ nhận diện nhầm bao nhiêu ảnh?
Ví dụ tiền đề: tính độ chính xác nhận diện khuôn mặt
Giả sử có 10 người, mỗi người 10 ảnh, tổng cộng là 100 ảnh. Bài toán đặt ra là tìm ông A trong tập 100 ảnh đó, khi chạy thuật toán nhận diện ta sẽ có 4 trường hợp xảy ra:
- Ảnh ông A và nhận diện ra ông A => đúng
- Ảnh ông A và nhận diện ra người khác => sai
- Ảnh người khác nhận diện ra ông A => sai
- Ảnh người khác nhận diện ra người khác => đúng
Theo 4 trường hợp đó thì ta sẽ tính ra được độ chính xác, ở đây là tỉ lệ nhận diện đúng với không bỏ sót
Precision là gì?
Precision là tỉ lệ chính xác khi nhận diện, được tính bằng công thức
Giả sử thuật toán cho rằng 8 ảnh là ông A trong 100 ảnh, sau khi kiểm tra thì thấy đúng 6 ảnh là ông A, còn 2 ảnh là người khác. Như vậy precsion được tính là: 6/(6+2) = 75%.
Tuy nhiên cho dù Precision = 1 = 100% thì cũng chưa hẳn đã là tốt. VD như thuật toán tìm được 5 ảnh của ông A, kiểm tra lại thì đúng 5/5 ảnh, nhưng ông A có tới 10 ảnh thì không đủ để chứng minh thuật toán tốt cho dù Precision == 100%, do đó ta xét tới Recall
Recall là gì?
Recall là tỉ lệ không bỏ sót khi nhận diện, được tính bằng công thức:
Cũng với ví dụ trên: tìm được 8 ảnh ông A, trong đó đúng 6 ảnh, còn 4 ảnh ông A bị bỏ sót không nhận ra thì Recall = 6/(6+4) = 60%. Nghĩa là bỏ sót 40% ảnh của ông A.
Tuy nhiên Recall = 1 = 100% thì cũng chưa hẳn là tốt. VD khi tìm ra 12 ảnh cho là ông A, trong đó đúng 10 ảnh, sai 2 ảnh, khi đó Recall = 10/(10+0) = 1 = 100%, còn Precision = 10/(10+2) = 0.83 = 83%
Kết luận
Precision và Recall nên đi đôi với nhau để tính độ chính xác hình ảnh. Tùy theo từng bài toán mà chỉ số “tỉ lệ nhận diện đúng” hay “tỉ lệ không bỏ sót” quan trọng hơn.
VD1: trong bài toán dò mìn, báo động nhầm còn hơn bỏ sót thì Recall quan trọng hơn.
VD2: trong bài toán phân loại mail spam, thà rằng bỏ sót email spam còn hơn quăng mail vào mục spam rồi bỏ sót mail. Lúc này Precision quan trọng hơn.
VD3: trong bài toán nhận diện khuôn mặt để điểm danh, nhận diện nhầm hay báo khuôn mặt không có trong database (bỏ sót) thì cả 2 đều quan trọng như nhau.
Lưu ý khi đánh giá độ chính xác nhận diện hình ảnh
Lưu ý 1: tính độ chính xác khi nhận diện là việc làm khoa học, do đó không được “cảm tính” khi đánh giá bằng mắt mà phải thực hiện các bài test để cho ra số liệu.
Lưu ý 2: để đánh giá được tỉ lệ chính xác khi phân loại ảnh thì cần đếm bao nhiêu ảnh đúng sai. Mẹo nhỏ là chúng ta đặt tên ảnh theo class của ảnh đó, VD:
- banana01.jpg
- banana02.jpg
- apple01.jpg
- apple02.jpg
- ….
Khi đó bạn sẽ chạy và đếm có bao nhiêu ảnh bằng code chứ không cần phải đếm thủ công. Có 1 công cụ rename file hàng loạt rất hay là Bulk rename Utilities.