sandbox/ivideon/puml/Crowd/cl_analyzer_1.puml

90 lines
2.6 KiB
Text

@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