RUP라는 창업 프로젝트를 진행하면서 yolo
를 사용한 Real Time Object Detection
을 해야되는 상황이 생겼다. 그래서 yolo
를 darknet
을 이용해 환경을 구축했는데 darknet
을 로컬 환경에 바로 구축하면 python
패키지의 버전문제, cuda
버전문제등 에러가 발생할 수 있으므로 docker
를 이용해 환경구축을 했다.
Dockerfile
Dockerfile
을 이용해 환경을 구축했고 해당 가상환경은 ubuntu 20.04
버전을 이용하였다.
FROM nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install build-essential -y && \
apt-get install pkg-config -y && \
apt-get install libjpeg-dev libtiff5-dev libpng-dev -y && \
apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev -y && \
apt-get install libv4l-dev v4l-utils -y && \
apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -y && \
apt-get install libgtk-3-dev -y && \
apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev -y && \
apt-get install libatlas-base-dev gfortran libeigen3-dev -y && \
apt-get install qt5-default -y && \
apt-get install python3-dev python3-numpy python3-pip -y && \
apt-get install git -y && \
apt-get install wget -y && \
apt-get install zsh -y && \
apt-get install tmux -y && \
apt-get install vim -y && \
apt-get install -y language-pack-en && \
apt install libcanberra-gtk-module libcanberra-gtk3-module -y && \
apt install libssl-dev -y && \
apt install fonts-powerline -y && \
apt install zip -y && \
update-locale
#install cmake
WORKDIR /root
RUN wget https://cmake.org/files/v3.20/cmake-3.20.4.tar.gz
RUN tar -xvzf cmake-3.20.4.tar.gz && rm cmake-3.20.4.tar.gz
WORKDIR /root/cmake-3.20.4
RUN ./bootstrap --prefix=/usr/local
RUN make -j4
RUN make install
#install opencv
RUN mkdir /root/opencv
WORKDIR /root/opencv
RUN wget -O opencv-4.5.2.zip https://github.com/opencv/opencv/archive/refs/tags/4.5.2.zip
RUN wget -O opencv_contrib-4.5.2.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip
RUN unzip opencv-4.5.2.zip
RUN unzip opencv_contrib-4.5.2.zip
RUN rm opencv-4.5.2.zip opencv_contrib-4.5.2.zip
WORKDIR /root/opencv/opencv-4.5.2
RUN mkdir build
WORKDIR /root/opencv/opencv-4.5.2/build
RUN 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.5.2/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 ../
RUN make -j4
RUN make install
#install convert2Yolo
WORKDIR /root
RUN git clone https://github.com/ssaru/convert2Yolo.git
RUN pip3 install -r convert2Yolo/requirements.txt
#install Yolov4
RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1
ENV LD_LIBRARY_PATH /usr/local/cuda/lib64/stubs/:$LD_LIBRARY_PATH
WORKDIR /
RUN git clone https://github.com/AlexeyAB/darknet
WORKDIR darknet
RUN sed -i 's/GPU=0/GPU=1/' ./Makefile && \
sed -i 's/CUDNN=0/CUDNN=1/' ./Makefile && \
sed -i 's/OPENCV=0/OPENCV=1/' ./Makefile
RUN mkdir build_release
WORKDIR build_release
RUN cmake ..
RUN cmake --build . --target install --parallel 8
RUN rm /usr/local/cuda/lib64/stubs/libcuda.so.1
#setting vim
COPY vimrc /root/.vimrc
#setting tmux
WORKDIR /root
RUN git clone https://github.com/gpakosz/.tmux.git
RUN ln -s -f .tmux/.tmux.conf
RUN cp .tmux/.tmux.conf.local .
#install oh my zsh
RUN chsh -s /usr/bin/zsh && \
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" && \
sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="agnoster"/' ~/.zshrc && \
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting && \
git clone https://github.com/zsh-users/zsh-autosuggestions.git ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions && \
sed -i 's/plugins=(git)/plugins=(git zsh-syntax-highlighting zsh-autosuggestions)/' ~/.zshrc
#setting gui
ENV NO_AT_BRIDGE=1
WORKDIR /darknet
CMD ["zsh"]
우선 코드를 살펴보면 line 1에서 nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04 이미지를 들고오는 것을 확인할 수 있다. 당연히 cuda와 cudnn 환경이 셋팅된 이미지가 필요해서 해당 이미지를 들고왔다.
line 3은 Dockerfile
을 이용해 build를 하기 때문에 사용자의 입력값을 받지않도록 설정한 것이다. line 5를 보면 darknet
의 환경구축을 위해 필요한 패키지들을 설치했다. darknet
에 필요한 패키지 말고도 다른 패키지도 있는 것을 확인할 수 있는데 이는 Dockerfile
을 이용해 이미지를 build하면 쉘 내부로 들어가서 학습을 시키기 위해 내가 선호하는 것들을 셋팅하기 위해서이다.
line 30부터 line 85까지는 darknet
에 필요한 cmake
와 opencv
를 설치하는 과정이다.
line 88을 보면 convert2Yolo를 설치한다. RUP 프로젝트를 할때 dataset을 VOC 형식으로 만들었기 떄문에 yolo 형식으로 변환할 필요가 있어서 설치했다.
line 93부터 line 112까지는 darknet에서 권장하는 방법으로 설치를 진행했고 line 102를보면 GPU
, CUDNN
, OPENCV
를 모두 사용하기 때문에 해당값들을 1
로 설정했다.
line 114부터는 쉘에 접속한후 사용하기 편하게 다양한 유틸을 설치해준것이다.
RUN
위의 Dockerfile
을 build한 후 실행하는 방법은 아래와 같다.
docker run --gpus all -it --rm \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-v [local path]:[remote path] \
-e DISPLAY=$DISPLAY \
-p 8888:8888 \
--name darknet hogbal/rup:darknet
line 3에 보면 local path
부분에 yolo
를 학습 시킬 수 있는 폴더를 지정해서 쉘에 접속한후 학습을 진행하면 된다. 학습을 진행하는 명령은 아래와 같다.
/darknet/darknet detector train data/obj.data [cfg] [pre-trained-models] -dont_show -mjpeg_port 8888 -map
darknet github를 참고하면 더 다양한 명령들이 존재한다.