00 YOLOX 아주 짧은 소개

Stream Perception Challenge (Workshop on Autonomous Driving at CVPR 2021)에서 1등을 수상한 논문입니다.

paper link

github link

주요 키워드 : YOLO, 1-stage detector, Real-time Object Detection, anchor-free

01 YOLOX를 설치하기 위한 사전 준비

YOLOX를 빌드하기 위해 선행되는 환경을 구축합니다.

01-1 운영체제

YOLOX를 사용하기 적합한 운영체제에 대해 설명합니다.

YOLOX는 기본적으로 CPU만 사용할 경우 운영체제의 제약이 없지만 GPU사용시 Windows와 Linux만 지원됩니다.

※ 이 문서는 Ubuntu 18.04 & 20.04를 기준으로 작성되었습니다.

01-2 Nvidia 드라이버

Ubuntu 환경에서 GPU를 활용하기 위한 드라이버 설치법입니다.

sudo apt update
sudo apt upgrade

제일 먼저 패키지 업데이트&업그레이드를 해줍니다.

(사진1 : 소프트웨어 & 업데이트)

사진1 의 숫자를 따라 소프트웨어 & 업데이트를 실행시킵니다.

(사진2 : 드라이버 목록)

Nvidia 드라이버 목록을 확인하여 설치합니다. 버전은 최소 460보다 높으며, 마지막에 sever 키워드가 없는 것으로 고릅니다. "바뀐 내용 적용"을 눌러 설치 한 후 컴퓨터를 재부팅하여 설치를 마무리합니다.

※ OS가 GPU를 인식하지 못 할 경우 Nvidia 드라이버 목록이 나타나지 않을 수 있습니다.

01-3 CUDA toolkit 설치

YOLOX를 위한 CUDA toolkit 설치법입니다.

CUDA 11.0 을 설치하겠습니다.

sudo apt update
sudo apt upgrade

제일 먼저 패키지 업데이트&업그레이드를 해줍니다.

※첨부된 사진의 CUDA 버전이 다를 수 있으나 절차상의 차이는 없습니다.

CUDA 11.0 설치 링크

(사진 3 : CUDA 설치 페이지)

링크를 클릭하고, 현재 사용중인 컴퓨터 환경에 맞게 옵션을 선택하면, 명령어가 제시됩니다.
두 줄의 명령어를 각각 터미널에 입력하여 설치합니다.

(사진 4 : CUDA 이용약관)

두 번째 명령어를 실행하면 CUDA 이용약관이 나타납니다. PageDown을 눌러 이용약관을 마지막 항목으로 이동 후 accept 를 입력합니다.

(사진 5 : CUDA 설치 옵션)

동의 후에 설치할 항목을 선택하는 화면이 나옵니다. 우리는 driver를 설치했으므로, 스페이스바를 눌러 해제 시킨 후 나머지 항목만을 남긴 채 install 합니다.

(사진 6 : CUDA 환경변수 설정)

사진 5에서 설치를 마친 후 환경 설정을 위해 사진 6의 내용을 적용합니다.

(1) 터미널에서 명령어 실행

sudo gedit ~/.bashrc

(2) 내용 추가

expert PATH
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/lib64:$LD_LIBRARY_PATH

(3) 저장 후 source ./bashrc 실행 또는 재부팅

여기까지 정상적으로 설치되었을 경우, 아래 명령어를 통해 CUDA의 버전을 확인 할 수 있습니다.

nvcc --version

(사진 7 : CUDA 정상 설치 확인 및 버전 체크)

01-4 cuDNN 설치

YOLOX를 위한 cuDNN 설치입니다.

cuDNN 8.1.1을 설치하겠습니다.

cuDNN 설치 링크

(사진 8 : cuDNN 버전 목록)

사진 8과 같이 cuDNN 8.1.1을 선택 한 후 리눅스용 라이브러리를 설치합니다.

tar -xvzf cudnn-11.2-linux-x64-v8.1.1.33.tgz

를 사용하여 다운 받은 파일의 압축을 해제합니다.

(사진 9 : cuDNN 파일)

압축을 해제하면 cuda라는 폴더가 생성됩니다. 이제 이 안의 파일을 cuda path에 복사하면 됩니다.

sudo cp -P cuda/include/cudnn*.h /usr/local/cuda/include 
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64

그 후 옮겨진 파일에 대해 권한 해제를 합니다.

sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* 

cuDNN설치가 완료되었으며, 아래의 명령어로 설치된 버전을 확인합니다.

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 

02 YOLOX 설치 및 실행

이제 YOLOX를 설치해봅시다.

02-1 YOLOX 빌드

YOLOX 리포지토리를 복제 후 YOLOX 디렉토리로 이동합니다.

git clone "https://github.com/Megvii-BaseDetection/YOLOX"
cd YOLOX

빌드에 필요한 요구사항을 설치합니다.

pip3 install -U pip && pip3 install -r requirements.txt

※ 이때 ONNX와 관련하여 오류가 나는 경우
requirements.txt 에서 onnx 관련된 내용을 지우고 다시 명령어를 실행합니다.
onnx는 YOLOX를 빌드하기위한 필요조건은 아닙니다.

(사진 11 : ONNX 오류 시)

이제 빌드합니다.
(첫번째 명령어 : 빌드, 두번째 명령어 : pycocotools install)

python3 setup.py develop
pip3 install cython; pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

02-2 사전 학습 모델 설치 및 기본 예제 테스트

사즌 학습 모델 파일은 .pth의 확장자를 가지고 있습니다.

이 파일은 github 리포지토리에 clone 할 때 함께 설치되지 않으므로, 수동으로 직접 설치해야합니다.

아래와 같이 YOLOX 리포지토리 ReadMe에서 pth 파일을 다운로드 합니다.

(사진 12 : 사전 학습 모델 설치)

아래의 명령어를 실행하여 dog.jpg에 대해 coco 모델로 테스트 해봅시다.

(사진 13 : 기본 예제 실행)

python tools/demo.py image -n yolox-s -c ./yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu

YOLOv4와 달리 실행 결과가 바로 나타나는것이 아니라 YOLO/YOLOX_outputs/yolox_s/vis_res/ 의 실행 시간을 이름으로 하는 폴더에 결과물이 저장됩니다.

(사진 14 : dog.jpg 실행결과)

02-3 tensorRT 설치

tensorRT는 딥러닝 모델을 경량화 시켜줍니다.

tensorRT 설치 링크

링크를 접속하여 로그인 한 후, 간단한 설문조사를 마치면 버전 릴리즈 노트 목록이 나타납니다.

(그림 15 : tensorRT 설치 목록)

ubuntu 18.04, cuda 11.0 전용 파일을 설치합니다.

아래 명령어로 압축을 풀고 pip 를 업그레이드 해둡니다.

tar -xvzf TensorRT-7.2.3.4.Ubuntu-18.04.x86_64-gnu.cuda-11.0.cudnn8.1.tar.gz
pip3 install –upgrade pip

그 후 환경변수를 적용합니다. egcd

(사진 16 : tensorRT 환경변수 적용)

sudo gedit ~/.bashrc

(2) 내용 추가

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chlee/TensorRT-7.2.3.4/lib 

(3) bashrc 변경 적용 또는 재부팅

source ~/.bashrc

그 후 TensorRT-7.2.3.4/python 폴더에서 현재 파이썬에 맞는 패키지를 실행합니다.

(사진 17 : tensorRT 패키지 설치 1)

python3 -m pip install tensorrt-7.2.3.4-cp38-none-linux_x86_64.whl 

cp36 = python3.6

cp37 = python3.7

cp38 = python3.8

그리고 uff 폴더에서 똑같이 패키지를 설치합니다.

(사진 18 : tensrRT 패키지 설치2)

python3 -m pip install uff-0.6.9-py2.py3-none-any.whl

그 후 graphsurgeon 폴더에서 패키지를 설치합니다.

python3 -m pip install graphsurgeon-0.4.5-py2.py3-none-any.whl

계속해서 onnx_graphsurgeon 폴더에서 패키지를 설치합니다.

python3 -m pip install onnx_graphsurgeon-0.2.6-py2.py3-none-any.whl

설치가 마무리되었습니다. 파이썬을 켜고 tensorrt 버전을 확인해서 정상적으로 설치되었는지 확인합니다.

python3
import tensorrt
tensorrt.__version__

02-4 torch2rt 설치

torch2rt는 pytorch에 tensorrt를 적용하기 쉽도록 도와줍니다.

git clone "https://github.com/NVIDIA-AI-IOT/torch2trt"

를 사용하여 리포지토리를 복제합니다.

unzip torch2trt-master.zip

으로 압축을 해제하고

sudo python3 setup.py install

로 설치하면 torch2rt를 사용할 수 있습니다.

02-5 데이터셋 만들기

YOLOX에서는 기존 YOLOv4 에서 사용했던 데이터 셋을 그대로 쓸 순 없습니다.

따라서 우리가 가진 말벌 데이터셋의 YOLOv4 방식의 주석을 COCO 주석으로 변환합시다.

※ 데이터셋의 이미지는 모두 jpg여야 합니다.

git clone "https://github.com/Taeyoung96/Yolo-to-COCO-format-converter"

리포지토리를 복제합니다. 그러면 7개의 파일이 있습니다.

main.py 를 열고 classes를 아래 사진과 같이 수정해줍니다.

바꾸고자 하는 이미지를 /tutorial/test_img에 넣어보았습니다. 경로는 어디에도 관계없습니다. 실행 시 파라미터로 넣어주기 때문입니다.

coco로 변환하기에 앞서 경로 정보가 담긴 두 개의 txt 파일을 수정해줘야 합니다.

path_replacer.py를 사용하면 일괄 변경을 할 수 있습니다.

기본 명령어는 아래와 같습니다. (※절대 경로를 사용합니다.)

python3 path_replacer.py --path_image_folder <File path where the images are located> --path_txt <File path of the 'txt' file you want to create>

예를 들어 이 글을 작성하는 저의 경우 아래 처럼 됩니다.

python path_replacer.py --path_image_folder /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/train --path_txt /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/train.txt

python path_replacer.py --path_image_folder /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/valid --path_txt /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/valid.txt

txt파일의 모든 내용이 변경되었습니다. 이렇게 경로 재지정을 했다면 이제 이미지 변환을 시작합니다.

python main.py --path <Absolute Path of train.txt> --output <Name of the json file>

json 파일의 이름을 지정해줘야 하므로 train은 instances_train2017.json
valid는 instances_val2017.json로 지정합니다. 왜냐하면 YOLOX에서 coco데이터셋을 사용할 때 반드시 이 파일명을 요구하기 때문입니다.

python3 main.py --path /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/train/ --output instances_train2017.json

python3 main.py --path /home/cilab/temp_yj/temp/Yolo-to-COCO-format-converter/tutorial/test_img/valid/ --output instances_val2017.json

이제 coco라는 폴더를 만들고 그 속에 세 개의 폴더(annotations, train2017, val2017)를 만듭니다.

그리고 각 폴더에 대해,

annotations : json 파일 두 개를 넣어줍니다.

train2017 : train의 '사진만' 넣어줍니다. (yolov4에서 필요했던 txt 주석은 필요없습니다.)

val2017 : valid의 '사진만' 넣어줍니다. (yolov4에서 필요했던 txt 주석은 필요없습니다.)

이것으로 YOLOv4의 데이터셋을 coco 형식으로 완전히 변경하였습니다.

02-6 학습하기

2-5에서 만든 데이터 셋을 학습에 활용해 봅시다.

YOLOX/yolox/data/datasets/coco_classes.py 파일을 열어서 수정합니다.

기존의 coco class를 지우지 말고 주석처리 한 후 벌로 바꿉시다.
※ 주의 : 이 수정을 적용하면 coco_classes.py를 원래대로 되돌리기 전까지 dog.jpg 예제가 작동하지 않습니다.

http://cilab427.synology.me:5000/ 에 접속합니다 .

/ci_data/ 농촌진흥청 /YOLOX/ 데이터 / 에 COCO 문법으로 작성된 최신 말벌 데이터 셋이 있습니다 .
( 압축버전 , 비압축버전 2 가지 )

둘 중 하나를 선택해 다운로드 합니다 . 압축 버전은 다운받자마자 압축을 해제 합니다 .

다운로드 받은 데이터 셋 폴더를 YOLOX/datasets/ 에 옮깁니다 .

그 후 아래 명령어를 통해 학습을 시작합니다.

python3 tools/train.py -f exps/default/yolox_s.py -d 1 -b 16 --fp16 -c ./yolox_s.pth

python3 tools/train.py -f exps/default/yolox_m.py -d 1 -b 16 --fp16 -c ./yolox_m.pth

python3 tools/train.py -f exps/default/yolox_l.py -d 1 -b 16 --fp16 -c ./yolox_l.pth

python3 tools/train.py -f exps/default/yolox_x.py -d 1 -b 16 --fp16 -c ./yolox_x.pth

-d : gpu 디바이스의 수입니다. 장착된 gpu가 n개일 경우 1대신 n을 적어 더 빨리 학습할 수 있습니다.

-b : 배치사이즈

--fp16 : yolov4의 cuDNN half 와 같습니다. 플로팅포인트32비트를 16비트로 바꿔 학습 속도를 올립니다.

-c : 전이학습 할 파일의 경로

학습 결과는 YOLOX_outputs에 저장됩니다.

03 타일링 적용

파일 설치 링크

파일 설치 링크를 클릭하여 다운로드 받습니다. (타일 이미지, 가중치 파일, 코드)

그림1과 같이 설치받은 파일을 압축해제하고 tools를 제외한 3개의 파일을 YOLOX 메인 폴더에 넣습니다.

그림 1

그리고 그림 2와 같이 남은 tools 폴더를 열어 내부의 6개 파일을 YOLOX-main/tools에 넣습니다.

demo_crop.py = 검출 결과를 잘라 저장하는 프로그램

demo_tile_default.py = 바운딩박스 처리 없이 작동되는 프로토타입

demo_tile_ozge_unel.py = 외즈게 위넬 방식

demo_tile_stephanecharette.py = 스테판 샤렛 방식

demo_tile_kyj_upgrade.py = CILAB 방식

demo_tile_kyj.py = CILAB 방식 구버전

그림 2

그 후, 그림 3, 4와 같이 YOLOX-main/exps/example/yolox_voc 폴더에서 yolox_voc_s.py를 열고 self.num_classes = 20을 self.num_classes = 80으로 변경합니다.

그림 3

그림 4

그리고 아래 코드를 사용해 검출합니다. (순서대로 스테판샤렛, CILAB, 외즈게위넬)

python3 tools/demo_tile_stephanecharette.py image -f exps/example/yolox_voc/yolox_voc_s.py -c ./best_ckpt.pth --path ./tile_test/ --conf 0.25 --nms 0.45 --tsize 320 --save_result --device gpu

python3 tools/demo_tile_kyj_upgrade.py image -f exps/example/yolox_voc/yolox_voc_s.py -c ./best_ckpt.pth --path ./tile_test/ --conf 0.25 --nms 0.45 --tsize 320 --save_result --device gpu

python3 tools/demo_tile_ozge_unel.py image -f exps/example/yolox_voc/yolox_voc_s.py -c ./best_ckpt.pth --path ./tile_test/ --conf 0.25 --nms 0.45 --tsize 320 --save_result --device gpu

부록 OpenCV 설치

YOLOX는 python으로 wrapping된 opencv를 사용하므로 해당 문서를 아래로 내렸습니다.

YOLOX를 위한 OpenCV 설치입니다.

opencv 4.4를 설치하겠습니다.


sudo apt update  
sudo apt upgrade

제일 먼저 패키지 업데이트&업그레이드를 해줍니다.


sudo apt-get install build-essential cmake  
sudo apt-get install pkg-config  
sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev  
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev  
sudo apt-get install libv4l-dev v4l-utils  
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  
sudo apt-get install libgtk-3-dev  
sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev  
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev  
sudo apt-get install python3-dev python3-numpy

opencv를 설치하기 위해 사전에 필요한 패키지를 모두 설치합니다.


mkdir opencv  
cd opencv  
wget -O opencv.zip [https://github.com/opencv/opencv/archive/4.4.0.zip](https://github.com/opencv/opencv/archive/4.4.0.zip)  
wget -O opencv\_contrib.zip [https://github.com/opencv/opencv\_contrib/archive/4.4.0.zip](https://github.com/opencv/opencv_contrib/archive/4.4.0.zip)  
unzip opencv.zip  
unzip opencv\_contrib.zip

opencv를 설치할 디렉토리를 만들고 2개의 압축파일(opencv, opencv_contrib)을 설치 한 후 압축을 해제합니다.

(사진 10 : opencv)
사진과 같이 opencv/opencv-4.4.0/build 디렉토리에서 아래의 명령어를 입력합니다.


cmake -D CMAKE\_BUILD\_TYPE=RELEASE -D CMAKE\_INSTALL\_PREFIX=/usr/local -D WITH\_TBB=OFF -D WITH\_IPP=OFF -D WITH\_1394=OFF -D BUILD\_WITH\_DEBUG\_INFO=OFF -D BUILD\_DOCS=OFF -D INSTALL\_C\_EXAMPLES=ON -D INSTALL\_PYTHON\_EXAMPLES=ON -D BUILD\_EXAMPLES=OFF -D BUILD\_PACKAGE=OFF -D BUILD\_TESTS=OFF -D BUILD\_PERF\_TESTS=OFF -D WITH\_QT=OFF -D WITH\_GTK=ON -D WITH\_OPENGL=ON -D BUILD\_opencv\_python3=ON -D OPENCV\_EXTRA\_MODULES\_PATH=../../opencv\_contrib-4.4.0/modules -D WITH\_V4L=ON -D WITH\_FFMPEG=ON -D WITH\_XINE=ON -D OPENCV\_ENABLE\_NONFREE=ON -D BUILD\_NEW\_PYTHON\_SUPPORT=ON -D OPENCV\_SKIP\_PYTHON\_LOADER=ON -D OPENCV\_GENERATE\_PKGCONFIG=ON ../

명령어가 정상적으로 작동되었다면 아래의 문구를 확인 할 수 있습니다.

-- Configuring done

-- Generating done

-- Build files have been written to: /home/webnautes/opencv/opencv-4.4.0/build

그리고 아래 명령어로 컴파일&인스톨합니다. (시간이 오래 걸립니다.)


time make -j$(nproc)  
sudo make install

결과를 확인하기 위해 아래 명령어를 입력하여 /usr/local/lib 가 출력되는지 확인합니다.

cat /etc/ld.so.conf.d/\*

+ Recent posts