- ๊ฐ์ ๋ DeepSORT๋ฅผ ์ด์ฉํ ์ค์๊ฐ ๋ค์ค ์ผ๊ตด ์ถ์ (ํ๊ตญ์ ๋ณด๊ณผํํ)
DeepSort ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ํ์ฌ ์ฌ๋ฌ ์ฌ๋์ด ๋ฑ์ฅํ๋ ๋์์์์ ์ผ๊ตด์ ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ์ ์ํ์์ต๋๋ค.
Yolov3์ Arcface ๋ฅผ ํตํ ์ผ๊ตด ํ์ง ๋ฐ feature extration์ ํตํด ์ํ๋ ์ฌ์ง์ ๊ธฐ๋ฐ์ผ๋ก ์์์์ ์ธ๋ฌผ์ ์ฐพ์ ์ถ์ ํ๋ ๋ชจ๋ธ์ ์ ์ํ์์ต๋๋ค.
- ์ฌ๋์ ์ผ๊ตด์ ์ง์์ ์ผ๋ก ์ถ์ ํ๋ ๊ฒ์ ๋ฏธ๋ ์ฌํ์์ ์๋นํ ์ค์ํ ๊ธฐ์ ๋ก ์๋ฆฌ๋งค๊นํ ๊ฒ์ ๋๋ค. ์์ ์ ์๋ ์ ๊ดํ, ํค์ค์คํฌ ๋ฑ์ ์ฅ์นํ ๊ฒฝ์ฐ, ๋์คํ๋ ์ด๋ฅผ ์ณ๋ค๋ณด๊ณ ์๋ ์ฌ๋ ์, ๋ณด๋ ์๊ฐ ๋ฑ์ ์์น์ ์ผ๋ก ์ฐ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ด๊ณ ์ฃผ๊ฐ ๊ด๊ณ ์บ ํ์ธ์ ์ต์ ํํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ํ ์ค๋ด ํ๊ฒฝ์ ์ํ๋ฅผ ์ถ์ ํ๋๋ฐ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ณต์ฅ/์ฌ๋ฌด์ค๊ณผ ๊ฐ์ ๊ณต๊ฐ์์ ํ์ฌ ๊ทผ๋ฌดํ๊ณ ์๋ ์ฌ๋์ ์๋ฅผ ์ธก์ ํ๊ณ , ๊ฐ๊ฐ์ ์ฌ๋์ ์ธ์งํ ์ ์๋ค๋ฉด, ์ถ๊ทผ ๋ช ๋ถ์ ๊ฐ์ ๋จ์ํ ์์ ์ ์๋ํํ ์ ์์ต๋๋ค. ๋ํ ์๋์ฐจ์ ๊ฐ์ ์ค๋ด ๊ณต๊ฐ์์ ํ์น๊ฐ์ ์ํ๋ฅผ ์ธ์งํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํนํ ์ด์ ์๊ฐ ์ด๋ค ์ํ๋ก ์ฃผํ์ ํ๊ณ ์๋์ง ์ ์ ์๋ค๋ฉด, ์ด๋ ์ฃผํ์ ์์ ์ ๋ณด์กฐํ๋ ํ๋์ ์ฅ์น๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
- Yolov3 ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋กWIDERFACE dataset์ ์ฌ์ฉํ์ฌ ํ์ตํ๋ค.
- ์ ์๋ ๋คํธ์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์๊ฐ Detection์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๋ค.
- Deepsort ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ์ฌ, ์ผ๊ตด ์ถ์ ์ ๋ง๋๋ก Feature Descriptor๋ฅผ Arcface๋ก ๋์ฒดํ์ฌ ์ผ๊ตด์ ๋ง๋ feature๋ก ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๋ค. ์ด ๋ ์์์ ์ฌ๋์ ๋ํด์ ๊ณ ์ ํ id๋ฅผ ์ฃผ์ด ์ถ์ ํ๋๋ก ํ๋ค.
- ์ ์ ์ธ ์ฌ๋ ์ด๋ฏธ์ง์ ๋ํด์ Feature ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์์ ์กด์ฌํ๋ ์ฌ๋์ ์ถ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ฐํ๋ค. ์๊ณ ์๋ ์ฌ๋์ ์ผ๊ตด ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค๋ฉด, ํด๋น ์ฌ๋์ ๊ณ์ํด์ ์ถ์ ํ๋๋ก ํ๋ค.
- ์ค์๊ฐ ๊ตฌ์กฐ ์ค๊ณ Deep sort ์๊ณ ๋ฆฌ์ฆ์ ํ์ง๋ ๋ฌผ์ฒด์ ๋ํด ์ถ์ ๋ง์ ์งํํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ค์๊ฐ ํ๋ฉด์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด์๋ ์ถ๊ฐ์ ์ธ ์กฐ์น๊ฐ ํ์ํ๋ค. Opencv์ tensorflow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ์กด์ Deep sort Repository๋ฅผ forkํ์ฌ ์ค์๊ฐ์ผ๋ก ์์์ ๋ํด ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์๋ค.
- 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 ๋งค์นญ์ ์์ด์ ์คํจํ๋ ๋ชจ์ต์ ๋ณด์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ๋ณ๊ฒฝํ์ฌ ์คํ์ ์งํํ์๋ค.
- Face Matching ์๊ณ ๋ฆฌ์ฆ ์ ์
-
FACE DB ์ ์ : ์์์์ ๋ฑ์ฅํ๋ ์ฌ๋์ ์ธ์ํ ์ ์๋๋ก ์ฌ์ ์ ๋ผ๋ฒจ๋ง๋ ์ฌ๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฐํ์ผ๋ก Feature๋ฅผ ์ถ์ถํ์๋ค. ์ด ๋, Feature ์ถ์ถ๊ธฐ๋ก ์ผ๊ตด์ ์ต์ ํ๋ Arcface ์ถ์ถ๊ธฐ๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ, ํด๋น ๋ฐ์ดํฐ๋ hash ์๋ฃํ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๋ค.
-
FACE Matching Algorithm ์ ์ : ์์์ ์ ์๋ Face DB๋ฅผ ๋ฐํ์ผ๋ก ๋ฐํ์์ ์ง์์ ์ผ๋ก ํ์ง๋ ์ผ๊ตด์ ๋ํด ์ธ์์ ์๋ํ๋ค. ๊ธฐ์กด์ Track ๊ฐ์ฒด์๋ ์ด์ ํ๋ ์๋์ ์ถ์ ํด์จ ์ผ๊ตด์ ๋ํ Feature ์ ๋ณด๋ค์ด ์ ์ฅ๋์ด ์๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Face DB์ ์๋ ์ฌ๋ ์ผ๊ตด ์ ๋ณด์ Cosine similarity๋ฅผ ํตํด ๊ฐ์ฅ ์์ ๊ฐ์ ํด๋น Track ๊ฐ์ฒด์ ์ผ๊ตด์ด๋ผ๊ณ ํ๋จํ๋ค. ์ด ๋, ํน์ Threshold(0.68)๋ณด๋ค ํฐ ๊ฐ์ผ ๊ฒฝ์ฐ ์๋ชป ํ์งํ๋ค๊ณ ํ๋จํ๊ณ , id๋ฅผ ๋ฐฐ์ ํ์ง ์๋๋ค. ํด๋น Threshold๋ Arcface์ Cosine similarity threshold ์คํ๊ฐ์ ๋ฐ์ํ์๋ค.
-
๋งค์นญ์ ํ๋๋ฐ ์์ด์ ์ค์ํ๊ฒ ์๊ฐํ ๊ฒ์ ์ธ๊ฐ์ง์ ๋๋ค.
- ์ผ๊ตด์ Feature ์ ๋ณด๋ฅผ ๋ฐ์ํ ์ ์์ด์ผ ํ๋ค.
- ๊ฐ์ฅ ์ต๊ทผ์ ํ์ง๋ Track ๊ฐ์ฒด๋ถํฐ ๋ฐฐ์ ํ๋๋ก ํ๋ค.
- Face DB์ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ๊ฐ์ฅ ์ ์ฌํ ์ฌ๋์๊ฒ ์ด๋ฅผ ๋ฐฐ์ ํ๋ค.
์ด๋ฅผ ์ํด์๋ Track ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ attibute๋ถํฐ ์ดํดํ ํ์๊ฐ ์์ต๋๋ค.
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์ ์ ํ๋๋ฅผ ๋ํ๊ธฐ ์ํด, ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ฒด์ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ง ๊ฐ์ฒด๋ถํฐ ๋งค์นญ์ ์์ฐจ์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ํ์ฌ ํ๋ ์์ ๋ํด ๋งค์นญ์ ์ํํ๋ค๋ฉด, ์ด์์๋ ๊ฐ์ฒด์ค, ์ด์ ํ๋ ์์์ ๋งค์นญ์ด ์ํ๋ ๊ฐ์ฒด๋ถํฐ ํ์ฌ ํ์ง๋ ๋ฌผ์ฒด๋ฅผ ๋ฐฐ์ ํ๋ ๊ฒ์ด ๋ณด๋ค ์ณ์ ๋งค์นญ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค. ์ด ๋, ๊ธฐ์กด์ ๋ ผ๋ฌธ๊ณผ๋ ๋ฌ๋ฆฌ, 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 ๋งค์นญ์ ํ๋ฒ์ ์ฐ์ฐํ์ฌ ์ถ๊ฐ์ ์ธ ๊ฐ๋ฅ์ฑ์ ํ๋ฒ๋ ์ค์ฌ์ฃผ์์ต๋๋ค.
์ด๋ ๊ฒ ๋งค์นญ๋ 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์ ๊ฒฝํฅ์ฑ์ ์ ์งํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฑํํ์์ต๋๋ค.
Tracking Persons-of-Interests via Adaptive Discriminative Features(ECCV 2016์์ ์ ์ํ Music Video Dataset์ ๊ธฐ๋ฐ์ผ๋ก ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํ๋ค. ์ ์ํ ๋ชจ๋ธ์ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ๋ค. ๊ธฐ์กด ์ฌ๋ ์ฌ์ง์ ๋ํ ์ ๋ณด๊ฐ ์์ ๋, ์์์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ํ id๋ฅผ ์ถ์ถํ์ฌ ์ถ์ ์ ํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ Face DB๊ฐ ์ฃผ์ด์ก์ ๋ ์ด๋ฅผ ๋งค์นญํ Face id๋ฅผ ๋งค์นญํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ๋ค.
IDF1 | IDP | IDR | Rcll | Prcn | FP | FN | IDs | FM | MOTA | MOTP | FAR |
---|---|---|---|---|---|---|---|---|---|---|---|
- | - | - | 70% | 89% | - | - | 1152 | - | 61.1%% | 65.7% | 0.2 |
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 |
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๊ฐ ๋ง์ ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง์ง ๋ชปํ๋ค.
์ฃผ์ ํน์ง์ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๊ตฌ๋ถ๋๋ค.
- ๋จผ์ ์์์ ์ฌ๋์ ๋ํด ์ถ์ ์ด ๊ฐ๋ฅํ๋ค. ์์์ ๋ช๋ช ์ ์ฌ๋์ด ์กด์ฌํ๋์ง ๋ชจ๋ฅด๋๋ผ๋ ๋ฑ์ฅํ๋ ์ธ๋ฌผ์ ๋ํด ๊ณ ์ ํ id๋ฅผ ๋ฐฐ์ ํ ์ ์๋ค.
- ๋๋ฒ์งธ๋ก ๊ฐ๋ ค์ง ๊ฒฝ์ฐ์๋ ์ ์ ID switching๋ฅผ ๊ฐ์ง ์ํ๋ก ์ฐ์์ ์ธ ์ถ์ ์ด ๊ฐ๋ฅํ๋ค. ํ๋์ Track์ด ์ผ๊ตด์ ํ์งํ ์ํ์ผ ๋, ์ด ์ผ๊ตด์ด ๊ฐ๋ ค์ง ๊ฒฝ์ฐ, 30frame ๋ด์๋ ํด๋น Track ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ ์ํ๋ก ๋ง๋ค์ด, ๋ง์ฝ 30์ด ๋ด์ ์ฌ๋ฑ์ฅํ๋ค๋ฉด ํด๋น Track id๋ฅผ ๋ฐฐ์ ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ์ด๋์ ๋ ํด๊ฒฐํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ด๋ฏธ ์ฌ๋์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ์ฌ๋์ ์ฐพ์๋ผ ์ ์๋ค. ๋ง์ฝ ์ธ๋ฌผ ์ฌ์ง์ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ, ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก Feature๋ฅผ ์์ฐํ๊ณ , ๊ฐ์ฅ ์ ์ฌํ ์ฌ๋๊ณผ ๋งค์นญํ ์ ์๋ค.
- 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
์ฌ๊ธฐ์์ ๊ฐ์ค์น ํ์ผ์ ๋ฐ์ ./
์ต์์ ๊ฒฝ๋ก์ ์์ถ์ ํ์ด์ฃผ์ธ์.
์ฌ๊ธฐ์์ ๋น๋์ค, ground truth ํ์ผ์ ๋ฐ์์ ์ต์์ ๊ฒฝ๋ก์ ์์ถ์ ํ์ด์ฃผ์ธ์. ํด๋น ๋ฐ์ดํฐ์ ์ Tracking Persons-of-Interests via Adaptive Discriminative Features(ECCV 2016)์์ ๊ฐ์ ธ์์ต๋๋ค.
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
๋ค์์ผ๋ก ํด๋น ๋ฐ์ดํฐ์ ์์ 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
์ด์ ๋ชจ๋ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค. ๋น๋์ค์ ๋ํด์ 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
์ด์ ์์ฑ๋ 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
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