Skip to content

wansook0316/MultiFaceTrackerUsingDeepsort

Repository files navigation

Description

DeepSort ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ์„ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋“ฑ์žฅํ•˜๋Š” ๋™์˜์ƒ์—์„œ ์–ผ๊ตด์„ ์ถ”์ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Introduction

Yolov3์™€ Arcface ๋ฅผ ํ†ตํ•œ ์–ผ๊ตด ํƒ์ง€ ๋ฐ feature extration์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์‚ฌ์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์ƒ์—์„œ ์ธ๋ฌผ์„ ์ฐพ์•„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋ธ์„ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

image

๋™์ž‘ ์˜์ƒ

2 (online-video-cutter com) (1) up_brunoMars up_Apink up_Westlife up_HelloBubble up_GirlsAloud up_Darling up_T-ara

ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ๋ฐฐ๊ฒฝ

  1. ์‚ฌ๋žŒ์˜ ์–ผ๊ตด์„ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์€ ๋ฏธ๋ž˜ ์‚ฌํšŒ์—์„œ ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ๋กœ ์ž๋ฆฌ๋งค๊น€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์ ์— ์žˆ๋Š” ์ „๊ด‘ํŒ, ํ‚ค์˜ค์Šคํฌ ๋“ฑ์— ์žฅ์น˜ํ•  ๊ฒฝ์šฐ, ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์ณ๋‹ค๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ ์ˆ˜, ๋ณด๋Š” ์‹œ๊ฐ„ ๋“ฑ์„ ์ˆ˜์น˜์ ์œผ๋กœ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ด‘๊ณ ์ฃผ๊ฐ€ ๊ด‘๊ณ  ์บ ํŽ˜์ธ์„ ์ตœ์ ํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋˜ํ•œ ์‹ค๋‚ด ํ™˜๊ฒฝ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ณต์žฅ/์‚ฌ๋ฌด์‹ค๊ณผ ๊ฐ™์€ ๊ณต๊ฐ„์—์„œ ํ˜„์žฌ ๊ทผ๋ฌดํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์‚ฌ๋žŒ์„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ถœ๊ทผ ๋ช…๋ถ€์™€ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋™์ฐจ์™€ ๊ฐ™์€ ์‹ค๋‚ด ๊ณต๊ฐ„์—์„œ ํƒ‘์Šน๊ฐ์˜ ์ƒํƒœ๋ฅผ ์ธ์ง€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์šด์ „์ž๊ฐ€ ์–ด๋–ค ์ƒํƒœ๋กœ ์ฃผํ–‰์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ด๋Š” ์ฃผํ–‰์˜ ์•ˆ์ „์„ ๋ณด์กฐํ•˜๋Š” ํ•˜๋‚˜์˜ ์žฅ์น˜๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๋‚ด์šฉ

  1. Yolov3 ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœWIDERFACE dataset์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šตํ•œ๋‹ค.
  2. ์ œ์ž‘๋œ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์‹œ๊ฐ„ Detection์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์ž‘ํ•œ๋‹ค.
  3. Deepsort ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ, ์–ผ๊ตด ์ถ”์ ์— ๋งž๋„๋ก Feature Descriptor๋ฅผ Arcface๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์–ผ๊ตด์— ๋งž๋Š” feature๋กœ ์ถ”์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์ž‘ํ•œ๋‹ค. ์ด ๋•Œ ์ž„์˜์˜ ์‚ฌ๋žŒ์— ๋Œ€ํ•ด์„œ ๊ณ ์œ ํ•œ id๋ฅผ ์ฃผ์–ด ์ถ”์ ํ•˜๋„๋ก ํ•œ๋‹ค.
  4. ์ •์ ์ธ ์‚ฌ๋žŒ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด์„œ Feature ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์ƒ์— ์กด์žฌํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ถ”์ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•œ๋‹ค. ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์–ผ๊ตด ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ๋žŒ์„ ๊ณ„์†ํ•ด์„œ ์ถ”์ ํ•˜๋„๋ก ํ•œ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ

  1. ์‹ค์‹œ๊ฐ„ ๊ตฌ์กฐ ์„ค๊ณ„ Deep sort ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ์ง€๋œ ๋ฌผ์ฒด์— ๋Œ€ํ•ด ์ถ”์ ๋งŒ์„ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์‹ค์‹œ๊ฐ„ ํ™”๋ฉด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. Opencv์™€ tensorflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ์กด์˜ Deep sort Repository๋ฅผ forkํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์˜์ƒ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.
  2. Yolov3 ์‚ฌ์šฉ ๋ฐ Feature Descriptor ๋ณ€๊ฒฝ
    • Yolov3 ์‚ฌ์šฉ : ๋ฌธ์ œ๋ฅผ ์ข…ํ•ฉํ•ด๋ณธ ๊ฒฐ๊ณผ, Detector์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. ์ด์— Yolov3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ผ๊ตด์— ๊ตญํ•œ๋œ ํ›ˆ๋ จ ๋ชจ๋ธ์„ ์ œ์ž‘ํ•˜์˜€๋‹ค. ํ•™์Šต ๋ฐ์ดํ„ฐ๋กœ๋Š” WIDER FACE(A Face Detection Benchmark)๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. WIDER FACE ๋ฐ์ดํ„ฐ ์…‹์€ ์–ผ๊ตด ๊ฒ€์ถœ ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ ์…‹์œผ๋กœ์„œ, ์ด 32,203๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์•ฝ 40๋งŒ๊ฐœ์˜ ์–ผ๊ตด label๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋˜ํ•œ ์ด label์€ ๋‹ค์–‘ํ•œ ์Šค์ผ€์ผ์„ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜์ƒ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ Scale์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.
    • Arcface๋ฅผ ์‚ฌ์šฉํ•œ Feature Descriptor ๋ณ€๊ฒฝ : ๊ธฐ์กด Deep sort๋Š” ๋ณดํ–‰์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ, Track matching์„ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, FeatureDescriptor์˜ Input shape์ด 2:1 ๋น„์œจ๋กœ ์ œ์ž‘๋˜์–ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Face Detection์˜ ๊ฒฐ๊ณผ๋Š” ์‚ฌ๋žŒ์˜ ์–ผ๊ตด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์‚ฌ๊ฐํ˜•์— ๊ฐ€๊น๋‹ค. ๋˜ํ•œ ๊ธฐ์กด์˜ Feature Descriptor์˜ ๊ฒฝ์šฐ ๋ณดํ–‰์ž ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ›ˆ๋ จํ•˜์—ฌ ํ˜„์žฌ ๊ณผ์—…์— ๋งž์ง€ ์•Š์•„ ์‹ค์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ, id ๋งค์นญ์— ์žˆ์–ด์„œ ์‹คํŒจํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์˜€๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ—˜์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
  3. Face Matching ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œ์ž‘
    • FACE DB ์ œ์ž‘ : ์˜์ƒ์†์— ๋“ฑ์žฅํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์ „์— ๋ผ๋ฒจ๋ง๋œ ์‚ฌ๋žŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Feature๋ฅผ ์ถ”์ถœํ•˜์˜€๋‹ค. ์ด ๋•Œ, Feature ์ถ”์ถœ๊ธฐ๋กœ ์–ผ๊ตด์— ์ตœ์ ํ™”๋œ Arcface ์ถ”์ถœ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” hash ์ž๋ฃŒํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.image

    • FACE Matching Algorithm ์ œ์ž‘ : ์œ„์—์„œ ์ œ์ž‘๋œ Face DB๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋Ÿฐํƒ€์ž„์— ์ง€์†์ ์œผ๋กœ ํƒ์ง€๋œ ์–ผ๊ตด์— ๋Œ€ํ•ด ์ธ์‹์„ ์‹œ๋„ํ•œ๋‹ค. ๊ธฐ์กด์˜ Track ๊ฐ์ฒด์—๋Š” ์ด์ „ ํ”„๋ ˆ์ž„๋™์•ˆ ์ถ”์ ํ•ด์˜จ ์–ผ๊ตด์— ๋Œ€ํ•œ Feature ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Face DB์— ์žˆ๋Š” ์‚ฌ๋žŒ ์–ผ๊ตด ์ •๋ณด์™€ Cosine similarity๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ํ•ด๋‹น Track ๊ฐ์ฒด์˜ ์–ผ๊ตด์ด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค. ์ด ๋•Œ, ํŠน์ • Threshold(0.68)๋ณด๋‹ค ํฐ ๊ฐ’์ผ ๊ฒฝ์šฐ ์ž˜๋ชป ํƒ์ง€ํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , id๋ฅผ ๋ฐฐ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด๋‹น Threshold๋Š” Arcface์˜ Cosine similarity threshold ์‹คํ—˜๊ฐ’์„ ๋ฐ˜์˜ํ•˜์˜€๋‹ค. image

