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์๋ ๊ฒฐํจ ๋ฐ ์ ์ ์ด๋ฏธ์ง๊ฐ ๋ค์ด์๋ค
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ๋ผ๋ฒจ๋ง๋ค ๊ฒฐํจ ์ ํ๊ณผ ๊ฒฐํจ ์ข ๋ฅ์ ๊ฐ์๊ฐ ๊ฐ๊ฐ ๋ค๋ฅด๋ค๋ ์ ์ด๋ค
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์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ๋ณธ ๋ฌผํ๋ค์ด๊ณ ๊ฒฐํจ๋ค๋ ์ง๊ด์ ์ด์ง๋ง ์ค์ ์ ์กฐ์ ์์ ๊ฐ๊ฐ์ ์์ฐํ์ด ์ด๋ค ํน์ง์ ๊ฐ์ง๊ณ ์๋์ง, ์ด๋ค ๊ฒฐํจ์ด ์ฃผ๋ก ๋ฐ์ํ๋์ง ๋ฑ ๋๋ฉ์ธ์ ๋ํ ๊น์ ์ดํด๋ฅผ ํ์๋ก ํ๋ค
'์ด๋ฏธ์ง ๋ฐ ์์ ์ฒ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด๋ฏธ์ง ์ด์ ํ์ง _ ๊ฐ๋จํ๊ฒ ๊ธฐํํด๋ณด๊ธฐ (0) | 2025.03.14 |
---|---|
OpenCV๋ฅผ ์ด์ฉํ ์ฐ๊ธฐ ๋ฐ ๋ถ๊ฝ ํ์ง (0) | 2024.02.17 |