반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

테크매니아

Raspberry Pi에서 Object Detection : YOLOv3 + NNPACK = 2FPS 본문

카테고리 없음

Raspberry Pi에서 Object Detection : YOLOv3 + NNPACK = 2FPS

SciomageLAB 2024. 10. 18. 00:22
반응형

Try1 : yolov4-tiny

이전 글에서 Raspberry Pi에서 YOLO v3를 실행해 봤다. 6초 정도의 시간이 걸렸는데, 이것을 조금씩 줄여보려고 한다.

우선 https://paperswithcode.com/sota/real-time-object-detection-on-coco 에 따르면 coco dataset으로 실시간 객체 탐지의 SOTA는 YOLOv4-tiny이다.

DarkNet GitHub Repo(https://github.com/AlexeyAB/darknet)에 가면, 샘플이 있다. clone을 받고 Makefile의 OPENMP옵션을 1로 활성화 하면 CPU 추론시 멀티 프로세싱을 지원한다. 그리고 darknet을 build하고

./darknet detector test ./cfg/coco.data ./cfg/yolov4-tiny.cfg ./yolov4-tiny.weights data/dog.jpg -i 0 -thresh 0.25

위 커멘드로 실행하면 약 4.4초 정도에 객체를 인식 할 수 있다.. 비디오로 테스트를 해봐도 0.2~0.3 FPS가 최선이다.

정말 Raspberry Pi에서는 1FPS 이상을 얻을 수 없는걸까.. mAP를 포기 하더라도 빨리 돌아가는 걸 좀 보고 싶은데...

Try2 : NNPACK

NNPACK은 신경망 계산을 위한 가속 패키지입니다. NNPACK은 멀티 코어 CPU를 위한 convnet 계층의 고성능 구현을 제공하는 것을 목표로 한다고 한다. NNPACK은 기계 학습 연구자들이 직접 사용하기 위한 것이 아니라 PyTorch, Caffe2, MXNet, tiny-dnn, Caffe, Torch 및 Darknet과 같은 딥러닝 프레임워크에서 활용되는 저수준 성능 기초요소를 제공한다고 한다.

Raspberry Pi 4 Model B는 Cortex-A72(ARM v8)를 사용합니다. 문서에 따르면 ARMv8 (AArch64) processor는 NEON과 무관하게 지원하는 것 같다.

CONV, FC 레이어 같은걸... 하드웨어 자원을 최대한 잘 쓰게 만들어 주는 것 같다.

원본 GitHub Repo : https://github.com/digitalbrain79/NNPACK-darknet 여깄는걸 그대로 하면 안되고 Pi용으로 만든 Repo인 https://github.com/digitalbrain79/darknet-nnpack를.. 해도 안돼서 이런저런 오류를 해결 한 새 최신 Repo인 https://github.com/mrhosseini/NNPACK-darknet

이 오픈소스가 재밌는게.. fork가 굉장히 많다. 이걸 가장 처음 만든 사람은 구글에 있는 Maratyszcza님이다. 이걸 한국에 있는 digitalbrain79님이 DarkNet을 지원하는 NNPACK인 NNPACK-darknet과 이를 이용한 darknet-nnpack을 만들었다. 근데 이게 원본 NNPACK와 종속성이 있는데 한참 동안 관리가 안돼서 그런지 최신 버전에 맞지 않는다. 이걸 mrhosseini님이 최신 변경사항을 적용해 NNPACK-darknet를 만들었다. 굉장히 많은 Repo가 있고, 이슈에 논의된 내용이 많으니 참고하면 된다.

fork한 프로젝트를 또 다시 fork한... 진정 오픈소스가 아닐까 싶다...

Try2 : NNPACK : Darknet-nnpack

https://github.com/mrhosseini/NNPACK-darknet을 이용해서 빌드를 하면 오류 없이 빌드가 된다.

confu setup 방식으로 build 하는게 예전 방식(?)으로 지금 최신 버전에선 잘 안된다. 아래 방법대로 cmake와 ninja를 이용해서 build 하면 된다.

mkdir build
cd build
cmake -G Ninja ..
ninja

이외에도 pthreadpool, cpuinfo 같은 종속성이 있는데, 다 따로 빌드 해 놓고 Makefile에 등록해서 빌드 하면 된다.

내 경우에는 opencv build가 잘못 됐는지, 한 장 짜리 이미지는 잘 처리되는데 mp4 video 입력은 제대로 처리되지 않았다. 자세한 건 소스와 build를 봐야 알겠지만, 한 프레임을 얼마나 빨리 처리할 수 있는지를 확인하는게 목적이기 때문에 더 깊게 확인하진 않았다.

NNPACK을 보면 armv8의 자원을 최대한 써서 빠르게 해주는 것 같다. 멀티쓰래드나 Neon(armv8에선 안쓰인다.)같은 그래픽, 멀티미디어 instruction set을 써서 나름의 가속화를 주는 것 같다.

결과

결과를 보면 나쁘지 않지만, tiny 모델이라 다른 좀 복잡한 이미지를 입력으로 하면 정확도가 다소 떨어지긴 한다. 하지만 라즈베리파이 환경인 점은 감안하고 원본 YOLOv3 모델이 쌩CPU에서 60초가 넘게 걸린 것을 생각한다면 2FPS는 약 1200배 성능향상... 엄청나다.

다음 글에서는 nnpack을 자세히 보거나 Object Detection 성능을 더 끌어내 보려고 한다.

반응형