Skip to content

refactor: 2ライン方式の採用に伴うディレクトリ整理 - #104

Draft
ucn-yushin wants to merge 13 commits into
developfrom
refactor/ucn/directory-restructure
Draft

refactor: 2ライン方式の採用に伴うディレクトリ整理#104
ucn-yushin wants to merge 13 commits into
developfrom
refactor/ucn/directory-restructure

Conversation

@ucn-yushin

Copy link
Copy Markdown
Contributor

対応Issue

ディレクトリ整理そのもののIssueは立てていません。方式決定の経緯は以下を参照してください。

なぜやったか

PR #90 で2ライン方式の採用が決まり、リポジトリの位置づけが「複数方式を並べて比較する実験リポジトリ」から「採用方式を運用するプロダクト」へ変わった。しかし構造は実験時代のままで、以下の問題があった。

  • 採用されなかった方式(ROI方式、センサー方式、SAHI+YOLOの旧台数計測)のコードが同居している
  • パッケージ化されておらず、各スクリプトが sys.path.insertcommon を import している
  • 依存定義がルートの pyproject.toml と各所の requirements.txt に二重化している
  • .gitignoredocs/ を丸ごと無視しており、方式決定の記録をコミットできない
  • テストが common/testsline_detection/testseval/tests の3箇所に分散している

何をやったか

レガシーの削除

raspi/detect/(SAHI+YOLOの旧台数計測)、raspi/sensor/(センサー方式のハンズオンサンプル)、cron/(sakura.ioからのデータ取得)、run_gate4_alternating.py(ROI方式との速度比較、完了済み)を削除した。削除前の状態は archive/pre-cleanup タグに保存してある。

srcレイアウトへの移行

scripts/            CLIエントリポイント(run_detection, setup_lines, visualize_lines, run_multi_video)
src/tracking_parking/
  ├── config.py     設定管理
  ├── detection/    ライン交差判定・トラッキング
  ├── output/       動画・イベントログ出力
  ├── common/       計測・GT・W&Bの共通基盤
  └── eval/         精度評価
tests/              common / detection / output / eval / scripts にミラー配置
docs/               設計・検証・決定の記録
data/, models/      入出力データとモデル重み(Git管理外)
plate_recognition/  ← raspi/number/
training/           ← yolo_fine_tuning/

pyproject.toml に hatchling のビルド設定を追加し、uv sync で editable install されるようにした。これにより全ファイルの sys.path.insert を削除し、from tracking_parking.common.x import ... の絶対 import に統一した。raspi/line_detection/requirements.txt は依存定義がルートと重複していたため削除した。

意思決定の記録

.gitignoredocs/ 一括除外をやめ、docs/decisions/0001-two-line-method.md として2ライン方式採用のADRを追加した。速度・集計精度の比較結果、決め手になった「実行と観測の基盤」の差に加えて、この決定が主張していないこと(イベント単位の精度は未評価、エッジ実機でのロバスト性は未検証など)と、ROI方式の削除で失われるパラメータ探索基盤を引き継ぐ課題として明記している。

ルート README.md も書き直した(従来はwikiへのリンク1行のみ)。

どのように実装したか

レビューしやすさのため、フェーズごとにコミットを分けている。

  1. chore: レガシー削除(対象ごとに1コミット、ロールバック可能な粒度)
  2. refactor: srcレイアウトへディレクトリを移動(内容変更なし)git mv のみ。89ファイルがリネームとして検出されており履歴が追える
  3. refactor: パッケージ化しimportからsys.pathハックを除去 — import書き換えとパッケージ化
  4. chore: / docs:.gitignore 整理、ADR追加、ドキュメントの旧パス更新

scripts/ はパッケージではないため、テストからの import パス解決は tests/conftest.py の1箇所に集約した(各テストでの sys.path 操作は全廃)。

.env / モデル重み / データの既定パスはすべてリポジトリルート基準へ統一した(data/inputsdata/outputsmodels/)。

画面スクリーンショット等

  • URL
    スクリーンショット

テスト項目

  • uv sync 後、uv run pytest -q が全件パスすること(手元では198件パス、移行前と同数)
  • uv run python -c "import tracking_parking" が成功すること
  • scripts/ 配下4本の --help がエラーなく表示されること
  • 実動画1本で scripts/run_detection.py を実行し、data/outputs/ へイベントログとmanifestが出力されること
  • setup_lines.py で保存したとき .env のライン座標以外の設定が保持されること

備考

⚠️ 正解データ(GT)の再構成について

raspi/roi-counter/ の未追跡データを削除した際、そこに置かれていた正解台数ファイル *_gt.json 6本を一緒に消してしまいました(data.gitignore 対象のため、Git・バックアップのいずれからも復元できませんでした)。

過去runのmanifestに gt_in / gt_out が記録されていたため、そこから data/inputs/configs/ へ再構成しています。値は6動画すべて復元できていますが、ファイルのSHA-256は元と一致しません。 condition_key にGTのハッシュが含まれるため、今後のrunは過去runと同一条件とはみなされなくなります。

  • 再構成した値: 1787008160.558032 (55/0), 1787009706.719727 (30/2), 1787011229.231516 (2/3), 1787012751.179971 (7/1), 1787014266.421887 (3/3), IMG_2787 (22/0)
  • 元ファイルにあったROI方式用の roi フィールドは復元していません(ROI方式は削除済みのため不要)
  • 元ファイルに events(イベント時刻)が入っていた形跡は、どの出力にも見当たりませんでした

手元に元ファイルの控えがある場合は差し替えてください。

その他

  • ROI方式のコードは feat/mike/89-bbox-analysis-within-roi ブランチに健在です。
  • archive/pre-cleanup タグ(develop ba00a9e 時点)を一緒にpushしています。
  • docs.local/ は従来どおりGit管理外のままです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant