YOLO 객체 감지 후 위험 영역 판단 로직 개선기

2025. 6. 10. 20:00·개발 일상

회사에서 개발 중인 AI 기반 안전 설비 시스템의 백엔드(python) 로직을 개선했다.
카메라 영상에서 사람을 감지하고 사람이 설정한 위험 구역에 진입했는지를 판단해서 실시간으로 설비를 제어하는 시스템이다.

기존 방식 이슈

YOLO를 통해 사람을 감지하면 [x1, y1, x2, y2] 형태의 bbox 좌표가 얻어진다.
이 좌표를 기반으로 DB에 저장된(설정한) ROI(위험 구역) 다각형과의 겹침 여부를 판단하는데
기존의 코드를 분석하니 기존에는 bbox의 하단선(bottom)만 사용하는 방식이였고, 현장에서 개선사항이 발생해 판단 로직을 수정하게 되었다.

bbox_matrix = LineString([(x1, y2), (x2, y2)])

위와 같은 경우 객체의 하단면이 위험 구역에 닿지 않으면 위험으로 판정되지 않는다.
하지만 실제 현장에서는 사람이 상체만 들어와도 충분히 위험할 수 있다.

  • 예: 사람이 몸을 기울인 상태로 팔만 들어간 경우, 로봇 설비와 충돌할 수 있음.

참고: 겹침 판단 방식

여기서 객체의 좌표와 위험 구역의 좌표가 "겹쳤다"는 걸 판단하는 방법은 여러 가지가 있다.
shapely 라이브러리는 다음과 같은 겹침 메서드를 제공한다.

메서드 설명
intersects() 두 객체가 조금이라도 겹치면 True
contains() A가 B를 완전히 포함해야 True
within() A가 B의 내부에 완전히 포함되어야 True
touches() 겹치지 않고 경계선만 접촉하면 True
overlaps() 일부 겹침일 때 True (완전 포함은 제외)
intersection().area 겹치는 면적을 수치로 계산

이 중 intersects()를 하여 사람(객체)의 bbox가 ROI(위험 영역 좌표)와 조금이라도 겹치면 즉시 위험으로 판단하는 방식의 메서드를 사용 중이다.

로직 수정

기존 방식은 하단선만 사용했지만, 개선 후에는 bbox 전체 사각형 영역을 사용한다.
이렇게 되면 bbox 사각형 좌표 중 하나라도 위험 영역 좌표와 겹치면 true가 반환된다.

bbox_matrix = box(x1, y1, x2, y2)
if bbox_matrix.intersects(roi_polygon):
    # roi_polygon은 전달받은 위험 영역 좌표를 의미
    # 위험 판단 로직 처리 진행...

이 방식은 훨씬 더 정밀하고, 실제 산업 안전 기준에도 부합한다.
설비는 사람이 일부라도 진입했을 때 위험으로 판단하여 바로 멈춰야 하기 때문이다.

추가 구현: 모드 분기

그런데, 문제는 기존 수십 개 사이트에 이미 설치되어 있는 시스템들이
하단선 기준으로 ROI를 설계해둔 상태라는 것이다.

로직을 일괄 변경하면 사이드 이펙트가 발생할 수 있으므로 화면 상에서 옵션으로 영역 판단 방식을 제공하도록 기능을 구현하였다.

화면(프론트엔드) 상에서 관리자 설정 기능으로 판단 방식("bottom", "box") 을 선택할 수 있도록 만들었다.

예를 들어 mode 옵션을 추가하여

* "bottom": 기존 방식 (bbox 하단선 기준)

* "box": 개선 방식 (bbox 전체 기준)

관리자 설정 창에서 이 값을 선택할 수 있게 했고,
프론트엔드 관리자 페이지에도 버튼 UI를 추가해서 쉽게 전환 가능하게 만들었다.

추가로 각 모드에 대한 설명도 툴팁을 넣어 관리자 입장에서 기능을 이해하지 못해도 적절히 선택할 수 있도록 UX 개선은 덤

저작자표시 (새창열림)

'개발 일상' 카테고리의 다른 글

서로 다른 서버 간 MongoDB 컬렉션 데이터 마이그레이션(ubuntu)  (2) 2025.07.03
[ubuntu 22.04] 최신 chrome 브라우저에서 키보드 입력 문제 해결법  (1) 2025.06.23
대량의 파일, 효율적으로 압축 & 전송하기 – 우분투 기반 백업 최적화  (2) 2025.06.02
[python] data.dict() vs jsonable_encoder(). 그리고 datetime 쿼리 삽질기  (0) 2025.05.26
MongoDB Aggregation을 활용한 통계 API 구현(python)  (1) 2025.05.22
'개발 일상' 카테고리의 다른 글
  • 서로 다른 서버 간 MongoDB 컬렉션 데이터 마이그레이션(ubuntu)
  • [ubuntu 22.04] 최신 chrome 브라우저에서 키보드 입력 문제 해결법
  • 대량의 파일, 효율적으로 압축 & 전송하기 – 우분투 기반 백업 최적화
  • [python] data.dict() vs jsonable_encoder(). 그리고 datetime 쿼리 삽질기
레실이
레실이
  • 레실이
    레실이의 티스토리
    레실이
  • 전체
    오늘
    어제
    • 분류 전체보기 (91)
      • SE Bootcamp 내용 정리 (63)
      • 알고리즘 연습 (7)
      • Project 주저리 (4)
      • 기술 면접 source (3)
      • 개발 일상 (12)
      • 생성 AI 활용 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인증/보안
    promise
    ORM
    Ajax
    react
    IT
    데이터베이스
    자료구조
    mongoDB
    Linux
    JavaScript
    CORS
    node
    문자열
    ubuntu
    CSR
    useRef
    DOM
    state
    useState
    CSS
    PickAndDrink
    알고리즘
    객체
    비동기
    JS
    MVC
    Python
    fastapi
    node.js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
레실이
YOLO 객체 감지 후 위험 영역 판단 로직 개선기
상단으로

티스토리툴바