Matching Algorithm

Matching algorithm

๋งค์นญ์„ ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•œ ๊ฒƒ์€ ์„ธ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ์–ผ๊ตด์˜ Feature ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  2. ๊ฐ€์žฅ ์ตœ๊ทผ์— ํƒ์ง€๋œ Track ๊ฐ์ฒด๋ถ€ํ„ฐ ๋ฐฐ์ •ํ•˜๋„๋ก ํ•œ๋‹ค.
  3. Face DB์— ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์ด๋ฅผ ๋ฐฐ์ •ํ•œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” Track ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” attibute๋ถ€ํ„ฐ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Track

class Track:
	track_id : ํŠธ๋ž™์˜ ๊ณ ์œ ํ•œ id
	max_age : ํŠธ๋ž™์ด ํƒ์ง€๋˜์ง€ ์•Š์•˜์„ ๋•Œ, ์‚ฌ๋ผ์ง€๊ธฐ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„
	feature : ํ•ด๋‹น ํŠธ๋ž™์ด ํƒ์ง€ํ•œ ์–ผ๊ตด์— ๋Œ€ํ•œ Feature๋ฅผ ๋ˆ„์ ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
	hits : ํŠธ๋ž™์ด ์ดˆ๊ธฐํ™”๋œ ์ดํ›„๋กœ, ์‹ค์ œ๋กœ ์ถ”์ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ž„์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ์„ฑ๊ณตํ•ด์•ผํ•˜๋Š” ํšŸ์ˆ˜์˜ ํ•˜ํ•œ๊ฐ’
	time_since_update : ์ธก์ •์ด ๋ฐ˜์˜๋œ ์ดํ›„๋กœ ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ํ”„๋ ˆ์ž„ ์ˆ˜
	face_name : Face_db๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐฐ์ •๋˜๋Š” ์‚ฌ๋žŒ์˜ ์ด๋ฆ„

Matching cascade์™€ Face Assignment๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด, Track ๊ฐ์ฒด๋Š” ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์•„๋ž˜์— ์„œ์ˆ ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ time_since_update๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜์—ฌ Matching cascade๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ face_name์˜ ๊ฒฝ์šฐ ๋ฐฐ์ •๋˜๋Š” ์–ผ๊ตด str๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. feature์˜ ๊ฒฝ์šฐ, ์–ผ๊ตด ํŠน์ง•์„ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๋…ผ๋ฌธ์—์„œ ๋ณ€ํ™”๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ๋Š” ์œ„ ๊ณผ์—…์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ•œ ๋‘๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜, Matching Cascade์™€ Face Alignment๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Matching Cascade

Matching Cascade๋Š” Matching์˜ ์ •ํ™•๋„๋ฅผ ๋†’ํžˆ๊ธฐ ์œ„ํ•ด, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๊ฐ์ฒด์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด๋ถ€ํ„ฐ ๋งค์นญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด ๋งค์นญ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด, ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด์ค‘, ์ด์ „ ํ”„๋ ˆ์ž„์—์„œ ๋งค์นญ์ด ์ˆ˜ํ–‰๋œ ๊ฐ์ฒด๋ถ€ํ„ฐ ํ˜„์žฌ ํƒ์ง€๋œ ๋ฌผ์ฒด๋ฅผ ๋ฐฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์˜ณ์€ ๋งค์นญ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ, ๊ธฐ์กด์˜ ๋…ผ๋ฌธ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, Arcface๋ฅผ ์‚ฌ์šฉํ•œ Feature๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋„๋ก ํ•˜์—ฌ ํ•ด๋‹น ๊ณผ์—…์— ๋งž๋Š” ๋ชฉ์ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

