머신 비전 프로젝트 2 - 결과
포스트
취소

머신 비전 프로젝트 2 - 결과

table of contents

배경 및 목표 (Situation & Task)

  • 스마트팜, 스마트 축사에 대한 활용을 전제로, 축사 내 돼지 객체를 인식하여 각종 정보를 모니터링하는 시스템을 구현하기
  • 시스템은 다음의 기능으로 구성됨
    • 개체 수 모니터링: 시야 내 돼지 객체를 탐지해 그 수를 모니터링한다. 갑작스러운 유실을 모니터링할 수 있다(객체 수의 증감을 감지하는 기능까지는 구현되지 않았음)
    • 금이/급수 구역 점유율: 식사 시간에 먹이 구역 점유율이 낮을 경우 질병 감염 등을 의심할 수 있다. 이를 모니터링하기 위한 먹이 구역 점유율 모니터링을 제공함(먹이 주변에 모여있음 / 그렇지 않음 flag로 제공)
    • 군집도 추정: 축사가 추우면 돼지는 모여들고, 더우면 흩어진다. 축사 내 적정 온도 관리를 위해 군집도 모니터링 제공(추움/보통/더움으로 제공)
    • 비접촉식 체중 추정: 체형과 체중의 상관관계가 높은 돼지의 특성을 이용한 비접촉식 체중 추정 기능 제공. 돼지의 발육 상태 모니터링에 활용 가능함.

역할 및 행동 (Action)

  • 실제 돼지를 준비할 수 없기 때문에 클레이와 색지로 각각 돼지와 축사를 모사함. 클레이는 분홍색만을 사용하였으며, 둥근 원통형에 귀나 꼬리 정도의 돌출부만 작게 묘사된 수준으로 실제 돼지에 비하면 상당히 많이 모형화되었음. 축사는 갈색 색지를 책상에 붙여 표현하였음.
  • 사진을 찍어 데이터셋을 만드는 것은 팀원들이 했고, 나는 그 데이터를 받아 roboflow auto labeling을 활용하여 세그멘테이션 및 OBB 라벨링을 진행함.
  • 돼지 객체의 수와 군집도를 모니터링하는 기능에는 OBB를, 체중을 추정하는 데에는 세그멘테이션을 이용하기로 하고, 각각에 대한 성능 평가 기준을 수립함.
    • OBB
      1. 돼지의 수를 정확히 세는 것을 최우선 목표로 count 정확도 ($1 - \text{오차}$로 계산)
      2. 객체 탐지 자체의 성능을 함께 평가하기 위해 rotated IOU 기반 mAP를 사용
      3. 모델이 얼마나 확신하였는지 함께 평가하기 위해 mAP와 confidence를 조화평균
    • 세그멘테이션: 일반적으로 사용되는 mIOU 사용
    • 체중 추정: 회귀 문제에 가깝기 때문에 오차 단위가 실제 단위와 일치하는 MAE와, 최솟값과 최댓값이 한정되어 단일 결과만으로도 상대적인 성능을 가늠하기 용이한 $R^2$ score 사용.
    • 모델의 입출력을 먼저 정의하고 그에 따른 테스트 코드를 작성하였음. 이는 모델 개발 이전에 진행된 사항으로, 일관된 성능 평가를 보장하기 위함.
      (그러나 실제 머신 비전 모델의 데이터 형식을 모르고 작성하여 추후 테스트 코드는 여러 번 수정되었으며, 그 외에도 각자의 개발 상황에 따라 고쳐서 적용하여 성능 평가 지표만이 일관되게 유지되었음. 실제 모델이 사용하는 데이터의 형식에 대한 무지로 발생한 일.)
  • 머신 비전으로써 구현되는 기본 기능 이외에, 유의미한 모니터링 변수를 제공하기 위한 추가적인 알고리즘을 작성함.
    • 군집도 알고리즘
      • 평상시의 개체 수/군집 모니터링을 제공하는 global 모드와 먹이 구역에 한정된 군집도를 제공하는 feed 모드로 구분됨.
      • 다음의 3가지 요소를 조합하여 군집도를 연산함
        • 점유율: 전체 면적 대비 돼지 객체가 차지하는 면적의 점유율과 돼지 객체의 무리에 한정한 부분 면적 점유율을 조합
        • 근접도: 객체 간 거리가 가까운 정도
        • 겹침도: 객체 바운딩 박스가 겹친 정도
      • 점유율의 경우 전체 면적 대비 돼지의 수가 적을 경우 전체 면적 대비 점유율만으로는 수치가 낮게 나와 부분 점유율을 추가로 도입한 것임.

  • 이전 프로젝트(폰트 분류기)에서 내가 만든 AI 모델의 성능이 다른 팀원보다 높지 못했다는 점을 근거로 AI 모델 개발은 팀원들에게 맡기고 OpenCV 기반 룰베이스 모델 개발을 시도함
    • 모형화한 환경이 매우 단순함을 이용하여 HSV 기반 마스크로 돼지 객체를 추출하고 모폴로지, 컨투어 추출을 거쳐 OBB를 생성함. 이때 OBB 모델의 성능 평가 지표를 동일하게 제공하기 위해 추출된 돼지 객체의 형태가 얼마나 적절한지를 연산하여 confidence를 대체함(룰베이스 모델은 AI 모델과 달리 confidence에 해당하는 개념이 원래 없었기 때문).
      1. BGR 이미지 입력
      2. Gaussian Blur + LAB CLAHE
      3. HSV/LAB 기반 후보 마스크
      4. Morphology Open/Close
      5. findContours
      6. 면적·종횡비·solidity 필터
      7. minAreaRect 등 OBB 후보
      8. 신뢰도 산출
      9. 출력 JSON: boxes, confidences

  • 룰베이스 모델의 성능 개선 시도
    1. 직접 하이퍼파라미터 지정: count 정확도 91.11%, mAP50 0.85로 룰베이스 모델에 기대했던 것보다는 좋은 성능이었지만 파라미터를 좀 더 최적화해서 성능을 개선해보기로 함.
    2. 랜덤 서치: 랜덤 서치로 파라미터를 최적화하여 count 정확도 90.90%, mAP50 0.85로 직접 지정한 것에 비해 근소하게 낮은 성능을 보임. 랜덤 서치를 하는 동안 진행된 trial의 정보가 연속적으로 활용되지 않는다는 점을 문제로 보고 추가 최적화 진행
    3. optuna+TPE: 랜덤 서치와 유사하나 이전 trial의 결과를 기반으로 더 나은 선택을 시도하는 하이퍼파라미터 최적화 기법. 성능 평가 지표에 가중치를 주어 최적화 방향성을 조절할 수 있음
      1. 카운트 정확도 : mAP50 : mAP50과 confidence의 조화평균 = 5:3:2 비율로 적용하여 파라미터 탐색. 카운트 정확도 94.88%, mAP50 0.90 달성.
      2. 동일 지표에 대하여 4:3:3 비율로 파라미터 탐색. 카운트 정확도 94.31%, mAP50 0.90 달성. 5:3:2로 최적화한 결과에 비해 근소하게 낮은 성능.

  • 모델 탐지 결과를 군집도 알고리즘에 적용
    • 군집도 알고리즘 자체는 군집의 정도를 수치화하는 것일 뿐, 그 수치가 어느 정도일 때 얼마나 모인 것인지 분류하는 것은 임계값을 지정해야 함.
    • 다양한 구도로 모형 돼지를 배치하며 경험적으로 임계값을 설정하였음

  • 개발된 돼지 탐지 시스템을 서비스로써 제공할 수 있도록 대시보드 UI를 디자인하고 개발함.
    • 화면 왼쪽 중앙에 카메라 화면을 배치하고, 화면 내 돼지 객체에 바운딩 박스 및 화면 가장자리에 각종 정보 출력
    • 팀원 간 다양한 모델을 개발하였기 때문에 카메라 화면 상단에 모델 선택 탭 배치
    • 화면 우측에는 사용자 지정 UI 배치. 군집도 판별 모드를 global/feed 중 선택하는 드롭다운 메뉴와 먹이 구역 ROI 지정 입력란, 카메라 화면 내 UI on/off 토글 메뉴 등이 배치됨.
    • 화면 하단에는 현재 선택된 모델을 기반으로 연산한 군집도 3요소의 점수와 모델의 사전 학습 평가 성능이 표기됨.
    • UI 화면
    • 브라우저–서버 구성
    • 페이지 로드 이후 상호작용(시퀀스)
    • UI 데이터 흐름(개념)

기여도 구분

데이터셋 준비를 위한 클레이 돼지 만들기, 데이터셋 라벨링, 군집도 계산 알고리즘 구현 및 임계값 세팅, 모델 성능 테스트 코드 초안 작성 및 업데이트, 룰베이스 OBB 탐지 모델 개발 및 고도화, UI 디자인 및 구현

결과 및 성과 (Result)

  • 데이터셋의 특성을 이용하여(색이 단순함) 룰베이스 기반 모델을 90% 이상의 성능으로 구현함.
  • 머신 비전뿐만 아니라 필요한 기능을 제공하기 위한 부가적인 알고리즘을 설계하고 구현할 수 있음
  • 하이퍼파라미터에 따라 모델의 성능이 달라짐을 이해하고 이를 적절한 기법으로 최적화할 수 있음
  • 데이터셋 생성부터 서비스 구현까지 엔드 투 엔드 전 과정 수행 가능

