物体検出とは、画像データのどこに何があるかを認識する技術である。このRESTサーバーは、YOLOを用いた物体検出エンジンにアクセスすることができるAPIを提供する。標準モデルを用いているので、一般的な対象物(人物、動物、乗り物など)を検出する。
https://www.python.org/downloads/からPythonをインストールする。
注意: Python 3.12.xを利用してください。3.13.xでは依存するパッケージがインストールできません。
NoSQLのキーバリュー型の一つで、メモリ上でデータを管理するインメモリデータべースである。ローカルファイルにアクセスするより高速であり、検出した結果画像データを所定の時間内で保持するために用いる。
https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/を参考にインストールする。
補足: WSL2のLinuxで動作させなくても、Redis for Windows 3.0からでも動作することを確認しています。 配信サイト: https://github.com/MicrosoftArchive/redis/releases
コマンドプロンプト上で、次のコマンドを実行し、必要なPythonのパッケージをインストールする。
pip install -r requirements.txt学習済みのYOLOモデルファイル(YOLO v3)は次のURLからダウンロードし、modelフォルダーに配置する。人物、動物、乗り物などを検出するモデルである。
https://github.com/OlafenwaMoses/ImageAI/releases/download/3.0.0-pretrained/yolov3.pt/
本アプリを起動するには環境変数の設定が必要である。以下の環境変数が.envファイルに定義されている。YOLOモデルファイル名やRedisサーバーは初期設定されているので、これらに変更があれば修正する。
| 変数名 | 説明 |
|---|---|
| LOCAL_FOLDER | アップロードしたファイルを暫定的に保存するローカルフォルダーの名前 |
| YOLO_MODEL_FILE | 利用するYOLOモデルファイルのパス |
| REDIS_HOST | Redisサーバーのホスト名 |
| REDIS_PORT | Redisサーバーのポート番号 |
| REDIS_EXPIRE | Redisキーの有効期限(秒) |
コマンドプロンプトから次のコマンドを実行し、サーバーを起動する。
開発版(ソースコード編集内容が自動的に反映される):
uvicorn main:app --reload本番環境:
uvicorn main:app※Application startup completeと表示されるまで少し時間がかかります。
コマンドの説明:
| コマンドの要素 | 説明 |
|---|---|
| uvicorn | FastAPIベースの非同期Python Webアプリケーションを実行する |
| main:app | Pythonファイルmain.pyの中で、FastAPIが生成する変数がapp |
| --reload | 実行中にソースコードが変更されたとき、サーバーが自動的にリロードされる |
デフォルトのポート番号は8000。
ポート番号を指定するときは --port [ポート番号] を後ろに付与する。
確認のため、Webブラウザを開き、次のURLへアクセスする(ポート番号が8000の場合)。
トップページが現れる。
このサーバーが提供するREST APIエンドポイントは、ある定型的なJSON構造を返却する。その構造は、株式会社MetaMoJiの製品 eYACHO および GEMBA Noteの開発者オプションのアグリゲーション検索条件を構成する RESTコネクタ の仕様に基づく。
REST用アグリゲーションの出力構造:
{
'keys': ['key1', 'key2', ... 'keyN'], # recordsの中で用いるキーの一覧
'records': [
{'key1': value-11, 'key2': value-21, ... 'keyN': value-N1},
{'key1': value-12, 'key2': value-22, ... 'keyN': value-N2},
...,
{'key1': value-1m, 'key2': value-2m, ... 'keyN': value-Nm},
],
'message': エラーメッセージ or null(success)
}eYACHO/GEMBA Noteアプリから送信されてきた画像情報をファイルに一時的に保存し、YOLOの物体検出を実行し、結果をRedisに格納する。
リクエストボディ(JSON)の構造:
| キー | 説明 |
|---|---|
| _noteLink | eYACHO/GEMBA Noteの対象ノート固有のURL |
| _pageId | eYACHO/GEMBA Noteの対象ページ固有のID番号 |
| inputImage | 物体検出する画像のBase64文字列 |
※_noteLinkと_pageIdは、Redisに情報を格納するときのキーを生成するために利用する。
レスポンスの仕様:
| キー | 説明 |
|---|---|
| objName | 検出された物体名称 |
| probability | 検出精度 |
| topX | 検出された領域の左上のX座標 |
| topY | 検出された領域の左上のY座標 |
| bottomX | 検出された領域の右下のX座標 |
| bottomY | 検出された領域の右下のY座標 |
レスポンス例:
{
'keys': ['objName', 'probability', 'topX', 'topY', 'bottomX', 'bottomY'],
'records': [
{'objName':<Detected Name>,
'probability':<Percentage>,
'topX':234, 'topY':140, 'bottmX':249, 'bottomY':156},
...],
'message': <コメント>
}/rest/detect_objectsメソッドで検出された物体の名称と認識領域をRedisから取得する。
リクエストボディ(JSON)の構造:
| キー | 説明 |
|---|---|
| _NOTE_LINK | eYACHO/GEMBA Noteの対象ノート固有のURL |
| _PAGE_ID | eYACHO/GEMBA Noteの対象ページ固有のID番号 |
※_NOTE_LINKと_PAGE_IDは、Redisから情報を取得するときのキーを生成するために利用する。
レスポンスの仕様:
| キー | 説明 |
|---|---|
| objName | 検出された物体名称 |
| probability | 検出精度 |
| topX | 検出された領域の左上のX座標 |
| topY | 検出された領域の左上のY座標 |
| bottomX | 検出された領域の右下のX座標 |
| bottomY | 検出された領域の右下のY座標 |
レスポンス例:
{
'keys': ['objName', 'probability', 'topX', 'topY', 'bottomX', 'bottomY'],
'records': [
{'objName':<Detected Name>,
'probability':<Percentage>,
'topX':234, 'topY':140, 'bottmX':249, 'bottomY':156},
...],
'message': <コメント>
}/rest/detect_objectsメソッドで生成された検出画像をRedisから取得する。
リクエストボディ(JSON)の構造:
| キー | 説明 |
|---|---|
| _NOTE_LINK | eYACHO/GEMBA Noteの対象ノート固有のURL |
| _PAGE_ID | eYACHO/GEMBA Noteの対象ページ固有のID番号 |
※_NOTE_LINKと_PAGE_IDは、Redisから情報を取得するときのキーを生成するために利用する。
レスポンスの仕様:
| キー | 説明 |
|---|---|
| outputImage | 生成された画像のBase64文字列 |
レスポンス例:
{
'keys': ['outputImage'],
'records': [{'outputImage':<Base64文字列>}],
'message': <コメント>
}- packageフォルダ以下にある開発パッケージのバックアップファイル(YOLO_Detect__<バージョン>__backup.gncproj)をeYACHO/GEMBA Noteに復元する
- サーバーが起動していることを確認する
- Windowsアプリからローカルサーバーにアクセスする場合は、管理者モードで利用対象アプリのループバックを有効にする → Windowsで開発する際の注意点
- 開発パッケージフォルダ上にある 物体検出ノートテンプレート をクリックする
- 新たなノートが作成される
- 編集状態のノートの中にある「縦型画像」ページあるいは「横型画像」ページを選択する
- 対象の画像を「入力画像」に張り付ける
- 人物、動物、乗り物などが映っている画像が良い
- ページ上の 画像送信 ボタンをクリックする [1]
- 「送信終了」とダイアログが現れると検出成功
- 同ページにある 領域検出 と 結果画像 をクリックすると認識した物体名称とその位置、検出画像が表示される [2]
- どちらのボタンからクリックしてもよい
[1] サーバーのポート番号を変更した場合は、「画像送信」のボタンコマンド「サーバーに送信する」に設定してあるRESTのURL、アグリゲーション検索条件「detectedObjectList」と「detectedImage」のコネクタ定義にある URL を変更する。
[2] 環境変数 REDIS_EXPIREで指定した時間間隔だけ、検出結果は残る。
- 2024-11-14 初版
