mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	dynamic number of processes based on selected regions
This commit is contained in:
		
							parent
							
								
									623a3044fb
								
							
						
					
					
						commit
						0359e2d2a1
					
				@ -24,9 +24,8 @@ PATH_TO_LABELS = '/label_map.pbtext'
 | 
			
		||||
# TODO: make dynamic?
 | 
			
		||||
NUM_CLASSES = 90
 | 
			
		||||
 | 
			
		||||
REGION_SIZE = 300
 | 
			
		||||
REGION_X_OFFSET = 1250
 | 
			
		||||
REGION_Y_OFFSET = 180
 | 
			
		||||
#REGIONS = "600,0,380:600,600,380:600,1200,380"
 | 
			
		||||
REGIONS = os.getenv('REGIONS')
 | 
			
		||||
 | 
			
		||||
DETECTED_OBJECTS = []
 | 
			
		||||
 | 
			
		||||
@ -98,6 +97,15 @@ class ObjectParser(threading.Thread):
 | 
			
		||||
            time.sleep(0.01)
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    # Parse selected regions
 | 
			
		||||
    regions = []
 | 
			
		||||
    for region_string in REGIONS.split(':'):
 | 
			
		||||
        region_parts = region_string.split(',')
 | 
			
		||||
        regions.append({
 | 
			
		||||
            'size': int(region_parts[0]),
 | 
			
		||||
            'x_offset': int(region_parts[1]),
 | 
			
		||||
            'y_offset': int(region_parts[2])
 | 
			
		||||
        })
 | 
			
		||||
    # capture a single frame and check the frame shape so the correct array
 | 
			
		||||
    # size can be allocated in memory
 | 
			
		||||
    video = cv2.VideoCapture(RTSP_URL)
 | 
			
		||||
