keix1の日記

共有用ブログ

【Python】setuptoolsで自作モジュールを一発入魂

下記リポジトリのREADMEにソースと一緒にまとめた。

github.com

下記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__.pysetup.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.pyentry_pointsconsole_scriptsCLIツール指定するための記述になっている

わかったこと

  • 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

下記に記録した

Google Colab GitHub

まとめ

  • 頻度ランキング1位ゲットできるCounter.most_common()[0][0]は覚えておいてソンはないかも

 

【文献調査】FairMOT: A Simple Baseline for Multi-Object Tracking

読んだもの

A Simple Baseline for Multi-Object Tracking

  • 華中科技大学とMicrosoftの人が共著の2020年5月公開の文献

paperswithcode.com

GitHub: FairMOT

github.com

試してみた

環境

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

デモ実行結果

youtu.be

文献概要

  • 近年、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

手法理解

f:id:keix1:20200610212159p:plain
FairMOT Method

  • 本手法では下記によりMOTを実現
    • One-shot method(one-shot learningとは別物?)
    • Anchor-free object detection
    • Multi-Layer Feature Aggregation

従来研究

  1. 2ステップ手法(2つのモデルでMOT
    • detection model:
      • bounding boxで位置を割り出す
    • association model:
      • 各bounding boxからRe-ID featureを抽出し対象物を関連付ける
    • 2つのネットワークの間では特徴を共有しないため、ビデオレートの速度は出なかった
  2. one-shot method(従来版)
    • 上記2つのネットワークを連結して高速に実行できるが、2ステップ手法に比べて精度が落ちていた
    • IDの切り替わり回数が大幅に増加してしまう問題があった(文献中に実験あり)

Re-IDについての2つの手法

f:id:keix1:20200610084555p:plain
Re-ID methods

  • (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〜

既存:

f:id:keix1:20200610230009p:plain
existing

Deep Layer Aggregation:

f:id:keix1:20200610230040p:plain
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)

Test Dataset

  • 2DMOT15,
  • MOT16
  • MOT17
  • MOT20

所感

  • このまま姿勢推定に突っ込めばもう個人を特定できると思った
  • one-shotという用語を調べてるうちにone-shot learningが気になり始めたが今回のone-shotは2つのタスクを1つのモデルでやるの意味だと思う。one-shot learning今度調べたい
  • 2つのタスクを1つのモデルで実施は前回調査したSiamMaskでも出てきたので最近のトレンドはmultitaskできるモデルなんだろうと思った

用語

英単語

  • 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

読んだもの

paperswithcode.com

youtu.be

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

f:id:keix1:20200602223846p:plain
SiamMaskComparison

  • 速い
    • 手元のMacのCPUで1.6fps(リアルタイム)
    • オフライン学習だから速い
      • 事前に学習し未知のデータに対して処理
      • 実行中の更新がないため紛らわしいものは間違える可能性あり
  • ラッキングの精度も執筆時点で最新のものより良い(Conclusionより)

手法の理解

SiamMaskの構成図

f:id:keix1:20200603004628p:plain
SiamMaskMethod

  • 従来と比べhの部分を拡張してmaskを出力

  • Fully-Convolutional Siamese Networksを使っている

    • Siamese Networksで同じ場面を表す大小2枚の画像を学習することでObject Trackingを実現
    • Siamese Networksはアーキテクチャ、中身のモデルはどんなネットワークにも変更可能

f:id:keix1:20200603004736p:plain
Siamese

  • Siameseの学習アルゴリズム
    • クラスが同じ場合は距離を近づけ、違う場合は距離を離すよう損失関数をつくる
      • ばねと同じ原理→フックの法則

f:id:keix1:20200603004836p:plain
Siamese2

  • 今回の手法はおそらく
    • 従来 :オブジェクトの位置をつくれるようSiameseしてる
    • 本手法:セグメンテーションするMaskをつくれるようSiameseしてる

試しにやってみた

実行環境

Demo.py実行時の注意点

  • PYTHONPATHを設定する
    • {yourlocation}/SiamMask/toolsを設定しました
  • スペースを押すと再生開始
  • --cpuをつけてCPUモードで実行できる

顔を選択したとき

youtu.be

文字を選択したとき

youtu.be

うまくいっていないところ

  • 足のトラッキング中、足が重なったりすると判別できずもう片方の足を追従してしまう
  • ラケットのトラッキングは体と重なっているところから開始しているせいか難しかった
    • 体と離れた状態から選択するなら良くなるかもしれない

所感

  • 動画中いつでもユーザーが自分でターゲットを設定できるので、アプリケーションの応用が無限に効きそう
    • 刑事「あの犯人を追え!」→ハッカー「了解」
  • セグメンテーションできるので、オブジェクトの状態を推定するための前処理として使えそう
    • 背景に関わらず物体のうごきや色に注目できる
  • 追従できるので人物の識別に使える?
    • Aさん、Bさん

関連知識

英単語

  • fundamental: 基礎的な
  • survaillance: 監視
  • subsequent: その後に起こる
  • intersection: 交差点
  • arbitrary: 任意の
  • consequence: 結果
  • understandably: 当然だが
  • operablity: 操作性
  • agnostic: 不可知論者
  • schematic: 概要を示した、図式の
  • denote: であることを示す
  • contrasive: 対称的な