>  Q&A  >  본문

YOLOv4 Python 객체 감지에서 인쇄 결과를 가져올 수 없습니다. PHP가 공백을 반환합니다.

<p>Python에서 YOLOv4를 사용하여 대상 감지를 실행하기 위해 이 git 패키지를 사용하고 있습니다</p> <pre class="brush:php;toolbar:false;">https://github.com/erentknn/yolov4-object-Detection</pre> <p> 스크립트는 잘 실행되고 터미널에서 찾은 대상을 자신있게 인쇄할 수 있지만 PHP에서 실행하면 반환된 결과가 비어 있습니다. PHP 스크립트가 Python이 완료되기를 기다리고 실시간으로 결과를 반환하지 않기 때문일 수 있습니다. 결과를 저장하고 마지막에 반환하기 위해 사전을 만들려고 시도했지만 여전히 비어 있습니다. 이전에는 YOLOv3에서 이 작업을 쉽게 수행할 수 있었지만 v4에서는 무엇이 변경되었는지 잘 모르겠습니다. </p> <p>편집: 더 많은 테스트를 거친 후에도 결과를 파일에 쓸 수 없는데 이상합니다. 터미널에서 실행하면 가능합니다. </p> 편집: var_dump($output)를 실행하면 NULL이 반환됩니다. 디버깅을 활성화한 후에는 추가 정보가 반환되지 않습니다.</p> <p>내가 정재运行脚本 - yolo_video.py</p> <pre class="brush:php;toolbar:false;"># 사용 예: python3 yolo_video.py -i video.mp4 -o video_out.avi 인수 가져오기 수입 글로브 수입 시간 수입 로깅 pathlib import 경로에서 이력서2 가져오기 numpy를 np로 가져오기 로거 = 로깅.getLogger(__name__) logger.setLevel(logging.INFO) formatter = 로깅.Formatter("%(asctime)s-%(name)s-%(message)s") stream_handler = 로깅.StreamHandler() stream_handler.setFormatter(포맷터) logger.addHandler(stream_handler) 파서 = argparse.ArgumentParser() parser.add_argument("-i", "--input", type=str, default="", 도움말="video.mp4") parser.add_argument("-o", "--output", type=str, default="", help="(선택 사항) 출력 비디오 파일 경로") parser.add_argument("-d", "--display", type=int, 기본값=1, help="출력 표시 여부(1/0)") parser.add_argument("-ht", "--height", 유형=int, 기본값=1200, help="출력 높이") parser.add_argument("-wt", "--width", 유형=int, 기본값=700, help="출력 너비") parser.add_argument("-c", "--confidence", type=float, 기본값=0.8, help="신뢰도 임계값") parser.add_argument("-t", "--threshold", 유형=float, 기본값=0.6, help="비최대 억제 임계값") args = 파서.parse_args() logger.info("파싱된 인수") CONFIDENCE_THRESHOLD = args.confidence NMS_THRESHOLD = args.threshold 그렇지 않은 경우 Path(args.input).exists(): raise FileNotFoundError("동영상 파일 경로가 존재하지 않습니다.") vc = cv2.VideoCapture(args.input) 가중치 = glob.glob("yolo/*.weights")[0] labels = glob.glob("yolo/*.txt")[0] cfg = glob.glob("yolo/*.cfg")[0] logger.info("{} 가중치,{} 구성 및 {} 사용labels.".format(weights, cfg, labels)) class_names = 목록() open(labels, "r")을 f로 사용: class_names = [f.readlines()의 cname에 대한 cname.strip()] COLORS = np.random.randint(0, 255, size=(len(class_names), 3), dtype="uint8") net = cv2.dnn.readNetFromDarknet(cfg, 가중치) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) 레이어 = net.getLayerNames() layer = [layer[i[0] - 1] for i in net.getUnconnectedOutLayers()] 작가 = 없음 def 감지(frm, net, ln): (H, W) = frm.shape[:2] blob = cv2.dnn.blobFromImage(frm, 1 / 255.0, (416, 416), swapRB=True, 자르기=False) net.setInput(블롭) start_time = 시간.시간() layerOutputs = net.forward(ln) end_time = 시간.시간() 상자 = [] 클래스 ID = [] 기밀 = [] layerOutputs의 출력: 출력 감지의 경우: 점수 = 탐지[5:] classID = np.argmax(점수) 신뢰도 = 점수[클래스ID] 신뢰도 > CONFIDENCE_THRESHOLD: 상자 = 감지[0:4] * np.array([W, H, W, H]) (centerX, centerY, 너비, 높이) = box.astype("int") x = int(centerX - (너비 / 2)) y = int(centerY - (높이 / 2)) box.append([x, y, int(너비), int(높이)]) classIds.append(클래스ID) Confidences.append(float(신뢰)) idxs = cv2.dnn.NMSBoxes(상자, 신뢰도, CONFIDENCE_THRESHOLD, NMS_THRESHOLD) len(idxs) > 0: idxs.flaten()의 경우: (x, y) = (상자[i][0], 상자[i][1]) (w, h) = (상자[i][2], 상자[i][3]) color = [COLORS[classIds[i]]]의 c에 대한 int(c) cv2.사각형(frm, (x, y), (x + w, y + h), 색상, 2) 텍스트 = "{}: {:.4f}".format(class_names[classIds[i]], Confidentials[i]) # 这里我打印结果(현재终端中工작) print("발견") 인쇄(신뢰[i]) print(class_names[classIds[i]]) cv2.putText( frm, 텍스트, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2 ) fps_label = "FPS: %.2f" % (1 / (종료_시간 - 시작_시간)) cv2.putText( frm, fps_label, (0, 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2 ) cv2.waitKey(1) < 1: (잡음, 프레임) = vc.read() 잡지 않은 경우: 부서지다 프레임 = cv2.resize(프레임, (args.height, args.width)) 감지(프레임, 네트, 레이어) 작성자가 None이 아닌 경우: writer.write(프레임)</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>
P粉275883973P粉275883973438일 전678

모든 응답(1)나는 대답할 것이다

  • P粉360266095

    P粉3602660952023-08-29 09:53:20

    cv2.waitKey 컴퓨터가 PHP인지 jupyter 노트북인지에 따라 일반적으로 작동하지 않습니다.

    제 컴퓨터에서 이 방법을 시도해 보았는데 문제가 해결되었습니다.

    으아악

    또는

    으아악

    비디오 재생이 끝나면 스크립트가 중지됩니다.

    회신하다
    0
  • 취소회신하다