2020-iuc-sw-skku / LSC-Systems

산학협력프로젝트: 머신러닝 기반 Wafer Map Defect Pattern Identification
8 stars 3 forks source link

Wafer Map Similarity Ranking #24

Open HyeonjinChoi opened 4 years ago

HyeonjinChoi commented 4 years ago

WMSR은 주어진 웨이퍼 맵과 유사한 웨이퍼 맵을 검색하는데 사용됨. 유사한 결함 패턴을 가지면 동일한 결함 원인을 갖는 경향이 있어서 근본 원인을 식별하는데 도움이 됨.

• 1 단계 : 추출된 특징의 유클리드 거리를 기반으로 상위 n개의 웨이퍼 맵을 검색 • 2 단계 : 1위 후보에서 상위 n개 후보 순위 결정 2D 정규화 된 상관계수(즉, 이미지 처리 분야에서 템플릿 매칭으로 알려짐)에 기초

image

(25)에서의 유사성 점수가 모든 후보 웨이퍼 맵에 대해 계산 된 후, 유사성 점수는 내림차순으로 정렬되어 유사성 순위 획득.

HyeonjinChoi commented 4 years ago
import os
import numpy as np
import pandas as pd
import math
import cv2
from setup import PATH, CONFIG

def similarity(y, x, type):
    # 웨이퍼맵의 평균 크기는 40x40 => 정규화시 40x40에 맞춰서 보간법 진행
    resize = lambda x: cv2.resize(x, dsize=(40, 40), interpolation=cv2.INTER_AREA)
    x = resize(x)
    y = resize(y)

    # similarity 계산
    mean = lambda x: x.sum() / x.size
    queried = x[:, :] - mean(x)
    candidate = y[:, :] - mean(y)
    score = ((queried * candidate).sum()) / math.sqrt(
        (queried ** 2).sum() * (candidate ** 2).sum()
    )

    x[x == 1] = 0
    y[y == 1] = 0

    queried = x[:, :] - mean(x)
    candidate = y[:, :] - mean(y)
    score_2 = ((queried * candidate).sum()) / math.sqrt(
        (queried ** 2).sum() * (candidate ** 2).sum()
    )

    global count
    count += 1

    # 유사도, 검색한 웨이퍼맵 결함패턴, 검색한 웨이퍼맵 인덱스 반환
    return (((score * 0.5) + (score_2 * 0.5)) * 100), type[count], count

def wm_index(x, y):
    # 입력받은 결함패턴의 대표 웨이퍼맵 찾기
    for i in range(len(y["wafer_map"])):
        if y["failure_type"].to_numpy()[i] == x:
            return i

if __name__ == "__main__":

    PATH_DATA = os.path.join(PATH, CONFIG["PATH"]["PATH_DATA"])
    PATH_FEATURE = os.path.join(PATH, CONFIG["PATH"]["PATH_FEATURE"])

    # denoising(spatial)처리후 진행, denoising후 반환시 .astype(np.float32) 적용
    data = pd.read_pickle(os.path.join(PATH_DATA, "sample_denoised.pkl"))

    # 검색하고싶은 결함패턴 입력
    defect_pattern = input(
        "1.Center  2.Donut  3.Edge-Loc  4.Edge-Ring  5.Loc  6.Near-full  7.Random  8.Scratch\n=> What defect pattern ? : "
    )
    count = -1

    # 유사도 구하기
    similarity_ranking = data["wafer_map"].apply(
        similarity,
        x=data["wafer_map"].to_numpy()[wm_index(defect_pattern, data)],
        type=data["failure_type"].to_numpy(),
    )

    # 정확순으로 정렬후 출력
    print(similarity_ranking.sort_values(ascending=False))
HyeonjinChoi commented 4 years ago

Denoising(spatial) 처리 후 진행

1) Center image

2) Donut image

3) Edge-Loc image

4) Edge-Ring image

5) Loc image

6) Near-full image

7) Random image

8) Scratch image