服务端
import flask
import torch
from multiprocessing import Process, Queue
import time
import cv2
model = torch.hub.load('../', 'custom', path='../weights/ppe_yolo_n.pt', source='local')
app = flask.Flask(__name__)
def detect(p_name,q_name):
url = "rtsp://admin:1234@100.100.3.100/doc/page/preview.asp"
cap = cv2.VideoCapture(url, cv2.CAP_FFMPEG)
# cap = cv2.VideoCapture(0)
# print("启动图像")
while True:
# start= time.time()
ret,frame = cap.read()
results_list = []
results = model(frame)
pd = results.pandas().xyxy[0]
person_list = pd[pd['name'] == 'person'].to_numpy()
if len(person_list) > 0:
il, it, ir, ib = person_list[0][:4].astype('int')
detect_result = {'person': [il.item(), it.item(), ir.item(), ib.item()]}
results_list.append(detect_result)
# print(results_list)
# if p_name.qsize()<5:
# end = time.time()
# time_sleep = {'time':end-start}
# results_list.append(time_sleep)
if p_name.qsize()<2:
p_name.put(results_list)
else:
p_name.get()
# print(results_list)
cv2.imshow("aaaa",frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
@app.route("/predict", methods=["POST"])
def predict():
# print("开始服务")
data = {"success": False}
if flask.request.method == 'POST':
if flask.request.files.get("image"):
data['predictions'] = q.get()
data["success"] = True
return flask.jsonify(data)
if __name__ == "__main__":
q = Queue()
p = Queue()
p1 = Process(target=detect, args=(q, p,))
p1.start()
app.run(host="192.168.3.8", port=5000)
客户端
import time
import requests
import cv2
from multiprocessing import Process, Queue
import numpy as np
# PyTorch_REST_API_URL ='http://192.168.3.8:5000/predict'
def predict_result(w_h):
while True:
payload = {'image': True}
r = requests.post('http://192.168.3.8:5000/predict', files=payload).json()
if r['success']:
if len(r['predictions']) > 0:
list_point = r['predictions']
for val in list_point:
point_fore = val['person']
w_h.put(point_fore)
else:
w_h.put([0,0,0,0])
def read_vis(w_h):
stare = 0
url = "rtsp://admin:1234@100.100.3.100/doc/page/preview.asp"
cap = cv2.VideoCapture(url, cv2.CAP_FFMPEG)
if not cap.isOpened():
print('Cannot open RTSP stream')
exit(-1)
while True:
ret, frame = cap.read()
atdd = time.time()
point_fore = w_h.get()
# print(point_fore[0])
if stare>40:
cv2.rectangle(frame, (point_fore[0], point_fore[1]), (point_fore[2], point_fore[3]), (255, 0, 0), 5)
cv2.putText(frame, 'Person', (point_fore[0] - 5, point_fore[1] - 5), cv2.FONT_ITALIC, 1, (0, 255, 0), 2)
stare +=1
atdd = time.time()
print(atdd-atdd)
cv2.imshow("b", frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
q = Queue()
p2 = Process(target=read_vis, args=(q,))
p2.start()
time.sleep(0.5)
p1 = Process(target=predict_result, args=(q,))
p1.start()