본문 바로가기

Some tips

[Anaconda/Win10] TF기반 YoloV4 학습/테스트

[Anaconda/Win10] TF기반 YoloV4 학습/테스트

[Anaconda/Win10] Running YoloV4 code with TF

 

 

 

1. 개발환경 

- Win10/Pycharm/CUDA 11.1/cuDNN 8.0.x/

- Windows 10에서 Anaconda를 기반으로 Python 코드를 실행하고자 함

- Torch 버전은 좀 더 번거로워서 TF 기반 YoloV4를 우선적으로 테스트

- 가상환경 설정 (deepflowest.tistory.com/181 를 참고함)

- CUDA와 cuDNN 라이브러리 이용은 해당 PC의 환경변수를 참고하니.. 알아서 세팅

$ conda create -n yolo pip python=3.7 
$ conda activate yolo
$ pip install tensorflow-gpu==2.4.0
$ pip install opencv-python
$ pip install easydict
$ pip install pillow

*2020.12.15일 자로 tensorflow 2.4.0 pip 패키지가 업데이트. tensorflow마다 빌드할 때 CUDA버전이 다르므로 이에 관련된 내용은 이 포스트의 가장 하단에 다시 설명.

 

 

2. 준비

- Source Code: github.com/hunglc007/tensorflow-yolov4-tflite

- Yolov4 weight 파일: github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

- Anaconda에서 git clone 명령어로 코드 받으려면 아래 코드 실행. 필자는 github에서 zip 파일 받아서 압출을 풀었음.

프로젝트 명(압축해제 폴더) = tensorflow-yolov4-tflite 일 것임.

$ conda install git

Weight 파일은 해당 링크를 그냥 다운로드 받아서 직접 \{YoloV4 home}\data\ 위치에 옮김. data가 아니어도 됨.

 

 

3. 기본 Test (Detect.py 실행)

- 여러 블로그에서 이미 설명하고 있고, 직접 tensorflow-yolov4-tflite\README.md 을 참고해도 됨.. 어렵지 않음.

- 앞서 다운로드한 weight 파일을 이용하여 직접 inference 하거나, tflite 또는 tensorRT 형식의 최적화 후에 inference를 수행하는 코드들임.

- python detect.py 명령어를 사용할 때 뒤에 flag를 추가하여 설정하는 방법도 있지만 코드에 미리 기본 값을 세팅해놓으면 그냥 python detect.py 만 실행해도 된다.

- detect.py 를 열어보면 상단에 설정된 값들이 나온다... 아래와 같이 설정값들을 본인 path에 맞게 수정..

flags.DEFINE_string('framework', 'tf', '(tf, tflite, trt')
flags.DEFINE_string('weights', './checkpoints/yolov4-416',
                    'path to weights file')
flags.DEFINE_integer('size', 416, 'resize images to')
flags.DEFINE_boolean('tiny', False, 'yolo or yolo-tiny')
flags.DEFINE_string('model', 'yolov4', 'yolov3 or yolov4')
flags.DEFINE_string('image', './data/kite.jpg', 'path to input image')
flags.DEFINE_string('output', 'result.png', 'path to output image')
flags.DEFINE_float('iou', 0.45, 'iou threshold')
flags.DEFINE_float('score', 0.25, 'score threshold')

 

4. Train or Evaluation

 Detect(=Test=Inference)를 수행할 때는 1개의 이미지만 사용해도 된다. 하지만, Train은 각각 수많은 데이터 그리고 가능하면 공인된 데이터셋이 필요하다. 이미 YoloV4 코드에서도 사용되듯.. COCO dataset을 사용한다.

 데이터셋 용량이 어마어마하다...다운로드 방식은 이미 tensorflow-yolov4-tflite\scripts\get_coco_dataset_2017.sh 위치에 파일이 잇다.. 하지만... 이것은 shell script(.sh 파일) 파일로 Windows에서 실행할 수 없다... anaconda에서도...

 Windows에서 실행하려다가 쉬운 방법을 찾지 못해 그냥 수동으로 다운로드한다... 해당 스크립트를 내용을 참고하여 진행해보자면..

 

  (1) 두 개의 폴더 생성

  script\coco\images 

  script\coco\annotations 

 

  (2) 아래 파일을 다운로드. (cocodataset.org/#home)

  http://images.cocodataset.org/zips/val2017.zip (1GB)

  http://images.cocodataset.org/annotations/annotations_trainval2017.zip (241MB) 

 

  (3) 압축해제 

  coco/images에 val2017.zip 압축 해제

  coco/annotations 에 annotations_trainval2017.zip 압축 해제

 

  (4) coco관련 dataset 설정

  - 다음 명령어 실행. 자신의 cocodataset\annotations\instances_val_2017.json 위치를 --input에 넣어준다.  

   - (Pycharm의 UI 하단 Terminal을 이용하여 주로 명령어를 실행함)

 $ python coco_convert.py --input ./coco/annotations/instances_val2017.json --output val2017.pkl 

  또는, coco_convert.py의 상단의 경로를 알아서 수정. 그리고 python coco_convert.py 만 실행해도 됨.

 

  다음으로 coco_annotation.py 내용 수정. 상단 flags.DEFINE_string 들의 내용을 보고 수정.

  - coco_data는 이미 앞서 coco_convert에서 생성된 파일이니 상대 위치 확인하여 수정하거나 그대로 둠.

  - classes 역시 원래 있는 파일이라 그대로 둠.

  - coco_path는 따로 coco dataset을 압축 푼 위치로 수정함.

  - image_path 이미지 위치를 현 프로젝트를 중심으로 수정.

  - anno_path_val 생성될 위치. 필자는 원래대로 '../data/dataset/val2017.txt'으로 설정.

  - 아래 코드를 실행하고 나서 0이 출력된다면 실패. 

  - tensorflow-yolov4-tflite\data\dataset\val2017.txt 를 열어서 레이블링 된 것을 확인

 $ python coco_annotation.py

 

  (5) train.py 실행

  - 학습과 관련된 내용은 별개. 현재는 실행에 목적을 두고 있음.

  - core\config.py 파일을 수정. #train options에 해당하는 내용들을 수정하자.

  - 앞서 생성된 파일의 위치를 지정. 이미 설정된 path 문제없음. 

  - train.py 상단에서 주의할 건 한 가지: weights 파일 위치. 자신의 path 확인해서 맞추자. => 전이 학습용

  - 아래 코드 실행. 끝.

 $ python train.py

 

 

5. 결과

 

 

 

 

6. GPU 사용과 관련된 문제

만약.. 코드를 run 하고 나서 학습이 시작되기 전 이런 에러가 뜬다면,, GPU 사용 없이 CPU로 코드가 실행될 것이다..

2020-12-28 09:21:21.597917: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-12-28 09:21:21.618150: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cublas64_10.dll'; dlerror: cublas64_10.dll not found
2020-12-28 09:21:21.685288: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cufft64_10.dll
2020-12-28 09:21:21.728368: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library curand64_10.dll
2020-12-28 09:21:21.827181: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cusolver64_10.dll
2020-12-28 09:21:21.853031: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cusparse64_10.dll'; dlerror: cusparse64_10.dll not found
2020-12-28 09:21:21.878954: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudnn64_7.dll'; dlerror: cudnn64_7.dll not found

  - 이미 다른 블로그에서도 설명하지만, 원하는 CUDA 버전이 없기 때문임.

  - CUDA를 tensorflow에 맞춰주던가, tensorflow를 현재 CUDA 버전에 맞춰야 함. 문제는 최신 GPU의 경우 어쩔 수 없이 CUDA 버전을 상향할 수밖에 없으며, tensorflow를 거기에 맞춰줄 수 밖에 없다.

  - Tensorflow 또한.. 발 빠르게 대처 중으로 보임. (github.com/tensorflow/tensorflow/releases)

  - 현재 필자는 CUDA 11.0과 11.1을 사용 중.. 위 링크를 가면 아래와 같은 문구 확인.

    TensorFlow pip packages are now built with CUDA11 and cuDNN 8.0.2.

 

  - 아래와 같은 과정을 추가로 수행함.

    (1) 원래 이 포스트의 설명과 다르게 하위 버전의 tensorflow를 사용하다가 pip install tensorflow-gpu==2.3.0 을 사용해서 최신 버전 설치함.

    (2) train.py 코드에서 에러 발생해서 해당 부분 삭제. 원인 확인 못함. 버전이 바뀌면서 사용법이 바뀐 듯 하나..

    (귀찮으므로 그냥 삭제만. 향후 어떤 문제가 발생할지 모르니... 에러를 따라 본인이 알아서 해결할 것..)

  아래 코드를 삭제. (train.py 19~20 line)
  if len(physical_devices) > 0:
       tf.config.experimental.set_memory_growth(physical_devices[0], True)

 

 

  • sweet_die 2021.03.15 17:34 댓글주소 수정/삭제 댓글쓰기

    주인장님 위에 코드를 실행하였는데요.
    CUDA_ERROR_OUT_OF_MEMORY: out of memory 에러를 혹시 해결하셨나요?
    제가 사용하고있는 GPU의 메모리가 4096MIB로 잡혀있더라구요

    • 개인사정으로 인해 이 코드에서 요구하는 메모리 크기를 확인 못하고 있습니다...
      다만 통상적으로 파이썬이 다른 프레임워크에 비해 굉장히 많은 메모리를 잡습니다..
      그리고 딥러닝하기에 4기가는 적은 메모리같습니다.. 평소 딥러닝으로 사용 안하시지 않나요? 저는 2080Ti 11기가 사용하고 있습니다.