2017-03-29 1 views
0

Bonjour à tous, Je travaille sur un programme de détection humaine en utilisant OpenCV en utilisant Python. J'ai vu this very good example et je l'ai couru sur les échantillons qu'il avait. Il peut détecter les personnes peu importe où ils sont confrontés et a une détection de chevauchement décent ainsi que des mouvements flous. Cependant, lorsque je l'ai exécuté sur certaines images que j'ai eues (la plupart du temps, des photos de personnes au niveau du genou, de la taille et du buste), j'ai découvert que le logiciel ne détecte pas tout le monde. Vous pouvez obtenir le photos from this link. C'est le code que j'utilise:OpenCV 3 Python - Détection humaine partielle?

# import the necessary packages 
    from __future__ import print_function 
    from imutils.object_detection import non_max_suppression 
    from imutils import paths 
    import numpy as np 
    import argparse 
    import imutils 
    import cv2 

    ap = argparse.ArgumentParser() 
    ap.add_argument("-i", "--images", required=True, help="path to images directory") 
    args = vars(ap.parse_args()) 

    # initialize the HOG descriptor/person detector 
    hog = cv2.HOGDescriptor() 
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 

    # loop over the image paths 
    imagePaths = list(paths.list_images(args["images"])) 
    for imagePath in imagePaths: 
      # load the image and resize it to (1) reduce detection time 
      # and (2) improve detection accuracy 
      image = cv2.imread(imagePath) 
      image = imutils.resize(image, width=min(400, image.shape[1])) 
      orig = image.copy() 

      # detect people in the image 
      (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4), 
        padding=(8, 8), scale=1.05) 

      # draw the original bounding boxes 
      for (x, y, w, h) in rects: 
        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2) 

      # apply non-maxima suppression to the bounding boxes using a 
      # fairly large overlap threshold to try to maintain overlapping 
      # boxes that are still people 
      rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) 
      pick = non_max_suppression(rects, probs=None, overlapThresh=0.65) 

      # draw the final bounding boxes 
      for (xA, yA, xB, yB) in pick: 
        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2) 

      # show some information on the number of bounding boxes 
      filename = imagePath[imagePath.rfind("/") + 1:] 
      print("[INFO] {}: {} original boxes, {} after suppression".format(
        filename, len(rects), len(pick))) 

      # show the output images 
      cv2.imshow("Before NMS", orig) 
      cv2.imshow("After NMS", image) 
      cv2.waitKey(0) 

C'est assez simple. Il parcourt les images, trouve les personnes dedans, puis dessine des rectangles de délimitation. Si les rectangles se chevauchent, ils sont réunis pour éviter les faux positifs et détecter plus d'une personne dans une seule personne.

Cependant, comme je l'ai mentionné ci-dessus, le code ne reconnaît pas les gens si des parties de leurs pieds ne sont pas présents.

Existe-t-il un moyen de faire en sorte qu'OpenCV reconnaisse les personnes qui n'ont qu'une partie de leur corps (genou, taille, poitrine vers le haut) présentes dans une vidéo? Dans mes scénarios de cas d'utilisation, je ne pense pas qu'il sera essentiel de rechercher les bras et les jambes, tant que le torse et la tête sont présents, je devrais être capable de le voir.

Toute avance serait très appréciée.

+0

Vous pouvez utiliser les cascades Haar, qui ont déjà été entraînées pour la détection du haut du corps. Voir [ici] (http://stackoverflow.com/a/31834603/5008845) et ses liens – Miki

+0

@Miki il semble que Haar Cascades qui ont été formés pour la détection du haut du corps ne peut détecter le haut du corps que si tout le corps est vu ? Je cherche peut-être un fichier différent de cascade haar xml. – Razgriz

+0

Cela n'a pas beaucoup de sens pour moi ... Mais je ne les ai jamais utilisés, donc je ne peux pas dire avec certitude – Miki

Répondre

0

J'ai trouvé la cascade du haut du corps du haar. Bien que cela ne fonctionne pas toujours (je vais poster une nouvelle question à ce sujet), c'est un bon début.

Voici le code:

import numpy as np 
import cv2 

img = cv2.imread('path/to/img.jpg',0) 

upperBody_cascade = cv2.CascadeClassifier('../path/to/haarcascade_upperbody.xml')  

arrUpperBody = upperBody_cascade.detectMultiScale(img) 
if arrUpperBody !=(): 
     for (x,y,w,h) in arrUpperBody: 
      cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 
     print 'body found' 

cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Mais ce n'est pas aussi raffiné que la solution que je soulevai hors de pyimagesearch.