딥러닝

제조업 이미지도 CutOut 오그먼테이션이 가능하다고~?

제갈티 2024. 9. 25. 11:02

랜덤 컷아웃 오그먼테이션 예시-1, 이 경우엔 더이상 레나 클래스가 아닙니다.

 

랜덤 컷아웃 오그먼테이션 예시-2. 이 경우엔 가려져도 여전히 레나 클래스 입니다.

 

랜덤 컷아웃 오그먼테이션 예시-3. 이 경우엔 가려져도 여전히 레나 클래스 입니다.
랜덤 컷아웃 오그먼테이션 예시-4. 이 경우엔 가려져도 여전히 레나 클래스 입니다.

 

- 학습타임 오그먼테이션으로 유명한 Albumentation 패키지로 CutOut 한 이미지결과를 실시간에 애니메이션으로 표시하고 분석하는 코드입니다.

- 컷아웃(잘라내기) 오그먼테이션은 모델의 일반화 성능 향상에 매우 효과적이어서 서비스업 데이터에 대한 이미지분류망이나 ObejctDetction 딥신경망에도 많이 쓰입니다. 클래스 범주가 무너지기 직전까지 이미지속 물체의 일부를 잘라내어 딥신경망을 강하게 키우려는 단련법인 셈이죠. 

- 인고지능 분야에사 데이타 오그먼테이션의 철학은 "나를 죽이지 못할수록, 나는 더 강해질 뿐이다." 이란 유명한 말로 정리가 되죠.

- 하지만 제조업 결함검출 이미지 에서는 사용이 위험하죠. 왜냐하면 저 그림처럼 레나얼굴은 부분이 가려져도 여전히 레나이지만, 작은 결함들은 가려지는 순간 클래스 범주가 달라져 버리기 때문입니다. 

작은 결함이 포함된 제조업 이미지 데이타

- 따라서 제조업에선 컷아웃 오그먼테이션을 변형하여 사용하여야 합니다. 제가 냈던 특허도 그중 하나의 기술이었는데요..

- Object Detection용으로 결함 영역이 라벨링(바운딩 박스로)된 데이타셋은 결함의 위치 정보를 알 수가 있으므로, 학습타임에 그 결함 영역을 검정박스가 가리게 될 경우에 그 이미지는 버려버리고 다음 컷아웃 이미지로 넘어가도록 하여 결함물체 가려짐에 의한 학습 클래스 왜곡을 자동으로 피해 가는 특허였습니다.

 - Object Detection 은 그렇게 찾고자 하는 결함 같은 물체의 위치정보를 알기 때문에 Cutout 오그먼테이션이 가능한데, image classification 은 위치정보를 몰라 컷아웃 Aug. 가 불가능하지요... 하지만 거기에도 방법은 있습니다. 바로... SRSM 같은 수학적 영상처리로 물체 후보영역을 찾아서 회피해 가는 방식으로 컷아웃 Aug. 를 하는 방법이 있습니다~!   

 

import cv2
import tkinter as tk
from PIL import Image, ImageTk
from albumentations import CoarseDropout

# Load the Lena image
image = cv2.imread("/Users/irix/Lenna.png")

- 필요한 패키지와 이미지를 로딩합니다.

def update_image(event):
    global image
    x, y = event.x, event.y
    
    # Scale the parameters based on mouse position
    #alpha = x * 0.1  # scale as needed
    #sigma = y * 0.1  # scale as needed
    
    # Apply Transform
    transform = CoarseDropout(max_holes=5, max_height=x, max_width=y, p=1)
    cutout_transformed = transform(image=image)
    
    # Convert color space from BGR to RGB
    transformed_image = cv2.cvtColor(cutout_transformed['image'], cv2.COLOR_BGR2RGB)
    
    # Convert the image format for tkinter
    im = Image.fromarray(transformed_image)
    img = ImageTk.PhotoImage(im)
    
    # Update the tkinter label with the transformed image
    img_label.img = img
    img_label.config(image=img)

- 이미지 업데이트 함수를 정의합니다. 마우스의 위치로 컷아웃 박스의 크기와 높이를 실시간에 변경하도록 합니다.

root = tk.Tk()

# Convert color space from BGR to RGB for initial image display
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
im = Image.fromarray(image_rgb)
img = ImageTk.PhotoImage(im)

# Create a tkinter label to display the image
img_label = tk.Label(root, image=img)
img_label.pack()

# Bind the mouse motion event to the image update function
root.bind("<Motion>", update_image)

root.mainloop()

- 메인 GUI를 작성하고 마우스 이벤트 핸들러를 연결합니다.

정리하면 다음과 같이 요약할 수 있겠습니다:

  1. CutOut 오그먼테이션은 일반적으로 효과적인 데이터 증강 기법입니다.
  2. 하지만 제조업에서는 문제가 있었습니다. 왜냐하면:
    • 큰 물체(예: 얼굴)는 일부가 가려져도 여전히 같은 클래스로 인식됩니다.
    • 작은 결함(디펙)은 가려지면 클래스가 완전히 달라질 수 있습니다.
  3. 이 특허는 이 문제를 해결하기 위해:
    • Object Detection 시 라벨링된 결함 영역이 가려지는 경우는 해당 이미지를 사용하지 않습니다.
    • 대신 배경만 가려지도록 CutOut을 적용합니다.

이 방법을 통해 제조업에서도 CutOut의 이점을 활용하면서 작은 결함의 특성을 보존할 수 있게 되었습니다. 이는 특히 품질 관리나 결함 검출과 같은 분야에서 유용할 것 같습니다.