Tidak dapat mendapatkan hasil cetakan daripada pengesanan objek YOLOv4 Python, PHP mengembalikan kosong
P粉275883973
P粉275883973 2023-08-28 12:41:17
0
1
729
<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中输出?我没有得到任何错误,脚本已经完中输出?我没有得到任何错误,脚本已经完成。<
P粉275883973
P粉275883973

membalas semua(1)
P粉360266095

cv2.waitKey Tidak berfungsi secara umum, bergantung pada sama ada mesin anda ialah PHP atau notebook jupyter.

Saya mencuba ini pada mesin saya dan ia menyelesaikan masalah:

while(vc.isOpened()):

if frame is None:
        break

atau

if not grabbed:
        break

Skrip akan berhenti apabila video telah selesai dimainkan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan