Я работаю над API object_detection, реализованным в tenorflow 1.14 и opencv 4.1, где моя задача состоит в том, чтобы распознавать средства индивидуальной защиты, изнашиваемые работниками на разных воротах строительной площадки. Мы используем потоки RTSP, где я уже использую многопоточность, чтобы минимизировать задержку, но все равно иногда происходит сбой потока. Поэтому я решил перезапускать весь сценарий python каждый 'n' раз обнаружения, чтобы все это не обработало sh из-за поврежденных кадров и т. Д., Но тензор потока очень медленный с загрузкой графа вывода и тому подобного для в первый раз (для меня это ~ 20 секунд), что недопустимо ждать, пока рабочие проникнут внутрь площадки у ворот. Так что теперь я рассматриваю просто остановить, а затем перезапустить ПРОСТО поток RTSP с opencv, который постоянно передает с фреймами механизм логического вывода для выполнения обнаружения объектов на них.
Теперь я не нашел никаких полезных потоков по этой теме. c, вот почему я пишу это здесь.
Соответствующая часть моего кода здесь:
from threading import Thread
import cv2, time
import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
from threading import Thread
import tensorflow as tf
import tensorflow.contrib.tensorrt as trt
import zipfile
from distutils.version import StrictVersion
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
from object_detection.utils import ops as utils_ops
import streamlit as st
######Initialize some important stuff###############
...
###### End of initialization###############
class VideoStreamWidget(object): # create threading
detected_counter1 = 0
detected_counter2 = 0
PASS_score1 = 0
NOPASS_score1 = 0
PASS_score2 = 0
NOPASS_score2 = 0
scoresumCounter1=0
scoresumCounter2=0
PASS_score_tmp =0
NOPASS_score_tmp=0
detection_index = 0
detboxesAreaTMP1 = [0,0,0,0]
detboxesAreaTMP2 = [0,0,0,0]
def __init__(self, src=rtsp_Url):
# Create a VideoCapture object
self.capture = cv2.VideoCapture(src)
# Start the thread to read frames from the video stream
self.thread = Thread(target=self.update, args=())
self.thread.daemon = True
self.thread.start()
self.counter = 0
def update(self): # here the update of "raw" frames happen
# Read the next frame from the stream in a different thread
while True:
if self.capture.isOpened():
(self.status, self.frame) = self.capture.read()
def show_frame(self): # here inference and post processing of images happen
if __name__ == '__main__':
video_stream_widget = VideoStreamWidget(rtsp_Url)
with detection_graph.as_default():
with tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.35))) as sess:
# Get handles to input and output tensors
ops = tf.get_default_graph().get_operations()
all_tensor_names = {output.name for op in ops for output in op.outputs}
tensor_dict = {}
for key in ['num_detections', 'detection_boxes', 'detection_scores','detection_classes', 'detection_masks']:
tensor_name = key + ':0'
if tensor_name in all_tensor_names:
tensor_dict[key] = tf.get_default_graph().get_tensor_by_name(tensor_name)
resfresherCounter = 0
while True:
# I think here it should be implemented somehow to close the stream and reopen it
try:
video_stream_widget.show_frame() # here the objec tdetection happens
except cv2.error as e:
print(e)
continue
Весь мой код здесь:
https://pastebin.com/7qBFwwfy
Заранее спасибо!