Professional Documents
Culture Documents
Bài toán phát hiện biển số xe máy Việt Nam
Bài toán phát hiện biển số xe máy Việt Nam
Chuẩn bị dữ liệu
Đánh giá bộ dữ liệu: dữ liệu kèm theo
Cách 1: Thu nhỏ kích thước biển bằng cách thêm biên kích thước ngẫu
nhiên vào ảnh gốc, sau đó resize ảnh bằng kích thước ảnh ban đầu.
Cách 2: Crop ảnh chứa biển số với kích thước ngẫu nhiên, sau đó resize
ảnh bằng kích thước ảnh ban đầu.
# Cách1
"""
image = cv2.imread(image_path)
#sau đó resize ảnh bằng kích thước ban đầu của ảnh
cv2.imwrite(output_path, image)
Ảnh thu được (bên phải) sau khi chạy hàm trên
# Cách2
image = cv2.imread(image_path)
cv2.imwrite(out_path, cropped_image)
Ảnh thu được (bên phải) sau khi chạy hàm trên
Thay đổi độ sáng của ảnh
def change_brightness(image_path, output_path, value):
"""
"""
img=cv2.imread(image_path)
h, s, v = cv2.split(hsv)
v = cv2.add(v, value)
v[v < 0] = 0
cv2.imwrite(output_path, img)
"""
"""
image = cv2.imread(image_path)
cv2.imwrite(output_path, img_rot)
Trong bài toán sử dụng mô hình YOLO, mình lưu file annotation dưới dạng .txt.
Trong đó: <x> <y> <width> <height> tương ứng là tọa độ trung tâm và kích
thước của đối tượng. Các giá trị này đã được chuẩn hóa lại, do vậy giá trị luôn
nằm trong đoạn [0,1]. object-class là chỉ số đánh dấu các classes.
Lưu ý: Với bài toán có nhiều nhãn, nhiều người cùng gán nhãn thì cần thống
nhất với nhau trước về thứ tự nhãn. Nguyên nhân do trong file annotation chỉ
lưu chỉ số (0,1,3,4,…) của nhãn chứ không lưu tên nhãn.
Sau khi gán nhãn xong các bạn để file annotation và ảnh tương ứng vào cùng
một thư mục.
Huấn luyện mô hình
Giới thiệu về YOLO-Tinyv4 và darknet
YOLO-Tinyv4
YOLOv4 là thuật toán Object Detection, mới được công bố trong thời gian gần
đây với sự cải thiện về kết quả đáng kể so với YOLOv3.
Y
OLO-Tinyv4 trên các nền tảng, nguồn.
Darknet
Darknet là một framework open source chuyên về Object Detection được viết
bằng ngôn ngữ C và CUDA. Darknet dùng để huấn luyện các mô hình YOLO
một cách nhanh chóng, dễ sử dụng.
Nội
dung trong thư mục vừa clone về
Bước 2: Sửa file Makefile trong thư mục vừa clone về
Tạo file yolo-tinyv4-obg.cfg với nội dung tương tự file yolov4-tiny.cfg trong
thư mục darknet/cfg, sau đó chỉnh sử một số dòng:
Dòng 6: Thay đổi batch=64. Nghĩa là: batch = số ảnh (cả file annotation)
được đưa vào huấn luyện trong một batch.
Dòng 7: Thay đổi subdivisions=16. Trong một batch được chia thành
nhiều block, mỗi block chứa batch/subdivisions ảnh được đưa vào GPU
xử lý tại một thời điểm. Weights của mô hình được update sau mỗi batch.
Dòng 20: Thay đổi max_batches=classes2000, không nhỏ hơn số ảnh
trong tập huấn luyện, và không nhỏ hơn 6000 (theo đây}). VD:
max_batches=6000.
Dòng 22: Thay đổi steps= 80%, 90% max_batches. VD:
steps=4800,5400. Sau khi huấn luyện được 80%, 90% max_batches,
learning_rate sẽ được nhân với một tỷ lệ (dòng 23 trong file), mặc định là
0.1.
Thay đổi classes=1 trong mỗi layer [yolo], dòng 217, 266.
Thay đổi filters trong mỗi layer [convolutional] trước layer [yolo] theo
công thức filters=(số class+5)*3. Trong bài toán này filters=18.
Chi tiết ý nghĩa của các tham số trong file cfg, bạn đọc có thể xem tại đây.
Bước 4: Tạo file obj.names chứa tên của các class, sau đó lưu trong thư mục
darknet/data.
Bước 8: Nén thư mục darknet thành file darknet.zip, sau đó đưa lên Google
Drive.
#Sau khi mount với drive. Chuyển đến thư mục chứa file darknet.zip vừa tải lên
cd drive/My\ Drive
!unzip darknet.zip
cd darknet
#Tạo thư mục backup để lưu lại weights khi huấn luyện
#Tên thư mục phải trùng với link folder backup trong file obj.data trên
!mkdir backup
import numpy as np
lst_files = os.listdir("data/obj/")
lst_images = []
lst_images.append(file)
with open("data/train.txt","w") as f:
f.write("data/obj/"+lst_images[idx]+"\n")
f.write("data/obj/"+lst_images[idx]+"\n")
#Biên dịch darknet (chỉ cần biên dịch một lần, lần sau dùng bỏ qua bước này)
!make
!chmod +x ./darknet
!./darknet detector train [data config file] [model config file] [pre-trained
weights]
-map: Dùng để hiển thị mAP được tính trên tập validation.
ch
art.png
Nhận xét: Quá trình huấn luyện hội tụ rất nhanh. Vì vậy có thể dừng sớm sau
2000 batches.
Dự đoán
Sau khi huấn luyện xong, toàn bộ weights sẽ được lưu trong folder backup.
!ls backup/
Để dự báo một bức ảnh sử dụng cú pháp:
!./darknet detector test [data config file] [model config file] [best-weights]
[image path]
backup/yolo-tinyv4-obj_best.weights test1.jpg
#Hàm sau được dùng để hiển thị kết quả dự đoán lên colab
def show(path):
import cv2
image = cv2.imread(path)
, interpolation = cv2.INTER_CUBIC)
plt.figure(figsize=(20,10))
plt.axis("off")
plt.imshow(resized_image)
plt.show()
show("predictions.jpg")
Kết quả dự
đoán