Skip to content

Commit

Permalink
Merge pull request #66 from TUS-OSK/develop
Browse files Browse the repository at this point in the history
Object-detection
  • Loading branch information
ilim0t authored Nov 13, 2019
2 parents 5cc4269 + 67d2e14 commit 550dfcc
Show file tree
Hide file tree
Showing 56 changed files with 7,227 additions and 859 deletions.
6 changes: 4 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +232,6 @@ dmypy.json
*.png
*.jpeg
*.jpg
*.m3u8
*.ts
*.mp4

# Docker files
Expand All @@ -244,3 +242,7 @@ dmypy.json

*.http
yarn.lock

# model data
openvino/
models/
128 changes: 57 additions & 71 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,64 +3,57 @@
OSK の部室の様子をオンラインで確認できるプロジェクト 部室ちゃん
その部室に置いてある PC で動かすプログラム

## Support

以下の OS をサポートします。

- Ubuntu 18.04
- macOS 10.14 (Debug mode のみ)

Debug mode 下では挙動に以下の差異があります。
## Description

- ストリーミング映像がカメラからではなく任意の動画ファイルから取得される
- Time zone の設定がされず時刻がずれる
bushitsuchan-PC は単一の Ubuntu PC 上で動作します。
限られた特定の人に,WEB site と Slack を介して部室の動画,画像または物体検出結果を表示します。

## Container
### Container

