-5
votes

Meilleure détection d'objet et algorithme de suivi

Je suis Newbie pour OpenCV. Je souhaite créer un algorithme de détection d'objet qui suit un joueur de football. Je veux savoir qui est ce joueur quel est son numéro de maillot. Je veux savoir est la meilleure façon de le trouver. Quel algorithme dois-je utiliser? J'ai fait un projet qui suit l'utilisateur avec la plage de couleurs dans laquelle j'ai converti chaque image vidéo en HSV code>. Mais le défi me vient à moi, c'est qu'après avoir détecté le joueur, comment puis-je trouver le numéro de maillot.

Voici mon code - P>

#Import libraries
import cv2
import os
import numpy as np

# import the necessary packages
from collections import deque
import numpy as np
import cv2
import imutils
import time


#Reading the video
vidcap = cv2.VideoCapture('football.mp4')
success,image = vidcap.read()

count = 0
success = True
idx = 0

#Read the video frame by frame
while success:
    #converting into hsv image
    hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
    #green range
    lower_green = np.array([40,40, 40])
    upper_green = np.array([70, 255, 255])
    #blue range
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    #Red range
    lower_red = np.array([0,31,255])
    upper_red = np.array([176,255,255])

    #white range
    lower_white = np.array([0,0,0])
    upper_white = np.array([0,0,255])

    #Define a mask ranging from lower to uppper
    mask = cv2.inRange(hsv, lower_green, upper_green)
    #Do masking
    res = cv2.bitwise_and(image, image, mask=mask)

    #convert to hsv to gray
    res_bgr = cv2.cvtColor(res,cv2.COLOR_HSV2BGR)
    res_gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)

    #Defining a kernel to do morphological operation in threshold image to 
    #get better output.
    kernel = np.ones((13,13),np.uint8)
    thresh = cv2.threshold(res_gray,127,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)


    #find contours in threshold image     
    im2,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    prev = 0
    font = cv2.FONT_HERSHEY_SIMPLEX

    for c in contours:
        x,y,w,h = cv2.boundingRect(c)
        #Detect players
        if(h>=(1.5)*w):
            if(w>15 and h>= 15):
                idx = idx+1
                player_img = image[y:y+h,x:x+w]
                player_hsv = cv2.cvtColor(player_img,cv2.COLOR_BGR2HSV)
                #If player has blue jersy
                mask1 = cv2.inRange(player_hsv, lower_blue, upper_blue)
                res1 = cv2.bitwise_and(player_img, player_img, mask=mask1)
                res1 = cv2.cvtColor(res1,cv2.COLOR_HSV2BGR)
                res1 = cv2.cvtColor(res1,cv2.COLOR_BGR2GRAY)

                nzCount = cv2.countNonZero(res1)
                #If player has red jersy
                mask2 = cv2.inRange(player_hsv, lower_red, upper_red)
                res2 = cv2.bitwise_and(player_img, player_img, mask=mask2)
                res2 = cv2.cvtColor(res2,cv2.COLOR_HSV2BGR)
                res2 = cv2.cvtColor(res2,cv2.COLOR_BGR2GRAY)
                nzCountred = cv2.countNonZero(res2)

                if(nzCount >= 20):
                    #Mark blue jersy players as france
                    cv2.putText(image, 'France', (x-2, y-2), font, 0.8, (255,0,0), 2, cv2.LINE_AA)
                    cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),3)
                else:
                    pass
                if(nzCountred>=20):
                    #Mark red jersy players as belgium
                    cv2.putText(image, 'Belgium', (x-2, y-2), font, 0.8, (0,0,255), 2, cv2.LINE_AA)
                    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)
                else:
                    pass
        if((h>=1 and w>=1) and (h<=30 and w<=30)):
            player_img = image[y:y+h,x:x+w]

            player_hsv = cv2.cvtColor(player_img,cv2.COLOR_BGR2HSV)
            #white ball  detection
            mask1 = cv2.inRange(player_hsv, lower_white, upper_white)
            res1 = cv2.bitwise_and(player_img, player_img, mask=mask1)
            res1 = cv2.cvtColor(res1,cv2.COLOR_HSV2BGR)
            res1 = cv2.cvtColor(res1,cv2.COLOR_BGR2GRAY)
            nzCount = cv2.countNonZero(res1)


            if(nzCount >= 3):
                # detect football
                cv2.putText(image, 'football', (x-2, y-2), font, 0.8, (0,255,0), 2, cv2.LINE_AA)
                cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),3)


    cv2.imwrite("./Cropped/frame%d.jpg" % count, res)
    # print('Read a new frame: ', success)    # save frame as JPEG file 
    count += 1
    cv2.imshow('Match Detection',image)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    success,image = vidcap.read()

