Series YOLOv4: #3 Đánh giá model bằng mAP -Object detection

 

1. Giới thiệu một số khái niệm liên quan tới object detection và đánh giá mô hình object detection.

Đối với mỗi model Object detection sau khi đào tạo, cần có những thang điểm để đánh giá sự chính xác của nó. Theo bản thân mình biết, hiện tại chúng ta đánh giá một model dựa trên: loss function, IOU avg, mAP, đánh giá trực quan, và nhiều bài báo cũng như các trang web lớn thường sử dụng mAP như là thước đo chính.

Vì vậy, hôm nay chúng ta sẽ tìm hiểu về khái niệm và cách tính AP,mAP.TÍnh toán mAP1.1. Một vài khái niệm cần nắm trong việc đánh giá một model object detection.

  • IOU( Intersection over union)

Intersection over Union là chỉ số đánh giá được sử dụng để đo độ chính xác của phát hiện đối tượng trên tập dữ liệu cụ thể. Chỉ số này thường được gặp trong các Object Detection Challenge. IOU thường được đánh giá hiệu năng của các bộ phát hiện đối tượng như HOG + Linear SVM và mạng nơ ron tích chập (R-CNN, FastR-CNN, YOLO,…).

Để áp dụng được IoU để đánh giá cần:

– Đường bao thực (ground-truth bounding box): là đường bao mà chúng ta gán cho vật thể bằng labelImg tool

– Đường bao dự đoán (predicted bouding box): là đường bao chúng ta sử dụng file Weights sau khi đào tạo để nhận dạng. Sử dụng bài này.

Dưới đây là ví dụ về đường bao thực và đường bao được dự đoán. Đường bao được dự đoán được vẽ bằng màu vàng, trong khi đó đường bao thực được vẽ bằng màu xanh lá. Mục tiêu ta là tính toán IoU (Intersection over Union) giữa hai đường bao 

IOU
Minh họa cách tính IOU

Tỷ lệ này là IoU (Intersection over union) là tỉ lệ giữa đo lường mức độ giao nhau giữa hai đường bao (thường là đường bao dự đoán và đường bao thực) để nhằm xác định hai khung hình có bị đè chồng lên nhau không.  Tỷ lệ này được tính dựa trên phần diện tích giao nhau gữa 2 đường bao với phần tổng diện tích giao nhau và không giao nhau giữa chúng.

 

IOU
Minh họa IOU

Các tiêu chí được dùng để đánh giá:

– Đối tượng được nhận dạng đúng với tỉ lệ IOU> 0.5 (True positive : TP)

TP
True Positive .

– Đối tượng được nhận dạng sai với tỉ lệ IOU < 0.5 (False positive : FP)

FP
False Positive.

– Đối tượng không được nhận dạng (False negative: FN)

  • Precision và Recall (Mình để nguyên bản tiếng anh vì khó dịch sang tiếng Việt). 

Dự đoán (Precision) đo lường mức độ chính xác là dự đoán của mô hình tức là tỷ lệ phần trăm dự đoán của mô hình là chính xác.

“Recall” đo lường như thế nào tốt mô hình tìm thấy tất cả các mẫu tích cực. Ví dụ: chúng ta có thể tìm thấy 80% các trường hợp tích cực có thể có trong các dự đoán K hàng đầu của mô hình.

Mô tả toán học của precision và recall

 

  • AP và mAP:

Từ precision và recall đã được định nghĩa ở trên chúng ta cũng có thể đánh giá mô hình dựa trên việc thay đổi một ngưỡng và quan sát giá trị của Precision và Recall. Khái niệm Area Under the Curve (AUC) cũng được định nghĩa tương tự. Với Precision-Recall Curve, AUC còn có một tên khác là Average precision (AP).

Giả sử có 𝑁 ngưỡng để tính precision và recall, với mỗi ngưỡng cho một cặp giá trị precision, recall là 𝑃𝑛,,=1,2,…,𝑁. Precision-Recall curve được vẽ bằng cách vẽ từng điểm có toạ độ (𝑃𝑛,) trên trục toạ độ và nối chúng với nhau. AP được xác định bằng:

𝐴𝑃=∑(𝑅𝑛−𝑅𝑛−1)𝑃𝑛𝑛

mAP là trung bình của AP được tính cho tất cả các lớp.

Đủ rồi, bây giờ chúng ta cùng đi tìm giá trị của AP và mAP nhé !

2. Tính toán mAP cho các bài toán Object detection.

2.1. Tổng quan các bước:

Bước 1: cài thư viện cần thiết để tính toán.

Bước 2: clone source code tính toán từ github.

Bước 3: chọn một số ảnh để tính toán( hoặc toàn bộ dataset nếu muốn độ chính xác cao).

Bước 4: tạo các file ground-truth ( file txt trong quá trình gán nhãn).

Bước 5: tạo file detection result (file txt được tạo ra bằng cách sử dụng file weights).

Bước 6: chạy code mẫu để tạo ra các biểu đồ AP và mAP như phía dưới 😀

AP
Kết quả tính toán AP và mAP

Và còn nhiều thứ hay ho dùng để bỏ vào báo cáo nữa :D.

2.2. Chi tiết các bước thực hiện.

  • Bước 1: Cài các thư viện. Ở phần này chúng ta chỉ cần 2 thư viện: matplotlib và opencv nhẹ nhàng và dễ dàng cài đặt.

Matplotlib: để khoanh vùng và tính toán.

  1. python -mpip install -U pip
  2. python -mpip install -U matplotlib
