【问题标题】:Why is my HAAR-Cascade Model not accurate? Python + OpenCV为什么我的 HAAR 级联模型不准确? Python + OpenCV
【发布时间】:2021-10-21 16:04:17
【问题描述】:

我正在使用 Cascade Trainer GUI 来获取 XML 文件。我有 100 张正面图像和 400 张负面图像。训练过程只用了5分钟左右,结果并不准确。我训练模型的对象是一把小螺丝刀。生成的 .xml 文件只有 31.5 KB。请看图片。 enter image description here

另外,照片中的矩形很小,更别说不准确了。

除了添加更多的正面和负面图像之外,我应该怎么做才能创建更准确的模型?我最终还需要进行图像跟踪。谢谢

#import numpy as np
import cv2
import time
"""
This program uses openCV to detect faces, smiles, and eyes. It uses haarcascades which are public domain. Haar cascades rely on
xml files which contain model training data. An xml file can be generated through training many positive and negative images. 
Try your built-in camera with 'cap = cv2.VideoCapture(0)' or use any video. cap = cv2.VideoCapture("videoNameHere.mp4")
"""

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
smile = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_smile.xml')
screw = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX

prev_frame_time, new_frame_time = 0,0
while 1:
    ret, img = cap.read()
    img = cv2.resize(img,(1920,1080))
    #faces = face_cascade.detectMultiScale(img, 1.5, 5)
    #eyes = eye_cascade.detectMultiScale(img,1.5,6)
  #  smiles = smile.detectMultiScale(img,1.1,400)
    screws = screw.detectMultiScale(img,1.2,3)

    new_frame = time.time()
    try:
        fps = 1/(new_frame_time-prev_frame_time)
    except:
        fps = 0
    fps = int(fps)
    cv2.putText(img,"FPS: "+str(fps),(10,450), font, 3, (0,0,0), 5, cv2.LINE_AA)

   # for (x,y,w,h) in smiles:
        #cv2.rectangle(img,(x,y),(x+w,y+h),(0,69,255),2)
       # cv2.putText(img,"smile",(int(x-.1*x),int(y-.1*y)),font,1,(255,255,255),2)

    for (x,y,w,h) in screws:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,255),2)
        cv2.putText(img,"screwdriver",(int(x-.1*x),int(y-.1*y)),font,1,(255,0,255),2)
  
   # for (x,y,w,h) in faces:
       #  cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
       #  cv2.putText(img,"FACE",(int(x-.1*x),int(y-.1*y)),font,1,(255,255,255),2)
      #  roi_color = img[y:y+h, x:x+w]
       # eyes = eye_cascade.detectMultiScale(roi_color)
       # for (ex,ey,ew,eh) in eyes:
          #  cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    
    
    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
    prev_frame_time = new_frame_time

cap.release()
cv2.destroyAllWindows()

【问题讨论】:

    标签: python opencv computer-vision haar-classifier


    【解决方案1】:

    关于该主题的大多数资源都推荐 3000-5000 张正片和负片图像。这很可能是准确性较低的原因。

    一些资源:

    1. Link 1 - sonots
    2. Link 2 - opencv-user-blog
    3. Link 3 - computer vision software
    4. Link 4 - pythonprogramming.net

    【讨论】:

    • 编辑:我已经基本解决了这个问题。我的主要问题是我的正面图像没有被裁剪。为了获得准确的模型,您需要在将每张图像输入训练之前,一张一张地裁剪它们。添加更多相关的负面图像也有帮助。最终的 xml 文件大约 43 KB,包含约 600 个 CROPPED 正图像和约 1200 个负图像
    【解决方案2】:

    如果您上面的图片是“典型”图片,那么它永远无法使用级联。

    那些需要可靠的纹理和姿势,你的场景缺少这两者。

    (我也猜想,你并没有真的有 100 张正面图像,而是你试图从几张或一张图像中“合成”它们,但事实证明这在现实生活中行不通)

    不要在这上面浪费更多时间。 获取更多(真实!)图像,并阅读对象检测 cnn 的内容,如 SSD 或 YOLO,它们在您的情况下更加稳健。

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2019-01-21
      • 2012-03-02
      相关资源
      最近更新 更多