Es können keine Druckergebnisse von der YOLOv4-Python-Objekterkennung abgerufen werden. PHP gibt einen leeren Wert zurück
P粉275883973
2023-08-28 12:41:17
<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>
cv2.waitKey
在一般情况下不起作用,具体取决于您的机器是PHP还是jupyter notebook。我在我的机器上尝试了这个,并解决了问题:
或者
当视频播放完毕时,脚本将停止。