CLIP ๊ธฐ๋ฐ˜ ์ œํ’ˆ ๊ฒฐํ•จ ํƒ์ง€ ๋ชจ๋ธ ์นด๋“œ

๋ชฉ์ฐจ (Table of Contents)


๋ชจ๋ธ ์„ธ๋ถ€์‚ฌํ•ญ

๋ชจ๋ธ ์„ค๋ช…

AnomalyCLIP์€ ํŠน์ • ๊ฐ์ฒด์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ•™์Šตํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋‚ด์˜ ์ „๊ฒฝ ๊ฐ์ฒด์™€ ์ƒ๊ด€์—†์ด ์ผ๋ฐ˜์ ์ธ ์ •์ƒ ๋ฐ ๋น„์ •์ƒ ํŒจํ„ด์„ ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ CLIP ๊ธฐ๋ฐ˜ ์ด์ƒ ํƒ์ง€ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์ œํ’ˆ ๊ฒฐํ•จ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ํ•™์Šต๋œ CLIP ๋ชจ๋ธ์„ ํŒŒ์ธํŠœ๋‹(Fine-tuning)ํ•˜์—ฌ ์ œํ’ˆ ์ด๋ฏธ์ง€์—์„œ ๊ฒฐํ•จ์„ ์‹๋ณ„ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ƒ์‚ฐ ๋ผ์ธ์˜ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ๊ฒฐํ•จ ํƒ์ง€ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’
๊ฐœ๋ฐœ์ž ์œค์„๋ฏผ
์ œ์ž‘ ํ›„์› SOLUWINS Co., Ltd. (์†”๋ฃจ์œˆ์Šค)
์ฐธ๊ณ  ์—ฐ๊ตฌ zhou2023 anomalyclip [github]
๋ชจ๋ธ ์œ ํ˜• CLIP (Contrastive Language-Image Pretraining) - Domain-Agnostic Prompt Learning Model
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Python
๋ผ์ด์„ ์Šค Apache 2.0, MIT, OpenAI

๊ธฐ์ˆ ์  ์ œํ•œ์‚ฌํ•ญ

์ œํ•œ์‚ฌํ•ญ ์„ค๋ช…
๋ฐ์ดํ„ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ๋ถ„ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์…‹์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋ถˆ๊ท ํ˜•ํ•  ๊ฒฝ์šฐ ๋ชจ๋ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ฑ๋Šฅ ์ œํ•œ ์‹ค์‹œ๊ฐ„ ๊ฒฐํ•จ ๊ฐ์ง€ ์„ฑ๋Šฅ์€ ํ•˜๋“œ์›จ์–ด ์‚ฌ์–‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋†’์€ ํ•ด์ƒ๋„์—์„œ์˜ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ์ง€ ํ•œ๊ณ„ ๊ฒฐํ•จ์ด ๋ฏธ์„ธํ•˜๊ฑฐ๋‚˜ ์ œํ’ˆ ๊ฐ„ ์œ ์‚ฌ์„ฑ์ด ๋งค์šฐ ๋†’์€ ๊ฒฝ์šฐ, ๋ชจ๋ธ์ด ๊ฒฐํ•จ์„ ์ •ํ™•ํ•˜๊ฒŒ ํƒ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ์„ธ๋ถ€์‚ฌํ•ญ

ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ

๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์–‘
CPU Intel Core i9-13900K (24 Cores, 32 Threads)
RAM 64GB DDR5
GPU NVIDIA RTX 4090Ti 24GB
Storage 1TB NVMe SSD + 2TB HDD

์†Œํ”„ํŠธ์›จ์–ด ํ™˜๊ฒฝ

๊ตฌ์„ฑ ์š”์†Œ ๋ฒ„์ „
OS Windows 11 64 bit / Ubuntu 20.04LTS
Python 3.8 (anaconda)
PyTorch 1.9.0
OpenCV 4.5.3
Cuda Toolkit 11.8
CuDNN 9.3.0.75 for cuda11

๋ฐ์ดํ„ฐ์…‹ ์ •๋ณด

์ด ๋ชจ๋ธ์€ ์ œํ’ˆ์˜ ์ •์ƒ ์ด๋ฏธ์ง€์™€ ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›ˆ๋ จ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ์ œํ’ˆ์˜ ์ด๋ฏธ์ง€, ๊ฒฐํ•จ ์˜์—ญ์— ๋Œ€ํ•œ ground truth ์ •๋ณด, ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ๊ด€๋ จ ํŠน์„ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” CLIP ๋ชจ๋ธ์˜ ์ž…๋ ฅ ํ˜•์‹์— ์ ํ•ฉํ•˜๋„๋ก ์ „์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๊ฒฐํ•จ ์˜์—ญ์˜ ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด ground truth ๋งˆํ‚น์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์†Œ์Šค: https://huggingface.co/datasets/quandao92/ad-clip-dataset
  • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์žฅ๋น„:
    • ์ˆ˜์ง‘ H/W: jetson orin nano 8GB
    • ์นด๋ฉ”๋ผ: BFS-U3-89S6C Color Camera
    • ๋ Œ์ฆˆ: 8mm Fiexd Focal Length Lens
    • ์กฐ๋ช…: LIDLA-120070
    • ๋ฐ์ดํ„ฐ ํ˜•์‹: .bpm, .jpg

๋ฐ์ดํ„ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ

1์ฐจ: 20240903_V0_๊ฐ„์ด ํ™˜๊ฒฝ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

  • V01: ์ „์ฒ˜๋ฆฌ ์ „ ๋ฐ์ดํ„ฐ ์›๋ณธ โ†’ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์›๋ณธ: 120ea
  • V02: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ โ†’ ์ •์ƒ/๋ถˆ๋Ÿ‰ ๋ถ„๋ฅ˜: 116ea/4ea
  • V03: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜, ๋ฐ์ดํ„ฐ ํšŒ์ „ โ†’ ์ด๋ฏธ์ง€ ์ฆ๊ฐ•_45/90/135๋„๋กœ ํšŒ์ „_360ea

Ground Truth Marking

PCA ๋ถ„ํฌ ์‹œ๊ฐํ™”

Isolation Forest๋กœ ์ด์ƒ๊ฐ’ ์‹๋ณ„ ๊ฒฐ๊ณผ

2์ฐจ: 20240910_V1_ํ•˜์šฐ์ง• ๋‚ด ์ด๋ฏธ์ง€ ์ˆ˜์ง‘

  • V01: ์ „์ฒ˜๋ฆฌ ์ „ ๋ฐ์ดํ„ฐ ์›๋ณธ โ†’ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์›๋ณธ: 350ea
  • V02: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ โ†’ ์ •์ƒ/๋ถˆ๋Ÿ‰ ๋ถ„๋ฅ˜: 336ea/14ea
  • V03: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜, ๋ฐ์ดํ„ฐ ํšŒ์ „ โ†’ ์ด๋ฏธ์ง€ ์ฆ๊ฐ•: 1,050ea

Ground Truth Marking

PCA ๋ถ„ํฌ ์‹œ๊ฐํ™”

Isolation Forest๋กœ ์ด์ƒ๊ฐ’ ์‹๋ณ„ ๊ฒฐ๊ณผ

3์ฐจ: 20250328_V2_์„ค๋น„ ๋‚ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

  • V01: ์ „์ฒ˜๋ฆฌ ์ „ ๋ฐ์ดํ„ฐ ์›๋ณธ โ†’ ์ด๋ฏธ์ง€ ์ˆ˜์ง‘_2,010๊ฐœ
  • V02: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ โ†’ ์ •์ƒ/๋ถˆ๋Ÿ‰ ๋ถ„๋ฅ˜ ์ˆ˜ํ–‰_1,918/92
  • V03: ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜, ๋ฐ์ดํ„ฐ ํšŒ์ „ โ†’ ์ด๋ฏธ์ง€ ์ฆ๊ฐ• ์ˆ˜ํ–‰_์ด๋ฏธ์ง€ ํšŒ์ „์„ ํ†ตํ•ด ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ 6,030๊ฐœ

Ground Truth Marking

PCA ๋ถ„ํฌ ์‹œ๊ฐํ™”

Isolation Forest๋กœ ์ด์ƒ๊ฐ’ ์‹๋ณ„ ๊ฒฐ๊ณผ

Data Configuration

์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์ •๊ทœํ™”:

  • ์ด๋ฏธ์ง€๋Š” ์ผ์ •ํ•œ ํฌ๊ธฐ(์˜ˆ: 518x518)๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆ๋˜๋ฉฐ, CLIP ๋ชจ๋ธ์˜ ์ž…๋ ฅ์œผ๋กœ ์ ํ•ฉํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ํ”ฝ์…€ ๊ฐ’์„ [0, 1] ๋ฒ”์œ„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Ground Truth ๋งˆํ‚น:

  • ๊ฒฐํ•จ์ด ์žˆ๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ๊ฒฐํ•จ ์˜์—ญ์„ bounding box ํ˜•์‹ ๋˜๋Š” binary mask๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆํ‚น๋œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ๋˜๋Š” CSV ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜์—ฌ ๋ชจ๋ธ ํ‰๊ฐ€ ์‹œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Ground Truth Marking

๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜:

  • Normal: ๊ฒฐํ•จ์ด ์—†๋Š” ์ •์ƒ ์ œํ’ˆ์˜ ์ด๋ฏธ์ง€.
  • Error: ๊ฒฐํ•จ์ด ์žˆ๋Š” ์ œํ’ˆ์˜ ์ด๋ฏธ์ง€. ๊ฒฐํ•จ ์œ„์น˜์™€ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Normal Product Images

Error Product Images

๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋ง ๊ฐ€์ด๋“œ

๋ณธ ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋ง ๊ฐ€์ด๋“œ๋Š” AnomalyDetection ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•ด ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ผ๋ฒจ๋งํ•˜๋Š” ๊ธฐ์ค€๊ณผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์ฃผ๋กœ ์ •์ƒ(normal) ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ตœ์†Œํ•œ์˜ ๋น„์ •์ƒ(anomaly) ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ฐ€์ด๋“œ๋Š” ๋ฐ์ดํ„ฐ์˜ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋ชฉํ‘œ๋ฅผ ๋‘ก๋‹ˆ๋‹ค.

๋ผ๋ฒจ๋ง ๋ฒ”์œ„

  1. ์ •์ƒ(normal) ๋ฐ์ดํ„ฐ:

    • ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์•ฝ 95% ์ด์ƒ์„ ์ฐจ์ง€.
    • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ ์กฐ๊ฑด์—์„œ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ (์กฐ๋ช…, ๊ฐ๋„, ๋ฐฐ๊ฒฝ ๋“ฑ).
    • ์ •์ƒ์ ์ธ ์ƒํƒœ์˜ ๊ธˆ์† ํ‘œ๋ฉด, ์ •๋ฐ€ํ•œ ๊ตฌ์กฐ, ๊ท ์ผํ•œ ๊ด‘ํƒ์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ.
  2. ๋น„์ •์ƒ(anomaly) ๋ฐ์ดํ„ฐ:

    • ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์•ฝ 5% ์ดํ•˜๋กœ ์ œํ•œ.
    • ๊ฒฐํ•จ ์œ ํ˜•:
      • Scratch: ์Šคํฌ๋ž˜์น˜.
      • Contamination: ์–ผ๋ฃฉ ๋˜๋Š” ์ด๋ฌผ์งˆ.
      • Crack: ํ‘œ๋ฉด ๊ท ์—ด.

๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋ง ๊ธฐ์ค€

1. ํŒŒ์ผ ๋„ค์ด๋ฐ ๊ทœ์น™

  • ๋ฐ์ดํ„ฐ ๋ฒ„์ „๋ณ„ ํŒŒ์ผ๋ช…์€ ๋ฒ„์ „๋ณ„๋กœ ์ƒ์ดํ•จ.
  • ๊ฐ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฌธ์„œ ์ฐธ๊ณ .
  • ๋ฐ์ดํ„ฐ ํด๋”๋ช…์€ <์ˆ˜์ง‘๋…„์›”์ผ>_<V๋ฒ„์ „>_<๊ฐ„๋‹จํ•œ ์„ค๋ช…> ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ.
  • ์˜ˆ์‹œ: 20240910_V0_๊ฐ„์ด ํ™˜๊ฒฝ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘.

2. ๋ผ๋ฒจ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

๋ผ๋ฒจ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” CSV ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ, ๊ฐ ๋ฐ์ดํ„ฐ์˜ ๋ผ๋ฒจ ๋ฐ ์„ค๋ช…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ํ•„๋“œ:

  • image_id: ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช….
  • label: ์ •์ƒ(normal) ๋˜๋Š” ๋น„์ •์ƒ(anomaly) ์—ฌ๋ถ€.
  • description: ์ƒ์„ธ ์„ค๋ช…(์˜ˆ: ๊ฒฐํ•จ ์œ ํ˜•).

์˜ˆ์‹œ:

{
  "image_id": "normal_20241111_001.jpg",
  "label": "normal",
  "description": "๋งค๋„๋Ÿฌ์šด ํ‘œ๋ฉด์„ ๊ฐ€์ง„ ์ •์ƒ์ ์ธ ๊ธˆ์† ๋ถ€ํ’ˆ, ๊ด‘ํƒ์ด ๊ท ์ผํ•จ."
}
{
  "image_id": "abnormal_20241111_002.jpg",
  "label": "error",
  "description": "ํ‘œ๋ฉด์— ์„ ํ˜• ์Šคํฌ๋ž˜์น˜๊ฐ€ ๋ฐœ๊ฒฌ๋จ."
}

AD-CLIP Model Architecture

AD-CLIP ๋ชจ๋ธ์€ CLIP (ViT-B-32)์„ ๋ฐฑ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•˜๊ณ , ๋Œ€์กฐ ํ•™์Šต์„ ํ†ตํ•ด ์ด์ƒ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์ถœ๋ ฅ์€ ์ด๋ฏธ์ง€๊ฐ€ ๋น„์ •์ƒ์ธ์ง€ ์ •์ƒ์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ์ด์ƒ ์ ์ˆ˜์™€ ๊ฐ ํด๋ž˜์Šค์˜ ํ™•๋ฅ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

CLIP-based Anomaly Detection Model Architecture

๋ชจ๋ธ ๊ตฌ์กฐ

์ž…๋ ฅ ๊ณ„์ธต (Input Layer):

  • ์ž…๋ ฅ ์ด๋ฏธ์ง€: ๋ชจ๋ธ์€ ํฌ๊ธฐ [640, 640, 3]์˜ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ๋ฐ›์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 640x640์€ ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ์™€ ์„ธ๋กœ ํฌ๊ธฐ์ด๋ฉฐ, 3์€ RGB ์ƒ‰์ƒ์˜ ์ฑ„๋„ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ: ์ด ๊ณ„์ธต์€ ์ž…๋ ฅ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋ธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋งž๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Backbone:

  • CLIP (ViT-B-32): ๋ชจ๋ธ์€ CLIP์˜ Vision Transformer (ViT-B-32) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ViT-B-32๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ํŠน์„ฑ์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ: ํ•„ํ„ฐ ํฌ๊ธฐ [32, 64, 128, 256, 512]๋Š” ๊ฐ ViT ๋ ˆ์ด์–ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฏธ์ง€์˜ ๊ฐ ๋ ˆ๋ฒจ์—์„œ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ํŠน์ง•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

Neck:

  • ์ด์ƒ ํƒ์ง€ ๋ชจ๋“ˆ (Anomaly Detection Module): ์ด ๋ชจ๋“ˆ์€ CLIP์—์„œ ์ถ”์ถœ๋œ ํŠน์ง•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ด์ƒ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ์ •์ƒ๊ณผ ๋น„์ •์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋Œ€์กฐ ํ•™์Šต (Contrastive Learning): ๋Œ€์กฐ ํ•™์Šต ๋ฐฉ๋ฒ•์€ ์ •์ƒ ์ด๋ฏธ์ง€์™€ ๋น„์ •์ƒ ์ด๋ฏธ์ง€ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ํ•™์Šตํ•˜์—ฌ, ์ด๋ฏธ์ง€์˜ ์ด์ƒ ์—ฌ๋ถ€๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

Head:

  • ์ด์ƒ ํƒ์ง€ ํ—ค๋“œ (Anomaly Detection Head): ๋ชจ๋ธ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์œผ๋กœ, ์ด ๊ณ„์ธต์€ ์ด๋ฏธ์ง€๊ฐ€ ๋น„์ •์ƒ์ ์ธ์ง€ ์ •์ƒ์ ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Outputs:
    • ์ด์ƒ ์ ์ˆ˜ (Anomaly Score): ๋ชจ๋ธ์€ ์ด๋ฏธ์ง€๊ฐ€ ์ด์ƒ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ ์ˆ˜(์˜ˆ: 1์€ ์ด์ƒ, 0์€ ์ •์ƒ)๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค ํ™•๋ฅ  (Class Probabilities): ๋ชจ๋ธ์€ ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ™•๋ฅ ์„ ์ถœ๋ ฅํ•˜๋ฉฐ, ์ด ํ™•๋ฅ ์„ ํ†ตํ•ด ๊ฒฐํ•จ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

Optimizer and Loss Function

Training

optimizer:

name: AdamW  # AdamW ์˜ตํ‹ฐ๋งˆ์ด์ € (๊ฐ€์ค‘์น˜ ๊ฐ์‡  ํฌํ•จ)
lr: 0.0001  # ํ•™์Šต๋ฅ 

loss:

classification_loss: 1.0  # ๋ถ„๋ฅ˜ ์†์‹ค (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ)
anomaly_loss: 1.0  # ๊ฒฐํ•จ ํƒ์ง€ ์†์‹ค (์ด์ƒ ํƒ์ง€ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์†์‹ค)
contrastive_loss: 1.0  # ๋Œ€์กฐ ํ•™์Šต ์†์‹ค (์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ์†์‹ค)

Metrics

  • Precision # ์ •๋ฐ€๋„ (Precision)
  • Recall # ์žฌํ˜„์œจ (Recall)
  • mAP # ํ‰๊ท  ์ •๋ฐ€๋„ (Mean Average Precision)
  • F1-Score # F1-์ ์ˆ˜ (๊ท ํ˜• ์žกํžŒ ํ‰๊ฐ€ ์ง€ํ‘œ)

Training Parameters

ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •:

  • Learning Rate: 0.001
  • Batch Size: 8
  • Epochs: 200

Pre-trained CLIP model

Model Download
ViT-B/32 download
ViT-B/16 download
ViT-L/14 download
ViT-L/14@336px download

Evaluation Parameters

  • F1-score: 90% ์ด์ƒ (1๋…„์ฐจ)
  • F1-score: 98% ์ด์ƒ (2๋…„์ฐจ)

ํ•™์Šต ์„ฑ๋Šฅ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

ํ•™์Šต์„ฑ๋Šฅ ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„

ํ•™์Šต ๊ณผ์ • ์˜ˆ์‹œ

1์ฐจ ํ•™์Šต ์„ฑ๋Šฅ

2์ฐจ ํ•™์Šต ์„ฑ๋Šฅ

3์ฐจ ํ•™์Šต ์„ฑ๋Šฅ

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผํ‘œ

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

Anomaly Product

Normal Product


๋ชจ๋ธ ๋ณ€๊ฒฝ ์ด๋ ฅ (Model Update History)

AD-CLIP ๊ธฐ๋ฐ˜ ์ด์ƒํƒ์ง€ ๋ชจ๋ธ์€ ์ด 3๊ฐœ ๋ฒ„์ „์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์œผ๋ฉฐ,
๊ฐ ๋ฒ„์ „์€ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ฐœ์„  ๋ฐ ๋ชจ๋ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋งž์ถฐ ์ฒด๊ณ„์ ์œผ๋กœ ๋ณ€๊ฒฝยท์Šน์ธ๋˜์—ˆ๋‹ค.
๋ชจ๋“  ์ด๋ ฅ์€ ๋ฐ์ดํ„ฐ ๋ฒ„์ „, ๋ชจ๋ธ ์„ฑ๋Šฅ(F1), ์Šน์ธ์ž, ๋น„๊ณ  ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ก๋˜์–ด ์ถ”์  ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฒ„์ „ ๋ณ€๊ฒฝ์ผ ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ ๋ฐ์ดํ„ฐ ๋ฒ„์ „ ์„ฑ๋Šฅ (F1) ์กฐ์น˜์ž ๊ฒ€์ˆ˜์ž ๋น„๊ณ 
v1.0.0 2024-09-23 ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ์…‹ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ์ตœ์ดˆ ํ•™์Šต 20240910_V0 0.91 ์œค์„๋ฏผ ์ตœ์ข…ํ˜ธ ์ตœ์ดˆ ๋ฐฐํฌ
v1.1.0 2024-09-26 ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•(ํšŒ์ „ยท์กฐ๋ช…) ๋ฐ Prompt ์ˆ˜์ • 20240920_V1 0.94 ์œค์„๋ฏผ ์ตœ์ข…ํ˜ธ ์„ฑ๋Šฅ ์•ˆ์ •ํ™”
v2.0.0 2025-06-19 ๋ฐ์ดํ„ฐ 30% ์ฆ๊ฐ€, ์ „์ฒด ์žฌํ•™์Šต ์ˆ˜ํ–‰ 20250610_V3 0.98 ์œค์„๋ฏผ ์ตœ์ข…ํ˜ธ 2์ฐจ๋…„๋„ ๋ชฉํ‘œ ์ถฉ์กฑ (๊ณ ๋„ํ™” ์™„๋ฃŒ)

๋ชจ๋ธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒด๊ณ„ (Model Version Management)

AD-CLIP ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝยท๊ต์ฒด ์‹œ์ ์€ ๋ฐ์ดํ„ฐ ๋ฒ„์ „, ์ฝ”๋“œ ๋ฒ„์ „, ์„ฑ๋Šฅ ๋กœ๊ทธ, ์Šน์ธ ๊ธฐ๋ก์ด ์ƒํ˜ธ ์—ฐ๊ณ„๋˜๋ฉฐ,
์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ์‹ ๋ขฐ์„ฑ, ์žฌํ˜„์„ฑ, ์ถ”์ ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•œ๋‹ค.

๋ฒ„์ „ ๋ช…๋ช… ๊ทœ์น™

๊ตฌ๋ถ„ ๊ทœ์น™ ์˜ˆ์‹œ
๋ฐ์ดํ„ฐ ๋ฒ„์ „ YYYYMMDD_V# ํ˜•์‹ 20240910_V0
๋ชจ๋ธ ๋ฒ„์ „ vX.Y.Z ํ˜•์‹ v2.0.0
์šด์˜ ๋กœ๊ทธ ๋ฒ„์ „ LOG_YYYYMMDD ํ˜•์‹ LOG_20251027

๊ด€๋ฆฌ ๊ตฌ์„ฑ์š”์†Œ

๊ตฌ๋ถ„ ๊ด€๋ฆฌ ํ•ญ๋ชฉ ์„ค๋ช…
๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ˆ˜์ง‘ยท๋ผ๋ฒจ๋งยท๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ํ•ด์‹œ(SHA256) ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ถ”์ 
๋ชจ๋ธ ๊ด€๋ฆฌ ํ•™์Šตยทํ‰๊ฐ€ยท์žฌํ•™์Šต ๊ฒฐ๊ณผ ๊ธฐ๋ก ๊ฐ ๋ฒ„์ „๋ณ„ ์ฒดํฌํฌ์ธํŠธ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
์šด์˜ ๊ด€๋ฆฌ ๋ฐฐํฌยท๋กœ๊ทธยท์„ฑ๋Šฅ ์ถ”์  ์šด์˜ ์ค‘ ProbabilityยทF1 ๋ชจ๋‹ˆํ„ฐ๋ง
๋ณด์•ˆ ๊ด€๋ฆฌ Adversarial ํƒ์ง€ยทPoisoning ๋ฐฉ์ง€ ๊ณต๊ฒฉ ํƒ์ง€ ์‹œ ๋ชจ๋ธ ๊ฒฉ๋ฆฌ ๋ฐ ๋ณต์› ์ˆ˜ํ–‰

๋ชจ๋ธ ๋ณ€๊ฒฝ ์ ˆ์ฐจ ์š”์•ฝ

๋‹จ๊ณ„ ์ฃผ์š” ํ™œ๋™ ์‚ฐ์ถœ๋ฌผ
โ‘  ์„ฑ๋Šฅ ๊ฐ์‹œ Probability ๋ฐ F1 Score ์ž๋™ ๋ชจ๋‹ˆํ„ฐ๋ง eval_log.json
โ‘ก ๊ต์ฒด ๊ฒ€ํ†  ๊ธฐ์ค€ ๋ฏธ๋‹ฌ ์‹œ ์žฌํ•™์Šต ๋ชจ๋ธ ์ƒ์„ฑ candidate_model.pth
โ‘ข ์„ฑ๋Šฅ ๋น„๊ต ๊ธฐ์กด vs ์‹ ๊ทœ ๋ชจ๋ธ ๊ฒ€์ฆ compare_result.xlsx
โ‘ฃ ์Šน์ธ ๊ฒ€์ˆ˜์ž ์Šน์ธ ๋ฐ ํšŒ์˜๋ก ๊ธฐ๋ก approval_log.json
โ‘ค ๋ฐฐํฌ ์šด์˜ ๋ฐ˜์˜ ๋ฐ ๋กœ๊ทธ ๋“ฑ๋ก release_note.md
โ‘ฅ ์ถ”์  ๋ชจ๋ธ ๊ต์ฒด ์ด๋ ฅ ์—…๋ฐ์ดํŠธ model_version_log.csv

๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

{
  "model_name": "ADCLIP_v2.0.0",
  "data_version": "20250610_V3",
  "created_at": "2025-06-19T10:00:00Z",
  "f1_score": 0.98,
  "precision": 0.977,
  "recall": 0.982,
  "optimizer": "AdamW",
  "framework": "PyTorch 2.0.0",
  "base_model": "openai/clip-vit-base-patch32",
  "author": "์œค์„๋ฏผ ์ฑ…์ž„์—ฐ๊ตฌ์›",
  "reviewer": "์ตœ์ข…ํ˜ธ ์ฑ…์ž„์—ฐ๊ตฌ์›",
  "status": "Active",
  "notes": "2์ฐจ๋…„๋„ ์ „์ฒด ์žฌํ•™์Šต ๋ฐ ์„ฑ๋Šฅ ๊ณ ๋„ํ™” ๋ฒ„์ „"
}

์„ค์น˜ ๋ฐ ์‹คํ–‰ ๊ฐ€์ด๋“œ

์ด ๋ชจ๋ธ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด Python๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ftfy==6.2.0: ํ…์ŠคํŠธ ์ •๊ทœํ™” ๋ฐ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • matplotlib==3.9.0: ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ฐ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • numpy==1.24.3: ์ˆ˜์น˜ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • opencv_python==4.9.0.80: ์ด๋ฏธ์ง€ ๋ฐ ๋น„๋””์˜ค ์ฒ˜๋ฆฌ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • pandas==2.2.2: ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์กฐ์ž‘์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Pillow==10.3.0: ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋ฐ ๋ณ€ํ™˜์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • PyQt5==5.15.10: GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
  • PyQt5_sip==12.13.0: PyQt5์™€ Python ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • regex==2024.5.15: ์ •๊ทœ ํ‘œํ˜„์‹ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • scikit_learn==1.2.2: ๊ธฐ๊ณ„ ํ•™์Šต ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • scipy==1.9.1: ๊ณผํ•™ ๋ฐ ๊ธฐ์ˆ  ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • setuptools==59.5.0: Python ํŒจํ‚ค์ง€ ๋ฐฐํฌ ๋ฐ ์„ค์น˜๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • scikit-image: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ๋ถ„์„์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • tabulate==0.9.0: ํ‘œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • thop==0.1.1.post2209072238: PyTorch ๋ชจ๋ธ์˜ FLOP ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋„๊ตฌ
  • timm==0.6.13: ๋‹ค์–‘ํ•œ ์ตœ์‹  ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • torch==2.0.0: PyTorch ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ
  • torchvision==0.15.1: ์ปดํ“จํ„ฐ ๋น„์ „ ์ž‘์—…์„ ์œ„ํ•œ PyTorch ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • tqdm==4.65.0: ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • pyautogui: GUI ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์„ค์น˜ ๋ช…๋ น์–ด

pip install -r requirements.txt

๋ชจ๋ธ ์‹คํ–‰ ๋‹จ๊ณ„

Dataset Configuration

Dataset configuration ์˜ˆ์‹œ:

โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ COMP_1/
โ”‚   โ”‚   โ”œโ”€โ”€ product_1/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ground_truth
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_1
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_2
โ”‚   โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ test/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ good
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_1
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_2
โ”‚   โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ train/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ good
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_1
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ anomaly_2
โ”‚   โ”‚   
โ”‚   โ”‚   โ”œโ”€โ”€ product_2/
โ”‚   โ”‚   
โ”‚   โ”‚   โ”œโ”€โ”€ meta.json
โ”‚   
โ”‚   โ”œโ”€โ”€ COMP_2/

JSON ํŒŒ์ผ ์ƒ์„ฑ

๋ฐ์ดํ„ฐ์…‹์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ JSON ํŒŒ์ผ(meta_train.json, meta_test.json)๋กœ ์ €์žฅ:

cd dataset_config
python dataset_get_json.py

Ground Truth ์ƒ์„ฑ

์ˆ˜๋™์œผ๋กœ ๋ชจ๋“  ground truth(anomaly mask๋งŒ) ์ƒ์„ฑ:

cd dataset_config
python image_ground_truth.py

ํ•™์Šต ๋ฐ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ์…‹ ์„ค์ •

cd training_libs
python dataset.py

Dataset ํด๋ž˜์Šค ๋™์ž‘ ๋ฐฉ์‹:

  • __init__ ๋ฉ”์„œ๋“œ: ๋ฐ์ดํ„ฐ์…‹์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ, ๋ณ€ํ™˜ ํ•จ์ˆ˜, ๋ฐ์ดํ„ฐ์…‹ ์ด๋ฆ„, ๋ชจ๋“œ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค
  • ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋‹ด์€ JSON ํŒŒ์ผ (meta_train.json)์„ ์ฝ์–ด์™€ ํด๋ž˜์Šค ์ด๋ฆ„ ๋ชฉ๋ก๊ณผ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
  • generate_class_info ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์„ ํด๋ž˜์Šค ID์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค
  • __len__ ๋ฉ”์„œ๋“œ: ๋ฐ์ดํ„ฐ์…‹์˜ ์ƒ˜ํ”Œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • __getitem__ ๋ฉ”์„œ๋“œ: ์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค์˜ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ฝ๊ณ , ์ด์ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  • ํ•„์š”์‹œ ์ด๋ฏธ์ง€์™€ ๋งˆ์Šคํฌ์— ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์ด๋ฏธ์ง€, ๋งˆ์Šคํฌ, ํด๋ž˜์Šค ์ด๋ฆ„, ์ด์ƒ ์—ฌ๋ถ€, ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ, ํด๋ž˜์Šค ID๋ฅผ ํฌํ•จํ•œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

2. Image Pre-processing (Transformation)

ํ•™์Šต ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ:

# training_libs/utils.py
# AnomalyCLIP_lib/transform.py

Data Processing Techniques:

  • normalization: ์ด๋ฏธ์ง€ ํ”ฝ์…€ ๊ฐ’์„ ํ‰๊ท  ๋ฐ ํ‘œ์ค€ํŽธ์ฐจ๋กœ ํ‘œ์ค€ํ™”
    • ๋ฐฉ๋ฒ•: 'Normalize' from 'torchvision.transforms'
  • max_resize: ์ด๋ฏธ์ง€์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๋น„์œจ์„ ๋งž์ถ”๊ณ  ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํฌ๊ธฐ ์กฐ์ •
    • ๋ฐฉ๋ฒ•: Custom 'ResizeMaxSize' class
  • random_resized_crop: ํ›ˆ๋ จ ์ค‘์— ์ด๋ฏธ์ง€๋ฅผ ๋žœ๋ค์œผ๋กœ ์ž๋ฅด๊ณ  ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ณ€ํ˜•์„ ์ถ”๊ฐ€
    • ๋ฐฉ๋ฒ•: 'RandomResizedCrop' from 'torchvision.transforms'
  • resize: ๋ชจ๋ธ ์ž…๋ ฅ์— ๋งž๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ์กฐ์ •
    • ๋ฐฉ๋ฒ•: 'Resize' with BICUBIC interpolation
  • center_crop: ์ด๋ฏธ์ง€์˜ ์ค‘์•™ ๋ถ€๋ถ„์„ ์ง€์ •๋œ ํฌ๊ธฐ๋กœ ์ž๋ฅด๊ธฐ
    • ๋ฐฉ๋ฒ•: 'CenterCrop'
  • to_tensor: ์ด๋ฏธ์ง€๋ฅผ PyTorch ํ…์„œ๋กœ ๋ณ€ํ™˜
    • ๋ฐฉ๋ฒ•: 'ToTensor'
  • augmentation (optional): ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋žœ๋ค ๋ณ€ํ™˜ ์ ์šฉ, 'AugmentationCfg'๋กœ ์„ค์ • ๊ฐ€๋Šฅ
    • ๋ฐฉ๋ฒ•: Uses 'timm' library if specified

3. Prompt Generating

# training_lib/prompt_ensemble.py

Prompts Built in the Code:

  1. Normal Prompt: ["{}"]

    • Normal Prompt Example: "object"
  2. Anomaly Prompt: ["damaged {}"]

    • Anomaly Prompt Example: "damaged object"

Construction Process:

  1. prompts_pos (Normal): Combines the class name with the normal template
  2. prompts_neg (Anomaly): Combines the class name with the anomaly template

4. Initial Setting for Training

ํ•™์Šต ๋ฐ์ดํ„ฐ์…‹ ๊ฒฝ๋กœ ๋ฐ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํŠธ ์ €์žฅ ๊ฒฝ๋กœ ์ •์˜:

parser.add_argument("--train_data_path", type=str, default="./data/", help="train dataset path")
parser.add_argument("--dataset", type=str, default='smoke_cloud', help="train dataset name")
parser.add_argument("--save_path", type=str, default='./checkpoint/', help='path to save results')

5. Hyper Parameters Setting

Depth Parameter

ํ”„๋กฌํ”„ํŠธ ํ•™์Šต ์ค‘ ํ•™์Šตํ•  ์ž„๋ฒ ๋”ฉ์˜ ๊นŠ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ์—์„œ ๋ณต์žกํ•œ ํŠน์ง•์„ ํ•™์Šตํ•˜๋Š” ๋Šฅ๋ ฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค:

parser.add_argument("--depth", type=int, default=9, help="image size")

Image Size

ํ•™์Šต์— ์‚ฌ์šฉํ•  ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค (ํ”ฝ์…€ ๋‹จ์œ„):

parser.add_argument("--image_size", type=int, default=518, help="image size")

Training Parameters

ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •:

parser.add_argument("--epoch", type=int, default=500, help="epochs")
parser.add_argument("--learning_rate", type=float, default=0.0001, help="learning rate")
parser.add_argument("--batch_size", type=int, default=8, help="batch size")

DPAM (Deep Prompt Attention Mechanism)

DPAM์˜ ํฌ๊ธฐ/๊นŠ์ด ํŒŒ๋ผ๋ฏธํ„ฐ:

parser.add_argument("--dpam", type=int, default=20, help="dpam size")

DPAM ์„ค์ • ๊ฐ€์ด๋“œ:

  • ViT-B/32 and ViT-B/16: --dpam should be around 10-13
  • ViT-L/14 and ViT-L/14@336px: --dpam should be around 20-24

