Dev/졸프

Custom object detection(YOLOv5)

rryu09 2023. 5. 26. 04:26

Index

Roboflow를 이용한 yolov5 custom training
tflite로 변환

 

리얼타임 카메라로 그림의 중요한!부분을 감지한 뒤 부분별 해설을 제공하는 모바일 어플을 제작하고자 합니다.

관람객이 그림을 카메라로 비추면, 그 그림 안의 부분들을 object detection으로 찾으려고 합니다.

 

우선 custom training을 위해 colab으로 yolov5 학습을 시키는 과정입니다.

결과물은 pt 파일로 나오는데, 이걸 tflite로 변환시켜 flutter에서 플러그인을 이용해 리얼타임 카메라와 연결할 예정입니다.

Custom Object Detection

다양한 곳에서 많고 훌륭한 데이터셋을 제공하고 있지만...

미술작품을 부분별로 감지하려면 그리고 원하는 부분에 대한 설명을 하려면 직접 라벨링을 통해 데이터를 만들어야 했습니다.

 

 

roboflow라는 툴을 이용하면 바로 yolov5 custom training colab에 프로젝트를 export 한 코드를 붙여넣어 object detection을 해볼 수 있었습니다. 

그림 하나를 정해서 찾고자 하는 부분에 bounding box를 그리고 해당 부분 라벨링을 해주면 됩니다.

그림에서 핵심적인 부분이면서 해설이 있는 부분을 지정해주면 좋겠네요

 

다음 그림에서 men 과 women 으로 나누어 라벨링을 해봤습니다

라벨링된 데이터셋이 트레인 셋으로 예쁘게 들어간 모습이네요

이제 모델을 생성하기 위해서 Generate 탭으로 가봅시다

 

Train/Test Split

Train / Test Split 이라는 게 있네요!

YOLO에서 Training, Validation, Testing 세트를 나누는 이유는... 모델의 학습과 평가를 위해 데이터를 적절히 분할하여 사용하기 위함입니다. 

 

Train, Valid, Test 셋이란?

가지고 있는 데이터셋을 전부 학습에 사용해 버린다면 unseen data, 즉 처음 본 데이터를 예측 및 분류할 때 좋지 않는 성능을 보일 가능성이 높습니다. 그래서 전체의 80%를 Train set으로 분류해 모델을 학습시키고, 20%를 Test set으로 분류해 모델 성능 평가를 하면 성능을 향상시킬 수 있습니다. 하지만 Train set과 Test set 두가지로만 데이터셋을 분류하게 되면 성능 검정을 한번밖에 할 수 없어요.

Test set의 결과대로 모델을 수정한다면 모델이 학습 데이터를 과하게 학습하는 상태인 overfitting이 발생할 가능성도 높아지기 때문에

Train set을 한번 더 Train set 과 Validation set으로 나눕니다.

 

각 세트가 어떤 역할을 하는지 더 자세히 살펴볼까요?

 

  1. 학습 데이터셋 (Training Set):
    • 학습 데이터셋은 모델이 학습하는 데 사용되는 데이터입니다.
    • YOLO 모델은 대량의 라벨링된 객체 감지 데이터로 학습되어야 합니다.
    • 학습 데이터셋은 객체의 다양한 크기, 모양, 배경 등을 포함하여 모델이 객체를 식별하고 위치를 정확하게 예측할 수 있도록 합니다.
    • 모델은 학습 데이터셋을 사용하여 가중치를 업데이트하고, 객체 감지 성능을 향상시키는데 사용됩니다.
  2. 검증 데이터셋 (Validation Set):
    • 검증 데이터셋은 모델의 학습 과정 중에 모델의 성능을 평가하고, 하이퍼파라미터 조정 등에 사용됩니다.
    • 학습 데이터셋으로 학습된 모델은 과적합(Overfitting)되어 학습 데이터셋에 대해서는 좋은 성능을 보일 수 있지만, 실제 데이터에 대해서는 제대로 동작하지 않을 수 있습니다.
    • 검증 데이터셋은 모델의 일반화 능력을 평가하여 적절한 하이퍼파라미터 조정이나 모델의 개선을 할 수 있게 도와줍니다.
    • 검증 데이터셋은 학습 데이터셋과는 독립적이어야 하며, 모델의 성능 평가를 정확하게 수행하기 위해 사용됩니다.
  3. 테스트 데이터셋 (Testing Set):
    • 테스트 데이터셋은 최종 모델의 성능을 평가하기 위해 사용됩니다.
    • 모델의 학습이 완료된 후에는 테스트 데이터셋을 사용하여 모델이 실제 상황에서 얼마나 잘 동작하는지를 평가합니다.
    • 테스트 데이터셋은 모델의 일반화 능력과 성능을 신뢰할 수 있는 지표로 사용됩니다.
    • 테스트 데이터셋은 학습 과정에서 모델에게 노출되지 않았기 때문에 모델의 성능을 객관적으로 평가할 수 있습니다.

 

Training, Validation, Testing 세트를 적절히 분할하면 모델의 학습, 개선, 평가를 신뢰할 수 있게 되며, 모델이 실제 환경에서 얼마나 잘 동작하는지를 평가할 수 있겠네요! 반면 적절히 분할하지 못하면 실제 데이터에 대해서는 좋은 결과를 내지 못할 수도 있어요.

 

비율은 어떤 결과를 얻고자 하는지에 따라 다를 수 있지만, 보통

  • Training Set : 60~80%,
  • Validation Set : 10~20%,
  • Testing Set : 10~20%

로 할당하여 사용한다고 합니다.

 

 

Augmentation

사용자가 카메라를 들고 이리저리 그림을 찍으면 ... 그리고 그곳이 박물관 같은 어두운 장소라면 더욱더

저렇게 깔끔한 인풋이 나올 수 없기 때문에 다양한 이미지를 더 넣어서 학습시켜야 좋은 결과를 얻을 수 있습니다

오오

 

roboflow에서 Generate 탭으로 가보면 4번째 단계로 Augmentation을 지원하고 있는 걸 볼 수 있습니다.

 

Augmentation(증강)은 데이터를 다양하게 변형하여 데이터셋을 풍부하게 만들어 모델의 학습을 개선하는 방법 중 하나인데, 모델이 보다 다양한 상황과 변동성을 학습할 수 있도록 도와줍니다.

 

YOLO의 Augmentation이 포함할 수 있는 단계:

  1. 이미지 확대/축소 (Image Scaling): 이미지의 크기를 조절하여 객체가 다양한 크기로 나타나도록 합니다. 이를 통해 모델은 다양한 크기의 객체를 인식하는 능력을 향상시킬 수 있습니다.
  2. 이미지 회전 (Image Rotation): 이미지를 회전하여 다양한 각도에서 객체를 인식할 수 있도록 합니다. 이를 통해 모델은 객체의 다양한 방향에 대한 학습을 수행할 수 있습니다.
  3. 이미지 뒤집기 (Image Flipping): 이미지를 좌우로 뒤집어 객체의 대칭성을 활용하여 데이터를 증강시킵니다. 이를 통해 모델은 객체의 다양한 대칭 모습을 학습할 수 있습니다.
  4. 이미지 밝기 조절 (Brightness Adjustment): 이미지의 밝기를 조절하여 다양한 조명 조건에서 객체를 인식할 수 있도록 합니다. 이를 통해 모델은 밝거나 어두운 환경에서의 객체 인식 능력을 향상시킬 수 있습니다.
  5. 이미지 잘라내기 (Image Cropping): 이미지에서 일부 영역을 잘라내어 객체의 일부분만을 포함하는 작은 이미지를 생성합니다. 이를 통해 모델은 객체의 일부분에 대한 인식 능력을 향상시킬 수 있습니다.
  6. 객체의 위치 이동 (Object Translation): 객체를 이미지 내에서 이동시켜 다양한 위치에서 인식할 수 있도록 합니다. 이를 통해 모델은 객체의 다양한 위치에서의 인식 능력을 향상시킬 수 있습니다.
  7. 데이터셋에서 클래스 불균형 보정 (Class Imbalance Correction): 데이터셋 내에서 클래스 간의 불균형을 보정하여 각 클래스의 데이터 수를 균형있게 맞춥니다. 이를 통해 모델은 모든 클래스에 대해 골고루 학습할 수 있습니다.

직접 데이터를 수작업으로 모으는 데에는 한계가 있지만 augmentation을 잘 활용한다면 가지고 있는 사진들로 더 많은 데이터를 추가할 수 있으니 정확도를 높일 수 있겠네요!

 

모델을 생성하고 나서 Versions 탭으로 가면 결과물을 스니펫으로 받아볼 수 있는 창이 있습니다.


colab 실행

먼저 필요한 요구사항들을 설치해야 합니다. yolov5 깃허브 레포지토리를 클론하고,

클론해온 레포의 yolov5 폴더로 이동해 requirements.txt안의 dependencies를 설치해 줍니다.

roboflow를 사용할 것이기 때문에 roboflow도 설치합니다.

requirements.txt

requirements.txt 안에 들어가면 설치해야 하는 것들과 필요한 버전들이 명시되어 있는 걸 볼 수 있어요

 

Roboflow 프로젝트를 연결해 줍니다

저 rf = Roboflow(api_key="")의 따옴표 부분에 받은 키를 넣어주세요

 

roboflow Custom Train 파트에서 원하는 모델을 선택하고 Get Snippet 버튼을 누르면 다운로드 코드를 제공해줍니다

api 키가 털리면 roboflow 계정이 위험할 수 있다고 하니 외부로 유출하면 좋지 않겠네요

다음은 데이터셋의 경로를 저장해두는 작업과 roboflow 프로젝트를 로드하는 작업이네요!

 

여러번 코드를 돌렸거나 roboflow에서 generate를 여러번 했다면 프로젝트 버전에 유의해야 해요

열심히 이미지 분류를 하고 이전 모델을 돌리게 될 수도 있습니다.

경로 문제로 에러가 뜬다면 exp 뒤 숫자가 현재 버전과 일치하는지 확인해봅시다

 

 

로딩이 잘 되어서 프로젝트를 다운로드했다면 트레이닝을 시작할 단계!

이때 roboflow에 Train, Valid, Test 셋이 모두 있는지 확인해야 합니다

 

해당 colab에서는 detector의 성능을 평가할 수 있는 tensorboard 화면도 제공하고 있네요!

 

 

 

테스트 폴더에 있는 이미지에 대해 학습한 결과로 detection을 진행해 봅시다

두근두근

 

어...엇?

그림 위쪽 산 부분이 women이라는 결과가 나왔지만...

0.15로 값이 크지 않고 지정한 부분들은 0.91로 높은 추정값이 나온 것을 확인할 수 있네요

 

 

pt 파일 형식으로 학습한 모델의 weight를 저장할 수도 있어요!

저는 이 파일을 tflite로 변환해 플러터에 얹어보려고 합니다

 


tflite 변환

tflite??

TFLite (TensorFlow Lite)는 모바일 및 임베디드 기기에서 TensorFlow 모델을 실행하기 위한 경량화된 머신러닝 프레임워크입니다. TensorFlow의 확장판으로써, 모바일 기기와 IoT 장치 등의 리소스 제한된 환경에서도 효율적인 모델 실행을 가능하게 합니다. 

주요 특징을 살펴볼까요?

 

  1. 경량화 (Lightweight):
    • TFLite는 모바일 기기 및 IoT 장치와 같은 리소스 제한된 환경을 고려하여 설계되었습니다.
    • 모델을 경량화하여 작은 크기와 빠른 실행 속도를 제공하며, 제한된 메모리와 연산 능력을 효율적으로 활용합니다.
  2. 모바일 및 임베디드 환경 지원:
    • TFLite는 안드로이드, iOS, Raspberry Pi 등의 모바일 기기 및 임베디드 시스템과 호환됩니다.
    • 이러한 환경에서 모델을 효율적으로 실행할 수 있도록 최적화된 런타임 및 API를 제공합니다.
  3. 모델 변환 및 최적화:
    • TFLite는 TensorFlow 모델을 변환하고 최적화하여 TFLite 모델 형식으로 변환할 수 있습니다.
    • 이러한 변환과 최적화 과정은 모델 크기를 축소하고 실행 속도를 향상시키는데 도움을 줍니다.
  4. 하드웨어 가속:
    • TFLite는 하드웨어 가속을 지원하여 모델 실행 속도를 더욱 향상시킵니다.
    • GPU, DSP (Digital Signal Processor), NPU (Neural Processing Unit) 등의 하드웨어 가속을 활용하여 모델을 빠르게 실행할 수 있습니다.
  5. 다양한 모델 유형 지원:
    • TFLite는 이미지 분류, 객체 감지, 세그멘테이션, 자연어 처리 등 다양한 머신러닝 모델 유형을 지원합니다.
    • 사전 학습된 TensorFlow 모델을 TFLite로 변환하여 이러한 모델들을 모바일 및 임베디드 환경에서 실행할 수 있습니다.

TFLite는 모바일 애플리케이션, 스마트 기기, IoT 장치 등에서 머신러닝 모델을 효율적으로 실행하고 배포할 수 있는 강력한 도구입니다. 리소스 제한된 환경에서도 머신러닝을 활용할 수 있게 해주며, 빠른 모델 실행 및 온디바이스 인퍼런스를 가능하게 합니다.

 

 

그러면... 모바일 애플리케이션에 모델을 넣고 싶으니 학습시킨 pt 모델을 tflite로 변환해봅시다

!git clone https://github.com/ultralytics/yolov5  # clone
!cd yolov5
!pip install -r /content/yolov5/requirements.txt  # install

새 코랩 문서를 파서 아까와 같이 필요한 것들을 다시 받았습니다

아까 다운받은 pt 파일을 업로드하고 export를 돌려봤습니다

benchmarks.py를 열어보니 다양한 export 포맷을 지원하네요

netron을 받아서 파일을 열어보면 모델이 어떻게 생겼는지 시각적으로 확인할 수 있습니다

 

이제 플러터로 리얼타임 카메라, tflite_flutter 플러그인을 이용해서 앱에 모델을 넣고 빌드해보려고 합니다

이후 데이터 추가하고 보완해서 모델 새로 생성하고 업데이트하면 되겠네요!

화이팅!!

'Dev > 졸프' 카테고리의 다른 글

React Google translate + tts API 로 텍스트 번역, 읽기  (1) 2023.11.14
RN Platform adapter testing  (0) 2023.05.07