【Python】setuptoolsで自作モジュールを一発入魂
下記リポジトリのREADMEにソースと一緒にまとめた。
下記README
setuppy
setuptoolsを使ってsetup.pyを試してみたリポジトリです。
setuptoolsについて
- 今までは頑張って
sys.path.append()
で自作モジュールをimportしていたが、相対パスを考えたりしなくてはならず面倒だった - setuptoolsなら自作モジュールをpipや開発環境に一発入魂できる
- どこからでもimportできる
- GitHubからもpip installできる
- コマンドラインツールもinstallできる
- twineを使えばPyPIにアップロードして普通にpip installもできるようになる
本レポのディレクトリ構造
. ├── setup.py ├── sample │ ├── __init__.py │ ├── hoge.py │ └── sample.py └── test └── test.py
Local develop
- ローカルファイルを更新すると即座に更新が反映される。
- 開発用途ならこれで良さそう。
Install on Local develop
インストール
cd setuppy
python setup.py develop
確認
pip list | grep sampleA
実行
python test/test.py
developインストールするなら下記は省いても動いた
__init__.py
setup.py
のpackagesとentry_points部分
Uninstall on Local develop
python setup.py develop -u
pip
- GitHubに置けばGitHubから配布が可能になる
- 当然だがスクリプトを更新したら再度pip installする必要がある
- 上記で触れた
__init__.py
とsetup.py
のpackage記述がいる
pip install
cd setuppy
pip install .
pip install from GitHub
pip install git+https://github.com/keix1/setuppy.git
pip uninstall
pip uninstall SampleA
コマンドラインツールとして使う
- 本レポをInstall済みであれば
sample_command
が使えるようになっている
sample_command
setup.py
のentry_points
のconsole_scripts
がCLIツール指定するための記述になっている
わかったこと
- develop installでは
.egg-info
に関係性が保存されてる様子 __init__.py
は空ファイルでもいいみたい- CLIツールとして使えるのちょっとやばい
参考
WebRTCで撮影した動画をFastAPIにPOSTでファイルアップロードするときハマったこと
TL;DR 解決
下記でファイルアップロードできます。
Javascript側(送る側)
var f = new FormData(); var filename = "something.webm" f.append("video", buffer, filename); // <=ここではまった let xhr = new XMLHttpRequest(); xhr.open('POST', window.location.origin + '/uploadVideo', true); xhr.send(f);
ちなみにbufferはblobです。
FastAPI側(受け取る側)
@app.post("/uploadVideo") async def uploadVideo(video: UploadFile = File(...)): # <=ここではまった video_data = await video.read() upload_path = pathlib.Path(f'static/received_videos/{video.filename}') with upload_path.open(mode="wb") as f: f.write(video_data) return {"filename": video.filename}
ハマったところ2点
- 必要なライブラリ
- FastAPIの引数名
必要なライブラリ
下記が必要そう
pip install python-multipart
参考:Uploading images in FastAPI post request causes 400 Bad Request - Stackoverflow
FastAPIの引数名
async def uploadVideo(video: UploadFile = File(...)):
ここでvideo
となっているところは多くの記事でfile
とかになっています。
FastAPIのPOSTで受け取る際はその引数の名前を送る側と同じにすることで受け取れるようになっているようです。
Javascriptを見るとたしかにvideo
と指定して送ってますね。(無駄に自分で変えてた。。。)
実はFlaskでやって一回成功していたのですが、それがこちら。
from flask import request @app.route('/uploadVideo', methods=["POST"]) def uploadVideo(): received = request.files videofile = received['video'] videofile.save('static/received_videos/' + videofile.filename) return str(received), 200
videoと指定して受け取っていますね。
教訓
割とどうでもいいようなところで結構な時間を使ってしまいました。
FastAPI初めてだったのでどこが違うか色々変な方向に疑って結果回り道してました。
今後はひとつひとつ成功したところを確認すること。
時々見かける便利そうなやつ:collections.Counter
collectionsとは?
このモジュールは、汎用の Python 組み込みコンテナ dict, list, set, および tuple に代わる、特殊なコンテナデータ型を実装しています。
- namedtuple()
- deque
- Counter←今日はこれ
- OrderedDict
- defaultdict
- UserDict
- UserList
- UserString
下記に記録した
まとめ
- 頻度ランキング1位ゲットできる
Counter.most_common()[0][0]
は覚えておいてソンはないかも
【文献調査】FairMOT: A Simple Baseline for Multi-Object Tracking
読んだもの
A Simple Baseline for Multi-Object Tracking
- 華中科技大学とMicrosoftの人が共著の2020年5月公開の文献
GitHub: FairMOT
試してみた
環境
Demoの実行→github#demo
- DLA34を使ったモデル(all_dla34.pth)ではメモリが足らなかった
RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB (GPU 0; 1.95 GiB total capacity; 0 bytes already allocated; 899.25 MiB free; 0 bytes cached)
- そのためその下のを実行(HRNetV2_w18を使ったモデルを使用)
python demo.py mot --load_model ../models/all_hrnet_v2_w18.pth --arch hrnet_18 --reid_dim 128 --conf_thres 0.4
デモ実行結果
- 大体3.4fpsぐらい出た
- 人のボックスに色、ボックス左上に数字がついて識別してる。すご
- 見えない場合動画DL→FairMOT_Demo.mp4 - Google ドライブ
文献概要
- 近年、Multi Object Tracking(MOT)のための物体検出(Object Detection)と再識別(Re-identification, Re-ID)は目覚ましい発展をしている
- しかし推論速度を向上するためにこの2つのタスクを1つのネットワークで達成する試みにはあまり注意が向けられていない
- 従来研究では再識別部(Re-ID)の学習がうまくいかず失敗している
- 本文献ではこのための問題解決のベースラインを示す
- Public datasetで学習し30fpsの速度が出る(GPUでってことだと思う。ベンチマーク用のなにかがあるのかもしれない)
Keywords: One-shot MOT, Simple Baseline, Anchor-free
手法理解
- 本手法では下記によりMOTを実現
- One-shot method(one-shot learningとは別物?)
- Anchor-free object detection
- Multi-Layer Feature Aggregation
従来研究
- 2ステップ手法(2つのモデルでMOT)
- detection model:
- bounding boxで位置を割り出す
- association model:
- 各bounding boxからRe-ID featureを抽出し対象物を関連付ける
- 2つのネットワークの間では特徴を共有しないため、ビデオレートの速度は出なかった
- detection model:
- one-shot method(従来版)
- 上記2つのネットワークを連結して高速に実行できるが、2ステップ手法に比べて精度が落ちていた
- IDの切り替わり回数が大幅に増加してしまう問題があった(文献中に実験あり)
Re-IDについての2つの手法
- (a)anchor-based Re-IDでは荒いグリッドを使うため物体の中心に合わせられない
- 黄と赤のアンカーは青シャツランナーのIDを推定している
- (b)anchor-free Re-IDは曖昧さの影響を受けづらい
Anchorを用いた手法はRe-IDに向かない
- 問題:
- 複数のアンカーが同じオブジェクトをとらえる可能性がある
- 解決:下記2つの問題に分解
- ピクセル単位のキーポイント(オブジェクトセンター)推定問題
- 高解像度特徴マップ上でのidentity分類問題(AとBは同じ?分類)
Multi-Layer Feature AggregationのMOTにおける重要性
Deep layer aggregationについて
Deep layer aggregation. Cvpr2018 P13〜
既存:
↓
Deep Layer Aggregation:
- MOTではRe-ID featureは大小それぞれのオブジェクトに対応するためlow/high level両方のfeatureを活用する必要がある
- Multi-Layer Feature Aggregationにより様々な大きさに対応できるようになり、実験からID切り替わり回数問題が低減することを確認した
ReIDの特徴の次元数
- 前述したRe-IDでは高次元な特徴を用いており、とてもいい結果を残してきた
- しかし次元数は小さいほうがいいことが判明した
- 低次元な特徴の学習はover-fittingを抑制しトラッキングの頑健性を向上する
学習について
DLA-34(COCOベースのpretrainモデル)で初期化しRTX 2080で30時間学習したそう
Train Dataset
only bounding box annotations (detection branch)
- ETH
- CityPerson
bounding box and identity annotations (detection and identity branch)
- CalTech
- MOT17
- CUHK-SYSU
- PRW
Test Dataset
- 2DMOT15,
- MOT16
- MOT17
- MOT20
所感
- このまま姿勢推定に突っ込めばもう個人を特定できると思った
- one-shotという用語を調べてるうちにone-shot learningが気になり始めたが今回のone-shotは2つのタスクを1つのモデルでやるの意味だと思う。one-shot learning今度調べたい
- 2つのタスクを1つのモデルで実施は前回調査したSiamMaskでも出てきたので最近のトレンドはmultitaskできるモデルなんだろうと思った
用語
- backbone network: 特徴抽出するための基礎的なネットワーク
- DLA-34: 今回backboneに使われたネットワーク
- HRNetV2: DLA-34と同じ感じ?
- Semantic Segmentation: 画像内の全画素にラベルやカテゴリを関連付けるタスク
- MOTAなどの評価指標について
- 「FCOS」、RetinaNetを超えたアンカーフリー物体検出 - LSC PSD - Medium
- Deep layer aggregation. Cvpr2018
- これにより大小のスケールに対応できるようになった
英単語
- degraded: 退化した
- end up: 最後には〜で終わる
- trajectory: 弾道、軌道
- in tern: 順番に
- compounding: 配合
- aggregating: 集約
- deserve: 値する
- dilated: 膨張した
- deformable: 変形可能な
- trivial: 自明
- need to leverage: 活用する必要がある
- observe: 気づく
- due to: のため
- fed to, feed to: 供給する
- promising: 前途有望な
- alleviate: 軽減する
- aligned with: 連携して
- fuse: 導火線
- jittering: 神経質
【文献調査】SiamMask: Fast Online Object Tracking and Segmentation: A Unifying Approach
読んだもの
GitHub: foolwood/SiamMask: [CVPR2019] Fast Online Object Tracking and Segmentation: A Unifying Approach
2019年5月公開
概要
- 任意のオブジェクトのトラッキング (visual object tracking, VOT)+セグメンテーション (video object segmentation, VOS)
- 自分でbounding boxを設定するとそのオブジェクトを追従してくれる→classのわからない未知のバイナリ画像を追える
- 青→自分で設定したbounding box
- 赤→ECOという従来手法
- 緑→提案するSiamMask
- 速い
- 手元のMacのCPUで1.6fps(リアルタイム)
- オフライン学習だから速い
- 事前に学習し未知のデータに対して処理
- 実行中の更新がないため紛らわしいものは間違える可能性あり
- トラッキングの精度も執筆時点で最新のものより良い(Conclusionより)
手法の理解
SiamMaskの構成図
従来と比べhの部分を拡張してmaskを出力
Fully-Convolutional Siamese Networksを使っている
- Siamese Networksで同じ場面を表す大小2枚の画像を学習することでObject Trackingを実現
- Siamese Networksはアーキテクチャ、中身のモデルはどんなネットワークにも変更可能
- Siameseの学習アルゴリズム
- クラスが同じ場合は距離を近づけ、違う場合は距離を離すよう損失関数をつくる
- ばねと同じ原理→フックの法則
- クラスが同じ場合は距離を近づけ、違う場合は距離を離すよう損失関数をつくる
- 今回の手法はおそらく
- 従来 :オブジェクトの位置をつくれるようSiameseしてる
- 本手法:セグメンテーションするMaskをつくれるようSiameseしてる
試しにやってみた
実行環境
- MacBookPro 2017 Core i7
Demo.py実行時の注意点
- PYTHONPATHを設定する
{yourlocation}/SiamMask/tools
を設定しました
- スペースを押すと再生開始
--cpu
をつけてCPUモードで実行できる
顔を選択したとき
文字を選択したとき
うまくいっていないところ
- 足のトラッキング中、足が重なったりすると判別できずもう片方の足を追従してしまう
- ラケットのトラッキングは体と重なっているところから開始しているせいか難しかった
- 体と離れた状態から選択するなら良くなるかもしれない
所感
- 動画中いつでもユーザーが自分でターゲットを設定できるので、アプリケーションの応用が無限に効きそう
- 刑事「あの犯人を追え!」→ハッカー「了解」
- セグメンテーションできるので、オブジェクトの状態を推定するための前処理として使えそう
- 背景に関わらず物体のうごきや色に注目できる
- 追従できるので人物の識別に使える?
- Aさん、Bさん
関連知識
- 動画から物体を追跡するSiamMaskの論文要約 - Qiita
- むちゃがっつり翻訳されている。ありがたや
- 論文読込み:「Fully-Convolutional Siamese Networks for Object Tracking」の要約 - Qiita
- 【深層距離学習】Siamese NetworkとContrastive Lossを徹底解説|はやぶさの技術ノート
- 物体検出、セグメンテーションをMask R-CNNで理解してみる (初心者) - Qiita
- コンピュータビジョンの最新論文調査 Object Tracking 編 · DeNA Engineers' Blog
- SiamRPNとSiamFC
- SiamRPNのが強いっぽい感じ
英単語
- fundamental: 基礎的な
- survaillance: 監視
- subsequent: その後に起こる
- intersection: 交差点
- arbitrary: 任意の
- consequence: 結果
- understandably: 当然だが
- operablity: 操作性
- agnostic: 不可知論者
- schematic: 概要を示した、図式の
- denote: であることを示す
- contrasive: 対称的な