yolo 학습을 마치고 yolo를 안드로이드 스튜디오에 연동하는 과정을 담은 포스팅입니다!
저는 darknet yolov4로 학습한 tiny모델을 사용했는데요,
darknet모델을 안드로이드 스튜디오에서 올리기 위해서는 아래와 같이 크게 두 가지가 있습니다.
1. TensorFlow 이용
2. OpenCV 이용
YOLO v4 in other frameworks
- TensorFlow: pip install yolov4 YOLOv4 on TensorFlow 2.0 / TFlite / Android: https://github.com/hunglc007/tensorflow-yolov4-tflite
Official TF models: https://github.com/tensorflow/models/tree/master/official/vision/beta/projects/yolo
For YOLOv4 - convert yolov4.weights/cfg files to yolov4.pb by using TNTWEN project,
and to yolov4.tflite TensorFlow-lite - OpenCV the fastest implementation of YOLOv4 for CPU (x86/ARM-Android),
OpenCV can be compiled with OpenVINO-backend for running on (Myriad X / USB Neural Compute Stick / Arria FPGA), use yolov4.weights/cfg with: C++ example or Python example
1. TensorFlow 이용
(1) 환경설정
https://github.com/haroonshakeel/tensorflow-yolov4-tflite
우선 위의 github에서 code를 다운로드 받아줍니다!
이후 각자 아나콘다를 실행해주고 위에서 다운로드한 폴더로 경로를 바꾸어 줍니다.
이제 환경설정을 해줘야 하는데요, 본인의 환경에 맞게 CPU 또는 GPU를 선택해서 아래의 코드를 입력해줍니다.
저는 노트북에 GPU가 탑재되어 있어서 GPU버전으로 실행시켜 줬습니다.
CPU
# CPU
conda env create -f conda-cpu.yml
# activate environment on Windows or Linux
conda activate tf-cpu
# activate environment on Mac
source activate tf-cpu
GPU
# GPU
conda env create -f conda-gpu.yml
# activate environment on Windows or Linux
conda activate tf-gpu
# activate environment on Mac
source activate tf-gpu
(2) wegiths파일 tensorflow 형식으로 변환
이제 darknet weights를 save_model.py 파일을 통해서 tensorflow형식으로 전환해 줄 차례입니다!
이때 본인의 custom wegiths파일이 있다면 본인의 파일명을 이용하고, 그렇기 않을 경우 github에서 weights파일을 다운로드하여서 다운받은 weights파일을 이용해줘도 무관 합니다.
이때 custom weights 파일을 이용한다면 names 파일이 필요한데요,
tensorflow-yolov4-tflite-master\data\classes
해당 경로에 names파일을 위치시켜주면 됩니다.
이후, tensorflow-yolov4-tflite-master\core에 있는 config.py 파일을 수정해줘야 합니다.
원래 아래의 밑줄 친 부분이 coco.names로 되어있는데요, 이 부분을 본인의 파일명에 맞게 수정해주면 됩니다.
에러 참고 글 ⬇
이제 아래 코드를 통해서 weights파일을 tensorflow형식으로 변환시켜 줍니다.
# Convert darknet weights to tensorflow
## yolov4
python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4
## yolov4-tiny
python save_model.py --weights ./data/yolov4-tiny.weights --output ./checkpoints/yolov4-tiny-416 --input_size 416 --model yolov4 --tiny
저의 경우 weights 파일 명이 yolov4-tiny-custom_last.weights였기에 코드가 아래와 같았습니다.
python save_model.py --weights ./data/yolov4-tiny-custom_last.weights --output ./checkpoints/yolov4-tiny-416 --input_size 416 --model yolov4 --tiny
이때 저는 일부 모듈을 찾을 수 없다고 떴는데요, 아래와 같이 pip install을 통해 해결해 주면 됩니다.
ModuleNotFoundError: No module named 'easydict'
>> pip install easydict
AttributeError: module 'h5py' has no attribute 'File'
>> pip uninstall h5py
>> pip install h5py
오류22
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model. https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras
성공적으로 변환에 성공하면 폴더 내에 checkpoints라는 폴더가 생성이 되고
해당 폴대 내에 자신이 지정한 폴더(yolov4-tiny-416)가 생성되는 것을 확인할 수 있습니다.
만들어진 폴더를 아래 코드를 통해 테스트를 진행할 수 있습니다.
만약 tiny버전이라면 --model yolov4 뒤에 --tiny를 붙여주면 됩니다.
# Run yolov4 on image
python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/kite.jpg
python detect.py --weights ./checkpoints/yolov4-tiny-416 --size 416 --model yolov4 --image ./data/kite.jpg --tiny
# Run on multiple images
python detect.py --weights ./checkpoints/yolov4-tiny-416 --size 416 --model yolov4 --images "./data/kite.jpg, ./data/girl.jpg"
# Run yolov4 on video
python detect_video.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --video ./data/japan.mp4 --output ./detections/video_output.avi
# Run yolov4 on webcam
python detect_video.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --video 0 --output ./detections/webcam_output.avi
(3) tflite형식으로 변환
이제 정말 우리가 필요한 tflite 형식으로 변환할 차례!
이번에도 위에서 한 것처럼 본인의 weights파일 명에 맞게 아래 코드를 돌려줍니다.
# Save tf model for tflite converting
python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4 --framework tflite
이 코드가 실행이 완료되도 아직 폴더내부에는 tflite파일이 생기지 않기에,
아래의 코드까지 돌려줘야 합니다!
세 개의 형식 중 본인의 원하는 것으로 선택해주면 됩니다!
# yolov4
python convert_tflite.py --weights ./checkpoints/yolov4-416 --output ./checkpoints/yolov4-416.tflite
# yolov4 quantize float16
python convert_tflite.py --weights ./checkpoints/yolov4-416 --output ./checkpoints/yolov4-416-fp16.tflite --quantize_mode float16
# yolov4 quantize int8
python convert_tflite.py --weights ./checkpoints/yolov4-416 --output ./checkpoints/yolov4-416-int8.tflite --quantize_mode int8 --dataset ./coco_dataset/coco/val207.txt
# Run demo tflite model
python detect.py --weights ./checkpoints/yolov4-416.tflite --size 416 --model yolov4 --image ./data/kite.jpg --framework tflite
실행이 정상적으로 완료됐다면, 위와 같이 checkpoints 폴더 내에 tflite파일이 생성이 됩니다!
(4) 안드로이드에서 yolo 실행
변환까지 잘 마쳤다면, 안드로이드 스튜디오에서 동작하는지 올려볼 차례입니다.
위에서 다운로드한 tensorflow-yolov4-tflite-master 프로젝트를 안드로이드 스튜디오에서 열어줍니다.
assets 폴더에 우리가 변환시킨 weights파일을 추가해주면 되는데요,
weights파일 외에도 class명이 담긴. txt 파일도 함께 넣어줘야 합니다.
저는 obj.txt 파일과 yolov4-tiny-416.tflite파일을 넣어줬습니다!
이제 소스 코드를 수정해줘야 합니다.
만약 본인의 weights가 tiny버전이라면, YoloV4 Classifier에서
isTiny = false라고 되어 있는 부분을 아래와 같이 true로 바꿔줘야 합니다.
// tiny or not
private static boolean isTiny = true;
이제 MainActivity.java와 DetectorActivity.java 두 개의 파일을 수정할 건데 두 개의 파일 모두 weights명과 coco.txt를 본인의 파일명에 맞게 변경해주면 됩니다.
이제 상단바에서 Build >> Build Bundle >> Build APK를 실행해주고 실행이 완료 되면 앱을 실행시켜 주면 됩니다
해당 영상은 custom weighs파일이 아닌, github의 weights파일로 돌린 영상입니다!\
저는 며칠동안 제대로 된 방법을 알아보지도 않고 무작정 블로그들에 있는 소스코드들만 긁어서 시도했었습니다.
처음에는 opencv 방법을 이용하려고 하려다가 안드로이드 스튜디오에서 계속 오류가 나서 이틀 정도를 날리고
이후에는 darknet weights를 tensorflow로 변환하려했는데 이마저도 수차례의 오류를 만났습니다 ㅠㅠ
그후로는 그냥 차근차근 정리하면서 하자라는 마음으로 github에 정리되어 있는 방식을 따라하다 보니까 되더라고요.
에러나도 될 때까지 삽질하면 어떻게든 되니까 우리 모두 화이팅하면서 모두들 성공하셨길 바라겠습니다 😂😂
참고 사이트
'프로젝트 > Capstone design' 카테고리의 다른 글
colab에서 darknet를 이용한 yolov4 실습 (1) | 2021.12.01 |
---|---|
yolo 이미지 라벨링을 위한 labelImg 사용법 (3) | 2021.11.21 |