과학&기술

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

파프리카닷컴 2022. 8. 27. 10:48

[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

 

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

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

    (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)