Maison  >  Questions et réponses  >  le corps du texte

Impossible d'obtenir les résultats d'impression de la détection d'objet YOLOv4 Python, PHP renvoie un blanc

<p>J'utilise ce package git pour exécuter la détection de cible à l'aide de YOLOv4 en Python</p> <pre class="brush:php;toolbar:false;">https://github.com/erentknn/yolov4-object-detection</pre> <p>Le script fonctionne correctement et je peux imprimer les cibles trouvées dans le terminal en toute confiance, mais lorsque je l'exécute depuis PHP, les résultats renvoyés sont vides. Je suppose que cela pourrait être dû au fait que le script PHP attend la fin de Python et ne renvoie pas les résultats en temps réel. J'ai essayé de créer un dictionnaire pour stocker les résultats et le renvoyer à la fin, mais il revient toujours vide. Avant, je pouvais le faire facilement dans YOLOv3, je ne suis pas sûr de ce qui a changé dans la v4. </p> <p>Edit : Après d'autres tests, je ne peux même pas écrire les résultats dans un fichier, ce qui est bizarre. Si je l'exécute depuis un terminal, je peux. </p> <p>EDIT : si je var_dump($output), il renvoie NULL. Après avoir activé le débogage, aucune information supplémentaire n'est renvoyée.</p> <p>我正在运行脚本 - yolo_video.py</p> <pre class="brush:php;toolbar:false;"># exemple d'utilisation : python3 yolo_video.py -i video.mp4 -o video_out.avi importer l'argparse importer le globe heure d'importation journalisation des importations à partir du chemin d'importation pathlib importer CV2 importer numpy en tant que np enregistreur = journalisation.getLogger(__name__) logger.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s-%(name)s-%(message)s") stream_handler = journalisation.StreamHandler() stream_handler.setFormatter(formatteur) logger.addHandler(stream_handler) analyseur = argparse.ArgumentParser() parser.add_argument("-i", "--input", type=str, default="", help="video.mp4") parser.add_argument("-o", "--output", type=str, default="", help="chemin d'accès au fichier vidéo de sortie (facultatif)") parser.add_argument("-d", "--display", type=int, par défaut=1, help="afficher ou non la sortie (1/0)") parser.add_argument("-ht", "--height", type=int, par défaut=1200, help="hauteur de sortie") parser.add_argument("-wt", "--width", type=int, par défaut=700, help="largeur de sortie") parser.add_argument("-c", "--confidence", type=float, par défaut=0.8, help="seuil de confiance") parser.add_argument("-t", "--threshold", type=float, par défaut=0.6, help="seuil de suppression non maximum") args = parser.parse_args() logger.info ("Arguments analysés") CONFIDENCE_THRESHOLD = args.confiance NMS_THRESHOLD = args.seuil sinon Path(args.input).exists() : raise FileNotFoundError ("Le chemin d'accès au fichier vidéo n'existe pas.") vc = cv2.VideoCapture (args.input) poids = glob.glob("yolo/*.weights")[0] labels = glob.glob("yolo/*.txt")[0] cfg = glob.glob("yolo/*.cfg")[0] logger.info("Utilisation de {} poids, {} configurations et {}étiquettes.".format(poids, cfg, étiquettes)) noms_classe = liste() avec open(labels, "r") comme f : class_names = [cname.strip() pour cname dans f.readlines()] COULEURS = np.random.randint(0, 255, size=(len(class_names), 3), dtype="uint8") net = cv2.dnn.readNetFromDarknet (cfg, poids) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) couche = net.getLayerNames() layer = [layer[i[0] - 1] pour i dans net.getUnconnectedOutLayers()] écrivain = Aucun def détecter (frm, net, ln): (H, W) = frm.forme[:2] blob = cv2.dnn.blobFromImage(frm, 1/255.0, (416, 416), swapRB=True, crop=False) net.setInput(blob) start_time = time.time() layerOutputs = net.forward(ln) end_time = time.time() cases = [] identifiants de classe = [] confidences = [] pour la sortie dans layerOutputs : pour la détection en sortie : scores = détection[5:] classID = np.argmax (scores) confiance = scores[classID] si confiance > CONFIDENCE_THRESHOLD : box = détection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype("int") x = int(centreX - (largeur / 2)) y = int(centreY - (hauteur / 2)) boxes.append([x, y, int(largeur), int(hauteur)]) classIds.append(classID) confiances.append(float(confiance)) idxs = cv2.dnn.NMSBoxes(boîtes, confiances, CONFIDENCE_THRESHOLD, NMS_THRESHOLD) si len(idxs) > 0 : pour moi dans idxs.flatten() : (x, y) = (boîtes[i][0], boîtes[i][1]) (w, h) = (boîtes[i][2], boîtes[i][3]) color = [int(c) pour c dans COULEURS[classIds[i]]] cv2.rectangle(frm, (x, y), (x + w, y + h), couleur, 2) texte = "{} : {:.4f}".format(class_names[classIds[i]], confidences[i]) # 这里我打印结果(在终端中工作) print("trouvé") print(confidences[i]) print(noms_classe[classIds[i]]) cv2.putText( frm, texte, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2 ) fps_label = "FPS : %.2f" % (1 / (heure_fin - heure_début)) cv2.putText( frm, fps_label, (0, 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2 ) tandis que cv2.waitKey(1) < 1: (saisi, cadre) = vc.read() s'il n'est pas saisi : casser frame = cv2.resize(frame, (args.height, args.width)) détecter (cadre, filet, couche) si l'écrivain n'est pas Aucun : écrivain.write(frame)</pre> <p>然后在我的PHP脚本中</p> <pre class="brush:php;toolbar:false;">$command = escapeshellcmd('python3 yolo_video.py -i video.mp4 -o video_out.avi'); $output = shell_exec($commande); echo $output;</pre> <p>
P粉275883973P粉275883973388 Il y a quelques jours642

répondre à tous(1)je répondrai

  • P粉360266095

    P粉3602660952023-08-29 09:53:20

    cv2.waitKey Ne fonctionne pas en général, selon que votre machine est PHP ou jupyter notebook.

    J'ai essayé ceci sur ma machine et cela a résolu le problème :

    while(vc.isOpened()):
    
    if frame is None:
            break

    ou

    if not grabbed:
            break

    Le script s'arrêtera une fois la lecture de la vidéo terminée.

    répondre
    0
  • Annulerrépondre