๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ด๋ฏธ์ง€ ๋ฐ ์˜์ƒ ์ฒ˜๋ฆฌ

์ด์ƒ ๋ฐ์ดํ„ฐ์…‹ MVTecAD ์‚ดํŽด๋ณด๊ธฐ

by kaizen_bh 2025. 3. 7.

 

 

1. ๊ฐœ์š”

 

https://www.mvtec.com/company/research/datasets/mvtec-ad

 

MVTec Anomaly Detection Dataset: MVTec Software

MVTec AD is a dataset for benchmarking anomaly detection methods with a focus on industrial inspection. It contains over 5000 high-resolution images divided into fifteen different object and texture categories. Each category comprises a set of defect-free

www.mvtec.com

 

MVTecAD ๋ฐ์ดํ„ฐ์…‹์ด๋ž€ ๋”ฅ๋Ÿฌ๋‹์˜ ์ด๋ฏธ์ง€ ์ด์ƒ ํƒ์ง€์— ์ฃผ๋กœ ์“ฐ์ด๋Š”, ๋งˆ์น˜ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜์˜ Cifar-100, COCO ๋ฐ์ดํ„ฐ์…‹๊ณผ ๊ฐ™์€ ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ์…‹์ด๋‹ค

์ฃผ๋กœ ์ œ์กฐ์—… ๊ฒ€์‚ฌ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ด์ƒ ํƒ์ง€ ๋ฐฉ๋ฒ•์„ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์…‹์ด๋ฉฐ, 15๊ฐœ์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๊ฒฐํ•จ ์ข…๋ฅ˜๋ณ„๋กœ ๊ตฌ๋ถ„๋œ 5,000๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค

 

 

 

๊ด€๋ จ๋œ ๋…ผ๋ฌธ์ด ์žˆ๋Š”๋ฐ ํ•ด๋‹น ๊ธ€์€ ๋…ผ๋ฌธ ๋ฆฌ๋ทฐ๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ์…‹์˜ ๊ตฌ์„ฑ์„ ์‚ดํŽด๋ณด๋Š” ๋‚ด์šฉ์ด๋‹ˆ.. ๋Œ€์‹  MVTecAD ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋ชจ๋ธ ๋ฒค์น˜๋งˆํฌ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•œ ๋งํฌ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค

https://paperswithcode.com/sota/anomaly-detection-on-mvtec-ad

 

Papers with Code - MVTec AD Benchmark (Anomaly Detection)

The current state-of-the-art on MVTec AD is GLASS. See a full comparison of 144 papers with code.

paperswithcode.com

 

 

 


 

 

 

2. MVTecAD EDA

๋ฐ์ดํ„ฐ์…‹์„ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ํˆด์€ ์บ๊ธ€ ๋…ธํŠธ๋ถ์ด๋‹ค

์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋„ ์บ๊ธ€์ด ์—…๋กœ๋“œ๋œ MVTec AD๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค

 

์ž‘์„ฑํ•œ ๋…ธํŠธ๋ถ ๋งํฌ๋Š” ์—ฌ๊ธฐ. ์บ๊ธ€ ๋…ธํŠธ๋ถ์—์„œ ๊ฐ€์ ธ์™€์„œ ๋Œ๋ ค๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

https://www.kaggle.com/code/bbonghag/mvtecad-eda-24-06-26

 

MVTecAD_EDA_24.06.26

Explore and run machine learning code with Kaggle Notebooks | Using data from MVTec AD

www.kaggle.com

 

 

 

 

2-1. ๋ฐ์ดํ„ฐ ํŠธ๋ฆฌ ๊ตฌ์กฐ

 

์œ„์—์„œ ์ž ๊น ์†Œ๊ฐœํ–ˆ์ง€๋งŒ MVTecAD ๋ฐ์ดํ„ฐ์…‹์€ 15๊ฐœ์˜ ๊ฐ์ฒด, ๋ฌผ๊ฑด์„ ๋‹ค๋ฃฌ๋‹ค

  • wood : ๋‚˜๋ฌด ์žฅํŒ
  • screw : ์Šคํฌ๋ฅ˜
  • metal_nut : ๋„ˆํŠธ
  • capsule : ์•Œ์•ฝ ์บก์А
  • hazelnut : ํ—ค์ด์ฆ๋„›
  • carpet : ์นดํŽ˜ํŠธ
  • pill : ์ •์ œ ์•Œ์•ฝ
  • grid : ๋ฏธ์„ธ ์ฒ ๋ง
  • zipper : ์ง€ํผ
  • transistor : ํŠธ๋žœ์ง€์Šคํ„ฐ
  • tile : ๋Œ€๋ฆฌ์„ ํƒ€์ผ
  • leather : ๊ฐ€์ฃฝ ์žฌ๋ฃŒ
  • toothbrush : ์นซ์†”
  • bottle : ๋ณ‘
  • cable : ์ผ€์ด๋ธ”

ํ•ด๋‹น ๋ฐ์ดํ„ฐ์…‹์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค

โ”œโ”€bottle
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€broken_large
โ”‚  โ”‚  โ”œโ”€broken_small
โ”‚  โ”‚  โ””โ”€contamination
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€broken_large
โ”‚  โ”‚  โ”œโ”€broken_small
โ”‚  โ”‚  โ”œโ”€contamination
โ”‚  โ”‚  โ””โ”€good
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€cable
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€bent_wire
โ”‚  โ”‚  โ”œโ”€cable_swap
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€cut_inner_insulation
โ”‚  โ”‚  โ”œโ”€cut_outer_insulation
โ”‚  โ”‚  โ”œโ”€missing_cable
โ”‚  โ”‚  โ”œโ”€missing_wire
โ”‚  โ”‚  โ””โ”€poke_insulation
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€bent_wire
โ”‚  โ”‚  โ”œโ”€cable_swap
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€cut_inner_insulation
โ”‚  โ”‚  โ”œโ”€cut_outer_insulation
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€missing_cable
โ”‚  โ”‚  โ”œโ”€missing_wire
โ”‚  โ”‚  โ””โ”€poke_insulation
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good

 

์˜ˆ์‹œ๋กœ bottle, cable 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋งŒ ๊ฐ€์ ธ์™”๋‹ค

15๊ฐœ ๋ผ๋ฒจ ์ค‘ ํ•˜๋‚˜์˜ ๋ผ๋ฒจ๋งˆ๋‹ค ground_truth, test, train 3๊ฐœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค

  • ground_truth : ํŒŒ์†๋ณ„ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€. test์˜ ํŒŒ์† ์ด๋ฏธ์ง€์™€ ๋งค์นญ๋จ (=๋งˆ์Šคํฌ ์ด๋ฏธ์ง€์™€ ๊ฒฐํ•จ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๋Š” ๋™์ผ)
  • test : ์ •์ƒ(good) ์ด๋ฏธ์ง€์™€ ํŒŒ์†๋ณ„ ์ด๋ฏธ์ง€
  • train : ์ •์ƒ(good) ์ด๋ฏธ์ง€

ground_truth์—๋Š” ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์€ ํ‘๋ฐฑ์˜ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๊ฐ€, test์—๋Š” ๊ฒฐํ•จ ๋ฐ ์ •์ƒ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด์žˆ๋‹ค

 

test vs ground_truth

 

 

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ๋ผ๋ฒจ๋งˆ๋‹ค ๊ฒฐํ•จ ์œ ํ˜•๊ณผ ๊ฒฐํ•จ ์ข…๋ฅ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ด๋‹ค

 

bottle์˜ ๊ฒฝ์šฐ broken_large, small, comtamination ์ด๋ผ๋Š” ์ž‘์€ ๊นจ์ง๊ณผ ํฐ ๊นจ์ง, ์˜ค์—ผ 3๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์กด์žฌํ•˜์ง€๋งŒ cable์˜ ๊ฒฝ์šฐ bent_wire, cable_swap, combined ๋“ฑ bottle๊ณผ ๋‹ค๋ฅธ ๊ฒฐํ•จ ์ข…๋ฅ˜๋ฅผ ๊ฐ€์ง„๋‹ค

์ด๋Š” ๋ผ๋ฒจ, ๋ฌผ๊ฑด์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐํ•จ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

 

 

 

 

๋ฐ์ดํ„ฐ์…‹ ์ „์ฒด ํŠธ๋ฆฌ ๊ตฌ์กฐ

๋”๋ณด๊ธฐ

๋ฐ์ดํ„ฐ์…‹ ์ „์ฒด ํŠธ๋ฆฌ ๊ตฌ์กฐ

 

C:\USERS\USERPC\DOWNLOADS\๋ด‰ํ•™\MVTECAD SIDE PROJECT\MVTECAD DATASET
โ”œโ”€bottle
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€broken_large
โ”‚  โ”‚  โ”œโ”€broken_small
โ”‚  โ”‚  โ””โ”€contamination
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€broken_large
โ”‚  โ”‚  โ”œโ”€broken_small
โ”‚  โ”‚  โ”œโ”€contamination
โ”‚  โ”‚  โ””โ”€good
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€cable
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€bent_wire
โ”‚  โ”‚  โ”œโ”€cable_swap
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€cut_inner_insulation
โ”‚  โ”‚  โ”œโ”€cut_outer_insulation
โ”‚  โ”‚  โ”œโ”€missing_cable
โ”‚  โ”‚  โ”œโ”€missing_wire
โ”‚  โ”‚  โ””โ”€poke_insulation
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€bent_wire
โ”‚  โ”‚  โ”œโ”€cable_swap
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€cut_inner_insulation
โ”‚  โ”‚  โ”œโ”€cut_outer_insulation
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€missing_cable
โ”‚  โ”‚  โ”œโ”€missing_wire
โ”‚  โ”‚  โ””โ”€poke_insulation
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€capsule
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€faulty_imprint
โ”‚  โ”‚  โ”œโ”€poke
โ”‚  โ”‚  โ”œโ”€scratch
โ”‚  โ”‚  โ””โ”€squeeze
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€faulty_imprint
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€poke
โ”‚  โ”‚  โ”œโ”€scratch
โ”‚  โ”‚  โ””โ”€squeeze
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€carpet
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ”œโ”€metal_contamination
โ”‚  โ”‚  โ””โ”€thread
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ”œโ”€metal_contamination
โ”‚  โ”‚  โ””โ”€thread
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€grid
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€bent
โ”‚  โ”‚  โ”œโ”€broken
โ”‚  โ”‚  โ”œโ”€glue
โ”‚  โ”‚  โ”œโ”€metal_contamination
โ”‚  โ”‚  โ””โ”€thread
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€bent
โ”‚  โ”‚  โ”œโ”€broken
โ”‚  โ”‚  โ”œโ”€glue
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€metal_contamination
โ”‚  โ”‚  โ””โ”€thread
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€hazelnut
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ””โ”€print
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ””โ”€print
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€leather
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€fold
โ”‚  โ”‚  โ”œโ”€glue
โ”‚  โ”‚  โ””โ”€poke
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€cut
โ”‚  โ”‚  โ”œโ”€fold
โ”‚  โ”‚  โ”œโ”€glue
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ””โ”€poke
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€metal_nut
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€bent
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€flip
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€bent
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€flip
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€pill
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€contamination
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€faulty_imprint
โ”‚  โ”‚  โ”œโ”€pill_type
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€contamination
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€faulty_imprint
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€pill_type
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€screw
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€manipulated_front
โ”‚  โ”‚  โ”œโ”€scratch_head
โ”‚  โ”‚  โ”œโ”€scratch_neck
โ”‚  โ”‚  โ”œโ”€thread_side
โ”‚  โ”‚  โ””โ”€thread_top
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€manipulated_front
โ”‚  โ”‚  โ”œโ”€scratch_head
โ”‚  โ”‚  โ”œโ”€scratch_neck
โ”‚  โ”‚  โ”œโ”€thread_side
โ”‚  โ”‚  โ””โ”€thread_top
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€tile
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€glue_strip
โ”‚  โ”‚  โ”œโ”€gray_stroke
โ”‚  โ”‚  โ”œโ”€oil
โ”‚  โ”‚  โ””โ”€rough
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€crack
โ”‚  โ”‚  โ”œโ”€glue_strip
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€gray_stroke
โ”‚  โ”‚  โ”œโ”€oil
โ”‚  โ”‚  โ””โ”€rough
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€toothbrush
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ””โ”€defective
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€defective
โ”‚  โ”‚  โ””โ”€good
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€transistor
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€bent_lead
โ”‚  โ”‚  โ”œโ”€cut_lead
โ”‚  โ”‚  โ”œโ”€damaged_case
โ”‚  โ”‚  โ””โ”€misplaced
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€bent_lead
โ”‚  โ”‚  โ”œโ”€cut_lead
โ”‚  โ”‚  โ”œโ”€damaged_case
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ””โ”€misplaced
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ”œโ”€wood
โ”‚  โ”œโ”€ground_truth
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ”œโ”€liquid
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ”œโ”€test
โ”‚  โ”‚  โ”œโ”€color
โ”‚  โ”‚  โ”œโ”€combined
โ”‚  โ”‚  โ”œโ”€good
โ”‚  โ”‚  โ”œโ”€hole
โ”‚  โ”‚  โ”œโ”€liquid
โ”‚  โ”‚  โ””โ”€scratch
โ”‚  โ””โ”€train
โ”‚      โ””โ”€good
โ””โ”€zipper
    โ”œโ”€ground_truth
    โ”‚  โ”œโ”€broken_teeth
    โ”‚  โ”œโ”€combined
    โ”‚  โ”œโ”€fabric_border
    โ”‚  โ”œโ”€fabric_interior
    โ”‚  โ”œโ”€rough
    โ”‚  โ”œโ”€split_teeth
    โ”‚  โ””โ”€squeezed_teeth
    โ”œโ”€test
    โ”‚  โ”œโ”€broken_teeth
    โ”‚  โ”œโ”€combined
    โ”‚  โ”œโ”€fabric_border
    โ”‚  โ”œโ”€fabric_interior
    โ”‚  โ”œโ”€good
    โ”‚  โ”œโ”€rough
    โ”‚  โ”œโ”€split_teeth
    โ”‚  โ””โ”€squeezed_teeth
    โ””โ”€train
        โ””โ”€good

 

 

 

 


 

 

2-2. ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

 

 

image_paths = glob('/kaggle/input/mvtec-ad/*/*/*/*')
len(image_paths)
=> 6612

 

์บ๊ธ€์˜ MVTecAD ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์ด 6612์žฅ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค

 

 

ํ•ด๋‹น ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์ด๋ฏธ์ง€๋งŒ ๋‹ด๊ฒจ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๋ผ๋ฒจ๋งˆ๋‹ค ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ช‡ ์žฅ์”ฉ ๋‹ด๊ฒจ์žˆ๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ณ ์ž ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ํ˜•ํƒœ๋กœ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

 

df = pd.DataFrame(columns=['label', 'group', 'state', 'filename', 'path'])

dataframes = []

for p in image_paths:
    info = p.split('/')
    label = info[4]
    group = info[5]
    state = info[6]
    filename = info[-1]
    
#     print(label, group, state, filename)
    
    # ์ž„์‹œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ
    temp_df = pd.DataFrame([{
        'label': label,
        'group': group,
        'state': state,
        'filename': filename,
        'path': p
    }])
    
    # ๋ฆฌ์ŠคํŠธ์— ์ž„์‹œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ถ”๊ฐ€
    dataframes.append(temp_df)

# ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๋ชจ๋“  ์ž„์‹œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ
df = pd.concat(dataframes, ignore_index=True)

df

 

 

 

์œ„์˜ ํŠธ๋ฆฌ๊ตฌ์กฐ๋Œ€๋กœ ๋ผ๋ฒจ๋งˆ๋‹ค ground_truth, train, test์™€ ๊ฒฐํ•จ ์ข…๋ฅ˜๋ณ„๋กœ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ๋ฅผ ๋‹ด์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์…‹์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค

์ด์ œ ์ด ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ผ๋ฒจ๋งˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ฒฐํ•จ๋งˆ๋‹ค ์–ด๋А ์ •๋„์˜ ์ด๋ฏธ์ง€๊ฐ€ ๋ถ„ํฌํ•˜๋Š”์ง€๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค์„œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค

 

 

 


 

 

 

2-3. ๋ผ๋ฒจ๋ณ„ ์ด๋ฏธ์ง€ ๋ถ„ํฌ

 

๋ผ๋ฒจ๋ณ„ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

df[df['group'] != 'ground_truth']['label'].value_counts()

label
hazelnut      501
screw         480
pill          434
carpet        397
zipper        391
cable         374
leather       369
capsule       351
tile          347
grid          342
metal_nut     335
wood          326
transistor    313
bottle        292
toothbrush    102
Name: count, dtype: int64

 

 

ํ—ค์ด์ฆ๋„›์ด 501์žฅ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ๊ณ  ์นซ์†”์ด 102์žฅ์œผ๋กœ ๊ฐ€์žฅ ์ ๋‹ค

ํ‘œ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ๋ˆˆ์— ๋” ์ž˜ ๋“ค์–ด์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค

 

 

(1) ์ „์ฒด ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ๋ถ„ํฌ

# ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ํฌํ•จ. ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹ ํด๋ž˜์Šค๋ณ„ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ๋ถ„ํฌ
plt.figure(figsize=(15,6))
sns.barplot(x=df['label'].value_counts().index,y=df['label'].value_counts().values )

 

 

 

(2) ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ์ œ์™ธ 

ํ•˜์ง€๋งŒ ์œ„์˜ ๊ทธ๋ž˜ํ”„์—๋Š” ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ทธ๋ ค๋ณด๊ฒ ๋‹ค

# ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ์ œ์™ธ. 
plt.figure(figsize=(15,6))
sns.barplot(x=df[df['group'] != 'ground_truth']['label'].value_counts().index, y=df[df['group'] != 'ground_truth']['label'].value_counts().values )

 

 

๊ทธ๋ž˜ํ”„์˜ ์Šค์ผ€์ผ์ด ์ค„์–ด๋“ค์—ˆ๊ณ  ํŠธ๋žœ์ง€์Šคํ„ฐ์™€ ๋ณ‘์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์•˜๋Š”๋ฐ ์ œ์™ธํ•œ ํ›„ ๋ณ‘์˜ ๊ฐœ์ˆ˜๊ฐ€ ์กฐ๊ธˆ ๋” ์ค„์–ด๋“ฌ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๊ฐ€ ๋ฏธ์„ธํ•˜๊ฒŒ ์ฐจ์ด๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

 

(3) ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜ ๋ถ„ํฌ

๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๋งŒ ๊ทธ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

# ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ๋ถ„ํฌ.  
plt.figure(figsize=(15,6))
sns.barplot(x=df[df['group'] == 'ground_truth']['label'].value_counts().index, y=df[df['group'] == 'ground_truth']['label'].value_counts().values )

 

์ด๋ ‡๊ฒŒ ๋ผ๋ฒจ๋ณ„ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜์˜ ๋ถ„ํฌ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค

 

๊ฐœ์ˆ˜๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด๋ฏธ์ง€์˜ ๋Œ€๋ถ€๋ถ„์€ ์ •์ƒ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฉฐ ๊ฒฐํ•จ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋“ค์ด ์ ์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

๋งˆ์Šคํฌ ์ด๋ฏธ์ง€์™€ ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€๊ณผ 1๋Œ€1๋กœ ๋งค์นญ๋˜๊ณ  ์œ„์˜ ๊ทธ๋ž˜ํ”„๋Š” ๋ผ๋ฒจ๋ณ„ ๋ชจ๋“  ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ž„์„ ์ƒ๊ฐํ•˜๋ฉด ๊ฒฐํ•จ ์œ ํ˜•๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋“ค์ด ๋งค์šฐ ์ ๊ฒŒ ๋ถ„ํฌํ•ด์žˆ์Œ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค

 

๊ทธ๋Ÿผ ๊ฐ๊ฐ ๋ผ๋ฒจ์˜ ๊ฒฐํ•จ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ถ„ํฌํ•ด์žˆ๋Š”์ง€ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด๋ณด๊ฒ ๋‹ค

 

 

 

 

 

 


 

 

 

 

2-4. ๋ผ๋ฒจ์˜ ๊ฒฐํ•จ๋ณ„ ์ด๋ฏธ์ง€ ๋ถ„ํฌ

 

15๊ฐœ์˜ ๋ผ๋ฒจ ๊ฒฐํ•จ ์ด๋ฏธ์ง€ ๋ถ„ํฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํ•œ๋ฒˆ์— ์ถœ๋ ฅํ•œ๋‹ค. (15๊ฐœ์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ญ‰ ์žˆ์œผ๋ฏ€๋กœ ์Šค์••์ฃผ์˜)

๊ฐ ๋ผ๋ฒจ์˜ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๋ถ„๋ฆฌ ํ›„ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋“ค์€ ์ œ์™ธํ•˜๊ณ  train, test ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฒฐํ•จ๋ณ„ ์ด๋ฏธ์ง€ ๋ถ„ํฌ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฐ๋‹ค

๋งˆ์Šคํฌ ์ด๋ฏธ์ง€์™€ ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋Š” 1๋Œ€1 ๋งค์นญ๋˜๊ธฐ ๋•Œ๋ฌธ์— ground_truth ๋Œ€์‹  test๋ฅผ ๋„ฃ์–ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค

 

for label in df['label'].unique():
    temp_df = df[df['label'] == label].copy()
    
    plt.figure(figsize=(14,4))
    barplot = sns.barplot(x=temp_df[temp_df['group'] != 'ground_truth']['state'].value_counts().index, y=temp_df[temp_df['group'] != 'ground_truth']['state'].value_counts().values )
    plt.title(f'{label}_image count')
    for p in barplot.patches:
        height = p.get_height()
        barplot.text(x=p.get_x() + p.get_width() / 2, 
                 y=height + 0.05, 
                 s=f'{int(height)}', 
                 ha='center', size=12)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๊ทธ๋ž˜ํ”„๋“ค์ด ๋งŽ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ผ๋ฒจ๋ณ„๋กœ ์ •์ƒ, ๊ฒฐํ•จ ์ข…๋ฅ˜๋ณ„ ์ด๋ฏธ์ง€ ๋ถ„ํฌ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋“ค์ด ๋งค์šฐ ์ ์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋Ÿผ ๋‹ค์Œ์—๋Š” ์‹ค์ œ ๊ฒฐํ•จ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ๋‹ค

 

 

 

 


 

 

 

2-5. ๊ฐ ๋ผ๋ฒจ ๊ฒฐํ•จ ์œ ํ˜• ์‚ดํŽด๋ณด๊ธฐ

 

์ด๋ฒˆ์—๋Š” ๋ผ๋ฒจ๋งˆ๋‹ค ๋ชจ๋“  ๊ฒฐํ•จ ์œ ํ˜•์„ ํ•œ๋ฒˆ์— ํ‘œ์‹œํ•˜์—ฌ ์‚ดํŽด๋ณด๊ฒ ๋‹ค

 

no_mask_df = df[df['group'] != 'ground_truth'] # ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€ ์ œ์™ธ

for current_class in no_mask_df['label'].unique():
    tmp = no_mask_df.loc[no_mask_df['label'] == current_class]
    states = no_mask_df.loc[no_mask_df['label'] == current_class, 'state'].unique()

    fig, axs = plt.subplots(1, len(states), figsize=(20, 8))
    
    for col_idx, state in enumerate(states):
        img_dir = tmp.loc[tmp['state'] == state, 'path'].sample(1).iloc[0]
        img = cv2.imread(img_dir)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        axs[col_idx].imshow(img)
        axs[col_idx].set_xticks([])  # x์ถ• ๋ˆˆ๊ธˆ ์ œ๊ฑฐ
        axs[col_idx].set_yticks([])  # y์ถ• ๋ˆˆ๊ธˆ ์ œ๊ฑฐ

    for ax, col in zip(axs, states):
        ax.set_title(col, size=15)

    axs[0].set_ylabel(current_class, rotation=0, fontsize=15, labelpad=40, fontdict=dict(weight='bold'))

    fig.tight_layout()
    plt.show()
    print('\n\n')

 

 

wood

 

 

 

screw

 

 

metal_nut

 

 

capsule

 

 

hazelnut

 

 

 

carpet

 

 

pill

 

 

grid

 

 

zipper

 

 

transistor

 

 

tile

 

 

 

 

leather

 

 

 

toothbrush

 

 

 

bootle

 

 

 

 

cable

 

 

 

 


 

 

3. ์ •๋ฆฌ

 

 

์ง€๊ธˆ๊นŒ์ง€ ์ด์ƒ ํƒ์ง€์—์„œ ์‚ฌ์šฉ๋˜๋Š” MVTecAD ๋ฐ์ดํ„ฐ์…‹์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค

 

์ด๋ฏธ์ง€ ์ด์ƒ ํƒ์ง€๋ผ๋Š” ํƒœ์Šคํฌ๋Š” ์ œ์กฐ์—…, ๋จธ์‹ ๋น„์ „ ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ๊ฒ€์‚ฌ ๋“ฑ์˜ ๊ณต์ •์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ์ด๋Ÿฐ ๋„๋ฉ”์ธ์˜ ํŠน์ง•์€ ๊ฒฐํ•จ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทน๋„๋กœ ์ ๋‹ค๋Š” ์ ์ด๋‹ค

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ์ง€๋„ ํ•™์Šต์œผ๋กœ๋Š” ์ œ๋Œ€๋กœ๋œ ์„ฑ๋Šฅ์ด ๋‚˜์˜ฌ ๋งŒํผ์˜ ๊ฒฐํ•จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•๋ณดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค

๋งŒ์•ฝ ๊ฒฐํ•จ๊ณผ ๋งˆ์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด Segmentation ์œผ๋กœ ํ•™์Šต์„ ํ•œ๋‹ค๋ฉด ๋ช‡ ์‹ญ์žฅ์—์„œ ๋งŽ์•„์•ผ ๋ช‡ ๋ฐฑ์žฅ ๋ฐ–์— ์•ˆ๋˜๋Š” ๊ฒฐํ•จ ๋ฐ์ดํ„ฐ๋กœ ์‹ค์ œ ๊ณต์ •์— ์ ์šฉํ•  ๋งŒํผ์˜ ์„ฑ๋Šฅ์ด ๋‚˜์˜ค๊ธฐ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค

 

๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€ ์ด์ƒ ํƒ์ง€๋Š” ์ •์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์— ํ•™์Šต์‹œํ‚ค๊ณ  ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋ธ์— ๋„ฃ์–ด ๊ฒฐํ•จ์„ ํƒ์ง€ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋ชจ๋ธ์—๋Š” EfficientAD, PatchCore ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค

์ด์ƒ ํƒ์ง€์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” Anomalib ๋ผ๋Š” OpenVINO Toolkit์—์„œ ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์œ„์˜ ๋ชจ๋ธ๋“ค๋„ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค

 

๊ทธ๋Ÿผ ์™œ ์ด์ƒ ํƒ์ง€๋ฅผ ๋‹ค๋ฃจ๋ ค๋ฉด MVTecAD ๋ฐ์ดํ„ฐ์…‹์„ ์‚ดํŽด๋ณด๋Š”๊ฒŒ ์ข‹์„๊นŒ?

๋ฐ์ดํ„ฐ์…‹์„ ํ†ตํ•ด ์ด์ƒ ํƒ์ง€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ธ์‚ฌ์ดํŠธ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

์–ด๋–ค ํ˜•ํƒœ์˜ ๊ฒฐํ•จ์ด ์กด์žฌํ•˜๋Š”์ง€ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•๋ณดํ• ์ˆ˜๋ก ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ๊ฒฐํ•จ ์ด๋ฏธ์ง€๋Š” ํ•จ๋ถ€๋กœ ์ฆ๊ฐ•์„ ํ•ด์„  ์•ˆ๋œ๋‹ค

๋„ˆํŠธ๋‚˜ ํŠธ๋žœ์ง€์Šคํ„ฐ ์ฒ˜๋Ÿผ ์œ„์น˜ ๋˜๋Š” ๋ฐฉํ–ฅ์ด ์ •ํ•ด์ ธ์žˆ๊ธฐ๋„ ํ•˜๊ณ  ๋ณ€์ƒ‰, ์˜ค์—ผ ๋“ฑ ์ฃผ๋ณ€๊ณผ์˜ ์ƒ‰์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค

MVTecAD์˜ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ๋ณธ ๋ฌผํ’ˆ๋“ค์ด๊ณ  ๊ฒฐํ•จ๋“ค๋„ ์ง๊ด€์ ์ด์ง€๋งŒ ์‹ค์ œ ์ œ์กฐ์—…์—์„œ ๊ฐ๊ฐ์˜ ์ƒ์‚ฐํ’ˆ์ด ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ฒฐํ•จ์ด ์ฃผ๋กœ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋“ฑ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค