Tidak dapat mendapatkan hasil cetakan daripada pengesanan objek YOLOv4 Python, PHP mengembalikan kosong
<p>Saya menggunakan pakej git ini untuk menjalankan pengesanan sasaran menggunakan YOLOv4 dalam Python</p>
<pre class="brush:php;toolbar:false;">https://github.com/erentknn/yolov4-object-detection</pre>
<p>Skrip berjalan dengan baik dan saya boleh mencetak sasaran yang ditemui dalam terminal dengan yakin, tetapi apabila saya melaksanakannya daripada PHP, keputusan yang dikembalikan adalah kosong. Saya rasa mungkin kerana skrip PHP sedang menunggu Python selesai dan tidak mengembalikan hasilnya dalam masa nyata. Saya cuba mencipta kamus untuk menyimpan hasil dan mengembalikannya pada penghujungnya, tetapi ia masih kosong. Saya pernah dapat melakukan ini dengan mudah dalam YOLOv3, tidak pasti apa yang telah berubah dalam v4. </p>
<p>Edit: Selepas lebih banyak ujian, saya tidak dapat menulis hasilnya pada fail, yang pelik. Jika lari dari terminal saya boleh. </p>
<p>EDIT: Jika saya var_dump($output), ia mengembalikan NULL. Selepas menghidupkan penyahpepijatan, tiada maklumat tambahan dikembalikan.</p>
<p>我正在运行脚本 - yolo_video.py</p>
<pre class="brush:php;toolbar:false;"># contoh penggunaan: python3 yolo_video.py -i video.mp4 -o video_out.avi
import argparse
glob import
masa import
pembalakan import
daripada pathlib import Path
import cv2
import numpy sebagai np
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
pemformat = pengelogan.Pemformat("%(asctime)s-%(nama)s-%(mesej)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="laluan ke (pilihan) fail video output")
parser.add_argument("-d", "--display", type=int, default=1,
help="paparkan output atau tidak (1/0)")
parser.add_argument("-ht", "--height", type=int, default=1200,
help="ketinggian output")
parser.add_argument("-wt", "--width", type=int, default=700,
help="lebar output")
parser.add_argument("-c", "--keyakinan", type=float, default=0.8,
bantuan="ambang keyakinan")
parser.add_argument("-t", "--ambang", type=float, default=0.6,
help="ambang penindasan bukan maksimum")
args = parser.parse_args()
logger.info("Hujah yang Dihuraikan")
CONFIDENCE_THRESHOLD = args.confidence
NMS_THRESHOLD = args.threshold
jika bukan Path(args.input).exists():
naikkan FileNotFoundError("Laluan ke fail video tidak wujud.")
vc = cv2.VideoCapture(args.input)
pemberat = glob.glob("yolo/*.weights")[0]
label = glob.glob("yolo/*.txt")[0]
cfg = glob.glob("yolo/*.cfg")[0]
logger.info("Menggunakan {} pemberat ,{} konfigurasi dan {}label.".format(berat, cfg, label))
nama_kelas = senarai()
dengan terbuka(label, "r") sebagai f:
class_names = [cname.strip() untuk cname dalam f.readlines()]
WARNA = np.random.randint(0, 255, saiz=(len(nama_kelas), 3), dtype="uint8")
net = cv2.dnn.readNetFromDarknet(cfg, pemberat)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
lapisan = net.getLayerNames()
lapisan = [lapisan[i[0] - 1] untuk i dalam net.getUnconnectedOutLayers()]
penulis = Tiada
def detect(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)
masa_mula = masa.masa()
layerOutputs = net.forward(ln)
masa_akhir = masa.masa()
kotak = []
classId = []
keyakinan = []
untuk output dalam layerOutputs:
untuk pengesanan dalam output:
markah = pengesanan[5:]
classID = np.argmax(skor)
keyakinan = markah[classID]
jika keyakinan > CONFIDENCE_THRESHOLD:
kotak = pengesanan[0:4] * np.array([W, H, W, H])
(centerX, centerY, lebar, tinggi) = box.astype("int")
x = int(centerX - (lebar / 2))
y = int(centerY - (tinggi / 2))
boxes.append([x, y, int(lebar), int(tinggi)])
classIds.append(classID)
confidents.append(float(confidence))
idxs = cv2.dnn.NMSBoxes(kotak, keyakinan, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)
jika len(idxs) > 0:
untuk i dalam idxs.flatten():
(x, y) = (kotak[i][0], kotak[i][1])
(w, h) = (kotak[i][2], kotak[i][3])
warna = [int(c) untuk c dalam COLORS[classIds[i]]]
cv2.segi empat tepat(frm, (x, y), (x + w, y + h), warna, 2)
teks = "{}: {:.4f}".format(nama_kelas[classId[i]], keyakinan[i])
# 这里我打印结果(在终端中工作)
print("ditemui")
cetak(keyakinan[i])
print(nama_kelas[classId[i]])
cv2.putText(
frm, teks, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2
)
fps_label = "FPS: %.2f" % (1 / (masa_akhir - masa_mula))
cv2.putText(
frm, label_fps, (0, 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2
)
manakala cv2.waitKey(1) < 1:
(digenggam, bingkai) = vc.read()
jika tidak direbut:
rehat
bingkai = cv2.resize(frame, (args.height, args.width))
mengesan (bingkai, jaring, lapisan)
jika penulis bukan Tiada:
writer.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($command);
echo $output;</pre>
<p>如何将Python脚本的结果在PHP中输出?我没有得到任何错误,脚本已经完中输出?我没有得到任何错误,脚本已经完成。<