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.exe -info E:\GreenParking\location.txt -vec GreenParking.vec -w 30 -h 20 -num 1749

Ý nghĩa lệnh: bạn tạo file vecto tên là GreenParking.vec chứa 1749 ả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.exe -data E:\train -vec GreenParking.vec -bg E:\negatives\bg.txt -numPos 1700 -numNeg 3000 -w 30 -h 20 -featureType LBP

Ý nghĩa lệnh: huấn luyện để tạo file E:\train\cascade.xml, với 1700 ảnh dương và 3000 ảnh âm, với 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

Lưu ý là khi tạo mẫu thì 1749 nhưng khi huấn luyện chỉ dùng 1700, điều đó giúp cho chương trình chạy không bị crash. Số lượng ảnh phải giảm đi tùy vào bộ ảnh.


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

26 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

  4. Pham Hoang Thai Loc says:

    > opencv_createsamples -info E:\GreenParking\location.txt -vec GreenParking.vec -w 30 -h 20 -num 3500
    em chạy câu lệnh trên nhưng bị lỗi ở tham số -num 3500, báo lỗi như sau:
    >OpenCV(3.4.5) Error: Bad argument (> Can not get new positive sample. The most possible reason is insufficient count >of samples in given vec-file.
    em chỉnh sửa -num thành <= 1749 (số file ảnh dương thực tế) thì chạy được, em nghĩ giá trị tham số 3500 hình như có vấn đề phải không anh?

  5. Chương Lâm says:

    Em bị lỗi như thế này thì sửa như thế nào ạ???

    C:\opencv\build\x64\vc15\bin>opencv_traincascade -data D:\train -vec D:\GreenParking.vec -bg D:\negatives\bg.txt -numPos 1748 -numNeg 3000 -w 30 -h 20 -featureType LBP -mode ALL
    ———————————————————————————
    Training parameters are pre-loaded from the parameter file in data folder!
    Please empty this folder if you want to use a NEW set of training parameters.
    ———————————————————————————
    PARAMETERS:
    cascadeDirName: D:\train
    vecFileName: D:\GreenParking.vec
    bgFileName: D:\negatives\bg.txt
    numPos: 1748
    numNeg: 3000
    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

    Stage 0 is loaded

    ===== TRAINING 1-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\3_4_winpack-build-win64-vc15\opencv\apps\traincascade\imagestorage.cpp, line 158

  6. Hoa Nguyen says:

    anh ơi em bị lỗi như thế này thì sửa như thế nào ạ???
    C:\Users\Admin>C:\Users\Admin\Downloads\Programs\opencv\build\x64\vc12\bin\opencv_traincascade.exe
    Usage: C:\Users\Admin\Downloads\Programs\opencv\build\x64\vc12\bin\opencv_traincascade.exe
    -data
    -vec
    -bg
    [-numPos ]
    [-numNeg ]
    [-numStages ]
    [-precalcValBufSize ]
    [-precalcIdxBufSize ]
    [-baseFormatSave]
    –cascadeParams–
    [-stageType ]
    [-featureType ]
    [-w ]
    [-h ]
    –boostParams–
    [-bt ]
    [-minHitRate = 0.995>]
    [-maxFalseAlarmRate ]
    [-weightTrimRate ]
    [-maxDepth ]
    [-maxWeakCount ]
    –haarFeatureParams–
    [-mode C:\Users\Admin\Downloads\Programs\opencv\build\x64\vc12\bin\opencv_traincascade.exe-data D:\output -vec D:\bienso.vec -bg C:\Users\Admin\Desktop\anhsai\list.txt -numPos 15 -numNeg 13 -numStage 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -w 134 -h 118
    ‘C:\Users\Admin\Downloads\Programs\opencv\build\x64\vc12\bin\opencv_traincascade.exe-data’ is not recognized as an internal or external command,
    operable program or batch file.

    • vohungvi says:

      opencv_traincascade.exe-data dính nhau nên không chạy được, bạn thêm khoảng trắng phía sau exe

    • Hoa Nguyen says:

      e cảm ơn anh!e sử được lỗi đó rồi ạ.nhưng giờ e bị lỗi này thì sử như nào ạ??
      C:\Users\Admin>C:\Users\Admin\Desktop\OPENCV\caidatopencv\build\x64\vc12\bin\opencv_traincascade.exe -data D:\train -vec bienso.vec -bg C:\Users\Admin\Desktop\ML\anhsai\list.txt -numPos 15 -numNeg 13 -w 135 -h 120 -featureType LBP -mode ALL
      Training parameters are loaded from the parameter file in data folder!
      Please empty the data folder if you want to use your own set of parameters.
      PARAMETERS:
      cascadeDirName: D:\train
      vecFileName: bienso.vec
      bgFileName: C:\Users\Admin\Desktop\ML\anhsai\list.txt
      numPos: 15
      numNeg: 13
      numStages: 20
      precalcValBufSize[Mb] : 256
      precalcIdxBufSize[Mb] : 256
      stageType: BOOST
      featureType: LBP
      sampleWidth: 135
      sampleHeight: 120
      boostType: GAB
      minHitRate: 0.995
      maxFalseAlarmRate: 0.5
      weightTrimRate: 0.95
      maxDepth: 1
      maxWeakCount: 100

      ===== TRAINING 0-stage =====

      Parameters can not be written, because file D:\train/params.xml can not be opened.

    • vohungvi says:

      Lỗi này do bạn chưa tạo folder D:\train

  7. Lê Võ Thanh Phong says:

    Cho em hỏi tại sao chọn “-featureType LBP” mà lại có thêm “-mode ALL” ạ?
    Lệnh -mode em đọc trên trang OpenCV thì nó ghi là lệnh chọn kiểu cho HAAR
    Em cảm ơn!

Leave a Reply