Skip to content

Fiona1121/ICN-final-project

Repository files navigation

ICN-final-project

Final project for ICN Fall, 2021 at NTU

Feature

  • Client Server Communication: using the Real-Time Streaming Protocol (RTSP)
  • Real Time Streaming: sending data using Realtime Transfer Protocol (RTP)
  • Quality of Service: using Real-time Transport Control Protocol (RTCP) to communicate traffic condition
  • Object detection: using Tensorflow to add detection while streaming
  • Camera Video Streaming: transferring server camera video to client by RTSP
  • Lost Server Simulation: assign a probability for server to loss a packet while sending RTP

System Flow

system-flow.jpeg

Protocol

RTP

RTP packet由UDP傳遞,負責將影像由Server端傳送至Client端。RTP packet將sequence number、 time stamp等資訊包進Header, frame 作為payload。由於以UDP傳送過大的packet容易產生socket.timeout的error,故將packet切成size為4096 bytes的segment傳送至clinet端。

RTSP

RTSP由TCP傳送,負責將client端的四個指令SETUP、PLAY、PAUSE、TEARDOWN傳送到server端。當使用者在介面中點下四種按鈕時,會將對應動作的指令裝入RTSP封包,並傳送至server,server將讀出封包中對應的rtp port,並對其做出client 下達的指令。

RTCP

RTCP由UDP傳遞,負責將封包傳送品質(fraction_lost),傳送至Server端,Server端將以此之標計算出網路壅塞程度(Congestion_level),並以網路壅塞程度控制傳送程度及壓縮影像品質。以避免網路壅塞。

RTCP.jpeg

Server

當接收client的Setup時,開啟三個thread (分別傳送或接受RTP, RTSP, RTCP),並進入PAUSE mode,等待收到client端的PLAY指令時,才開始傳送影片,在傳送影片時,除了監聽RTSP指令以決定PLAY,PAUSE,TEARDOWN動作外。亦會監聽RTCP指令,以控制傳送速度、影像品質,以避免網路阻塞 。

Congestion level計算公式如下:

由 RTCP 指令中的 fraction lost,計算當前的 congestion level,並依照 congestion level(0~5),壓縮每張frame的解析度、控制傳送速度,以避免網路阻塞 。

server.jpeg

CongestionController

負責根據 congestion level 變更傳送速度

ImageTranslator

根據 congestion level 壓縮傳送影片

Lost Packet Simulation

可以利用 -l 的 argument 去決定 loss 的機率,模擬封包遺失的狀況

Client

使用方式:在點選setup按鈕後,即可完成RTP, RTSP, RTCP的connection。可透過PLAY, PAUSE, TEARDOWN按鈕完成播放、暫停、關閉等動作。另外會計算當前的packet loss,並透過RTCP封包告訴Server端當前的傳送品質,以利Server得知網路壅塞情況。

Packet lost計算:

每次接收 RTP packet 時,Client 會紀錄預期收到的下個封包 (excepted sequence number) ,並透過核對 RTP 封包 sequence number 計算累積的丟失封包數量 (cumulative_lost),並以公式fraction_lost = # packet lost / total packet 計算出fraction_lost,裝入RTCP封包傳送給Server。Server將以此指標計算網路壅塞程度

實作如下圖:

Untitled

Object Detection

Ref: https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/blob/master/Raspberry_Pi_Guide.md

將 client 收到的每張 frame 通過一個 pretrain 的 tflite object detection model,並將結果以方框直接標示於畫面中,並顯示出判斷信心。由於該 model 原本是為 raspberry pi 所設計,不需太多的計算資源,因此 inference 並不會對 fps 產生影響。

GUI

  • 使用PyQt5套件來產生GUI畫面。
  • 是用四個 QPushButton 來產生 setup, play, pause, breakdown,四個按鈕,並依序加入QVBoxLayout來產生左邊的按鈕列。
  • 畫面則是採用 qlabel 來產生,並使用 pyqtSignal 來更新 frame 以播出影片。
  • 最右邊的 layout 則是 使用 qlabel 來印出各種統計資料,並且再每更新固定張數的 frame 後更新數據,以增加可讀性。
  • 最後將以上三個部分依序加入 QHBoxLayout 來產生最終的畫面。

4AFD893F-E697-4C53-8636-6E2051A7C8FE.png

執行方式

Installation

Clone the repository with https://github.com/Fiona1121/ICN-final-project.git.

Having python>=3.6 installed, create a virtual environment by running python -m venv venv inside the cloned folder.

Activate the virtual environment (source venv/bin/activate on Linux, .\venv\Scripts\activate on Windows).

Install the requirements with python -m pip install -r requirements.txt.

Usage

Server should be run first with

python main_server.py

To specify server ip, port, or session ID

$ python main_server.py -h
usage: main_server.py [-h] [-i IPADDRESS] [-p PORT] [-s SESSIONID] [-l PROBLOST]

optional arguments:
 -h, --help            show this help message and exit
 -i IPADDRESS, --IPADDRESS IPADDRESS
                       The RTSP server IP address
 -p PORT, --PORT PORT  The port number
 -s SESSIONID, --SESSIONID SESSIONID
                       Session IDServer session ID
 -l PROBLOST           Probability of rtp packet loss

Client can be run with

python main_client.py <filename> <host> <server_port> <client_port>

About

Final project for ICN Fall, 2021 at NTU

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages