2022 年 T-Brain「無人機飛行載具之智慧計數競賽」作品。使用 YOLOv7-W6、VisDrone 遷移學習、資料集專屬 Anchor box 與四階段訓練流程,辨識無人機影像中的小型車、大型車、人與機車。
| 項目 | 結果 |
|---|---|
| Team | TEAM_2724 |
| Private Leaderboard | 18 / 236 Teams |
| Private Leaderboard Hmean_TIoU | 0.73922 |
名次與分數來自本人保存的競賽紀錄。官方頁面可確認競賽任務、236 支參賽隊伍與 private leaderboard 規則,但目前沒有可匿名存取、能固定驗證 TEAM_2724 名次的 leaderboard 匯出,因此不將它描述成第三方獨立驗證結果。
將無人機視角的圖片做物件偵測,框出「小型車」、「大型車」、「人」、「機車」四個類別。
Input
Output
原始資料與標註不包含在本 repository;使用者必須從授權來源自行取得。
這四份 notebook 保留當時的訓練方法;為了公開安全,已移除輸出、個人路徑與私人雲端資源識別碼。它們是歷史方法紀錄,不是目前的一鍵訓練環境。
歷史模型訓練使用 2022 年的 Colab、PyTorch 與 YOLOv7 環境。現在可直接重跑的是資料格式、XML 與 Anchor 分析工具,不需要 GPU、資料集或模型權重:
python -m pip install -e ".[dev]"
python -m pytest -q
python -m ruff check .
python scripts/check_repository.py把競賽原始標註整理成 YOLO 格式:
- 原始格式:
類別 idx, 左上 x, 左上 y, 寬度 W, 高度 H - YOLO 格式:
類別 idx 中心點 x 中心點 y 寬度 W 高度 H - 除類別 idx 外,其餘數值都要依照圖片寬高 normalization;分隔符號從逗號改為空格。
準備圖片目錄、對應的競賽標註目錄與輸出目錄後執行:
python to_yolo.py \
--images-dir /authorized/images \
--labels-dir /authorized/labels \
--output-dir /tmp/yolo-labels原始專案使用的資料夾安排如下:
目標是從自己的 Dataset 求出適合的 Anchor box。此時 TXT 已經是 YOLO 格式;工具流程先轉成 Pascal VOC XML,再用 IoU-distance k-means 求出群中心。
python mytxt2xml.py \
--images-dir /authorized/images \
--labels-dir /tmp/yolo-labels \
--output-dir /tmp/voc \
--class-map 0=car --class-map 1=hov --class-map 2=person --class-map 3=motorcycleinput-width、input-height 應與之後訓練及推論的圖片尺寸一致;clusters 是 k-means 的 k 值。
python myanchors.py \
--annotations-dir /tmp/voc \
--input-width 1280 --input-height 1280 \
--clusters 12 --seed 0 \
--output /tmp/yolo_anchors.txt這次比賽使用官方無人機 Dataset 和 VisDrone Dataset。兩者求得的 Anchor box 都與 YOLOv7-W6 的 COCO 預設值差異很大,尤其缺少涵蓋影像大範圍的大物件 Anchor;這符合無人機俯視影像中物件偏小、密集的特性。因此訓練時使用依各 Dataset 分群得到的 Anchor 尺寸。
當時使用的競賽資料 Anchor:
6,21, 13,14, 11,23
18,23, 13,34, 30,26
22,37, 17,53, 22,71
40,39, 37,67, 77,91
當時使用的 VisDrone Anchor:
4,9, 5,16, 6,25
11,14, 10,35, 16,27
25,19, 19,51, 37,35
34,82, 64,58, 97,130
Anchor 尺寸必須和訓練輸入解析度對應。本 repository 的新版工具固定 random seed 並處理空群,讓相同輸入可產生可重現結果。
模型採用 YOLOv7-W6,訓練解析度為 1280 × 1280。
先在 VisDrone Dataset 訓練 80 epochs,希望模型學到無人機視角下小型、密集物件的特徵。
使用競賽 Dataset 訓練 80 epochs 後,當時觀察到「人」與「機車」類別的表現較弱,拉低整體 mAP,因此進一步調整外部資料的類別映射。
將 VisDrone 中較細的類別濃縮成競賽的四個目標類別。例如把不同型態的行人合併為 person,把轎車與休旅車映射到相同車輛類別,避免來源資料與目標資料的標籤定義不一致。
最後回到目標資料進行 refinement、產生預測,並轉換成競賽要求的提交格式。
因為當時找不到和競賽資料相同視角、且可公開展示的影片,所以使用 Coverr 的高空俯視短片作為定性 Demo。原始 clip 與創作者 metadata 沒有被完整保存,因此這段 GIF 只作為歷史展示,不是量化評估證據。
歷史推論命令
python detect.py --weights best.pt \
--img-size 1280 \
--conf-thres 0.4 \
--iou-thres 0.65 \
--device 0 \
--source demo.mp4Origin
Inference
除了四份歷史 notebooks,repository 也保留可在 CPU、無外部資料的環境重跑的工具:
src/drone_competition_tools/ 標註轉換、XML 匯出與 Anchor 分析
to_yolo.py 競賽標註轉 YOLO CLI
mytxt2xml.py Pascal VOC XML CLI
myanchors.py 可重現 Anchor 分析 CLI
scripts/check_repository.py 隱私與公開檔案契約
tests/ 離線單元測試與 repository 契約測試
figure/ 歷史圖表與定性結果
- Repository 不提供競賽資料、VisDrone 資料、checkpoint、pretrained weights 或 ONNX,因此不是可直接部署的 detector。
- 公開資產不足以重新產生 private leaderboard 成績。
- 歷史 notebook 需要相容的舊版 CUDA、PyTorch、YOLOv7、另外取得的資料與權重才能完整重跑。
- 沒有 latency、robustness、drift、fairness 或正式 production monitoring 評估。
本 repository 不散布 T-Brain 或 VisDrone 的圖片與標註、競賽測試資料、模型權重或 Coverr 原始影片。所有外部資產仍受各自條款約束。歷史 notebooks 含 YOLOv7 衍生內容,因此 repository 使用 GPL-3.0-only,詳細來源與界線見 THIRD_PARTY_NOTICES.md。














