Series YOLOv4: #2 Nhận dạng vật thể sau khi đào tạo – Predict object detection by YOLOv4

1. Giới thiệu.

Như bài Hướng dẫn training Object detection với YOLOv4 sử dụng Google Colab đã trình bày. Sau khi quá trình train kết thúc, chúng ta thu được các file weights nằm trong thư mục darknet/backup:

weights
Các file trọng số được xuất sau quá trình train.

Bây giờ các bạn tải file yolov4_best.weights, về để thực hiện nhận dạng nhé

2. Object detection.

Bước 1: các bạn cần cài các thư viện:

pip install opencv-python
pip install numpy

Bước 1: các bạn tải thêm các file:

yolo.names ở trong thư mục darknet.

yolov4-custom.cfg ở trong thư mục darknet/cfg.

Để chung 3 file: weights, yolo.names và cfg vào thư mục YOLOv4.

Bước 2: lựa chọn một vài files ảnh để detect và quăng vào thư mục YOLOv4 luôn 😀

Bước 3: tạo file YOLOv4_detect.py trong thư mục YOLOv4

Bước 4: sử dụng các đoạn code sau đây, copy vào file YOLOv4_detect.py.

  • Hàm để vẽ bouding box cho vật thể:
def draw_prediction(img, class_id, confidence, x, y, x_plus_w, y_plus_h):
    label = str(classes[class_id])
    color = COLORS[class_id]
    cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2)
    cv2.putText(img, label + str(confidence) , (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
  • Hàm lưu các file txt.
def savePredict(name, text):
    textName = name + '.txt'
    with open(textName, 'w+') as groundTruth:
        groundTruth.write(text)
        groundTruth.close()
  • Đọc file ảnh và các thông số của ảnh:
img_path = 'img.jpg'
image = cv2.imread("diep.jpg") # đổi tên ảnh để nhận dạng
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Width = image.shape[1]
Height = image.shape[0]
scale = 0.00392
  • Đọc các file cấu hình:
classes = None
with open("yolo.names", 'r') as f: # Chỉnh sửa file yolo.names ở đây
    classes = [line.strip() for line in f.readlines()] COLORS = np.random.uniform(0, 255, size=(len(classes), 3)) net = cv2.dnn.readNet("yolov3-tiny_6000.weights", "yolov3-tiny.cfg") #Thay đổi tên của file weights và file cfg tại đây. blob = cv2.dnn.blobFromImage(image, scale, (416, 416), (0, 0, 0), True, crop=False) #Convert ảnh sang blob
  • Đưa ảnh vào mạng và đặt thông số để xuất các bouding box:(Các bạn cứ tạm hiểu như vậy nhé, vì nếu mình giải thích sâu hơn sẽ rất khó hiểu vì nó cần tìm hiểu sâu.)
net.setInput(blob)
outs = net.forward(get_output_layers(net))
#print(outs)
class_ids = []
confidences = []
boxes = []
conf_threshold = 0.5 # Đây là ngưỡng vật thể, nếu xác suất của vật thể nhỏ hơn 0.5 thì #model sẽ loại bỏ vật thể đó. Các bạn có thể tăng lên cao hoặc giảm xuống tùy theo mục #đích model của mình.
nms_threshold = 0.4
#Nếu có nhiều box chồng lên nhau, và vượt quá giá trị 0.4 (tổng diện tích chồng nhau) thì #1 trong 2 box sẽ bị loại bỏ.
start = time.time() #đo thời gian thực thi của model

​LƯU Ý:  Ý nghĩa của việc đo thời gian thực thi là để giúp chúng ta tính FPS ( số lượng ảnh xử lý được trong 1 giây), để tìm cách tối ưu hoặc tính toán phù hợp cho các bài toán (thời gian thực) khác nhau.

  • Dự đoán vật thể trên các ô lưới và lưu giá trị vào 1 mảng:
for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.05:
            print(confidence)
            center_x = int(detection[0] * Width)
            center_y = int(detection[1] * Height)
            w = int(detection[2] * Width)
            h = int(detection[3] * Height)
            x = center_x - w / 2
            y = center_y - h / 2
            class_ids.append(class_id)
            confidences.append(float(confidence))
            boxes.append([x, y, w, h])

  • ​Lấy ngưỡng của các dự đoán.
indices = cv2.dnn.NMSBoxes(boxes, confidences, conf_threshold, nms_threshold)
  • Lưu giá trị các bounding box và vẽ các bounding box lên hình.
Result = ""
for i in indices:
    i = i[0]
    box = boxes[i]
    x = box[0]
    y = box[1]
    w = box[2]
    h = box[3]
    textpredict = "{} {} {} {} {} {}\n".format(str(class_ids[i]), confidences[i], x, y, x+w, y+h)
    Result += textpredict
savePredict(pathDirection, name, Result)
  • Vẽ các bounding box lên hình và show hình.
scale_percent = 50
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
image = cv2.resize(src=image, dsize=(width,height))
cv2.imshow("object detection", image)
  • Kết thúc đo thời gian thực thi và in thời gian thực thi lên màn hình.
end = time.time()
print("YOLO Execution time: " + str(end-start))
cv2.waitKey()

Nếu lười tìm hiểu code giống mình và muốn mì ăn liền, các bạn có thể tải code ở đây 😀 

Sau khi chạy code YOLOv4_detect.py. Kết quả sẽ hiển thị

Ngoài ra các bạn có thể sử dụng code Object detection từ bài của anh Thắng ( miai.vn) theo bài này và code ở đây

LƯU Ý: điểm khác biệt là: anh Thắng sử dụng thư viện argparse để gọi các file từ terminal, việc thử với nhiều lần khiến mình cảm thấy mất thời gian đổi tên ảnh từ terminal nên mình đã modify và sửa trưc tiếp vào trong code. Còn nội dung và phương pháp thì giống nhau nhé 😀

Bài hướng dẫn đến đây là hết. Chúc các bạn có thể thực hiện thành công.

 

Bài viết tham khảo bài viết

www.miai.vn/2019/08/05/yolo-series-1-su-dung-yolo-de-nhan-dang-doi-tuong-trong-anh/

9 thoughts on “Series YOLOv4: #2 Nhận dạng vật thể sau khi đào tạo – Predict object detection by YOLOv4

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 *