Es können keine Druckergebnisse von der YOLOv4-Python-Objekterkennung abgerufen werden. PHP gibt einen leeren Wert zurück
P粉275883973
P粉275883973 2023-08-28 12:41:17
0
1
727
<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粉275883973
P粉275883973

Antworte allen(1)
P粉360266095

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

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

while(vc.isOpened()):

if frame is None:
        break

或者

if not grabbed:
        break

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage