실시간 영상 스트리밍에서 객체를 추적하고, 해당 객체가 특정 영역에 머무는 시간을 계산하는 방법과
특히, 정적 비디오 파일과 실시간 스트리밍의 차이를 강조하면서 실시간 영상 스트리밍에서 발생할 수 있는 문제를 해결하는 방법을 알아보자.
주요 내용:
- 정적 비디오 파일 처리 vs. 스트리밍 처리:
- 정적 비디오 파일의 경우, 프레임률(FPS)이 일정하여, 단순히 프레임 수를 세고 FPS로 나누어 시간 계산을 할 수 있음. 하지만 스트리밍에서는 FPS가 일정하지 않기 때문에, 실시간으로 프레임을 처리하는 모델이 속도를 따라가지 못하면 문제가 발생할 수 있기도 함.
- 스트리밍에서의 문제점:
- 실시간 스트리밍에서는 모델의 처리 속도보다 스트리밍의 FPS가 높을 수 있음. 이 경우, 모델이 프레임을 처리하는 속도가 스트리밍 속도보다 느리면, 프레임이 버퍼에 쌓여서 지연(latency)이 발생하고, 너무 많은 프레임이 쌓여 버퍼가 가득 차면 시스템이 멈추게 됨.
- 이를 해결하려면 피드백 루프를 사용하여 모델의 처리 속도를 측정하고, 버퍼에 들어가는 프레임 수를 제한하는 방법을 사용해야함.
- 시간 계산 방법:
- 실시간 스트리밍에서는 FPS 기반으로 시간을 계산하는 대신, 시스템 시간을 사용하여 객체가 특정 영역에 들어갈 때 시간을 기록하고, 각 프레임에서 그 시간을 빼서 체류 시간을 계산.
- 구현 방법:
- FPS 기반 타이머: 비디오 파일에서 FPS가 일정하므로, 각 프레임의 번호를 세고 이를 FPS로 나누어 시간을 계산.
- 시계 기반 타이머: 스트리밍에서는 각 객체가 영역에 들어갈 때 시스템 시간을 기록하고, 각 프레임에서 이 시간을 빼서 체류 시간을 계산.
- 프로젝트 설정 및 코드 작성:
- 코드 구현 과정에서는 모델을 로드하고, 객체를 추적하여 결과를 화면에 표시합니다. 또한, 객체가 특정 영역에 들어왔을 때 그 객체의 시간을 계산하고 이를 화면에 표시하는 방법으로 처리.
- 'supervision' 패키지와 'inference' 패키지를 사용하여 객체를 추적하고, 감지된 객체에 대해 라벨을 붙여 시각화.
- 영역 설정:
- 사용자가 자신의 영역을 정의할 수 있도록 도와주는 도구를 제공하여, 특정 영역 내에서만 객체를 추적하고 해당 객체의 체류 시간을 계산.
실시간 비디오 스트리밍에서 객체 추적 및 시간 계산을 어떻게 효율적으로 처리할 수 있는지에 대해 확인해보자.
1. FPS 기반 타이머 (정적 비디오 파일 처리)
- 정적 비디오 파일에서는 FPS(초당 프레임 수)를 기반으로 시간을 계산.
각 프레임의 번호를 세고 FPS로 나누어 객체가 특정 구역에 머무는 시간을 측정. 이를 위해 supervision 패키지의 video info를 사용하여 FPS를 추출하고, 각 구역별로 타이머를 초기화. - 객체가 구역에 머무는 시간을 계산한 후, label annotator를 사용하여 결과를 화면에 표시.
2. 스트리밍 처리에서 FPS의 문제
- 실시간 스트리밍에서는 FPS가 일정하지 않아서 FPS 기반 타이머를 사용할 수 없습니다. 영상 스트리밍에서는 프레임이 계속해서 들어오므로, FPS가 모델의 처리 속도보다 빠르면 지연(latency)이 발생. 이 문제를 해결하려면 피드백 루프를 추가해야 하며, 이를 통해 스트리밍 처리를 안정적으로 할 수 있음.
3. 스트리밍 처리 구현
- 비디오 스트리밍을 처리하려면 정적 파일 대신 RTSP URL을 통해 실시간 스트리밍을 받아야 함. 이를 위해 get stream frame generator 함수를 사용하여 스트리밍에서 프레임을 받아 처리.
- FPS 기반 타이머 대신, 시스템 시간을 사용하는 clock-based timer로 변경하여 실시간 스트리밍에서도 시간 계산을 할 수 있도록 함.
4. 스트리밍 테스트
- RTSP 스트리밍을 실시간으로 테스트하려면 Docker와 같은 도구를 사용하여 비디오 파일을 로컬에서 RTSP 스트리밍으로 전환할 수 있음. VLC와 같은 소프트웨어를 통해 스트리밍이 잘 송출되는지 확인할 수 있다고 함.
5. 효율적인 스트리밍 처리 (Inference Pipeline 사용)
- 스트리밍에서 발생하는 지연 문제를 해결하기 위해 Inference Pipeline을 사용.
이 유틸리티는 여러 스레드를 사용하여 비디오 스트림을 효율적으로 처리하며, 프레임을 처리할 때마다 지정된 콜백 함수를 실행. - 이 방법을 사용하면 모델의 처리 속도가 스트리밍 FPS와 맞지 않더라도 안정적으로 스트리밍을 처리할 수 있음.
6. 코드 리팩토링
- 기존의 코드를 리팩토링하여 Inference Pipeline을 활용한 비디오 스트리밍 처리로 전환하고. 이를 위해 CustomSync 클래스를 정의하고, on_prediction 메서드를 통해 각 프레임에 대해 추적 및 시간 계산을 처리.
- 이 방식으로 여러 스레드를 활용하여 스트리밍을 처리하고, 지연을 최소화.
7. 중요 고려 사항
- 카메라 설정: 카메라는 고정되어 있어야 하며, 줌 인/아웃이나 팬(회전)을 하면 구역이 정확하게 맞지 않게 되므로 카메라 각도를 잘 설정하는 것이 중요함.
- 스트리밍 품질 문제: 실시간 스트리밍에서 발생하는 네트워크 불안정성이나 압축으로 인해 객체 감지의 품질이 떨어질 수 있기에. 이로 인해 객체 추적이 불안정해지고, 타이머가 리셋될 수 있음.
- 테스트 환경: 모델을 실제 하드웨어와 환경에서 테스트하여 예상되는 조건에서 잘 작동하는지 확인하는 것이 중요함. 이를 통해 실제 운영 환경에서 모델이 객체를 정확하게 감지할 수 있도록 함.
8. 결론
- 정적 비디오 파일 처리에서 실시간 스트리밍 처리로 전환하는 과정과, 스트리밍 처리에서 발생할 수 있는 지연 문제를 해결하는 방법을 확인해봤는데. Inference Pipeline을 활용하면 여러 스레드를 사용하여 효율적으로 스트리밍을 처리할 수 있으며, 이를 통해 안정적인 객체 추적과 시간 계산이 가능함.
'AI > Computer Vision' 카테고리의 다른 글
numpy clip (0) | 2025.04.06 |
---|---|
torch.cat (0) | 2025.04.06 |
구글 PailGemma (0) | 2025.03.25 |
YOLO-World: Real-Time, Zero-Shot Objeddt Detecdtion Explained (0) | 2025.03.24 |