전통 Computer vision 활용 객체 구분

류창훈·2025년 4월 10일
1

CV (Computer Vision)

목록 보기
17/17

오랜만의 포스팅입니다.


그간 회사 이력서 쓰고 계속 이력서 밀어넣고 면접보고 하느라 정신이 없었습니다.

지금도 정신 없습니다.


얼마전 과제 형식의 회사 입사 테스트를 치게 되었는데,
그때 제가 진행한 내용 좀 적어보려 합니다.

최종 결과는... ㅎㅎ

그쪽 회사에서 부여받은 데이터이기 때문에 따로 이미지 데이터를 보이거나 하지는 않겠습니다.

뭐 암튼, 쭉 가봅시다.




- 데이터 설명 및 접근


데이터는 어떤 공장 물품 같은데,
불량품, 정상품 둘다 섞여 있는 이미지 데이터입니다.


따로 어떤 레이블이 존재하지 않아서 임의로 구분을 해야 하고,
쭉 확대해서 육안으로 보면,
잘못된 부분이 어느정도 구분 가능할 정도인 데이터 집합입니다.

그리고 컬러가 따로 존재하지는 않고, 흑백으로 구성되어 있습니다.


하지만 여기서 불량품의 결측 부위가 확대해서 봐야 어느정도 보이는 건데,
기존 모델 가져다 쓰거나 전이 학습하거나 그럴 수는 없고,

픽셀 단위로 접근해서 지지고 볶고 정말 잘 해야
확대 안하고 어느정도 보이는 정도 입니다.

그래서 여기서의 관건은,
어떻게든 옛날 방식으로 결측 부위 극대화노이즈 감소 입니다.




- 1차 처리



특정 이미지 HSV 컬러 스페이스로 변환 하고, 각 채널 히스토그램 시각화 한 것 입니다.

흑백 이미지여서 H(색상), S(채도) 값은 0에 분포되어 있는 것을 확인할 수 있습니다.


애초에 흑백 이미지는 밝기 정보만 갖고 있어서 따로 컬러 스페이스를 변환하지 않아도 되나,

작업 후, 문서 작업 막바지에 이걸 알아차렸었습니다.


그땐, 뭐.. 이미 제출 기한 임박해서 뭐 어쩌겠습니까 ㅎㅎ

처음부터 되돌리기에는 시간이 너무 없었고,


대충 문서에만 자알 이러쿵 저러쿵 적어서 제출했습니다 ㅎㅎ


뭐 암튼 이거 근거해서 쭉 봐 봅시다.

V(밝기) 값의 분포를 봐보면, 25 부분에 쭉 증폭되는 형태고, 80 ~ 100 부분에도 살짝 증폭되는 구간이 보입니다.

원본 이미지셋을 보면, 검은색 배경에 회색 객체 몇개 분포되어 있는 형태인데,
검은색 배경이 거의 대부분을 차지하기 때문에, 0에서 아주 크게 증폭되는 형태,
회색 객체 부분 때문에 80 ~ 100 부분에서 또 한번 증폭되는 형태입니다.


이 물체 안의 결함 부분은 배경(검은색)보다는 밝고, 물체(회색) 보다는 어두운 형태입니다.


관건은 결함 부위이고,
이걸 고려해서 V 채널을 60~80으로 제한했습니다.



이렇게 하고 나니, 결함 부분이 좀 끊겨져 나오는 경우가 있었고,
아직 좀 부족합니다.

그래서 두번째 과정으로, CLAHE를 적용했습니다.
clipLimit 값은 3.0, 그리고 결함 부분을 고려해서 블록 사이즈는 8 by 8로 지정하여 어두운 영역을 강조되게끔 하였습니다.

그 후에 감마 보정을 통해 잘못 감지되는 밝은 부분을 억제하고,
전체적으로 좀 대비를 조정했습니다.


여기서 끊어진 부분 연결 해보겠다고 모폴로지 연산 이것저것 다 적용했었는데,
워낙 미세하기도 하고 노이즈도 많이 껴있어서 그런가..
잘 안 나왔었습니다.

그래서 그냥 모폴로지 연산은 뺐습니다.


마지막으로 시각화 위해서 흑백 반전을 했는데, 이건 뭐,
사람한테 보기 좋으라고 한거니 넘어가겠습니다.




- 2차 처리



지금까지 어느정도 노이즈도 잡았고, 결측 부위도 최대한 극대화 했습니다.

그럼 이제는 어떻게 어떤 기준으로 불량품으로 처리할 것인가 구현을 해야합니다.


위 그래프는 1차 처리 과정 거치고 나서의 히스토그램 분포 입니다.


흑백 반전을 했기 때문에 250값에 증폭되는 형태를 띄고,

X축 120~160 부분을 보면, 아주 미세하게 빈도가 올라가는 것을 확인할 수 있습니다.

Y축 값이 100000 넘어서 까지 있어서 그렇지 그래도 꽤 큰 값이다.

그래서 thresh_dark 임계값은 140으로, 이 이하의 값은 dark, 그리고 이렇게 dark로 구분된 픽셀 비율이 객체 픽셀 기준 10% 이상이면 불량(Bad)로 판단하도록 설정했습니다.



추가로 마스킹 데이터셋 같이 부여받아서,
객체 위치는 이 데이터셋으로 특정하게끔 유도 했습니다.

그래서 객체 픽셀 비율 판단 기능 까지 같이 넣었습니다.




- 마무리


짧게 부여받은 시간동안 이거 수행하면서
밤낮 없이 계속 실험하고,
그냥 제가 알고 있는 모든 걸 다 털어넣었던 것 같습니다.


이건 그래도 나름 최종까지 갔어서 좀 될줄 알고 기대 많이 했었는데


클릭하면 이동

참 아쉽게 된거죠? ㅎㅎ


그냥 제가 알고 있는 모든걸 이미 다 실험했어서 그런지
따로 뭐 이걸 더 해볼 껄 그랬나 하면서
후회가 되지는 않습니다.

실력자 분들.. 적용해볼 만한 좋은 방식 있음 알려주세요

요샌 그냥 좀 실무쪽으로 배우고 싶어서
조건 상관없이 그냥 취업 좀 하고 싶은데...


그래도 오랜만에 딴거 하나도 생각 안들고 한곳에 몰두 할 수 있었던 시간이라
그 자체로 좋은 경험이었던 것 같습니다.



취준생 분들 같이 파이팅입니다.







감사합니당 ~ 🦾

profile
Vision AI Researcher

0개의 댓글