DPAM ์„ค๋ช…:

  • DPAM์€ ํŠนํžˆ Vision Transformers (ViT)์—์„œ ๋ชจ๋ธ์˜ ํŠน์ • ๋ ˆ์ด์–ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
  • Attention ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ชจ๋ธ์ด ๊ฐ ๋ ˆ์ด์–ด ๋‚ด์—์„œ ์ค‘์š”ํ•œ ํŠน์ง•์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค
  • DPAM์€ ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด์— ์ ์šฉ๋˜์–ด ๋” ๊นŠ๊ณ  ์„ธ๋ถ€์ ์ธ ํŠน์ง• ์ถ”์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค
  • DPAM์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ ˆ์ด์–ด ์ˆ˜๋Š” ์กฐ์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (--dpam), ๋ชจ๋ธ์„ ์–ผ๋งˆ๋‚˜ fine-tuneํ• ์ง€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค
  • ์ „์ฒด ๋ชจ๋ธ์„ ๊ฐœ์„ ํ•˜๋ ค๋ฉด --dpam์„ ๋ชจ๋ธ์˜ ๋ ˆ์ด์–ด ์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: ViT-B์˜ ๊ฒฝ์šฐ 12, ViT-L์˜ ๊ฒฝ์šฐ 24)
  • ์ตœ์ข… ๋ ˆ์ด์–ด(์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ธ์ด ๋ณต์žกํ•œ ํŠน์ง•์„ ํ•™์Šตํ•˜๋Š” ๊ณณ)์—๋งŒ ์ง‘์ค‘ํ•˜๋ ค๋ฉด ๋” ์ ์€ DPAM ๋ ˆ์ด์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

6. Test Process

Load pre-trained and Fine tuned (Checkpoints) models:

  1. Pre-trained model (./pre-trained model/):

    • ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ (ViT-B, ViT-L, ๋“ฑ) ํฌํ•จ
    • CLIP ๋ชจ๋ธ ํ•™์Šต์˜ ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉ๋จ
    • ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์€ ์ด์ „์— ํ•™์Šต๋œ ํŠน์ง•์„ ํ™œ์šฉํ•˜์—ฌ ํ•™์Šต ์†๋„๋ฅผ ๋†’์ด๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค
  2. Fine-tuned models (./checkpoint/):

    • ์ด ํด๋”์˜ "epoch_N.pth" ํŒŒ์ผ์€ fine-tuning ๊ณผ์ • ์ค‘ ๋ชจ๋ธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
    • ๊ฐ ".pth" ํŒŒ์ผ์€ ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์—์„œ fine-tuned๋œ ๋ชจ๋ธ์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
    • ์ด๋Ÿฌํ•œ ์ฒดํฌํฌ์ธํŠธ๋Š” fine-tuning ์žฌ๊ฐœ, ๋‹ค์–‘ํ•œ ๋‹จ๊ณ„์—์„œ ๋ชจ๋ธ ํ‰๊ฐ€, ๋˜๋Š” ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฒ„์ „ ์„ ํƒ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ชจ๋ธ ๊ณต๊ฒฉ ์ทจ์•ฝ์  ๋ถ„์„

๋ณธ ๋ฌธ์„œ๋Š” AnomalyCLIP ๋ชจ๋ธ์˜ ์ทจ์•ฝ์  ๋ถ„์„ ๋ฐ ์ ๋Œ€์  ๊ณต๊ฒฉ(Adversarial Attacks)์— ๋Œ€ํ•œ ๋ฐฉ์–ด ๋Œ€์ฑ…์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ๋ฐ ๋ชจ๋ธ ์ˆ˜์ค€์˜ ๋ฐฉ์–ด ์ „๋žต์„ ๊ตฌํ˜„ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

1. ์ทจ์•ฝ์  ๋ถ„์„

์ ๋Œ€์  ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. Adversarial Examples:

    • ์„ค๋ช…: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ์ž‘์€ ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋ธ์˜ ์˜ˆ์ธก์„ ์™œ๊ณกํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ์ •์ƒ ์ด๋ฏธ์ง€๋ฅผ ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋กœ ์˜ˆ์ธกํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
  2. Data Poisoning:

    • ์„ค๋ช…: ํ•™์Šต ๋ฐ์ดํ„ฐ์— ์•…์˜์  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ชจ๋ธ ํ•™์Šต์„ ์™œ๊ณกํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ๋น„์ •์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
  3. Evasion Attacks:

    • ์„ค๋ช…: ์ถ”๋ก  ์‹œ ๋ชจ๋ธ์˜ ๋ถ„๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ๊ฒฐํ•จ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์œผ๋กœ ์˜ˆ์ธกํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ๋ฐ ๋ฐ์ดํ„ฐ์…‹ ์˜ํ–ฅ

  • ์„ฑ๋Šฅ ์ €ํ•˜: ์ ๋Œ€์  ์ƒ˜ํ”Œ ์ž…๋ ฅ ์‹œ ๋ชจ๋ธ์˜ ์ •ํ™•๋„ ๊ฐ์†Œ
  • ๋ฌด๊ฒฐ์„ฑ ์†์ƒ: ๋ฐ์ดํ„ฐ ๋ณ€์กฐ๋กœ ์ธํ•ด ํ•™์Šต๋œ ๋ชจ๋ธ์ด ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์‹ ๋ขฐ์„ฑ์„ ์ƒ์‹ค
  • ์•…์˜์  ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ: ๋ชจ๋ธ์˜ ์˜์‚ฌ๊ฒฐ์ •์ด ์˜ค์ž‘๋™ํ•˜์—ฌ ์ƒ์‚ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€

2. ๋Œ€์‘ ๋ฐฉ์•ˆ

๋ฐ์ดํ„ฐ ์ˆ˜์ค€ ๋ฐฉ์–ด ๋Œ€์ฑ…

  1. ๋ฐ์ดํ„ฐ ์ •์ œ:

    • ํ๋ฆฟํ•˜๊ฑฐ๋‚˜ ์ž˜๋ฆฐ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
    • ๋ฐ์ดํ„ฐ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ ๋ฐ ๊ฒฐํ•จ ๋ณต๊ตฌ
    • ๊ฒฐ๊ณผ: ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ฐ•ํ™”๋กœ ์ ๋Œ€์  ๋…ธ์ด์ฆˆ ํšจ๊ณผ ๊ฐ์†Œ
  2. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•(Data Augmentation):

    • ๋žœ๋ค ํšŒ์ „, ํฌ๊ธฐ ์กฐ์ •, ๋ฐ๊ธฐ ๋ฐ ๋Œ€๋น„ ์กฐ์ •
    • Gaussian Noise ๋ฐ Salt-and-Pepper Noise ์ถ”๊ฐ€
    • ๊ฒฐ๊ณผ: ๋ฐ์ดํ„ฐ ๋‹ค์–‘์„ฑ ํ™•๋ณด ๋ฐ ๋ชจ๋ธ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ ๊ฐ•ํ™”
  3. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ:

    • ๊ฐ ๋ฐ์ดํ„ฐ ํ•ด์‹œ๊ฐ’(MD5) ์ €์žฅ ๋ฐ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€ ํ™•์ธ
    • ๊ฒฐ๊ณผ: ๋ฐ์ดํ„ฐ์…‹ ์‹ ๋ขฐ์„ฑ ๋ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ

๋ชจ๋ธ ์ˆ˜์ค€ ๋ฐฉ์–ด ๋Œ€์ฑ…

  1. Adversarial Training:

    • FGSM ๊ธฐ๋ฐ˜์˜ ์ ๋Œ€์  ์ƒ˜ํ”Œ์„ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ํฌํ•จ
    • ๊ฒฐ๊ณผ: ์ ๋Œ€์  ์ƒ˜ํ”Œ์—์„œ๋„ ํ‰๊ท  ์ •ํ™•๋„ 5% ํ–ฅ์ƒ
  2. Gradient Masking:

    • ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ์ˆจ๊ฒจ ๋ชจ๋ธ์ด ์ ๋Œ€์  ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด
  3. Temperature Scaling:

    • ๋ชจ๋ธ์˜ ์˜ˆ์ธก ํ™•๋ฅ ์„ ์กฐ์ •ํ•˜์—ฌ ์ ๋Œ€์  ์ƒ˜ํ”Œ ๋ฏผ๊ฐ๋„ ์™„ํ™”

์‹œ์Šคํ…œ ์ˆ˜์ค€ ๋ฐฉ์–ด ๋Œ€์ฑ…

  1. ์‹ค์‹œ๊ฐ„ ํƒ์ง€ ๋ฐ ๋Œ€์‘:

    • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ด์ƒ ํŒจํ„ด์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํƒ์ง€ํ•˜๋Š” ์‹œ์Šคํ…œ ๊ตฌ์ถ•
    • ๊ฒฐ๊ณผ: ์ ๋Œ€์  ๊ณต๊ฒฉ ๋ฐœ์ƒ ์‹œ ์ฆ‰๊ฐ์ ์ธ ๊ฒฝ๊ณ  ๋ฐ ๋Œ€์‘ ๊ฐ€๋Šฅ
  2. ์ž๋™ํ™”๋œ ๋ฐฉ์–ด ๋„๊ตฌ:

    • Adversarial Examples ์ƒ์„ฑ ๋ฐ ๋ฐฉ์–ด ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

3. ์‹คํ—˜ ๊ฒฐ๊ณผ

ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ

  • ์ •์ƒ ๋ฐ์ดํ„ฐ: 110๊ฑด
  • ๊ฒฐํ•จ ๋ฐ์ดํ„ฐ: 10๊ฑด
  • ์ ๋Œ€์  ๋ฐ์ดํ„ฐ(FGSM ๊ณต๊ฒฉ): 100๊ฑด

์ฃผ์š” ์„ฑ๋Šฅ ์ง€ํ‘œ

๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ ๋Œ€์  ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์œจ
Accuracy 98% 92% -6%
F1 Score 0.935 0.91 -2.5%
False Positive 2% 5% +3%
False Negative 3% 7% +4%

4. ํ–ฅํ›„ ๊ณ„ํš

  1. ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ํ…Œ์ŠคํŠธ:

    • PGD, DeepFool ๋“ฑ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ์ ์šฉ ๋ฐ ํ‰๊ฐ€
  2. ๋ชจ๋ธ ๊ฐœ์„ :

    • Contrastive Learning ๋ฐ ์•™์ƒ๋ธ” ํ•™์Šต์„ ํ†ตํ•œ ๊ฒฌ๊ณ ์„ฑ ๊ฐ•ํ™”
  3. ์‹ค์‹œ๊ฐ„ ๋ฐฉ์–ด ์‹œ์Šคํ…œ ๊ตฌ์ถ•:

    • ๋ชจ๋ธ์˜ ์‹ค์‹œ๊ฐ„ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ ๋Œ€์  ์ž…๋ ฅ ํƒ์ง€ ๋ฐ ์ฐจ๋‹จ

์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด์•ˆยท๋ผ์ด์„ ์Šค ์œ„ํ—˜ ๊ด€๋ฆฌ ์ฒด๊ณ„

๋ณธ ์„น์…˜์€ AnomalyCLIP/AD-CLIP ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ์นด๋“œ์˜ ๋ณด์•ˆยท๋ผ์ด์„ ์Šค ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
๋ชฉ์ : ๊ณต๊ธ‰๋ง(Software Supply Chain) ๋ฆฌ์Šคํฌ ์ตœ์†Œํ™”, ๋ผ์ด์„ ์Šค ์˜๋ฌด ์ค€์ˆ˜, ์žฌ๋ฐฐํฌ/์ƒ์šฉํ™” ์ ํ•ฉ์„ฑ ํ™•๋ณด.

1) ๋ฒ”์œ„(Scope) & ์›์น™

  • ๋Œ€์ƒ: ํ•™์Šต/์ถ”๋ก  ์ฝ”๋“œ, ์Šคํฌ๋ฆฝํŠธ, ๋„๊ตฌ ์ฒด์ธ, ํŒŒ์ƒ ์‚ฐ์ถœ๋ฌผ(๊ฐ€์ค‘์น˜ยท์ฒดํฌํฌ์ธํŠธยทGUI ์‹คํ–‰ํŒŒ์ผ), ๋ฐฐํฌ ๋ฒˆ๋“ค(whl/zip/docker)
  • ์›์น™:
    • ์ตœ์†Œ๊ถŒํ•œ(Principle of Least Privilege)
    • ์žฌํ˜„๊ฐ€๋Šฅ ๋นŒ๋“œ(Reproducible Build)
    • ํˆฌ๋ช…์„ฑ(๋ช…์‹œ์  ๋ผ์ด์„ ์Šค ๊ณ ์ง€)
    • ์‹ ์†ํ•œ ์ทจ์•ฝ์  ํŒจ์น˜
  • ์ƒ์šฉ ๋ฐฐํฌ ์‹œ ๋ชจ๋“  OSS ์˜๋ฌด(์ €์ž‘๊ถŒ/NOTICE/์†Œ์Šค ์ œ๊ณต ๋ฒ”์œ„ ๋“ฑ) ์„ ์ดํ–‰ ํ›„ ๋ฐฐํฌ

2) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ & ๋ผ์ด์„ ์Šค ๋งคํŠธ๋ฆญ์Šค

์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „/๋ผ์ด์„ ์Šค๋Š” pip-licenses/cyclonedx-py ์‚ฐ์ถœ๋ฌผ๋กœ ์ž๋™์ƒ์„ฑํ•˜์—ฌ ๋ณธ ํ…Œ์ด๋ธ”์„ ์ •๊ธฐ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๋ฒ„์ „(์˜ˆ) ๋ผ์ด์„ ์Šค(์˜ˆ) ํ•ต์‹ฌ ์˜๋ฌด
ftfy 6.2.0 MIT ์ €์ž‘๊ถŒ ๊ณ ์ง€ ์œ ์ง€
matplotlib 3.9.0 PSF/MATPL ์ €์ž‘๊ถŒ ๊ณ ์ง€
numpy 1.24.3 BSD-3 ์ €์ž‘๊ถŒ/๋ฉด์ฑ… ๊ณ ์ง€
opencv-python 4.9.0.80 Apache-2.0 NOTICE ํฌํ•จ ๊ถŒ์žฅ
pandas 2.2.2 BSD-3 ์ €์ž‘๊ถŒ/๋ฉด์ฑ… ๊ณ ์ง€
Pillow 10.3.0 HPND-PIL ์ €์ž‘๊ถŒ ๊ณ ์ง€
PyQt5 / PyQt5-sip 5.15.10 / 12.13.0 GPLv3/์ƒ์šฉ๋“€์–ผ ์ƒ์šฉ ๋ฐฐํฌยท์ •์  ๋งํฌ ์ฃผ์˜
regex 2024.5.15 PSF ์ €์ž‘๊ถŒ ๊ณ ์ง€
scikit-learn 1.2.2 BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
scipy 1.9.1 BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
setuptools 59.5.0 MIT ์ €์ž‘๊ถŒ ๊ณ ์ง€
scikit-image ์ตœ์‹  BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
tabulate 0.9.0 MIT ์ €์ž‘๊ถŒ ๊ณ ์ง€
thop 0.1.1.post... MIT ์ €์ž‘๊ถŒ ๊ณ ์ง€
timm 0.6.13 Apache-2.0 NOTICE ํฌํ•จ ๊ถŒ์žฅ
torch 2.0.0 BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
torchvision 0.15.1 BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
tqdm 4.65.0 MPL-2.0 ์ˆ˜์ • ๋ฐฐํฌ ์‹œ ์†Œ์Šค ๊ณต๊ฐœ ์š”๊ฑด ํ™•์ธ
pyautogui ์ตœ์‹  BSD-3 ์ €์ž‘๊ถŒ ๊ณ ์ง€
CLIP ๊ฐ€์ค‘์น˜(ViT-B/32 ๋“ฑ) ๋งํฌ ์ฐธ์กฐ OpenAI Terms(๋ชจ๋ธ ๊ฐ€์ค‘์น˜) ์ƒ์—…์  ์ด์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€/์žฌ๋ฐฐํฌ ์ œํ•œ ์‚ฌํ•ญ์„ ๊ฐœ๋ณ„ ์•ฝ๊ด€์œผ๋กœ ์žฌํ™•์ธ ํ•„์š”

โš ๏ธ ์ฃผ์˜: PyQt5๋Š” GPLv3(๋˜๋Š” ์ƒ์šฉ ๋ผ์ด์„ ์Šค)๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ƒ์šฉ ๋ฐฐํฌ/์ •์  ๋งํฌ ์‹œ ์ฝ”๋“œ ๊ณต๊ฐœ ์˜๋ฌด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•„์š” ์‹œ ์ƒ์šฉ ๋ผ์ด์„ ์Šค ๊ตฌ๋งค ๋˜๋Š” Qt์˜ ๋Œ€์ฒด GUI(์˜ˆ: PySide6 LGPL, ์›น ํ”„๋ก ํŠธ์—”๋“œ) ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ OpenAI CLIP ๊ฐ€์ค‘์น˜๋Š” OpenAI ์ œ๊ณต ์•ฝ๊ด€์„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด ์žฌ๋ฐฐํฌ/์ƒ์—…์  ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ๊ฒ€์ฆํ•˜์„ธ์š”.

3) ๋ฐฐํฌ ์‹œ ํ•„์ˆ˜ ๊ณ ์ง€(Attribution) & NOTICE

  • ์ €์žฅ์†Œ ๋ฃจํŠธ์— LICENSE, NOTICE, THIRD_PARTY_LICENSES/ ์œ ์ง€
  • ํŒจํ‚ค์ง€๋ณ„ ์ €์ž‘๊ถŒยท๋ฉด์ฑ… ๊ณ ์ง€ ํฌํ•จ(์ž๋™์ˆ˜์ง‘ ์‚ฐ์ถœ๋ฌผ ๋ณ‘ํ•ฉ)
  • ๋ชจ๋ธ ๊ฐ€์ค‘์น˜/๋ฐ์ดํ„ฐ์…‹์˜ ์›์ €์ž‘์žยท์•ฝ๊ด€์„ README์— ๋ช…์‹œ

4) ์ทจ์•ฝ์  ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค (CVE/SBOM)

๋„๊ตฌ ์ฒด์ธ(๊ถŒ์žฅ):

  • SBOM: cyclonedx-py / pipdeptree โ†’ bom.json/bom.xml
  • ๋ผ์ด์„ ์Šค: pip-licenses --format=json
  • ์ทจ์•ฝ์ : pip-audit, safety, (์ปจํ…Œ์ด๋„ˆ) trivy

์ •์ฑ…:

  1. ์ฃผ๊ธฐ์  ์Šค์บ”: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์ฃผ 1ํšŒ, ๋ฆด๋ฆฌ์Šค ์ง์ „ 1ํšŒ
  2. ์ž„๊ณ„์น˜: High/CRITICAL ๋ฐœ๊ฒฌ ์‹œ ๋ฆด๋ฆฌ์Šค ์ค‘๋‹จ, ํŒจ์น˜/์šฐํšŒ๋ฒ„์ „ ํ‰๊ฐ€
  3. ๋ณ€๊ฒฝ๊ด€๋ฆฌ: ํŒจ์น˜ ํ›„ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ, ์„ฑ๋Šฅ ์˜ํ–ฅ ๋ณด๊ณ 
  4. ์ถ”์ : SECURITY.md์— CVE, ์˜ํ–ฅ๋ฒ”์œ„, ๋Œ€์‘์ƒํƒœ ๊ธฐ๋ก

์˜ˆ์‹œ ์ปค๋งจ๋“œ:

# SBOM
python -m pip install cyclonedx-bom pipdeptree pip-licenses pip-audit safety
cyclonedx-py -o sbom.json
pipdeptree --json-tree > deps.json
pip-licenses --format=json --with-license-file > THIRD_PARTY_LICENSES/licenses.json

# ์ทจ์•ฝ์ 
pip-audit            # PyPI ์—์ฝ”์‹œ์Šคํ…œ ์ทจ์•ฝ์  ์Šค์บ”
safety check         # ์•ˆ์ „์„ฑ DB ๊ธฐ๋ฐ˜ ์Šค์บ”

# ์ปจํ…Œ์ด๋„ˆ(์žˆ์„ ๊ฒฝ์šฐ)
trivy fs .           # ์†Œ์Šค/์ข…์†์„ฑ ์Šค์บ”

5. ๊ฐœ๋ฐœยท๋นŒ๋“œ ๋ณด์•ˆ (Development & Build Security)

์•ˆ์ „ํ•˜๊ณ  ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ ์ง€ํ•˜์—ฌ ๊ณต๊ธ‰๋ง ๋ฆฌ์Šคํฌ๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ ์„ค์ •:

  • ์ž ๊ธˆํŒŒ์ผ(requirements.txt / constraints.txt)์— ์ •ํ™•ํ•œ ๋ฒ„์ „(pin) ๋ช…์‹œ
  • pip-tools๋ฅผ ์‚ฌ์šฉํ•ด ์˜์กด์„ฑ ๋™๊ฒฐ (pip-compile)
  • CI/CD์—์„œ --require-hashes ์˜ต์…˜์œผ๋กœ ํ•ด์‹œ ๊ฒ€์ฆ
  • ๋ฐฐํฌ ์•„ํ‹ฐํŒฉํŠธ์— SHA256 ํ•ด์‹œ ๋ฐ SBOM ํฌํ•จ
  • API Key / Token์€ ์ฝ”๋“œ์— ์ ˆ๋Œ€ ํฌํ•จ ๊ธˆ์ง€ (ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋˜๋Š” Secret Manager ์‚ฌ์šฉ)
  • ์„œ๋ช…/๋ฌด๊ฒฐ์„ฑ ๊ด€๋ฆฌ: ํ•ด์‹œ ๊ฒ€์ฆ ๋ฐ SBOM ๋™์‹œ ๋ฐฐํฌ
  • ๊ถŒํ•œ ๋ถ„๋ฆฌ: ํ•™์Šต/์ถ”๋ก  ์„œ๋ฒ„๋Š” ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰

์„ค์น˜ ์˜ˆ์‹œ:

pip install pip-tools
pip install cyclonedx-bom pipdeptree pip-licenses pip-audit safety

๋นŒ๋“œ/๊ฒ€์ฆ ๋ช…๋ น์–ด:

# ์˜์กด์„ฑ ๋™๊ฒฐ
pip-compile requirements.in --output-file requirements.txt

# SBOM ์ƒ์„ฑ
cyclonedx-py -o sbom.json

# ๋ผ์ด์„ ์Šค ๋ฐ ์˜์กด์„ฑ ๋ฆฌ์ŠคํŠธ
pip-licenses --format=json --with-license-file > THIRD_PARTY_LICENSES/licenses.json

# ์ทจ์•ฝ์  ์ ๊ฒ€
pip-audit
safety check

6. ๋ฐ์ดํ„ฐยท๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๋ณด์•ˆ (Data & Model Artifact Security)

๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋Š” AI ๊ณต๊ธ‰๋ง์˜ ํ•ต์‹ฌ ์ž์‚ฐ์ž…๋‹ˆ๋‹ค.
์•„๋ž˜ ์ง€์นจ์€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๋ชจ๋ธ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋ณด์•ˆ ๊ธฐ์ค€์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ชฉํ‘œ:

  1. ํ•™์Šต ๋ฐ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ(Integrity) ๋ณด์žฅ
  2. ๋ชจ๋ธ ์ฒดํฌํฌ์ธํŠธ(.pth ๋“ฑ)์˜ ์œ„๋ณ€์กฐ ๋ฐฉ์ง€ ๋ฐ ์ถ”์ ์„ฑ ํ™•๋ณด
  3. ์ ๋Œ€์  ๊ณต๊ฒฉ(Adversarial Attack) ๋ฐ ๋ฐ์ดํ„ฐ ์˜ค์—ผ(Data Poisoning) ๋Œ€์‘
  4. ํ•™์Šต ์žฌํ˜„์„ฑ(Reproducibility) ๋ณด์žฅ

๋ฐ์ดํ„ฐ ๋ณด์•ˆ ๊ด€๋ฆฌ ์ ˆ์ฐจ:

๋‹จ๊ณ„ ์„ค๋ช… ๋„๊ตฌ / ์‹คํ–‰ ์˜ˆ์‹œ
โ‘  ์ˆ˜์ง‘ ์›๋ณธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ›„ MD5/SHA256 ํ•ด์‹œ ๊ธฐ๋ก sha256sum dataset.zip > dataset.sha256
โ‘ก ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ „ ํ•ด์‹œ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ sha256sum -c dataset.sha256
โ‘ข ๋ผ๋ฒจ ๊ด€๋ฆฌ ๋ผ๋ฒจ๋ง ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„ JSON/CSV๋กœ ๋ถ„๋ฆฌ ๊ด€๋ฆฌ meta_train.json, meta_test.json
โ‘ฃ ์ ‘๊ทผ ์ œ์–ด ๋ฐ์ดํ„ฐ ํด๋” ๊ถŒํ•œ ์ตœ์†Œํ™” (r-- ๊ถŒํ•œ์œผ๋กœ ๊ณต์œ ) chmod 440 data/*
โ‘ค ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ณ€๊ฒฝ ์‹œ์ ๋งˆ๋‹ค ๋ฒ„์ „๋ช… ๊ธฐ๋ก (์˜ˆ: 20241002_V2) Git tag ๋˜๋Š” DVC ์‚ฌ์šฉ

๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๊ด€๋ฆฌ:

ํ•ญ๋ชฉ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ์ฃผ์˜์‚ฌํ•ญ
๋ชจ๋ธ ๊ฐ€์ค‘์น˜ (.pth) ์ฒดํฌํฌ์ธํŠธ ํŒŒ์ผ๋งˆ๋‹ค SHA256 ์ƒ์„ฑ ๋ฐ ๋ณด๊ด€ ํŒŒ์ผ๋ช…์— Epoch, ๋ฒ„์ „, ๋‚ ์งœ ํฌํ•จ (adclip_e120_v2.pth)
ํ•™์Šต ๋กœ๊ทธ TensorBoard ๋˜๋Š” CSV ํฌ๋งท์œผ๋กœ ๊ธฐ๋ก ์†์‹ค ๊ณก์„  ๋ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ ํฌํ•จ
๋ชจ๋ธ ์„ค์ •๊ฐ’ (Config) config.yaml ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ €์žฅ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ ์‹œ ๋ฒ„์ „ ๋ณ€๊ฒฝ ํ•„์ˆ˜
์ถ”์ ์„ฑ ํ™•๋ณด MLflow / W&B ๋˜๋Š” ๋กœ์ปฌ DB ์‚ฌ์šฉ run_id, commit_id, data_version ์—ฐ๋™
๋น„๊ณต๊ฐœ ์ €์žฅ์†Œ ๊ด€๋ฆฌ ๋‚ด๋ถ€ NAS ๋˜๋Š” S3 Private Bucket ํ™œ์šฉ ๊ณต๊ฐœ ์ €์žฅ์†Œ ์—…๋กœ๋“œ ๊ธˆ์ง€ (ํŠนํžˆ ๊ณ ๊ฐ ์ด๋ฏธ์ง€ ํฌํ•จ ์‹œ)

์ฒดํฌํฌ์ธํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (์˜ˆ์‹œ):

{
  "model_name": "ad_clip_epoch_120.pth",
  "sha256": "3f83c2a0aef2d7d9c2225b18d9ea435d...",
  "data_version": "20241002_V2",
  "created_at": "2024-10-12T09:30:00Z",
  "train_command": "python train.py --config config.yaml --epochs 200",
  "framework": "PyTorch 2.0.0",
  "base_model": "openai/clip-vit-base-patch32",
  "f1_score": 0.91,
  "author": "์œค์„๋ฏผ",
  "organization": "SOLUWINS Co., Ltd."
}

์ ๋Œ€์  ๊ณต๊ฒฉ(Adversarial Attack) ๋ฐฉ์–ด ๊ฐ•ํ™”:

๊ณต๊ฒฉ ์œ ํ˜• ์„ค๋ช… ๋Œ€์‘ ๋ฐฉ์•ˆ
FGSM (Fast Gradient Sign Method) ์ž…๋ ฅ ์ด๋ฏธ์ง€์— ์ž‘์€ ๋…ธ์ด์ฆˆ ์ถ”๊ฐ€ ํ•™์Šต ์‹œ FGSM ์ƒ˜ํ”Œ ํฌํ•จ (Adversarial Training)
PGD (Projected Gradient Descent) ๋ฐ˜๋ณต์ ์œผ๋กœ ๋…ธ์ด์ฆˆ ์ตœ์ ํ™” torchattacks ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ฐฉ์–ด ํ…Œ์ŠคํŠธ
Data Poisoning ํ•™์Šต ๋ฐ์ดํ„ฐ์— ์•…์„ฑ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋ฐ์ดํ„ฐ ์ •์ œ ๋ฐ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ
Evasion Attack ์ถ”๋ก  ์‹œ ์ž…๋ ฅ ์กฐ์ž‘ ํ™•๋ฅ  ์ž„๊ณ„๊ฐ’ ์กฐ์ • + Gradient Masking

๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ (์˜ˆ์‹œ):

#!/bin/bash
echo "[INFO] Starting dataset integrity check..."
for file in $(cat dataset.sha256 | awk '{print $2}'); do
  sha256sum -c dataset.sha256 --status $file
  if [ $? -eq 0 ]; then
    echo "[OK] $file integrity verified."
  else
    echo "[ERROR] $file integrity mismatch!"
    exit 1
  fi
done
echo "[INFO] Dataset integrity check completed successfully."

๊ถŒ์žฅ ๋„๊ตฌ:

๋ชฉ์  ๋„๊ตฌ ๋น„๊ณ 
๋ฐ์ดํ„ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ DVC (Data Version Control) Git ์—ฐ๋™ ๊ฐ€๋Šฅ
๋ชจ๋ธ ์‹คํ—˜ ์ถ”์  MLflow / W&B ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ ๊ฒฐ๊ณผ ์ถ”์ 
๋ณด์•ˆ ์Šค์บ” trivy, safety, pip-audit ์˜์กด์„ฑ ์ทจ์•ฝ์  ์ ๊ฒ€
๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ sha256sum / openssl dgst ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ

์˜ˆ์‹œ ์›Œํฌํ”Œ๋กœ์šฐ (๋ชจ๋ธ ์•„์นด์ด๋ธŒ ์ƒ์„ฑ):

# 1. ํ•ด์‹œ ์ƒ์„ฑ
sha256sum ad_clip_epoch_120.pth > ad_clip_epoch_120.pth.sha256

# 2. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ
python gen_metadata.py --model ad_clip_epoch_120.pth --out model_info.json

# 3. ์•„์นด์ด๋ธŒ ํŒจํ‚ค์ง•
tar -czvf adclip_model_v2.tar.gz ad_clip_epoch_120.pth model_info.json

# 4. ์—…๋กœ๋“œ ์ „ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ
sha256sum -c ad_clip_epoch_120.pth.sha256

๋ฌธ์„œํ™” ์˜ˆ์‹œ:

/security/model_security/README.md ํŒŒ์ผ ๋‚ด ํฌํ•จ ๊ถŒ์žฅ

# Model Artifact Security Policy
- ๋ชจ๋“  ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋Š” SHA256 ๊ธฐ๋ฐ˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ํ›„ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
- ๊ฐ ๋ชจ๋ธ์—๋Š” ํ•™์Šต ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ ๋ฒ„์ „, ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ช…์‹œ๋œ `model_info.json`์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
- ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ๋ชจ๋ธ ๋ณ€๊ฒฝ ์‹œ, ์ƒˆ๋กœ์šด ๋ฒ„์ „ ํƒœ๊ทธ(`_Vx.x`)๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  SBOM์„ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

7. ์žฌ๋ฐฐํฌยท์ƒ์—…ํ™” ๊ฐ€์ด๋“œ (Redistribution & Commercialization)

์˜คํ”ˆ์†Œ์Šค ๋ผ์ด์„ ์Šค ๋ฐ ๋ฐ์ดํ„ฐ์…‹ยท๋ชจ๋ธ ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜์—ฌ ๋ฒ•์  ๋ฆฌ์Šคํฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์›์น™:

๋ผ์ด์„ ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ ์ฃผ์˜์‚ฌํ•ญ
MIT / BSD / Apache-2.0 ์ž์œ ๋กœ์šด ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ €์ž‘๊ถŒ, NOTICE ํŒŒ์ผ ์œ ์ง€
GPL / MPL ๋“ฑ ์นดํ”ผ๋ ˆํ”„ํŠธ ์กฐ๊ฑด๋ถ€ ํ—ˆ์šฉ ๋งํฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์†Œ์Šค ๊ณต๊ฐœ ์˜๋ฌด ๋ฐœ์ƒ
OpenAI CLIP ๊ฐ€์ค‘์น˜ ์ œํ•œ์  ์ƒ์—…์  ์ด์šฉ ์•ฝ๊ด€ ๋ณ„๋„ ํ™•์ธ ํ•„์š”
HuggingFace Dataset ์ถœ์ฒ˜๋ณ„ ํ™•์ธ ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž ์•ฝ๊ด€ ์ค€์ˆ˜ ํ•„์š”

์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  • THIRD_PARTY_LICENSES/ ์ตœ์‹ ํ™”
  • PyQt5 ๋“ฑ GPL ๊ณ„์—ด ์˜์กด์„ฑ ๊ฒ€ํ† 
  • CLIP ๊ฐ€์ค‘์น˜ ์•ฝ๊ด€ ๋ฌธ์„œ ์ฒจ๋ถ€
  • SBOM + ํ•ด์‹œ ํฌํ•จํ•˜์—ฌ ๋ฐฐํฌ

8. ๋‚ด๋ถ€ ์Šน์ธยทRACI (Internal Approval & RACI)

ํ”„๋กœ์„ธ์Šค ์ƒ ์ฑ…์ž„๊ณผ ๊ถŒํ•œ์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ™œ๋™ Responsible Consulted Accountable
์‹ ๊ทœ OSS ๋„์ž… ๊ฒ€ํ†  ๊ฐœ๋ฐœํŒ€ ๋ณด์•ˆํŒ€, ๋ฒ•๋ฌด ๋ณด์•ˆํŒ€์žฅ
SBOM/๋ผ์ด์„ ์Šค ์Šค์บ” ๊ฐœ๋ฐœํŒ€ ๋ณด์•ˆํŒ€ ๋ณด์•ˆํŒ€์žฅ
์ทจ์•ฝ์  ํŒจ์น˜ ์ ์šฉ ๊ฐœ๋ฐœํŒ€ ๋ณด์•ˆํŒ€ ๊ฐœ๋ฐœํŒ€์žฅ
๋ฆด๋ฆฌ์Šค ์Šน์ธ ๊ฐœ๋ฐœํŒ€ ๋ณด์•ˆยท๋ฒ•๋ฌด ์ œํ’ˆ ์ฑ…์ž„์ž(PO)

9. PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ (Pull Request Checklist)

๋ฆด๋ฆฌ์Šค/๋ณ‘ํ•ฉ ์ „ ๋ณด์•ˆยท๋ฒ•์  ์ค€์ˆ˜๋ฅผ ์œ„ํ•œ ์ ๊ฒ€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

- [ ] requirements.txt ๋ฒ„์ „ ํ•€ ๋ฐ ํ•ด์‹œ ํฌํ•จ
- [ ] pip-audit / safety: HighยทCritical ์ทจ์•ฝ์  ์—†์Œ
- [ ] SBOM(cyclonedx-py) ์ƒ์„ฑ ๋ฐ ์ปค๋ฐ‹
- [ ] THIRD_PARTY_LICENSES/ ๊ฐฑ์‹  ์™„๋ฃŒ
- [ ] NOTICE ๋ฐ LICENSE ์ตœ์‹ ํ™”
- [ ] ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ยท๋ฐ์ดํ„ฐ์…‹ ์•ฝ๊ด€ ๊ฒ€์ฆ ๋ฌธ์„œ ์ฒจ๋ถ€
- [ ] GUI ํ”„๋ ˆ์ž„์›Œํฌ(PyQt5 ๋“ฑ) ์ƒ์šฉ์„ฑ ๊ฒ€ํ†  ๊ฒฐ๊ณผ ์ฒจ๋ถ€
- [ ] CI ๋นŒ๋“œยทํ…Œ์ŠคํŠธ ํ†ต๊ณผ

References

  • AnomalyCLIP: Object-agnostic Prompt Learning for Zero-shot Anomaly Detection [github]
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for quandao92/clip-based-anomaly-detection

Finetuned
(84)
this model

Dataset used to train quandao92/clip-based-anomaly-detection