for level in range(cascade_depth): # ๋ณดํ†ต Track ๊ฐ์ฒด์˜ max_age๋งŒํผ
      if len(unmatched_detections) == 0:  # ๋ชจ๋“  detection์— ๋Œ€ํ•ด ๋งค์นญํ–ˆ๋‹ค๋ฉด ์ข…๋ฃŒ
          break

      track_indices_l = [ # ํ˜„์žฌ level์˜ ๊ฐ์ฒด(์ฆ‰ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์—…๋ฐ์ดํŠธ๋œ Track ๊ฐ์ฒด)๋ฅผ ๊ฐ€์ ธ์˜ด
          k for k in track_indices
          if tracks[k].time_since_update == 1 + level
      ]
      if len(track_indices_l) == 0: # ํ˜„์žฌ level์˜ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ๋‹ค์Œ level ์‹œ๋„
          continue

			# hungrian ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ level์—์„œ ์ตœ์ ์˜ Matching ์‹œ๋„
      matches_l, _, unmatched_detections = \
          min_cost_matching(
              distance_metric, max_distance, tracks, detections,
              track_indices_l, unmatched_detections)
      matches += matches_l
  unmatched_tracks = list(set(track_indices) - set(k for k, _ in matches))

ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” Matching cascade๋ฅผ ํ†ตํ•˜์—ฌ ๋ชจ๋“  Track ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ Matching์„ ์‹œ๋„ํ•˜์—ฌ, ๋งค์นญ๋œ Track๊ฐ์ฒด๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ Cascade ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Œ์—๋„ max_threshold๋ฅผ ๋„˜์ง€ ๋ชปํ•˜๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, unmatched_track์œผ๋กœ ํŒ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ unmatched_track์˜ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” IoU ๋งค์นญ์„ ํ•œ๋ฒˆ์— ์—ฐ์‚ฐํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๊ฐ€๋Šฅ์„ฑ์„ ํ•œ๋ฒˆ๋” ์ค„์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Face Assignment

์ด๋ ‡๊ฒŒ ๋งค์นญ๋œ Track๋“ค์„ ๊ณ„์‚ฐํ•œ ํ›„์—๋Š”, ํ•ด๋‹น Track ๊ฐ์ฒด๋“ค์ด ๊ฐ€์ง„ Feature ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Face DB์— ์žˆ๋Š” ์ธ๋ฌผ์˜ ์–ผ๊ตด Feature์™€์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ์–ผ๊ตด์„ ๋ฐฐ์ •ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ResNet50์„ ๋ฐฑ๋ณธ์œผ๋กœ ํ•™์Šต๋œ Arc_res50์˜ Pretrained model์„ ์‚ฌ์šฉํ•˜์—ฌ Feature๋ฅผ ์ถ”์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

face_db[person_name] = dict({"used": False, "db": name_db})

๋ณดํ†ต์˜ ์˜์ƒ์—์„œ ํŠน์ • ํ”„๋ ˆ์ž„์˜ ์‚ฌ๋žŒ์€ 1๋ช…๋งŒ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ์ ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. "used"์˜ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ํƒ์ง€๋ฅผ ํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋†’์€ ์œ ์‚ฌ๋„๋ฅผ ๊ฐ€์ง€๋Š” ์‚ฌ๋žŒ์„ ๋ฐฐ์ •ํ•˜๊ณ , ์ดํ›„์— ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ํŒ์ •ํ–ˆ์„ ๋•Œ, ๋ฐฐ์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

for i in face_db:
    for track_idx, detection_idx in matches: # Cascade๋ฅผ ํ†ตํ•ด ๋งค์นญ๋œ Track ๊ฐ์ฒด์— ๋Œ€ํ•ด
        self.tracks[track_idx].update( # ๋จผ์ € Kalman filter๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์œ„์น˜๋ฅผ ์˜ˆ์ธกํ•จ
            self.kf, detections[detection_idx])
        
        if self.tracks[track_idx].get_face_name() == "": # ํ˜„์žฌ ์–ผ๊ตด์„ ๋ฐฐ์ •๋ฐ›์ง€ ๋ชปํ•œ Track ๊ฐ์ฒด๋ผ๋ฉด ๋ฐฐ์ •
            self.tracks[track_idx].find_face_name(face_db, max_face_threshold)

    for track_idx in unmatched_tracks: # ๋งค์นญ์— ์‹คํŒจํ•œ Track ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ์–ผ๊ตด ๋ฐฐ์ •์„ ํ•ด์ œํ•œ๋‹ค.
        self.tracks[track_idx].mark_missed(face_db) 
    for detection_idx in unmatched_detections: # Track ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ, ํ•œ๋ฒˆ ์–ผ๊ตด ๋ฐฐ์ •์„ ์‹œ๋„ํ•œ๋‹ค.
        self._initiate_track(detections[detection_idx], face_db, max_face_threshold)
    self.tracks = [t for t in self.tracks if not t.is_deleted()]

์ด๋ฏธ ๋ฐฐ์ •๋œ ์‚ฌ๋žŒ์— ๋Œ€ํ•ด face_name์„ ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ, id switching์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ, ์ฒซ ๋ฐฐ์ •๋•Œ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž˜๋ชป ๋ฐฐ์ •ํ•  ๊ฒฝ์šฐ, ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Track์˜ ๊ฒฝํ–ฅ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Result