발표자료

현직 멘토 피드백

  1. 마스킹으로 하는 경우 시연 중 사람 손이 섞이면 좀 혼선이 있지 않겠니?

    → 사람 손이 직접 나오지 않게 도구 등을 활용하겠다.

  2. 지금 하는 일들이 마스킹도 하고 돼지 수 검출도 하시잖아요. 굳이 그렇게 나눠서 하는 이유가 있어요?

    → 지금 님들 개발 시간 엄청 짧아요. 현업에서의 중요한 관점 중 하나가 한정된 시간 안에서 적절한 하나의 방법을 딱 찾아내는 것도 중요해요. 지금 고민하는 마스킹과 디텍션 중에서 어떤 방법이 더 좋은 결과를 찾아낼 수 있을까? 이 시점에서는 선택과 집중이 필요하다.

    만약 둘 다 했다가 이도저도 안되면 최악의 경우 실패한 프로젝트가 되는 거예요. 그건 고민을 좀 해보세요.

    또 문제가 님들 회귀도 하실 거잖아요. 되겠어요? 진짜 솔직히 될 것 같아요? 고민해보시고 에바다 싶으면 선택과 집중을 하세요.

  3. Q) 체중 예측을 하는 과정에서 실제 돼지들은 체형과 무게의 관계성이 어느정도 일관성을 갖는데, 점토 모형은 그만한 일관성을 갖기가 어렵다. 그래서 어느 정도 체형의 일관성을 갖도록 하기 위해 돼지 모형을 원통형으로 좀 더 단순화하려고 한다. 괜찮을까요?

    → 돼지를 모델링하는 식이 있다면 그걸 통일하는 게 좋으실 것 같습니다. 무게 측정은 ok.

    다만 무게 값의 차이가 꽤 적어서 데이터셋이 좀 어려워질 것 같다. 그러니까 어차피 모형화하는 김에 실제 돼지의 무게를 비례해서 임의로 설정하시는 것도 방법이 될 것 같고, 소수 3자리 이상 측정할 수 있다면 그것만으로도 약간 대응은 될 것 같아요.

    재밌겠지만 골때리는 문제입니다. 형상의 차이가 좀 문제가 될 수는 있을 것 같음.

    잘 되는 방법론 하나 있으면 딱 그것만 다같이 쓰는 식으로 노동력을 줄여보세요.

  4. Q) 축사에서 룰 베이스로 검출할 때 색깔 베이스로 하겠다 했었다. 다만 뭉쳐있는 돼지는 제대로 검출이 안된다. 이걸 분리해낼 수 있는 방법론이 존재할까?

    → 없진 않겠지. 러프하게만 생각해봐도 엣지를 따라 분할한다든가 하는 식의 여러 시도는 할 수 있겠다만 멘토님도 이건 해봐야 알 것 같다. depth를 이용한다든가 할 수는 있겠다만 선택권이 있다면 그냥 AI하는 게 훨씬 나을 것 같다. 그거 하면 금방인데 굳이? 싶다.

    무의미는 아니고 나름 유의미한 챌린지가 될 수는 있겠지만, 어쩌면 수요가 있을지도 모를 일이긴 한데, 선택권이 있는 상황에서는 잘 안할 일이긴 하다.

  5. Q) 점토 모형의 매끄러운 질감과 단일 색상은 실제 축사의 복잡한 환경(오물, 털, 그림자)과 차이가 큽니다. 데이터 증강(Augmentation) 시 노이즈나 조명 변화를 어느 정도 수준까지 적용해야 모델의 강건성(Robustness)을 확보할 수 있을까요?

    → 수치로 말하긴 좀 어렵다. 지금 카메라로는 분홍색이 잘 나오는데, 현장 카메라는 화질구지라 색이 잘 안나온다는 전제를 해도 되고, 야외조명 등을 고려해도 좋을 것 같다. 요지는 그걸로 학습해도 되지만, 우리의 가상 모델이 잘한다라는 것도 있지만 우리는 환경이 좀 구려져도 여전히 잘한다는 것을 보여줄 수도 있다. 실제 도입 시에는 그런 케이스도 당연히 있으니 증강하는 것은 당연한 일이다.

  6. 멘토님 보시기엔 회귀가 제일 어렵다

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.

머신 비전 프로젝트 2 - 기획

머신 비전 프로젝트 2 - 피드백