YACWC
This commit is contained in:
@@ -5,7 +5,9 @@ import queue
|
||||
import multiprocessing
|
||||
import time
|
||||
|
||||
logger = get_logger('live_inference', file_path='/var/log/live_inference.log', stdout=True)
|
||||
logger = get_logger('live_inference',
|
||||
file_path='/var/log/live_inference.log',
|
||||
stdout=True)
|
||||
|
||||
all_cameras_config = {
|
||||
"camera_sidefeeder": {
|
||||
@@ -36,25 +38,39 @@ all_cameras_config = {
|
||||
}
|
||||
|
||||
for cam, details in all_cameras_config.items():
|
||||
details['url_rtsp'] = f"rtsp://admin:marybear@{details['ip']}:554/h264Preview_01_sub"
|
||||
details[
|
||||
'url_rtsp'] = f"rtsp://admin:marybear@{details['ip']}:554/h264Preview_01_sub"
|
||||
details['url_api'] = f"http://{details['ip']}/cgi-bin/api.cgi"
|
||||
details['username'] = 'admin'
|
||||
details['password'] = 'marybear'
|
||||
details['camera_name'] = cam
|
||||
# %%
|
||||
if False:
|
||||
details = all_cameras_config['camera_driveway']
|
||||
url = details['url_api']
|
||||
username = 'admin'
|
||||
password = 'marybear'
|
||||
from utils import get_snap
|
||||
|
||||
cc = get_snap(url, username, password)
|
||||
# %%
|
||||
cameras_config = dict()
|
||||
#cameras_config['camera_railing'] = all_cameras_config['camera_railing']
|
||||
cameras_config = all_cameras_config
|
||||
|
||||
|
||||
def start_system():
|
||||
# Create shared multiprocessing queue for model
|
||||
img_scoring_queue = multiprocessing.Queue(maxsize=len(cameras_config) * 2)
|
||||
|
||||
|
||||
# Create threading queues for each camera
|
||||
for cam, details in cameras_config.items():
|
||||
details['msg_queue'] = queue.Queue(maxsize=1)
|
||||
details['img_scoring_queue'] = img_scoring_queue
|
||||
|
||||
# Start model process
|
||||
model_process = multiprocessing.Process(target=run_model, args=(img_scoring_queue,))
|
||||
model_process = multiprocessing.Process(target=run_model,
|
||||
args=(img_scoring_queue, ))
|
||||
model_process.daemon = True
|
||||
model_process.start()
|
||||
logger.info('Started model process')
|
||||
@@ -74,23 +90,34 @@ def start_system():
|
||||
|
||||
# Auto-capture loop - continuously send get messages when queues are empty
|
||||
msg_counts = dict()
|
||||
last_save = dict()
|
||||
for cam_name in cameras_config:
|
||||
msg_counts[cam_name] = 0
|
||||
|
||||
last_save[cam_name] = 0
|
||||
|
||||
save_interval = 60
|
||||
try:
|
||||
while True:
|
||||
for cam_name, details in cameras_config.items():
|
||||
try:
|
||||
if details['msg_queue'].empty():
|
||||
details['msg_queue'].put('get', block=False)
|
||||
msg_counts[cam_name]+=1
|
||||
c_time = time.time()
|
||||
cmd_suffix = ''
|
||||
if (c_time - last_save[cam_name]) > save_interval:
|
||||
cmd_suffix = '+save'
|
||||
last_save[cam_name] = c_time
|
||||
|
||||
details['msg_queue'].put('get' + cmd_suffix,
|
||||
block=False)
|
||||
|
||||
msg_counts[cam_name] += 1
|
||||
logger.debug(f"Auto-sent 'get' to {cam_name}")
|
||||
except queue.Full:
|
||||
pass # Queue full, skip
|
||||
except Exception as e:
|
||||
logger.error(f"Error auto-sending to {cam_name}: {e}")
|
||||
|
||||
time.sleep(0.1) # Small delay
|
||||
|
||||
time.sleep(1) # Small delay
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Shutting down...")
|
||||
# Send exit messages to all cameras
|
||||
@@ -99,7 +126,7 @@ def start_system():
|
||||
details['msg_queue'].put('exit', block=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
# Terminate model process
|
||||
if model_process.is_alive():
|
||||
model_process.terminate()
|
||||
@@ -107,6 +134,8 @@ def start_system():
|
||||
if model_process.is_alive():
|
||||
model_process.kill()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
multiprocessing.set_start_method('spawn', force=True) # Ensure compatibility
|
||||
multiprocessing.set_start_method('spawn',
|
||||
force=True) # Ensure compatibility
|
||||
start_system()
|
||||
|
||||
Reference in New Issue
Block a user