본문 바로가기

Data-science/deep learning

배경 차이가 뚜렷한 이미지에서, cv2.connectedComponetsWithStats 활용하여 객체 분리하고 자르기 + efficientDet

728x90
image = cv2.imread('C:\\Users\\SGSDEV\\detection\\original\\6666.jpeg')
img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, src = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY_INV)
cnt, labels, stats, centroids = cv2.connectedComponentsWithStats(src)
dst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
imgs = []
for i in range(1, cnt): # 각각의 객체 정보에 들어가기 위해 반복문. 범위를 1부터 시작한 이유는 배경을 제외
    (x, y, w, h, area) = stats[i]
#     print(x, y, w, h, area)
    # 노이즈 제거
    if area < 50000:
        continue
    imgs.append(image[y:y+h,x:x+w]) 
    dst = cv2.rectangle(dst, (x, y, w, h), (255, 0, 0), thickness=5)
dst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
imgs = []
for i in range(1, cnt): # 각각의 객체 정보에 들어가기 위해 반복문. 범위를 1부터 시작한 이유는 배경을 제외
    (x, y, w, h, area) = stats[i]

    # 노이즈 제거
    if area < 50000:
        continue
    imgs.append(image[y:y+h,x:x+w]) 
    dst = cv2.rectangle(dst, (x, y, w, h), (255, 0, 0), thickness=5)

패딩한 후 이미지 저장 (cv2.copyMakeBorder 를 이용한다)

https://jacegem.github.io/blog/2018/OpenCV-Python-Tutorials-07-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8-%EC%9E%91%EC%97%85/

 

[OpenCV-Python Tutorials 07] 이미지에 대한 기본 작업

[OpenCV-Python Tutorials 07] 이미지에 대한 기본 작업 모든 파일은 Github에서 확인 할 수 있습니다. 목표 배울 내용: 픽셀 값에 액세스 및 수정 이미지 속성에 액세스 이미지 영역 설정 (ROI: Region of Image)

jacegem.github.io

for idx, img in enumerate(imgs):
    if img.shape[0] > 0 and img.shape[1] > 0:
        img = cv2.copyMakeBorder(img, 500, 500, 500, 500, cv2.BORDER_CONSTANT, value=[230, 230, 230])
        cv2.imwrite(f'{idx}_.png', img)

각각 잘라서 저장하는 것도 좋은데, 과정을 시각화를 해본다.

이미지 사이즈가 커서 figsize를 크게 주었다.

plt.figure(figsize=(30,45))
plt.subplot(3, 1, 1)
plt.imshow(image,'gray')
plt.xticks([])
plt.yticks([])

plt.subplot(3, 1, 2)
plt.imshow(src, 'gray')
plt.xticks([])
plt.yticks([])

plt.subplot(3, 1, 3)
plt.imshow(dst)
plt.xticks([])
plt.yticks([])
plt.show()

결과는

정확히 객체 부분만 잘라준다.

 

## 패딩을 한 이유는 딥러닝에서 객체를 분류하기 위해서이다. 객체만 확대해서 본 걸 학습하지 않아 모델에겐 어려울 수 있다. 그래서 학습 데이터와 최대한 유사한 데이터를 제공해준다.

 

딥러닝 디텍션 결과

모델을 앞선 포스트에서 말했던 것처럼 efficientDet을 이용하였다.

결과는 만족스럽다. 분류를 잘 해낸다. 훌륭하다~~~