@ -109,42 +117,45 @@ def main():
 | 
			
		||||
        exit(1)
 | 
			
		||||
    video.release()
 | 
			
		||||
 | 
			
		||||
    # create shared value for storing the time the frame was captured
 | 
			
		||||
    # note: this must be a double even though the value you are storing
 | 
			
		||||
    #       is a float. otherwise it stops updating the value in shared
 | 
			
		||||
    #       memory. probably something to do with the size of the memory block
 | 
			
		||||
    shared_frame_time = mp.Value('d', 0.0)
 | 
			
		||||
    shared_frame_time2 = mp.Value('d', 0.0)
 | 
			
		||||
    shared_memory_objects = []
 | 
			
		||||
    for region in regions:
 | 
			
		||||
        shared_memory_objects.append({
 | 
			
		||||
            # create shared value for storing the time the frame was captured
 | 
			
		||||
            # note: this must be a double even though the value you are storing
 | 
			
		||||
            #       is a float. otherwise it stops updating the value in shared
 | 
			
		||||
            #       memory. probably something to do with the size of the memory block
 | 
			
		||||
            'frame_time': mp.Value('d', 0.0),
 | 
			
		||||
            # create shared array for storing 10 detected objects
 | 
			
		||||
            'output_array': mp.Array(ctypes.c_double, 6*10)
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
    # compute the flattened array length from the array shape
 | 
			
		||||
    flat_array_length = frame_shape[0] * frame_shape[1] * frame_shape[2]
 | 
			
		||||
    # create shared array for storing the full frame image data
 | 
			
		||||
    shared_arr = mp.Array(ctypes.c_uint16, flat_array_length)
 | 
			
		||||
    # shape current frame so it can be treated as an image
 | 
			
		||||
    frame_arr = tonumpyarray(shared_arr).reshape(frame_shape)
 | 
			
		||||
    # create shared array for storing 10 detected objects
 | 
			
		||||
    shared_output_arr = mp.Array(ctypes.c_double, 6*10)
 | 
			
		||||
    shared_output_arr2 = mp.Array(ctypes.c_double, 6*10)
 | 
			
		||||
 | 
			
		||||
    capture_process = mp.Process(target=fetch_frames, args=(shared_arr, [shared_frame_time, shared_frame_time2], frame_shape))
 | 
			
		||||
    capture_process = mp.Process(target=fetch_frames, args=(shared_arr, [obj['frame_time'] for obj in shared_memory_objects], frame_shape))
 | 
			
		||||
    capture_process.daemon = True
 | 
			
		||||
 | 
			
		||||
    detection_process = mp.Process(target=process_frames, args=(shared_arr, shared_output_arr, 
 | 
			
		||||
        shared_frame_time, frame_shape, REGION_SIZE, REGION_X_OFFSET, REGION_Y_OFFSET))
 | 
			
		||||
    detection_process.daemon = True
 | 
			
		||||
    detection_processes = []
 | 
			
		||||
    for index, region in enumerate(regions):
 | 
			
		||||
        detection_process = mp.Process(target=process_frames, args=(shared_arr, 
 | 
			
		||||
            shared_memory_objects[index]['output_array'], 
 | 
			
		||||
            shared_memory_objects[index]['frame_time'], frame_shape, 
 | 
			
		||||
            region['size'], region['x_offset'], region['y_offset']))
 | 
			
		||||
        detection_process.daemon = True
 | 
			
		||||
        detection_processes.append(detection_process)
 | 
			
		||||
 | 
			
		||||
    detection_process2 = mp.Process(target=process_frames, args=(shared_arr, shared_output_arr2, 
 | 
			
		||||
        shared_frame_time2, frame_shape, 1080, 0, 0))
 | 
			
		||||
    detection_process.daemon = True
 | 
			
		||||
 | 
			
		||||
    object_parser = ObjectParser([shared_output_arr, shared_output_arr2])
 | 
			
		||||
    object_parser = ObjectParser([obj['output_array'] for obj in shared_memory_objects])
 | 
			
		||||
    object_parser.start()
 | 
			
		||||
 | 
			
		||||
    capture_process.start()
 | 
			
		||||
    print("capture_process pid ", capture_process.pid)
 | 
			
		||||
    detection_process.start()
 | 
			
		||||
    print("detection_process pid ", detection_process.pid)
 | 
			
		||||
    detection_process2.start()
 | 
			
		||||
    print("detection_process pid ", detection_process2.pid)
 | 
			
		||||
    for detection_process in detection_processes:
 | 
			
		||||
        detection_process.start()
 | 
			
		||||
        print("detection_process pid ", detection_process.pid)
 | 
			
		||||
 | 
			
		||||
    app = Flask(__name__)
 | 
			
		||||
 | 
			
		||||
@ -175,7 +186,11 @@ def main():
 | 
			
		||||
                    thickness=2,
 | 
			
		||||
                    display_str_list=["{}: {}%".format(obj['name'],int(obj['score']*100))],
 | 
			
		||||
                    use_normalized_coordinates=False)
 | 
			
		||||
            cv2.rectangle(frame, (REGION_X_OFFSET, REGION_Y_OFFSET), (REGION_X_OFFSET+REGION_SIZE, REGION_Y_OFFSET+REGION_SIZE), (255,255,255), 2)
 | 
			
		||||
 | 
			
		||||
            for region in regions:
 | 
			
		||||
                cv2.rectangle(frame, (region['x_offset'], region['y_offset']), 
 | 
			
		||||
                    (region['x_offset']+region['size'], region['y_offset']+region['size']), 
 | 
			
		||||
                    (255,255,255), 2)
 | 
			
		||||
            # convert back to BGR
 | 
			
		||||
            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
 | 
			
		||||
            # encode the image into a jpg
 | 
			
		||||
@ -186,8 +201,8 @@ def main():
 | 
			
		||||
    app.run(host='0.0.0.0', debug=False)
 | 
			
		||||
 | 
			
		||||
    capture_process.join()
 | 
			
		||||
    detection_process.join()
 | 
			
		||||
    detection_process2.join()
 | 
			
		||||
    for detection_process in detection_processes:
 | 
			
		||||
        detection_process.join()
 | 
			
		||||
    object_parser.join()
 | 
			
		||||
 | 
			
		||||
# convert shared memory array into numpy array
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user