vidcap.release()
cv2.destroyAllWindows()


0 commentaires

4 Réponses :


1
votes

La question de la "meilleure algorithme d'exécution de x sur (nouveau jeu de données ou de la tâche) Y" est assez invalide pour l'apprentissage des algorithmes, car ils sont tous écoutés pour nos applications, en fonction des données que nous les avons formées et aucune optimalité n'est (ou peut être) garantie.

Algorithmes de détection De nos jours utilisez une grande variété de mécanismes, de la détection des objets à l'aide d'un apprentissage profond, de la filtration de Kalman à la piste et de l'incorporation de contextes et de fusion différents.

Vous pouvez vous demander la différence entre le suivi et la détection. Essayez de trouver les différences entre la détection (parfaitement) un objet (de la même instance) dans plusieurs cadres vs le suivi en utilisant les informations de temps. Si vous pouviez parfaitement trouver tous les objets, et le nombre d'instances de manière cohérente, quelle est la différence maintenant?

Je peux vous renvoyer à de nombreuses sources pour l'étudier, pour des exemples Ceci article moyen, Detectron de Facebook (basé sur MASK-RCNN) et ainsi de suite. Essayez diverses combinaisons de mots-clés dans Google pour améliorer vos résultats: "L'apprentissage profond de la détection d'objet" (filtrer pour 2017 et supérieur), "Suivi de l'objet" en érudit ...

bonne chance!


0 commentaires

1
votes

Vous pouvez utiliser OPENCV pour le suivi de l'objet:

Suivi de l'objet OpenCV

Entraînez votre propre cascade OpenCV pour reconnaître le numéro de maillot:

Formation de cascade personnalisée sur mesure + monuments faciaux

Pour plus d'informations sur l'installation OpenCV, reportez-vous à la section:

https://www.pyimagesearch.com/ et

https://www.learnopencv.com/

C'est ce que vous avez probablement besoin:

https://www.youtube.com/watch?v=qa1dyqsano8


0 commentaires

1
votes

Vous pouvez commencer par un projet factice à l'aide d'un réseau de neurones avec un modèle de coco pré-formé: https://github.com/icy3d/hello-coco-py

 Objets détectés: personne et voiture

Si vous avez besoin de plus apprendre à réduire le nombre de classes à détecter (personne, voiture, bus, ..). Si vous avez besoin de plusieurs solutions SophicstiCated, formez votre propre réseau de neurones ou adaptez un réseau existant à vos besoins (Google pour l'apprentissage de transfert).

De toute façon, vous devriez Se familiariser avec Tensorflow .


3 commentaires

Bonjour, merci pour votre réponse précieuse. J'ai besoin de plus de conseils que je suis très nouveau à OpenCV et j'apprécierais votre aide.


Hé - Je suis heureux d'aider à faire des détails, mais je ne peux pas vous enseigner à OpenCV. Une fois que vous avez la boîte de liaison des joueurs, vous devez le suivre du cadre à l'encadre. Et pour le numéro de maillot, je recommanderais d'utiliser OCR pour extraire le nombre. Regardez ce tutoriel: pyimagesearch.com/2018/09/17/...


Génial ... merci ... j'apprends un cours sur OpenCV. Et j'espère que cela ne vous dérange pas si j'ai des questions futures. Apprécier ton aide. Merci, stackoverflow ami.



1
votes

Vous pouvez vérifier à partir de ce document récent ( https://arxiv.org/pdf/1902.03524.pdf ) que le CNN développé par Baidu est l'état de la technique dans un problème de reconnaissance d'image.


0 commentaires