Opencv: để hiển thị animation.
  1. python -mpip install -U pip
  2. python -mpip install -U opencv-python
  • Bước 2: tải source code:
​git clone https://github.com/Cartucho/mAP.git
  • Bước 3: Chọn lựa ảnh để tính toán. Sau khi lựa chọn, các bạn copy ảnh vào thư mục mAP-master/input/image-optional. tại git mới tải về nhé.
  • Bước 4: Chọn các file txt trùng tên với ảnh ở bước 2. Copy và để vào thư mục mAP-master/input/groung-truth.

Tác giả có nói tới phần difficult, nhưng sau một vài lần vật vã tính toán thì mình kết luận là có hay không cũng đều ra kết quả giống nhau nhé

Nhưng có một vấn đề quan trọng:

Format của file txt phục vụ quá trình train thì sẽ có dạng : "0 0.xxxx 0.yyyy 0.wwww 0.hhhh"

Nhưng tác giả của git lại yêu cầu đầu file txt có tọa độ dạng pixel: "0 123 321 222 444"

Nên chúng ta phải convert các giá trị theo đúng định dạng tác giả yêu cầu.

Đầu tiên là bỏ các file ảnh và file txt vào chung1 folder nhé, sau đó sử dụng code:

  • Kiểm tra ảnh và file txt có trùng tên hay không.
def check(path_txt):
        name = path_txt.split(".")[0]
        if os.path.isfile(name + '.jpg'):
                return True
        return False
  • Sau đó convert.
for path_txt in glob.glob(path_input + "/*.txt"):
        no=[0,0,0,0,0]
        #print(path_txt)
        if check(path_txt):
                image = cv2.imread(path_txt.split(".")[0] + ".jpg")
                h,w = image.shape[:2]
                output=""
                with open(path_txt, "r") as stream:
                        for line in stream.readlines():
                                line = line.strip()
                                coord = line.split(" ")
                                a = coord[0]
                                num = int(line.split(' ',1)[0])
                                no[num]+=1
                                coord = [float(i) for i in coord[1:]]
                                box = np.array(coord) * np.array([w,h,w,h])
                                (centerX, centerY, width, height) = box.astype('int')
                                left = centerX - int(width/2)
                                top = centerY - int(height/2)
                                right = centerX + int(width/2)
                                bottom = centerY + int(height/2)
                                out1 = "{} {} {} {} {}\n".format(a, left, top, right, bottom)
                                output +=out1
                name_output = path_txt.split('/')[-1]
                print(name_output)
                with open(path_output + '/' + name_output, 'w') as stream_out:
                        stream_out.write(output)
                stream.close()
                stream_out.close()
  • Bước 5: tạo file detection result, tức là kết quả của model object detection lưu lại các giá trị dự đoán và bounding box của các vật thể.

Mình đã có bài hướng dẫn tại đây. Bạn nào chưa biết cách thực hiện thì có thể tham khảo.

Hoặc bạn có thể sử dụng code predict tất cả các ảnh trong folder: tại đây. ( Nhớ là phải tải 3 file trong quá trình train model yolov4 về nhé, bao gồm : weights, cfg và yolo.names.) Bỏ qua quảng cáo

  • Bước 6: sau khi đầy đủ các file: Detection results, ground-truth, và ảnh (nhớ để vào đúng thư mục nhé). Ta chạy file main.py ở thư mục mAP-master, sau đó chờ xuất kết quả thôi !

Màn hình sẽ hiển thị như hình bên dưới:

2.3. Kết quả và giải thích kết quả.

Sau khi kết thúc, các biểu đồ được tạo ra và nằm ở thư mục mAP-master/output. Bao gồm:

  • Hình 1: Biểu đồ thể hiện tổng số lần dự đoán có IOU> 0.5 (True Positive) và IOU < 0.5 ( False Positive) trên mỗi nhãn. Tổng của 2 số màu xanh và đỏ là số đối tượng của nhãn mà bạn đưa vào.
Detection result
Kết quả tính toán AP trên tổng số nhãn.

 

  • Hình 2: biểu đồ thể hiện giá trị AP của từng đối tượng. và mAP chính là giá trị trung bình cộng của các AP.
AP
Kết quả tính toán AP và mAP
  • Hình 3: kết quả AP của từng đối tượng( nằm trong thư mục mAP-master/output/class)ch tính mình đã giải thích ở phần 1.

 

P and C
Kết quả Precision và Recall.
  • Tập hợp hình vẽ các bounding box ground-truth và predicted để tính IOU,TP,FP,recall, presition, AP và mAP.
TP
True Position.

2.4. Đánh giá.

Phương pháp của tác giả vẫn tồn tại một số tính toán có sai sót.( tuy là phải cảm ơn tác giả rất nhiều vì chia sẻ cách đánh giá mô hình nhưng phải rõ ràng là vẫn có sai sót). Cho nên các bạn đừng tự ti quá về model của mình, mà hãy tìm thêm một vài phương pháp đánh giá nữa để đối chiếu và so sánh.

Một số lỗi :

Fail
Lỗi nhận nhầm cây….

Fail
Lỗi chồng cây …..

Tới đây là hết, chúc các bạn thực hiện thành công. Nếu có lỗi hoặc thắc mắc, các bạn có thể bình luận phía dưới, mình sẽ hỗ trợ.

 

Bài viết tham khảo: https://github.com/Cartucho/mAP

Cảm ơn bạn Nguyễn Thành Long đã hỗ trợ mình trong quá trình thực hiện bài đánh giá.

 

3 thoughts on “Series YOLOv4: #3 Đánh giá model bằng mAP -Object detection

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *