본문 바로가기
공부공부/2023 쌓여가는 나의 지식~

파이썬 Pyqt를 이용한 세그멘테이션 라벨링툴(1)(다각형 그리기 / python)

by Lee_story_.. 2023. 9. 7.
728x90

일반적인 바운딩 박스로 라벨링을 진행하다가

세그멘테이션 기법을 이용하여 러닝 하는것이 훨씬 정확성을 보장할 것으로 생각되어

 

정리/공부/구현 해 보았습니다!

 

 

구현부는 천천히 진행해갈 예정입니다!

 

여러가지 이미지 데이터 라벨링에 대한 방법들은 아래 블로그에서 확인!

 

데이터라벨링(Data labeling)의 객체검출(object detection) 방법 용어정리/데이터 어노테이션 기법

안녕하세요. 달토깽이 입니다. 데이터라벨링이라는 것이 참 생소하고 그렇죠. 저도 처음 접할때는 생경했지요. 디지털노가다 인형에 눈알붙이기 등등 라벨링은 별명도 많습니다. 아무리 어떤

romance-dal315.tistory.com

 

 

 

세그멘테이션?  >> 폴리곤 >> 모양이 일정하지 않은 다각형으로 처리!

전체를 나누어 처리한다는 의미로 

 

딥러닝을 위한 라벨링에서는

단순한 사각,원형 틀이 아닌 정확한 모양대로 그려 라벨링 하는 방법입니다.

 

대표적인 라벨링 툴로는 

LabelMe가 있습니다!

 

 

 

 

GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag

Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). - GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, recta...

github.com

 

 

 

 

 

위 처럼 사진에서 특정 객체를 나누어 라벨링 하는것을 세그멘테이션 라벨링이라고 합니다!

 

일반적인 사각 바인딩 보다는 훨씬 정확한 객체 그 자체를 학습 할 수 있다는 장점이 있습니다.

하지만 그만큼 데이터 처리/학습에서 복잡한 과정을 거치게 됩니다!

 

 

그렇기에 이미지 라벨링을 하기전에 어떤 방법이 더 효과적일지 고려하여 선택하여야 합니다!

 

 

 

 

 

 

 

이제 구현을 할 차례!

 

아직 모든 부분에 대해서 기획/ 정리를 하지 않아 

간단한 부분부터 차근차근 처리해보도록 하겠습니다.

 

 

먼저 pyqt를 이용하여

점을 기준으로 변을 생성할수 있도록!

그리고 끝점을 만나면 다각형이 만들어 지도록 하는것 까지 구성해 보겠습니다.

 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt, QPoint

import math

class MyWindow(QMainWindow):   
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 500, 500)
        self.setWindowTitle("Click and Draw")
        self.points = []
        self.last_clicked_point = None


        self.setMouseTracking(True)  ## 마우스 추적해야함..



    def paintEvent(self, event):  ## 캔버스에 그려질때 실행됨!
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        pen = QPen(Qt.black, 5)
        painter.setPen(pen)
        
        if len(self.points) > 1:  ## 
            for i in range(len(self.points)-1):
                painter.drawLine(self.points[i], self.points[i+1])

        for point in self.points:
            painter.drawPoint(point)

        if self.last_clicked_point is not None:
            painter.drawLine(self.last_clicked_point, self.mapFromGlobal(self.cursor().pos()))



    def mousePressEvent(self, event):## 마우스를 눌렀을때
        if event.button() == Qt.LeftButton:
            
            point = event.pos() 

            self.points.append(point)## 새로운 지점 생성!
            self.last_clicked_point = point
            self.update()

            if(len(self.points)==1):
                return
            
            distance = math.sqrt(math.pow(self.points[0].x() - self.points[-1].x(), 2) + math.pow(self.points[0].y() - self.points[-1].y(), 2))
            
            print(distance)

            if distance<=15:## 첫번째 지점을 클릭시에 다각형 완성!>>>>>>> 
                self.points[1]=self.points[0]  
                self.points.clear() 
                self.last_clicked_point=None
                


    def mouseMoveEvent(self, event):## 마우스 이동시에 계속해서 업데이트
        self.update()



if __name__ == "__main__":## 실행부
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

 

 

 

간단하게 검은 펜으로 클릭시에 지점이 생기고 다음 지점을 이어주는 형식으로 다각형 그리기를 만들어 보았습니다.

 

 

 

 

결과는 아래처럼 잘 구성되는것 같습니다!

 

 

 

 

 

 

 

끝!

 

 

라벨링 툴을 제작함에 있어 불확실한 부분이 있기에 천천히 진행하도록 하겠습니다

 

다음글로 돌아오겠습니다!

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글