spring98 / flutter-yolo-realtime-plugin

실시간 객체검출 플러그인 배포 (2023)
MIT License
12 stars 4 forks source link

실시간 객체탐지 플러그인

YOLO 실시간 객체 감지를 지원하는 Flutter 구현입니다.

preview

iPhone 13 pro

286609173-b0e97003-d4f9-4a19-b0e8-c1981c6e4cb8

Galaxy S10

286611068-4da95ee3-2005-48ec-8d00-a717b2d0e8fb



플러그인 개발

인공지능 모델을 이용하여 온디바이스 추론 프로젝트를 진행한 경험이 있습니다.

당시 Flutter 로 개발하기위해 여러가지 플러그인들을 테스트 했지만 실시간 추론을 지원하는 플러그인을 찾을 수 없었습니다.

해당 기능을 구현하기 위해서는 카메라 플러그인과 인공지능 추론 플러그인을 따로 설치 후 카메라 데이터를 가져와 다시 추론 플러그인을 거치는 방식을 사용하였습니다.

두 플러그인을 따로 사용하다보니 1회 추론시간이 1500 ~ 1600 ms 정도 걸리게 되었고, 실시간으로 사용하기에는 다소 무리가 있다고 판단해 결국 기존 AOS 네이티브로 개발된 코드를 리팩토링 하여 진행했었습니다.

프로젝트 종료 후 해당 문제를 해결하여 비슷한 문제를 겪고 있는 개발자들을 위해 플러그인 배포를 진행하였습니다.



기존 방식(성능 이슈 발생)

기존 방식을 그림으로 표현하면 아래와 같습니다.

Sitemap (5)


  1. 카메라 플러그인으로 네이티브에 접근 해 스트림 데이터 받아오기 (1,2,3,4)
  2. 스트림 데이터를 인공지능 추론 플러그인으로 네이티브에 접근 해 결과 받아오기 (5,6,7,8)
  3. 결과 내용을 출력하기


위의 프로세스에서 주목해야할 점은 2,3,6,7 화살표 입니다.

Flutter 에서 플러그인을 개발할 때는 Method Channel 을 이용해서 네이티브와 통신하게 되는 데, 통신 횟수가 많아질수록, 통신 데이터가 많아질수록 지연시간이 발생합니다.

사진의 3번 화살표를 통해 기기 해상도에 맞는 이미지 데이터가 Flutter 로 전송되고 6번 화살표를 통해 다시 한번 네이티브로 전송됩니다.

데이터 크기가 큰 이미지 데이터가 1회 추론에 대해 플랫폼 사이를 2번 움직이는 통신 오버헤드가 발생하여 평균 추론시간은 1500~1600 ms 정도가 걸리게 됩니다.



개선 방식

기존 방식을 개선하면 아래 사진과 같습니다.



  1. 플러그인에서 네이티브에 접근하여 카메라 스트림 데이터를 Flutter 로 가져오지 않고 바로 추론하기
  2. 추론결과를 이용하여 네이티브 뷰 개발
  3. Flutter 에서 네이티브 뷰를 띄우는 기능을 활용하여 제공

위의 프로세스에서 카메라 데이터는 네이티브 내에서 직접 연산, 추론되며 네이티브 뷰를 따로 만들어 띄우는 방식으로 개발 했기 때문에 Flutter 로 직접 전송되지 않으므로 오버헤드가 크게 발생하지 않습니다.

결과적으로 추론시간은 1500-1600 ms 에서 200-300 ms 로 크게 개선할 수 있었습니다.




2024.05.03 기준 상위 28% 수의 개발자들(popularity 72%)이 사용하고 있으며 YOLOv5 를 지원합니다. https://pub.dev/packages/yolo_realtime_plugin