Heim  >  Fragen und Antworten  >  Hauptteil

Es können keine Druckergebnisse von der YOLOv4-Python-Objekterkennung abgerufen werden. PHP gibt einen leeren Wert zurück

<p>Ich verwende dieses Git-Paket, um die Zielerkennung mit YOLOv4 in Python auszuführen</p> <pre class="brush:php;toolbar:false;">https://github.com/erentknn/yolov4-object-detection</pre> <p>Das Skript läuft einwandfrei und ich kann die gefundenen Ziele im Terminal sicher ausdrucken, aber wenn ich es aus PHP ausführe, sind die zurückgegebenen Ergebnisse leer. Ich schätze, es könnte daran liegen, dass das PHP-Skript auf den Abschluss von Python wartet und die Ergebnisse nicht in Echtzeit zurückgibt. Ich habe versucht, ein Wörterbuch zu erstellen, um die Ergebnisse zu speichern und am Ende zurückzugeben, aber es ist immer noch leer. Früher konnte ich das in YOLOv3 problemlos machen, bin mir aber nicht sicher, was sich in Version 4 geändert hat. </p> <p>Bearbeiten: Nach weiteren Tests kann ich die Ergebnisse nicht einmal in eine Datei schreiben, was seltsam ist. Wenn ich vom Terminal aus laufe, kann ich. </p> <p>EDIT: Wenn ich var_dump($output) verwende, wird NULL zurückgegeben. Nach dem Einschalten des Debuggens werden keine zusätzlichen Informationen zurückgegeben.</p> <p>我正在运行脚本 - yolo_video.py</p> <pre class="brush:php;toolbar:false;"># Beispielverwendung: python3 yolo_video.py -i video.mp4 -o video_out.avi argparse importieren Globus importieren Importzeit Protokollierung importieren aus pathlib import Path cv2 importieren numpy als np importieren logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s-%(name)s-%(message)s") stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) parser = argparse.ArgumentParser() parser.add_argument("-i", "--input", type=str, default="", help="video.mp4") parser.add_argument("-o", "--output", type=str, default="", help="Pfad zur (optionalen) Ausgabevideodatei") parser.add_argument("-d", "--display", type=int, default=1, help="Ausgabe anzeigen oder nicht (1/0)") parser.add_argument("-ht", "--height", type=int, default=1200, help="Höhe der Ausgabe") parser.add_argument("-wt", "--width", type=int, default=700, help="Breite der Ausgabe") parser.add_argument("-c", "--confidence", type=float, default=0.8, help="Konfidenzschwelle") parser.add_argument("-t", "--threshold", type=float, default=0.6, help="nicht-maximaler Unterdrückungsschwellenwert") args = parser.parse_args() logger.info("Geparste Argumente") CONFIDENCE_THRESHOLD = args.confidence NMS_THRESHOLD = args.threshold wenn nicht Path(args.input).exists(): raise FileNotFoundError("Pfad zur Videodatei ist nicht vorhanden.") vc = cv2.VideoCapture(args.input) Gewichte = glob.glob("yolo/*.weights")[0] labels = glob.glob("yolo/*.txt")[0] cfg = glob.glob("yolo/*.cfg")[0] logger.info("Verwendung von {} Gewichtungen, {} Konfigurationen und {}labels.".format(weights, cfg, labels)) class_names = list() mit open(labels, "r") as f: class_names = [cname.strip() für cname in f.readlines()] COLORS = np.random.randint(0, 255, size=(len(class_names), 3), dtype="uint8") net = cv2.dnn.readNetFromDarknet(cfg, Gewichte) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) Layer = net.getLayerNames() Layer = [Layer[i[0] - 1] für i in net.getUnconnectedOutLayers()] Autor = Keine def discover(frm, net, ln): (H, W) = frm.shape[: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() Kisten = [] classIds = [] Konfidenzen = [] für die Ausgabe in LayerOutputs: zur Erkennung in der Ausgabe: Punkte = Erkennung[5:] classID = np.argmax(scores) Vertrauen = Ergebnisse[Klassen-ID] wenn Konfidenz > CONFIDENCE_THRESHOLD: box = Erkennung[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype("int") x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) boxen.append([x, y, int(width), int(height)]) classIds.append(classID) confidences.append(float(confidence)) idxs = cv2.dnn.NMSBoxes(Boxen, Konfidenzen, CONFIDENCE_THRESHOLD, NMS_THRESHOLD) wenn len(idxs) > 0: für i in idxs.flatten(): (x, y) = (Boxen[i][0], Boxen[i][1]) (w, h) = (Boxen[i][2], Boxen[i][3]) color = [int(c) für c in COLORS[classIds[i]]] cv2.rectangle(frm, (x, y), (x + w, y + h), color, 2) text = "{}: {:.4f}".format(Klassennamen[Klassen-IDs[i]], Konfidenzen[i]) # 这里我打印结果(在终端中工作) print("gefunden") print(confidences[i]) print(class_names[classIds[i]]) cv2.putText( frm, Text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2 ) fps_label = "FPS: %.2f" % (1 / (end_time - start_time)) cv2.putText( frm, fps_label, (0, 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2 ) während cv2.waitKey(1) < 1: (gepackt, Frame) = vc.read() falls nicht ergriffen: brechen Frame = cv2.resize(Frame, (args.height, args.width)) erkennen(Rahmen, Netz, Ebene) wenn der Autor nicht None ist: write.write(frame)</pre> <p>然后在我的PHP-Version</p> <pre class="brush:php;toolbar:false;">$command = escapeshellcmd('python3 yolo_video.py -i video.mp4 -o video_out.avi'); $output = shell_exec($command); echo $output;</pre> <p>
P粉275883973P粉275883973439 Tage vor683

Antworte allen(1)Ich werde antworten

  • P粉360266095

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

    cv2.waitKey在一般情况下不起作用,具体取决于您的机器是PHP还是jupyter notebook。

    我在我的机器上尝试了这个,并解决了问题:

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

    或者

    if not grabbed:
            break

    当视频播放完毕时,脚本将停止。

    Antwort
    0
  • StornierenAntwort