Phát hiện vật thể – P2: thực hành

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.

Trong thư mục ảnh âm có file _create_bg_file.bat. Các bạn chạy file đó để tạo ra file bg.txt có chứa đường dẫn tuyệt đối (để tránh lỗi tìm không thấy file)

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à bug của phiên bản Opencv 2.x.x, các bạn download Opencv 3.x.x sẽ hết lỗ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 độ chính xác bằng tool

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.

cascade.xml (22KB)
Download Cascade Analytics

Code detect object C++

Code detect object Python

https://github.com/opencv/opencv/blob/master/samples/python/facedetect.py

13 Responses to Phát hiện vật thể – P2: thực hành

  1. lunitto says:

    thưa anh, em training xong rồi, giờ muốn sd file xml đó thì ta làm như nào ạ :))

    • vohungvi says:

      Mình mới vừa thêm link của chương trình Cascade Analytics và source code rồi nhé bạn

    • lunitto says:

      em dùng đoẠN CODE C++ trên kia mà nó ko đc anh ạ

    • lunitto says:

      em dùng đoạn code này của python thì vẫn khoanh đc vùng biển số

      import cv2

      # load classifier
      classifier = cv2.CascadeClassifier(‘cascade.xml’)

      # load image
      img = cv2.imread(‘oto.jpg’)

      # convert image to grayscale
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

      # detect faces
      faces = classifier.detectMultiScale(gray, 1.4, 3)

      # draw rectangles on image for every detected face
      for (x,y,w,h) in faces:
      img = cv2.rectangle(img, (x,y), (x+w,y+h), (455, 0, 0), 4)
      print(x, y, w, h)

      cv2.imwrite(‘test_sv.jpg’, img)
      cv2.imshow(‘out’, img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

  2. Chuc Tran says:

    anh ơi cho em hỏi lỗi này là gì ạ:
    OpenCV Error: Insufficient memory (Failed to allocate 1073740800 bytes) in cv::OutOfMemoryError, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\alloc.cpp, line 52
    OpenCV Error: Assertion failed (u != 0) in cv::Mat::create, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\matrix.cpp, line 411

    • vohungvi says:

      Bạn kiểm tra xem có đủ RAM không

    • Chuc Tran says:

      dạ em thưa anh, nếu trong trường hợp em đang train em yêu cầu 18 Stage mà nó chỉ chạy đến Stage 13 xong ra thông báo như này thì đã train thành công chưa ạ
      Required leaf false alarm rate achieved. Branch training terminated.

    • vohungvi says:

      Vậy là train thành công rồi đó bạn, vào thư mục train sẽ thấy file cascade.xml. Còn lý do không đủ stage là do bộ ảnh dương của bạn quá ít (dưới 1000)

    • Chuc Tran says:

      dạ vâng. Em cảm ơn anh ạ!

    • Chuc Tran says:

      anh ơi, cho em hỏi là khi em train thành công rồi nhưng khi chạy chương trình nó lại không thể load được file cascade.xml là sao ạ.Em đã chỉ rõ đường dẫn của file xml khi gọi hàm load rồi ạ.

    • vohungvi says:

      nó báo lỗi gì bạn?

  3. Minh Trương says:

    anh ơi cho em hỏi đây là lỗi gì ạ:

    F:\opencv\build\x64\vc15\bin>opencv_traincascade.exe -data E:\train -vec E:\bien.vec -bg C:\Users\DELL\Desktop\hoa-anh-am\bg.txt -numPos 49 -numNeg 25 -w 30 -h 20 -featureType LBP -mode ALL
    PARAMETERS:
    cascadeDirName: E:\train
    vecFileName: E:\bien.vec
    bgFileName: C:\Users\DELL\Desktop\hoa-anh-am\bg.txt
    numPos: 49
    numNeg: 25
    numStages: 20
    precalcValBufSize[Mb] : 1024
    precalcIdxBufSize[Mb] : 1024
    acceptanceRatioBreakValue : -1
    stageType: BOOST
    featureType: LBP
    sampleWidth: 30
    sampleHeight: 20
    boostType: GAB
    minHitRate: 0.995
    maxFalseAlarmRate: 0.5
    weightTrimRate: 0.95
    maxDepth: 1
    maxWeakCount: 100
    Number of unique features given windowSize [30,20] : 9135

    ===== TRAINING 0-stage =====
    Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
    > ) in CvCascadeImageReader::PosReader::get, file c:\build\master_winpack-build-win64-vc15\opencv\apps\traincascade\imagestorage.cpp, line 158

    • vohungvi says:

      Mình không biết bước 1 (tạo sample) của bạn thành công không, tuy nhiên thấy số lượng ảnh của bạn quá ít, tốt nhất từ 300 trở lên

Leave a Reply