반응형
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 성능 측정 본문

카테고리 없음

Raspberry Pi에서 Object Detection 성능 측정

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

1. Get YOLO (darknet)

가장 널리 사용되는 Object Detection을 알아보기 위해서 일단 YOLO를 실행 해 봤다.

Repo는 https://github.com/AlexeyAB/darknet를 사용 했고 Makefile에 Option은 모두 0으로 했다.

model은 yolov3.weights와 yolov3-tiny.weights를 사용했고 모두 위 repo에서 받았다.

2. Test YOLOv3 and tiny model (darknet)

# yolov3
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/person.jpg

# yolov3-tiny
./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights data/person.jpg

빠른 알고리즘으로 알려져 있지만 역시 ARM에서 쌩 CPU로 돌리기에는 버거운 것 같다.

yolov3 yolov3-tiny
weights file size 237M 34M
Test1 65375.980000 5853.315000
Test2 65365.381000 5875.121000
Test3 65449.436000 5857.202000

총 3번의 테스트를 했고 거의 거의 비슷한 시간이 나왔다.

yolov3는 평균 65초 정도, yolov3-tiny는 평균 6초가 나왔다.

weights file size는 약 7배정도 차이가 나고, 시간은 약 11배 정도 차이가 난다.

3. Test SSD MobileNet(TFlite) model

그 다음으로 빠를 것 같은 TF lite에서의 Object Detection 성능을 확인해 봤다.

다행히 TF lite 샘플이 있어서 Rasp pi에서 이걸 실행 해 봤다.

버전 문제가 있어서 Rasp pi에 Python 3.7을 설치 한다.

$ wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
$ tar -xf Python-3.7.4.tgz

$ sudo mkdir /usr/local/opt
$ sudo mv ./Python-3.7.4 /usr/local/opt/
$ cd /usr/local/opt/Python-3.7.4/

$ sudo ./configure --prefix=/usr/local/opt/python-3.7.4 --enable-optimizations 
$ sudo make altinstall

TFlite 메뉴얼에 있는대로 설정을 한다.

https://github.com/tensorflow/examples/tree/master/lite/examples/object_detection/raspberry_pi

4MB짜리 detect.tflite을 다운받고 실행한다.

python3.7 detect_picamera.py --model /tmp/detect.tflite --labels /tmp/coco_labels.txt

평균 186ms의 시간을 보이고 있다. 약 5FPS정도로 실시간 까지는 아니지만 괜찮은 성능이다.

아래는 YOLO v3, YOLO v3 tiny, TF lite object detection의 결과를 비교 한 것이다.
TF lite object detection은 모델이 YOLOv3가 아니라 SSD mobilenet이고 괄호는 GPU 시간이다.

YOLO v3 YOLO v3 tiny YOLO v3 .pb file TF lite object detection (GPU)
https://github.com/AlexeyAB/darknet https://github.com/AlexeyAB/darknet https://github.com/Byronnar/tensorflow-serving-yolov3 https://github.com/clippingforlove/tensorflow-lite-yolo-v3
yolov3.weights yolov3-tiny.weights ./checkpoint/yolov3_coco_v3.pb ./yolo_v3.tflite
237M 34M 237M 237M
65 sec 6 sec 8 sec 9 sec (1.13.1, 0.71 sec)

4. YOLO v3를 TF lite로 실행하기

구글링을 해도 YOLO v3를 TF Lite로 변환 하는 제대로 검증된 파일이 없어서.. 직접 해봤다.

우선 TF로 짜여진 YOLO를 찾았다. GitHib에서 가장 star가 많은 https://github.com/YunYang1994/tensorflow-yolov3 Repo를 참고 했다. checkpoint도 있고 잘 만들어 둔 것 같다.

여기서 saved_model을 적용한 Repo가 https://github.com/Byronnar/tensorflow-serving-yolov3인데 여기 있는 save_model.py로 파일을 내보낸다... 근데 문제는 그 뒤에 작업이 제대로 안된다..

새로운 Repo를 찾았다. https://github.com/clippingforlove/tensorflow-lite-yolo-v3 여기는 아예 TF lite까지 제대로 지원한다. 작업 마지막 쯤에 세그멘테이션 오류가 나서 GPU서버에서 다시 실행했다.

TF 1.14.0에서 실행해야 한다. (경우에 따라 TF 1.13.1만 되는 경우도 있다.)

GPU 서버에서 yolo_v3.tflite파일로 변환 했지만, Rasp pi에서 실행이 안됐다.

AttributeError: module 'tensorflow_core.contrib' has no attribute 'lite'

위의 오류에 대해서는 https://www.tensorflow.org/lite/guide/python?hl=ko 에서 설명하고 있다. Raspberry Pi에 맞는 인터프리터 wheel을 설치하고 소스를 수정해야 한다.

- import tensorflow as tf
+ import tflite_runtime.interpreter as tflite

- interpreter = tf.lite.Interpreter(model_path=args.model_file)
+ interpreter = tflite.Interpreter(model_path=args.model_file)

이렇게 패치를 히면 제대로 실행은 되는데 시간은 약 9초 정도 소요된다. TFLite를 써도.. 기대한 만큼 5FPS 이상은 나오지 않는다.

5. TFLite

TFLite 파일로 Export 하면 알아서 자동으로 Quantization 될 줄 알았는데 파일 용량도 비슷하고 생각한 대로 시간도 줄지 않았다. 따로 Quantization을 해야 할 것 같다. 다행히 공식 메뉴얼 https://www.tensorflow.org/lite/performance/post_training_quantization에서 자세히 설명을 하고 있다.

위에서 경험했지만, Rasp pi(ARM)에서는 제대로 모델 변환이 안된다. 아래 작업들은 x86 서버에서 실행하고, 결과물만 가지고 Rasp pi에 옮겨서 실행 했다. 문서에 따르면 Quantization작업은 또 TensorFlow 1.15이상에서 된다고 한다. x86 개발용 Host PC에 TensorFlow 버전을 업데이트 해야 한다.

다른 프로젝트도 그렇지만 특히 TensorFlow는 버전에 따라서 오류를 내는 경험이 많기 때문에 특히 주의해서 버전을 바꿔가면서 (아니면 venv를 잘 왔다갔다 하면서) 써야 한다.

??? 왜 tflite 파일 크기가 1/4인 quantized model이 더 오래 걸리지...???

푸르닝은 Keras만 지원하고 Tensorflow는 지원하지 않는 것 같다(??)

6. ONNX

https://github.com/clippingforlove/tensorflow-lite-yolo-v3
여기서의 weight file은 pb file이다.
TensorFlow to ONNX는 https://github.com/onnx/tensorflow-onnx를 참고하면 된다.
용량은 비슷하게 237M 정도로 나온다.
pi로 가서, onnx runtime을 설정 한다. https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux.git

참고자료

반응형