bushitsuchan-PC では[Docker](https://www.docker.com/)というソフトフェアを活用しています。
Docker はコンテナ技術を体現したシステムの一つで,独立したサービス単位で環境それぞれを Container という形で OS レベルに分離させることができます。必要最低な構成を独立して扱うため再利用性が高まり,また分離しているため取り回しも良くなります。

bushitsuchan-PC における container の一覧と用途を記します。

### streaming-server

同時に複数のプロセスがカメラにアクセスすることができないためこの container で映像を管理し,複数のプロセスへとカメラ画像を受け渡します。

### streamer

**streaming-server** へと実際にカメラ画像をストリーミングします。遅延を減らすための圧縮や codec の変換も行います。
各 Container の説明は[ここ](docs/container.md)に置かれています。

### media
### Design

各 container が必要とするカメラ画像や映像を **streaming-server** から代理で取り出します。また取り出す際のさらなる変換も行います
bushitsuchan-PC 全体のフローは[Sequence 図](/docs/sequence.md)で確認できます

### reverse-proxy

外部からのアクセスを URL 毎に **web** または **slack** へ振り分ける処理を行います。
## Setup

### tunnel
bushitsuchan-PC を動作させるための設定を各部分ごとに説明します。

外部へ **reverse-proxy** サーバを公開する際の初期設定などの処理を行います。
### 環境変数

### web
#### 説明

ブラウザでウェブサイトへアクセスされた際の処理を行います。ログイン処理なども担います
環境変数は独立したアプリケーション間で共通の値を参照できる値を設定するもので,通常は不変な ID やパスワードをセットしておきます

### slack
#### 設定

Slack 上での slash command や action への応答を処理しています。
最終的に`.env`ファイルに以下の様に書き保存してください。
各変数へと何をセットすれば良いのかはこれから説明します。

### redis
```text=
AWS_REST_API_ID=j3i... # 二回目以降に必要
AWS_ACCESS_KEY_ID=FUB...
AWS_SECRET_ACCESS_KEY=vKw...
データベースとして機能し,ログイン情報の保持や画像変換の待機管理を行います。
NGROK_AUTH=8HU...
## Design
SESSION_SECRET=presetprivatekey # 暗に暗号化へ使う任意の頑強な文字列
bushitsuchan-PC 全体のフロー
SLACK_CLIENT_ID=179...
SLACK_CLIENT_SECRET=38b...
WORKSTATION_ID=I6B...
> [Sequence 図](/docs/sequence.md)
SLACK_BOT_ACCESS_TOKEN=xoxb-3814...
SLACK_SIGNING_SECRET=fb36...
CONTACT_CHANNEL=BN3...
NOTIFICATION_CHANNEL=O6C...
```

## Setup
> ファイルを作成せずに [direnv](https://direnv.net/)などで環境変数にセットしても動作します
### ngrok

Expand All @@ -74,7 +67,7 @@ ngrok はユーザー登録をしていると使い勝手が良くなるので
#### 設定

[ngrok](https://ngrok.com/)に登録して,`Tunnel Authtoken` を取得します。
それを後述する環境変数`NGROK_AUTH`にセットしてください。
それを前述したように環境変数`NGROK_AUTH`にセットしてください。

### AWS API Gateway

Expand All @@ -88,7 +81,7 @@ API Gateway を利用するためには AWS アカウントと AWS へアクセ
[AWS アクセスキーの作成方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-access-key/)に従い

新たにユーザー作成し,`アクセスキー ID``シークレットアクセスキー`を作成してください。
それを後述する環境変数`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`にセットしてください。
それをを前述したように環境変数`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`にセットしてください。

そのユーザーにはポリシー`AmazonAPIGatewayAdministrator`をアクセス権にアタッチしてください。

Expand All @@ -101,7 +94,7 @@ API Gateway を利用するためには AWS アカウントと AWS へアクセ
Slack と連携し特定の Workspace に属する場合のみ LIVE Streaming 視聴を許可するように設定します。
その際,Slack App という枠組みを利用しています。新たに Slack App を作成し,それに対応するいくつかの ID やキーが必要です。

また,Slash Commands やメッセージへのアクションを受け取るためには[slack 設定](slack/README.md)に従う必要があります。
また,Slash Commands やメッセージへのアクションを受け取るために追加で[Slack 追加設定](/docs/slack_appendix.md)に従う必要があります。

#### 設定

Expand All @@ -111,7 +104,8 @@ Bot User メニューにて Redirect URLs は
`https://[RESOURCE_ID].execute-api.[REGION].amazonaws.com/prod/oauth-redirect`のみに設定し,
Scopes に`identity.basic`を追加してください。

作成した Slack App から以下の環境変数を設定してください。詳細は後述します。
作成した Slack App から以下の環境変数を設定してください。

どの部分から得るのかの対応を書いておきます。

- `SLACK_CLIENT_ID`: Basic Information > App Credentials > Client ID
Expand All @@ -131,36 +125,7 @@ bushitsuchan-PC では slack で特定のワークスペースに属する場合
まず,そのワークスペースのサイトをブラウザで開きます。
URL が`https://app.slack.com/client/VYS39C27C/UC7CHE35J`のようになっているはずです。
この URL の`VYS39C27C`部分が必要な ID です。
後述する環境変数`WORKSTATION_ID`にセットしてください。

### 環境変数

#### 説明

環境変数は独立したアプリケーション間で共通の値を参照できるもので,通常は不変な ID やパスワードを設定します。

#### 設定

`.env`ファイルに以下の様に書き保存してください。

```text
AWS_REST_API_ID="j3i..." # 二回目以降に必要
AWS_ACCESS_KEY_ID="FUB..."
AWS_SECRET_ACCESS_KEY="vKw..."
NGROK_AUTH="8HU..."
SESSION_SECRET="presetprivatekey" # 暗に暗号化へ使う任意の頑強な文字列
SLACK_CLIENT_ID="179..."
SLACK_CLIENT_SECRET="38b..."
WORKSTATION_ID="VOW38CP2D"
SLACK_BOT_ACCESS_TOKEN="xoxb-3814..."
SLACK_SIGNING_SECRET="fb36..."
```

> ファイルを作成せずに [direnv](https://direnv.net/)などで環境変数に代入しても動作します
これを前述したように環境変数`WORKSTATION_ID`にセットしてください。

## Requirement

Expand Down Expand Up @@ -193,3 +158,24 @@ Forwarding https://[AWS_REST_API_ID].execute-api.[AWS_REGION].amazonaws.com/pro
すると,初回実行時(過去に Slack で認証をしていなければ) Slack の認証ページへリダイレクトされます。
Sign in すると自動的に配信再生ページへ移動します。

### slack

設定した Workspace 内で`/bushitsu-photo`コマンドを任意の場所で送信すると,現在の現在の部室の様子が投稿されます。
また,環境変数`NOTIFICATION_CHANNEL`にセットしたチャンネルに部室を物体検出した結果が随時投稿されます。

## For Developer

[ここ](docs/developer.md)に詳細が記されています。

## Support

以下の OS をサポートします。

- Ubuntu 18.04
- macOS 10.14 (Debug mode のみ)

Debug mode 下では挙動に以下の差異があります。

- ストリーミング映像がカメラからではなく任意の動画ファイルから取得される
- Time zone の設定がされず時刻がずれる
45 changes: 41 additions & 4 deletions docker-compose.debug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ services:
environment:
- RTMP_SERVER_URL=rtmp://streaming-server:1935/live
- STREAM_NAME=bushitsuchan
media:
build: ./media
image-storage:
build: ./image-storage
working_dir: /app
command: npm run dev
entrypoint: docker-entrypoint.sh
volumes:
- ./media/src:/app
- ./image-storage/src:/app
- ./photo:/photo
ports:
- 3000:80
Expand All @@ -36,6 +36,21 @@ services:
depends_on:
- streamer
- redis
hls:
build: ./hls
working_dir: /app
command: npm run dev
entrypoint: docker-entrypoint.sh
volumes:
- ./hls/src:/app
ports:
- 3006:80
- 4006:9229
environment:
- RTMP_SERVER_URL=rtmp://streaming-server:1935/live
- STREAM_NAME=bushitsuchan
depends_on:
- streamer

reverse-proxy:
image: nginx:alpine
Expand Down Expand Up @@ -94,6 +109,7 @@ services:
- SLACK_SIGNING_SECRET=${SLACK_SIGNING_SECRET}
- CONTACT_CHANNEL=${CONTACT_CHANNEL}
- SESSION_SECRET=${SESSION_SECRET}
- NOTIFICATION_CHANNEL=${NOTIFICATION_CHANNEL}
volumes:
- ./slack/src:/app
ports:
Expand All @@ -118,4 +134,25 @@ services:
# command: redis-server --appendonly yes --requirepass foobared
volumes:
- ./redis:/data
# python:

object-detection:
build:
context: ./object-detection
working_dir: /app
command: pipenv run dev
environment:
- RTMP_SERVER_URL=rtmp://streaming-server:1935/live
- STREAM_NAME=bushitsuchan
- DEVICE=CPU
- CPU_EXTENSION=/opt/intel/openvino/inference_engine/lib/intel64/libcpu_extension_avx2.so
- FLASK_ENV=development
privileged: true
volumes:
- ./object-detection/src:/app
- /dev:/dev
ports:
- 3005:80
- 5678:5678
depends_on:
- streamer
- image-storage
Loading

0 comments on commit 550dfcc

Please sign in to comment.