Top Ad unit 728 × 90


Phát Hiện Nhận Dạng Đối Tượng (Lý Thuyết Và Thực Hành)

PHẦN 1:
Phát hiện đối tượng là để trả lời câu hỏi: “Đối tượng cần tìm có ở trong ảnh hay không?” và “Nếu có thì nằm ở vị trí nào?”
Trong các phương pháp tìm đối tượng hiện nay có Haar cascade là phương pháp phổ biến nhất. Quy trình bao gồm:
Bước 1: Dùng tool của Opencv cung cấp để rút trích đặc trưng của đối tượng (gọi là haar-like) vào tập dữ liệu (*.xml). Đó là các đặc trưng đường chéo, đường ngang, đường dọc của đối tượng.
Bước 2: Viết chương trình để tìm đối tượng, thuật toán như sau: lần lượt quét qua các vùng trên ảnh để tìm đối tượng. Đối tượng nào có đặc trưng giống với tập dữ liệu & thoả mãn các tham số thì xem như đó là đối tượng cần tìm.

Bước 1: Rút trích đặc trưng

Bước này còn được gọi là huấn luyện (training)
Bạn cần chuẩn bị 2 bộ ảnh, một bộ ảnh có chứa đối tượng gọi là ảnh dương, bộ còn lại là những ảnh bất kỳ không chứa đối tượng gọi là ảnh âm. Số lượng ảnh âm & dương càng nhiều thì độ chính xác càng cao & thời gian huấn luyện càng lâu.
Ví dụ
Bạn muốn tạo tập dữ liệu nhận diện biển số xe, bạn cần khoảng 2000 ảnh biển số & 1000 ảnh không chứa biển số (có thể là ảnh hoa lá cành...)
Tiếp theo, bạn phải chỉ định rõ vị trí hình chữ nhật chứa đối tượng cần tìm và lưu vào file chỉ mục, có 2 cách thực hiện:
    – Crop ảnh chỉ lấy vùng chữ nhật chứa đối tượng: file chỉ mục chỉ chứa tên file ảnh
    – Ghi lại thông số x y width height của vùng chữ nhật vào file: file chỉ mục gồm tên file ảnh, số vùng chữ nhật trong ảnh và các toạ độ x y width height
Mình có viết tool Object Locator để giúp bạn thực hiện bước trên
Khi đã có file chỉ mục, các bạn sẽ làm 2 bước để tạo tập dữ liệu (*.xml), thuật toán của 2 bước này được viết sẵn:
– Bước 1.1: dùng opencv_createsamples.exe tạo file vecto chứa ảnh thumbnail của vùng hình chữ nhật. Bước này nhanh, 2000 ảnh mất chưa tới 1 phút.
– Bước 1.2: dùng opencv_traincascade.exe lấy ảnh trong file vecto đặt ngẫu nhiên vào các ảnh âm để rút trích các đặc trưng. Bước này chậm, 2000 ảnh mất từ 1 ngày đến 1 tuần tuỳ theo độ chính xác các bạn yêu cầu
Hoàn thành 2 bước này bạn sẽ có file xml

Bước 1.1 tạo file vecto

Đầu tiên các bạn tìm chương trình opencv_createsamples.exe trong lib Opencv theo đường dẫn opencv300\build\bin\Release và truyền các tham số sau:
-info file chỉ mục mà bạn đã tạo
-img khi bạn chỉ có 1 ảnh dương (như là logo cty chẳng hạn) thì bỏ qua tham số -info và truyền tên file ảnh vào đây
-vec file output cho bước tiếp theo
-bg file ảnh âm khi bạn chỉ có 1 ảnh dương
-num số lượng file ảnh dương
-bgcolor khi bạn không chỉ định ảnh âm thì có thể chỉ định 1 màu để làm ảnh âm
-inv -randinv -bgthresh -maxidev -maxxangle -maxyangle -maxzangle các tham số để tạo thêm các ảnh ngẫu nhiên bằng cách xoay trong không gian 3 chiều
-show hiện ảnh trong quá trình tạo mẫu
-w chiều rộng của mẫu được tạo
-h chiều cao của mẫu được tạo
Ví dụ: opencv_createsamples.txt -vec D:\bienso.vec -info D:\plate_image\positive\location.txt -num 2000 -w 40 -h 30
Chương trình sẽ tạo file D:\bienso.vec có chứa 2000 ảnh thumbnail, mỗi ảnh có kích thước 40 x 30 pixels.

Bước 1.2 huấn luyện

Các bạn lấy file opencv_traincascade.exe truyền các tham số sau (do nhiều tham số nên mình chỉ ghi các tham số quan trọng):
-data Thư mục rỗng dành để chứa các step và các file tạm trong quá trình huấn luyện, file xml thu được cũng nằm trong này
-vec file vec bạn tạo ở bước 1.1
-bg file text chứa danh sách các file ảnh âm
-numPos số lượng ảnh dương
-numNeg số lượng ảnh âm
-numStage số lượng bước huấn luyện bạn muốn, càng lớn (14 -> 20) thì thời gian huấn luyện càng lâu và kết quả càng chính xác
-w chiều rộng của mẫu được tạo (ở bước 1.1 bao nhiêu thì ở đây cũng vậy)
-h chiều cao của mẫu được tạo (ở bước 1.1 bao nhiêu thì ở đây cũng vậy)
-minHitRate tỉ lệ chính xác của ảnh dương. ,
-maxFalseAlarmRate tỉ lệ cho phép sai số tối đa của ảnh âm.
Ví dụ: opencv_traincascade.exe -data D:\output -vec D:\bienso.vec -bg D:\plate_image\negative\list.txt -numPos 2000 -numNeg 1000 -numStage 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -w 40 -h 30
Chương trình sẽ tạo file D:\output\output.xml chứa các đặc trưng của biển số xe. Khi bạn thử nghiệm độ chính xác của chương trình, cứ mỗi 1000 ảnh cho rằng là ảnh dương phải đúng 995 ảnh và cứ mỗi 1000 ảnh cho rằng là ảnh âm chỉ được sai 500 ảnh.
Các file xml được huấn luyện sẵn nằm trong lib opencv theo đường dẫn: opencv300\sources\data\haarcascades hoặc các bạn có thể search trên Internet

Bước 2: Sử dụng tập dữ liệu để phát hiện đối tượng

Trước khi thực hiện thuật toán phát hiện đối tượng, ảnh phải chuyển sang ảnh xám (gray). Đồng thời cũng câng bằng sáng (equalize hist) để ảnh được đồng nhất về độ tương phản, không bị ảnh hưởng bởi ánh sáng môi trường.
Chương trình sẽ quét qua toàn bộ ảnh để so sánh với tập dữ liệu. Lần đầu tiên sẽ lấy hình chữ nhật kích thước bằng max-size được chỉ định hoặc bằng kích thước ảnh, sau đó thu nhỏ lại theo tỉ lệ được chỉ định rồi lại so sánh với tập dữ liệu, cứ như thế cho đến khi vùng quét bằng kích thước min-size thì dừng.

Để sử dụng, bạn cần load data từ file xml, sau đó dùng hàm detectMultiScale để tìm đối tượng trong ảnh. Các tham số bao gồm: ảnh input, các vùng chữ nhật được cho là chứa đối tượng, tỉ lệ vùng chữ nhật được thu nhỏ sau mỗi lần quét, số khung hình chữ nhật trùng nhau tối thiểu để được xem là 1 đối tượng, phương thức quét, kích cỡ tối thiểu, kích cỡ tối đa.
PHẦN 2:
Trong bài này sẽ hướng dẫn các bạn nhận diện biển số xe máy. Đây là đề tài khá hấp dẫn vì mang tính thực tiễn cao, mặc dù đã nhiều người làm tuy nhiên độ chính xác chưa đạt được mức thương mại.
Để huấn luyện được Cascade thì các bạn nên đọc và hiểu hết lý thuyết trong phần 1 để dễ dàng thay đổi, tinh chỉnh các thiết lập, và cũng hiểu được các bộ dữ liệu mình chuẩn bị sẵn cho các bạn.
Nếu bạn không biết dùng command line, không biết cấu trúc của OpenCV thì bạn nên tìm hiểu trước khi đọc tiếp.

Các công cụ cần thiết

1. OpenCV 2.4.9 Đây là phiên bản ổn định (stable), các bạn có thể dùng phiên bản cao hơn vẫn ok
2. Tập dữ liệu dương: mình sử dụng bộ ảnh của công ty Green Parking. Trong file zip chứa 1749 ảnh
3. Tập dữ liệu âm: bao gồm 3000 hình ảnh bất kỳ không chứa biển số xe
4. Object locator: dùng để khoanh vùng đối tượng
5. Cascade analytics: dùng để đánh giá độ chính xác sau khi huấn luyện xong

Bắt đầu thực hiện

Các bước thực hiện như sau:
  1. Khoanh vùng đối tượng bằng tool Object locator
  2. Tạo tập ảnh sample bằng tool opencv_createsamples
  3. Huấn luyện bằng tool opencv_traincascade

Bước 1: Khoanh vùng đối tượng

Các bạn dùng tool Object locator vẽ hình chữ nhật bao lấy đối tượng, sau khi làm xong các bạn sẽ được file location.txt nằm trong thư mục chứa ảnh.
Mình đã tạo sẵn file location.txt cho các bạn. Và trong thư mục ảnh âm mình cũng có tạo file bg.txt chứa danh sách các file ảnh âm

Bước 2: Tạo tập ảnh samples

Dùng lệnh sau để tạo tập ảnh
opencv_createsamples -info E:\GreenParking\location.txt -vec GreenParking.vec -w 30 -h 20 -num 3500
Ý nghĩa lệnh: bạn tạo file vecto tên là GreenParking.vec chứa 3500 ảnh crop biển số, mỗi ảnh có kích thước 30×20 pixels.

Bước 3: Huấn luyện

Tạo folder để chứa dữ liệu các bước huấn luyện, mình tạo folder E:\train
Dùng lệnh sau để huấn luyện
opencv_traincascade -data E:\train -vec GreenParking.vec -bg E:\negatives\bg.txt -numPos 3000 -numNeg 3000 -w 30 -h 20 -featureType LBP -mode ALL
Ý nghĩa lệnh: huấn luyện để tạo file E:\train\cascade.xml, với 3000 ảnh dương và 3000 ảnh âm, kích thước bằng kích thước samples đã được tạo, sử dụng LBP feature vì kết quả chính xác tương đương Haar feature nhưng lại nhanh hơn rất nhiều, phù hợp cho việc thử nghiệm
Khi huấn luyện chương trình sẽ hiển thị như thế này
Có 1 mẹo ở đây là tạo 3500 samples nhưng khi huấn luyện chỉ dùng 3000, điều đó giúp cho chương trình chạy không bị crash, lý do sẽ được giải thích sau khi bạn đã làm được bài này

Với câu lệnh như vậy mình huấn luyện trên máy CPU Intel core i5 2500 mất hơn 3 giờ

Kiểm tra kết quả

Sau khi huấn luyện xong bạn sẽ được file E:\train\cascade.xml, dùng chương trình Cascade analytics để đánh giá độ chính xác. Mình đã test thử file kết quả thì độ phát hiện được 2848/3536 ảnh.
PHẦN 3:  Phát hiện xe hơi trên đường bằng Haar Cascade
Chương trình này sử dụng Haar Cascade để phát hiện xe hơi đang chạy trên đường cao tốc. Đầu vào là ảnh hoặc video, chương trình sẽ tìm và vẽ khung hình chữ nhật bao lấy đối tượng. Đây là phần mềm demo cho thuật toán dùng Cascade, còn các thuật toán khác cũng chạy tốt như Background Subtraction
Để hiểu được thuật toán của chương trình, cách tạo ra file cascade bạn cần đọc 2 bài này:
Phát hiện đối tượng- P1: Lý thuyết
Phát hiện đối tượng – P2: thực hành
Để sử dụng các bạn chạy file với cú pháp
VehicleDetector.exe < input image or video file >
Hoặc các bạn có thể chạy file VehicleDetector.bat
Phát Hiện Nhận Dạng Đối Tượng (Lý Thuyết Và Thực Hành) Reviewed by Jacky on tháng 1 30, 2018 Rating: 5

3 nhận xét:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.