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>