Impossible d'obtenir les résultats d'impression de la détection d'objet YOLOv4 Python, PHP renvoie un blanc
P粉275883973
P粉275883973 2023-08-28 12:41:17
0
1
734
<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粉275883973
P粉275883973

répondre à tous(1)
P粉360266095

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal