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>