PIA-SPACE_LeaderBoard / utils /anonymize.py
irfanrah's picture
feat: ๋ชจ๋ธ๋ช… ํ•˜์ดํผ๋งํฌ ๊ฐ€๋ช… ์ฒ˜๋ฆฌ โ€” PE(Perception Encoder) -> CLIP
7452c48
Raw
History Blame Contribute Delete
4.88 kB
"""๋ฒค์น˜๋งˆํฌ(ํšŒ์‚ฌ) ์ด๋ฆ„ ๊ฐ€๋ช… ์ฒ˜๋ฆฌ โ€” Space ํ‘œ์‹œ ์ „์šฉ.
๋ฆฌ๋”๋ณด๋“œ ์ปฌ๋Ÿผ์€ `<ํšŒ์‚ฌ>_<๋ฒ„์ „/์Šคํ”Œ๋ฆฟ>_<์นดํ…Œ๊ณ ๋ฆฌ>` ํ˜•์‹์ด๊ณ  ๋งจ ์•ž ํ† ํฐ์ด ์‹ค์ œ
๊ณ ๊ฐ/๊ธฐ๊ด€๋ช…(Coupang, Hyundai, KISA ...)์ด๋ผ, ์™ธ๋ถ€ ๊ณต๊ฐœ SPACE ์—์„œ๋Š” ๋งจ ์•ž
ํ† ํฐ๋งŒ ๋‘ ๊ธ€์ž ์ฝ”๋“œ๋กœ ์น˜ํ™˜ํ•œ๋‹ค. ๋ฒ„์ „/์Šคํ”Œ๋ฆฟยท์นดํ…Œ๊ณ ๋ฆฌ๋Š” ๊ทธ๋Œ€๋กœ ๋‘ฌ์„œ ํ‘œ์˜
์˜๋ฏธ์™€ ๊ธฐ์กด ๋™์ž‘์„ ๋ณด์กดํ•œ๋‹ค.
Coupang_balanced_test_v1_Fire -> Co_balanced_test_v1_Fire
Hyundai_v3_Falldown -> Hy_v3_Falldown
Korea_nrf_Smoke -> Ko_nrf_Smoke
๊ตฌ๊ธ€ ์‹œํŠธ ์›๋ณธ์€ ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” sheet2df ๊ฐ€ df ๋ฅผ ๋งŒ๋“  ํ‘œ์‹œ ๋‹จ๊ณ„์—์„œ๋งŒ
์ปฌ๋Ÿผ๋ช…์„ ์น˜ํ™˜ํ•˜๊ณ , config ์˜ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก/์ˆจ๊น€ ๊ทœ์น™๋„ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋งž์ถฐ ๊ฐฑ์‹ ํ•œ๋‹ค.
"""
import re
import enviroments.config as config
_map = {} # ํšŒ์‚ฌ๋ช…(lower) -> 2๊ธ€์ž ์ฝ”๋“œ
_orig_default_avg = None
_orig_default_ds = None
_orig_hide_exact = None
# โ”€โ”€ ๋ชจ๋ธ๋ช… ํ† ํฐ ๊ฐ€๋ช… (์…€ ๊ฐ’ ์น˜ํ™˜) โ”€โ”€
# ํ•˜์ดํผ๋งํฌ ๋ชจ๋ธ๋ช… ์•ˆ์˜ ํŠน์ • ๋ชจ๋ธ ํ† ํฐ์„ ๊ฐ€๋ฆฐ๋‹ค. ์˜ˆ: PE(Perception Encoder) -> CLIP.
# ์•ž์œผ๋กœ ๊ฐ€๋ฆด ๋ชจ๋ธ์ด ์ƒ๊ธฐ๋ฉด ์—ฌ๊ธฐ์— {"์›๋ณธํ† ํฐ": "ํ‘œ์‹œํ† ํฐ"} ์œผ๋กœ ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
# ํ† ํฐ ๊ฒฝ๊ณ„๋Š” ๋ฌธ์ž์—ด ์‹œ์ž‘/๋ ๋˜๋Š” '-' '_' ๋กœ ๋ณธ๋‹ค (PE-Core, FT_PE-Core, PE_Large ๋ชจ๋‘ ๋งค์นญ,
# PETAยทPErson ๊ฐ™์€ ๋‹ค๋ฅธ ๋‹จ์–ด๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ). ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„.
MODEL_TOKEN_SUBS = {
"PE": "CLIP",
}
_token_re = re.compile(
r"(?<![A-Za-z0-9])(" + "|".join(re.escape(k) for k in MODEL_TOKEN_SUBS) + r")(?=[-_]|$)"
)
def _sub_model_tokens(s: str) -> str:
return _token_re.sub(lambda m: MODEL_TOKEN_SUBS[m.group(1)], s)
def _base_code(company: str) -> str:
"""ํšŒ์‚ฌ๋ช… -> ์•ž 2๊ธ€์ž ์ฝ”๋“œ (์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž + ๋‘˜์งธ ์†Œ๋ฌธ์ž). ์˜ˆ: Coupang -> Co."""
alnum = [c for c in company if c.isalnum()]
if not alnum:
return "Xx"
if len(alnum) == 1:
return alnum[0].upper() + "x"
return alnum[0].upper() + alnum[1].lower()
def _leading_token(col: str):
"""๋ฒค์น˜๋งˆํฌ ์ปฌ๋Ÿผ์ด๋ฉด ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ์„ ๋ฐ˜ํ™˜, ์•„๋‹ˆ๋ฉด None.
๊ณต๋ฐฑ ํฌํ•จ(์˜ˆ: 'Model name', 'Datasets Used')ยท'_' ์—†์Œ(TASK, Model)ยท
AVG_* (๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹) ์€ ์น˜ํ™˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.
"""
if " " in col or "_" not in col:
return None
head = col.split("_", 1)[0]
if head == "AVG":
return None
return head
def _build_map(companies):
"""ํšŒ์‚ฌ๋ช… ๋ชฉ๋ก -> {ํšŒ์‚ฌ๋ช…(lower): ์ฝ”๋“œ}. ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋‹ค๋ฅธ ์ด๋ฆ„์€ ๊ฐ™์€ ํšŒ์‚ฌ๋กœ
๋ณด๊ณ  ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ ํ•ฉ์นœ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฒน์น˜๋ฉด ๋’ค์— ์ˆซ์ž๋ฅผ ๋ถ™์—ฌ ์œ ์ผ์„ฑ ๋ณด์žฅ."""
m, used = {}, set()
for name in sorted(set(companies), key=str.lower):
key = name.lower()
if key in m:
continue
base = _base_code(name)
code, n = base, 1
while code in used:
n += 1
code = f"{base}{n}"
used.add(code)
m[key] = code
return m
def alias_of(company: str) -> str:
return _map.get(company.lower()) or _base_code(company)
def _anon_col(col: str) -> str:
"""์ปฌ๋Ÿผ๋ช…์˜ ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ๋งŒ ์ฝ”๋“œ๋กœ ์น˜ํ™˜. ๋‚˜๋จธ์ง€(๋ฒ„์ „/์นดํ…Œ๊ณ ๋ฆฌ)๋Š” ์œ ์ง€."""
head = _leading_token(col)
if head is None:
return col
return f"{alias_of(head)}{col[len(head):]}"
def anonymize_df(df):
"""df ๋ฒค์น˜๋งˆํฌ ์ปฌ๋Ÿผ์˜ ๋งจ ์•ž ํšŒ์‚ฌ ํ† ํฐ์„ 2๊ธ€์ž ์ฝ”๋“œ๋กœ ์น˜ํ™˜ํ•˜๊ณ ,
config ์˜ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก/์ˆจ๊น€ ๊ทœ์น™๋„ ๋™์ผ ์ฝ”๋“œ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค (idempotent).
"""
global _map, _orig_default_avg, _orig_default_ds, _orig_hide_exact
if _orig_default_avg is None:
_orig_default_avg = list(config.DEFAULT_AVG_DATASETS)
_orig_default_ds = list(config.DEFAULT_DATASETS)
_orig_hide_exact = list(config.HIDE_COLUMN_EXACT)
companies = [t for t in (_leading_token(c) for c in df.columns) if t]
_map = _build_map(companies + list(_orig_default_avg))
df = df.rename(columns={c: _anon_col(c) for c in df.columns})
# ๋ชจ๋ธ๋ช… ํ† ํฐ ๊ฐ€๋ช…: ํ•˜์ดํผ๋งํฌ(Model/Model name/Model link)์™€ ์…€ ๊ฐ’ ์ „๋ฐ˜์—์„œ
# PE -> CLIP ๋“ฑ ์น˜ํ™˜. ํ‘œ์‹œ ํ…์ŠคํŠธ์™€ ๋งํฌ URL ์„ ํ•จ๊ป˜ ๋ฐ”๊ฟ” ๋…ธ์ถœ์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
for col in df.columns:
if df[col].dtype == object:
df[col] = df[col].map(
lambda v: _sub_model_tokens(v) if isinstance(v, str) else v
)
# config ๋„ ๊ฐ™์€ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ ๋ฆฌ๋”๋ณด๋“œ ์…€๋ ‰ํ„ฐ/AVG/์ˆจ๊น€์ด ์ผ๊ด€๋˜๊ฒŒ ๋™์ž‘
config.DEFAULT_AVG_DATASETS = [alias_of(d) for d in _orig_default_avg]
config.DEFAULT_DATASETS = [
d if d == "AVG" else alias_of(d) for d in _orig_default_ds
]
config.HIDE_COLUMN_EXACT = [_anon_col(c) for c in _orig_hide_exact]
return df