@startuml Crowd Analyzer Flow title Поток анализа очередей в Crowd Analyzer actor "Redis Queue" as redis participant "analyze_crowd()" as entry participant "_analyze_crowd()" as main participant "frames.pull()" as frames_mod participant "_run_detectors()" as detectors participant "TevianHeadsDetector" as tevian participant "_build_zones_info()" as zones_builder participant "_get_triggered_zones()" as trigger_checker participant "Storage" as storage participant "central.send()" as central participant "zones_db" as db redis -> entry: task(uin, camera_id, zones) activate entry entry -> entry: acquire TASKS_LICENCES entry -> main: _analyze_crowd(uin, camera, zones, server_id) activate main main -> main: _filter_frequent_tasks() alt tasks too frequent main -> entry: return (skip) else proceed main -> frames_mod: pull(uin, camera) activate frames_mod frames_mod -> main: Frame object deactivate frames_mod opt rotation_angle provided main -> main: frame.rotate(rotation_angle) end main -> detectors: _run_detectors(uin, camera, frame, zones) activate detectors detectors -> detectors: check tevian enabled & used detectors -> tevian: request(uin, camera, frame, zones) activate tevian tevian -> detectors: detection results deactivate tevian detectors -> main: detected_values, timings, errors deactivate detectors main -> zones_builder: _build_zones_info(zones, detected_values) activate zones_builder zones_builder -> main: zones_info (with AI results) deactivate zones_builder main -> trigger_checker: _get_triggered_zones(zones_info, timestamp) activate trigger_checker loop for each zone trigger_checker -> trigger_checker: check trigger conditions trigger_checker -> trigger_checker: check schedule trigger_checker -> trigger_checker: check grace period end trigger_checker -> main: triggered_zones deactivate trigger_checker main -> main: draw zones on frame main -> storage: upload_fileobj(image_with_zones) activate storage storage -> main: zones_url deactivate storage main -> central: send('new_measurement', data) activate central central -> main: measurement sent deactivate central main -> db: update({'_id': f'{uin}/{camera}'}, detected_at) activate db db -> main: updated deactivate db end main -> entry: analysis complete deactivate main entry -> entry: release TASKS_LICENCES entry -> redis: task finished deactivate entry @enduml