Tracking Persons-of-Interests via Adaptive Discriminative Features(ECCV 2016์—์„œ ์ œ์ž‘ํ•œ Music Video Dataset์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ œ์ž‘ํ•œ ๋ชจ๋ธ์€ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ธฐ์กด ์‚ฌ๋žŒ ์‚ฌ์ง„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์„ ๋•Œ, ์˜์ƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ ์œ ํ•œ id๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ถ”์ ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Face DB๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด๋ฅผ ๋งค์นญํ•œ Face id๋ฅผ ๋งค์นญํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

image

์ด์ „ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ

IDF1 IDP IDR Rcll Prcn FP FN IDs FM MOTA MOTP FAR
- - - 70% 89% - - 1152 - 61.1%% 65.7% 0.2

Face DB์—†์ด ๊ณ ์œ  ID๋ฅผ ๋ฐฐ์ •ํ•œ ๊ฒฝ์šฐ

IDF1 IDP IDR Rcll Prcn FP FN IDs FM MOTA MOTP FAR
6.9% 6.98% 6.97% 80.7% 80.87% 2421 2261 348 589 57.4% 68.7% 0.34

Face DB๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ๋ฌผ์„ ๋ฐฐ์ •์„ ์šฐ์„ ์‹œ ํ•œ ๊ฒฝ์šฐ

IDF1 IDP IDR Rcll Prcn FP FN IDs FM MOTA MOTP FAR
52.6% 60.1% 51.95% 79.35% 81.84% 2220 2434 201 603 59.01% 67.2% 0.32

์ถ”์ ์˜ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” MOTA์™€ MOTP๊ฐ€ ์•ฝ 60%์˜ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์˜€๋‹ค. ๋˜ํ•œ Face DB์—์„œ, ๋“ฑ์žฅํ•˜๋Š” ์ธ๋ฌผ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ •๋ณด๋ฅผ ํ†ตํ•ด ID๋ฅผ ์ถ”์ถœํ•ด๋ณธ ๊ฒฐ๊ณผ, ID์— ๊ด€๋ จ๋œ ์ง€ํ‘œ(IDF1, IDP, IDR) ์—ญ์‹œ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋˜ํ•œ ids์—์„œ ๊ธฐ์กด ๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ MOTA์— ์žˆ์–ด์„œ FN, FP๊ฐ€ ๋งŽ์•„ ์ข‹์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€์ง€ ๋ชปํ–ˆ๋‹ค.

๊ฒฐ๋ก 

์ฃผ์š” ํŠน์ง•์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

  1. ๋จผ์ € ์ž„์˜์˜ ์‚ฌ๋žŒ์— ๋Œ€ํ•ด ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜์ƒ์— ๋ช‡๋ช…์˜ ์‚ฌ๋žŒ์ด ์กด์žฌํ•˜๋Š”์ง€ ๋ชจ๋ฅด๋”๋ผ๋„ ๋“ฑ์žฅํ•˜๋Š” ์ธ๋ฌผ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ id๋ฅผ ๋ฐฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋‘๋ฒˆ์งธ๋กœ ๊ฐ€๋ ค์ง„ ๊ฒฝ์šฐ์—๋„ ์ ์€ ID switching๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ๋กœ ์—ฐ์†์ ์ธ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜๋‚˜์˜ Track์ด ์–ผ๊ตด์„ ํƒ์ง€ํ•œ ์ƒํƒœ์ผ ๋•Œ, ์ด ์–ผ๊ตด์ด ๊ฐ€๋ ค์ง„ ๊ฒฝ์šฐ, 30frame ๋‚ด์—๋Š” ํ•ด๋‹น Track ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด, ๋งŒ์•ฝ 30์ดˆ ๋‚ด์— ์žฌ๋“ฑ์žฅํ•œ๋‹ค๋ฉด ํ•ด๋‹น Track id๋ฅผ ๋ฐฐ์ •ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  3. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋ฏธ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น ์‚ฌ๋žŒ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ธ๋ฌผ ์‚ฌ์ง„์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ, ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Feature๋ฅผ ์ƒ์‚ฐํ•˜๊ณ , ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ์‚ฌ๋žŒ๊ณผ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋‹ค.

Environment Setting

  • python 3.7
  • tensorflow 2.4.1
  • cuda 11.2
  • cudnn 8.0.5
  • GPU : RTX 3080
  • CPU : AMD Ryzen 7 5800X 8-Core Processor

์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ž˜ ํŒŒ์ผ์„ ํ†ตํ•ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ pip install requirement.txt

If you want Evaluation

์—ฌ๊ธฐ์—์„œ ๊ฐ€์ค‘์น˜ ํŒŒ์ผ์„ ๋ฐ›์•„ ./ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ์— ์••์ถ•์„ ํ’€์–ด์ฃผ์„ธ์š”.

Download Music Video Dataset

์—ฌ๊ธฐ์—์„œ ๋น„๋””์˜ค, ground truth ํŒŒ์ผ์„ ๋ฐ›์•„์„œ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ์— ์••์ถ•์„ ํ’€์–ด์ฃผ์„ธ์š”. ํ•ด๋‹น ๋ฐ์ดํ„ฐ์…‹์€ Tracking Persons-of-Interests via Adaptive Discriminative Features(ECCV 2016)์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

Convert GT xml file to txt

ground truth ํŒŒ์ผ์„ tracking evaluation์„ ์œ„ํ•ด ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

python xml2txt.py \
    --gt_path ./resources/gt/T-ara_gt.xml \
    --gt_file_path ./resources/gt/T-ara_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/GirlsAloud_gt.xml \
    --gt_file_path ./resources/gt/GirlsAloud_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/Darling_gt.xml \
    --gt_file_path ./resources/gt/Darling_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/Westlife_gt.xml \
    --gt_file_path ./resources/gt/Westlife_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/BrunoMars_gt.xml \
    --gt_file_path ./resources/gt/BrunoMars_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/HelloBubble_gt.xml \
    --gt_file_path ./resources/gt/HelloBubble_gt.txt

python xml2txt.py \
    --gt_path ./resources/gt/Apink_gt.xml \
    --gt_file_path ./resources/gt/Apink_gt.txt

Extract Reference Image

๋‹ค์Œ์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์…‹์—์„œ gt์— ๋งž๋Š” ์–ผ๊ตด์„ ์ถ”์ถœํ•˜์—ฌ face db์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค.

python generate_face.py \
    --gt_file_path ./resources/gt/T-ara_gt.txt \
    --video_file_path ./resources/video/in/T-ara.mov \
    --face_data_path ./resources/database/T-ara

python generate_face.py \
    --gt_file_path ./resources/gt/GirlsAloud_gt.txt \
    --video_file_path ./resources/video/in/GirlsAloud.mp4 \
    --face_data_path ./resources/database/GirlsAloud

python generate_face.py \
    --gt_file_path ./resources/gt/Darling_gt.txt \
    --video_file_path ./resources/video/in/Darling.mp4 \
    --face_data_path ./resources/database/Darling

python generate_face.py \
    --gt_file_path ./resources/gt/Westlife_gt.txt \
    --video_file_path ./resources/video/in/Westlife.mp4 \
    --face_data_path ./resources/database/Westlife

python generate_face.py \
    --gt_file_path ./resources/gt/BrunoMars_gt.txt \
    --video_file_path ./resources/video/in/BrunoMars.mp4 \
    --face_data_path ./resources/database/BrunoMars

python generate_face.py \
    --gt_file_path ./resources/gt/HelloBubble_gt.txt \
    --video_file_path ./resources/video/in/HelloBubble.mp4 \
    --face_data_path ./resources/database/HelloBubble

python generate_face.py \
    --gt_file_path ./resources/gt/Apink_gt.txt \
    --video_file_path ./resources/video/in/Apink.mp4 \
    --face_data_path ./resources/database/Apink

Let's Tracking

์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋””์˜ค์— ๋Œ€ํ•ด์„œ tracking์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

python object_tracker.py \
    --video ./resources/video/in/T-ara.mov \
    --database ./resources/database/T-ara \
    --output ./resources/video/out/T-ara.mp4 \
    --eval ./resources/gt/T-ara_pred.txt

python object_tracker.py \
    --video ./resources/video/in/BrunoMars.mp4 \
    --database ./resources/database/BrunoMars \
    --output ./resources/video/out/BrunoMars.mp4 \
    --eval ./resources/gt/BrunoMars_pred.txt

python object_tracker.py \
    --video ./resources/video/in/Darling.mp4 \
    --database ./resources/database/Darling \
    --output ./resources/video/out/Darling.mp4 \
    --eval ./resources/gt/Darling_pred.txt

python object_tracker.py \
    --video ./resources/video/in/GirlsAloud.mp4 \
    --database ./resources/database/GirlsAloud \
    --output ./resources/video/out/GirlsAloud.mp4 \
    --eval ./resources/gt/GirlsAloud_pred.txt

python object_tracker.py \
    --video ./resources/video/in/HelloBubble.mp4 \
    --database ./resources/database/HelloBubble \
    --output ./resources/video/out/HelloBubble.mp4 \
    --eval ./resources/gt/HelloBubble_pred.txt

python object_tracker.py \
    --video ./resources/video/in/Westlife.mp4 \
    --database ./resources/database/Westlife \
    --output ./resources/video/out/Westlife.mp4 \
    --eval ./resources/gt/Westlife_pred.txt

python object_tracker.py \
    --video ./resources/video/in/Apink.mp4 \
    --database ./resources/database/Apink \
    --output ./resources/video/out/Apink.mp4 \
    --eval ./resources/gt/Apink_pred.txt

Evaluation

์ด์ œ ์ƒ์„ฑ๋œ tracking file์„ ๊ฐ€์ง€๊ณ  ํ‰๊ฐ€๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

python evaluation.py \
    --gt_file_path ./resources/gt/T-ara_gt.txt \
    --pred_file_path ./resources/gt/T-ara_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/GirlsAloud_gt.txt \
    --pred_file_path ./resources/gt/GirlsAloud_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/Darling_gt.txt \
    --pred_file_path ./resources/gt/Darling_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/Westlife_gt.txt \
    --pred_file_path ./resources/gt/Westlife_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/BrunoMars_gt.txt \
    --pred_file_path ./resources/gt/BrunoMars_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/HelloBubble_gt.txt \
    --pred_file_path ./resources/gt/HelloBubble_pred.txt

python evaluation.py \
    --gt_file_path ./resources/gt/Apink_gt.txt \
    --pred_file_path ./resources/gt/Apink_pred.txt

Reference

deepface
Deep SORT
YoloV3 Implemented in TensorFlow 2.0
YOLOFace
Tracking Persons-of-Interests via Adaptive Discriminative Features(ECCV 2016)
Simple Online and Realtime Tracking with a Deep Association Metric(IEEE 2016)
ArcFace: Additive Angular Margin Loss for Deep Face Recognition