ΠΠΎΠ»ΡΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·!
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ! ΠΠΎΡΠΎΠ³ΠΈΠ΅ Π΄ΡΡΠ·ΡΡ, Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Ρ
ΠΎΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ TensorRT, RetinaNet Π½Π° Π±Π°Π·Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π°Π΄Π°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ: Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠΈΡΡ Π΄Π°ΡΠ°ΡΠ΅Ρ, ΠΎΠ±ΡΡΠΈΡΡ Π½Π° Π½ΡΠΌ ΡΠ΅ΡΡ RetinaNet/Unet Π½Π° Pytorch1.3+, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π²Π΅ΡΠ° Π² ONNX, Π΄Π°Π»Π΅Π΅ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ Π² engine TensorRT ΠΈ Π²ΡΡ ΡΡΠΎ Π΄Π΅Π»ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π² docker, ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π° Ubuntu 18 ΠΈ ΠΊΡΠ°ΠΉΠ½Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π° ARM(Jetson)* Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΡΡΡΠ½ΠΎΠ΅ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π³ΠΎΡΠΎΠ²ΡΠΉ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠΊΡΠΏΠΎΡΡΡ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ RetinaNet/Unet, Π½ΠΎ ΠΈ ΠΊ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΠΎ Π²ΡΠ΅ΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΎΠ±Π²ΡΠ·ΠΊΠΎΠΉ.
ΠΡΠ°ΠΏ 1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ΠΠ΄Π΅ΡΡ Π²Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΡΠ» ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ Ρ ΠΎΡΡ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π½Π° desktop ΠΌΠ°ΡΠΈΠ½Π΅, ΠΊΠ°ΠΊ Π²ΠΏΡΠΎΡΠ΅ΠΌ ΠΈ Π½Π° devbox. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ β ΡΡΠΎ python virtual environment ΠΈ cuda 10.2 (ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ nvidia) ΠΈΠ· deb.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΠ²Π΅ΠΆΠ΅ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Π°Ρ Ubuntu 18. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ cuda 10.2(deb), ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Ρ, ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ docker, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π΄ΠΎΠΊΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡΠΈ, Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
Π ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π³Π»ΡΠ΄ΡΠ²Π°ΡΡ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π΅Π»Π°Π΅ΠΌ git clone
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΡΡΡ-ΡΡΡΡ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ docker Ρ nvidia-ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² NGC Cloud ΠΈ Π·Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΡΡΡΡ. ΠΠ΄ΡΠΌ ΡΡΠ΄Π°
ΠΡΠΏΠΎΠ»Π½ΠΈΠΌ:
docker login nvcr.io
Username: $oauthtoken
Password: <Your Key> - ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ»ΡΡ
Username ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ. ΠΡ Π²ΠΎΡ, ΡΡΠΈΡΠ°ΠΉ, ΡΡΠ΅Π΄Π° ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠ°!
ΠΡΠ°ΠΏ 2. Π‘Π±ΠΎΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° docker
ΠΠ° Π²ΡΠΎΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΌΡ ΡΠΎΠ±Π΅ΡΠ΅ΠΌ docker ΠΈ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΎΡΡΡΠΌΠΈ.
ΠΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ Π² ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ retina-examples ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ
docker build --build-arg USER=$USER --build-arg UID=$UID --build-arg GID=$GID --build-arg PW=alex -t retinanet:latest retinanet/
ΠΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ docker ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Ρ Π² Π½Π΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ·Π΅ΡΠ° β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ ΠΏΠΈΡΠ°ΡΡ Π½Π° ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ VOLUME Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ·Π΅ΡΠ°, ΠΈΠ½Π°ΡΠ΅ Π±ΡΠ΄Π΅Ρ root ΠΈ Π±ΠΎΠ»Ρ.
ΠΠΎΠΊΠ° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ docker, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΠ·ΡΡΠΈΠΌ Dockerfile:
FROM nvcr.io/nvidia/pytorch:19.10-py3
ARG USER=alex
ARG UID=1000
ARG GID=1000
ARG PW=alex
RUN useradd -m ${USER} --uid=${UID} && echo "${USER}:${PW}" | chpasswd
RUN apt-get -y update && apt-get -y upgrade && apt-get -y install curl && apt-get -y install wget && apt-get -y install git && apt-get -y install automake && apt-get install -y sudo && adduser ${USER} sudo
RUN pip install git+https://github.com/bonlime/pytorch-tools.git@master
COPY . retinanet/
RUN pip install --no-cache-dir -e retinanet/
RUN pip install /workspace/retinanet/extras/tensorrt-6.0.1.5-cp36-none-linux_x86_64.whl
RUN pip install tensorboardx
RUN pip install albumentations
RUN pip install setproctitle
RUN pip install paramiko
RUN pip install flask
RUN pip install mem_top
RUN pip install arrow
RUN pip install pycuda
RUN pip install torchvision
RUN pip install pretrainedmodels
RUN pip install efficientnet-pytorch
RUN pip install git+https://github.com/qubvel/segmentation_models.pytorch
RUN pip install pytorch_toolbelt
RUN chown -R ${USER}:${USER} retinanet/
RUN cd /workspace/retinanet/extras/cppapi && mkdir build && cd build && cmake -DCMAKE_CUDA_FLAGS="--expt-extended-lambda -std=c++14" .. && make && cd /workspace
RUN apt-get install -y openssh-server && apt install -y tmux && apt-get -y install bison flex && apt-cache search pcre && apt-get -y install net-tools && apt-get -y install nmap
RUN apt-get -y install libpcre3 libpcre3-dev && apt-get -y install iputils-ping
RUN mkdir /var/run/sshd
RUN echo 'root:pass' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
CMD ["/usr/sbin/sshd", "-D"]
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ°, ΠΌΡ Π±Π΅ΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π°ΡΠΈ Π»ΡΠ±ΠΈΠΌΡΠ΅ Π»ΠΈΠ±Ρ, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ retinanet, Π½Π°ΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΡΠ°Π±ΠΎΡΡ Ρ Ubuntu ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ openssh. ΠΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΈΠ΄Π΅Ρ ΠΊΠ°ΠΊ ΡΠ°Π· Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·Π° nvidia, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ Π»ΠΎΠ³ΠΈΠ½ Π² NGC Cloud ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Pytorch1.3, TensorRT6.x.x.x ΠΈ Π΅ΡΠ΅ ΠΊΡΡΡ Π»ΠΈΠ±, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ cpp ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π½Π°ΡΠ΅Π³ΠΎ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ°.
ΠΡΠ°ΠΏ 3. ΠΠ°ΠΏΡΡΠΊ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° docker
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΠΊΠ΅ΠΉΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΠΌ nvidia docker. ΠΡΠΏΠΎΠ»Π½ΠΈΠΌ:
docker run --gpus all --net=host -v /home/<your_user_name>:/workspace/mounted_vol -d -P --rm --ipc=host -it retinanet:latest
Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ ssh <curr_user_name>@localhost. ΠΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°, ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ Π² PyCharm. ΠΠ°Π»Π΅Π΅ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ
Settings->Project Interpreter->Add->Ssh Interpreter
Π¨Π°Π³ 1
Π¨Π°Π³ 2
Π¨Π°Π³ 3
ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ Π²ΡΡ ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡΠΈΠ½ΡΠΎΡΠ°Ρ
,
Interpreter -> /opt/conda/bin/python
β ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ln Π½Π° Python3.6 ΠΈ
Sync folder -> /workspace/retinanet
ΠΠΌΡΠΌ ΡΠΈΠ½ΠΈΡ, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ Π²ΡΡ, ΡΡΠ΅Π΄Π° Π³ΠΎΡΠΎΠ²Π° ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ!
ΠΠΠΠΠ!!! Π‘ΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΡΡΠ½ΡΡΡ ΠΈΠ· docker ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ Retinanet. Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠΌ ΠΌΠ΅Π½Ρ Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΠ½ΠΊΡ
Deployment->Download
ΠΠΎΡΠ²ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈ Π΄Π²Π΅ ΠΏΠ°ΠΏΠΊΠΈ build, retinanet.egg-info ΠΈ _Π‘.so
ΠΡΠ»ΠΈ Π²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ, ΡΠΎ ΡΡΠ΅Π΄Π° Π²ΠΈΠ΄ΠΈΡ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ, ΠΊ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ RetinaNet.
ΠΡΠ°ΠΏ 4. Π Π°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΎΠ±ΡΡΠ°Π΅ΠΌ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ
ΠΠ»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ Ρ, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠΎ Π²Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΈΠ»ΠΈ Π΄Π°ΡΠ°ΡΠ΅Ρ ΠΈ ΡΠΊΠ°ΡΠ°Π»ΠΈ Π΅Π³ΠΎ, Π½ΠΎ ΡΡΠ°Π·Ρ Π·Π°ΡΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² Π½Π°Ρ RetinaNet Π½Π΅ Π²ΡΠΉΠ΄Π΅Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² COCO. Π’ΡΠ»Π·Π° Π΄Π»Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²:
markup_utils/supervisly_to_coco.py
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Category Π² ΡΠΊΡΠΈΠΏΡΠ΅ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠΈ (ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ background Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½Π΅ Π½Π°Π΄ΠΎ)
categories = [{'id': 1, 'name': '1'},
{'id': 2, 'name': '2'},
{'id': 3, 'name': '3'},
{'id': 4, 'name': '4'}]
ΠΠ²ΡΠΎΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ ΡΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΠΊΡΠΎΠΌΠ΅ COCO/VOC Π²Ρ ΠΎΠ±ΡΡΠ°ΡΡ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΠΊΡΠΈΠΈ Π½Π΅ Π±ΡΠ΄Π΅ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ»
retinanet/dataset.py
ΠΠΎΠ±Π°Π²ΠΈΠ² ΡΡΡΠ΄Π° Π»ΡΠ±ΠΈΠΌΡΠ΅ Π°ΡΠ³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
Π ΠΎΠ±ΡΠ΅ΠΌ train loop ΡΠΎΠΆΠ΅ ΡΠ»Π°Π±Π΅Π½ΡΠΊΠΈΠΉ, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΠ½ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ» ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΡ, ΡΠ·Π°Π» ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠΆΠ°ΡΠ½ΡΠΉ scheduler ΠΈ Ρ.Π΄. ΠΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π²Π°ΠΌ ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ±ΡΠ°ΡΡ backbone ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ
/opt/conda/bin/python retinanet/main.py
c ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ:
train retinanet_rn34fpn.pth
--backbone ResNet34FPN
--classes 12
--val-iters 10
--images /workspace/mounted_vol/dataset/train/images
--annotations /workspace/mounted_vol/dataset/train_12_class.json
--val-images /workspace/mounted_vol/dataset/test/images_small
--val-annotations /workspace/mounted_vol/dataset/val_10_class_cropped.json
--jitter 256 512
--max-size 512
--batch 32
Π ΠΊΠΎΠ½ΡΠΎΠ»Π΅ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅:
Initializing model...
model: RetinaNet
backbone: ResNet18FPN
classes: 2, anchors: 9
Selected optimization level O0: Pure FP32 training.
Defaults for this optimization level are:
enabled : True
opt_level : O0
cast_model_type : torch.float32
patch_torch_functions : False
keep_batchnorm_fp32 : None
master_weights : False
loss_scale : 1.0
Processing user overrides (additional kwargs that are not None)...
After processing overrides, optimization options are:
enabled : True
opt_level : O0
cast_model_type : torch.float32
patch_torch_functions : False
keep_batchnorm_fp32 : None
master_weights : False
loss_scale : 128.0
Preparing dataset...
loader: pytorch
resize: [1024, 1280], max: 1280
device: 4 gpus
batch: 4, precision: mixed
Training model for 20000 iterations...
[ 1/20000] focal loss: 0.95619, box loss: 0.51584, 4.042s/4-batch (fw: 0.698s, bw: 0.459s), 1.0 im/s, lr: 0.0001
[ 12/20000] focal loss: 0.76191, box loss: 0.31794, 0.187s/4-batch (fw: 0.055s, bw: 0.133s), 21.4 im/s, lr: 0.0001
[ 24/20000] focal loss: 0.65036, box loss: 0.30269, 0.173s/4-batch (fw: 0.045s, bw: 0.128s), 23.1 im/s, lr: 0.0001
[ 36/20000] focal loss: 0.46425, box loss: 0.23141, 0.178s/4-batch (fw: 0.047s, bw: 0.131s), 22.4 im/s, lr: 0.0001
[ 48/20000] focal loss: 0.45115, box loss: 0.23505, 0.180s/4-batch (fw: 0.047s, bw: 0.133s), 22.2 im/s, lr: 0.0001
[ 59/20000] focal loss: 0.38958, box loss: 0.25373, 0.184s/4-batch (fw: 0.049s, bw: 0.134s), 21.8 im/s, lr: 0.0001
[ 71/20000] focal loss: 0.37733, box loss: 0.23988, 0.174s/4-batch (fw: 0.049s, bw: 0.125s), 22.9 im/s, lr: 0.0001
[ 83/20000] focal loss: 0.39514, box loss: 0.23878, 0.181s/4-batch (fw: 0.048s, bw: 0.133s), 22.1 im/s, lr: 0.0001
[ 94/20000] focal loss: 0.39947, box loss: 0.23817, 0.185s/4-batch (fw: 0.050s, bw: 0.134s), 21.6 im/s, lr: 0.0001
[ 105/20000] focal loss: 0.37343, box loss: 0.20238, 0.182s/4-batch (fw: 0.048s, bw: 0.134s), 22.0 im/s, lr: 0.0001
[ 116/20000] focal loss: 0.19689, box loss: 0.17371, 0.183s/4-batch (fw: 0.050s, bw: 0.132s), 21.8 im/s, lr: 0.0001
[ 128/20000] focal loss: 0.20368, box loss: 0.16538, 0.178s/4-batch (fw: 0.046s, bw: 0.131s), 22.5 im/s, lr: 0.0001
[ 140/20000] focal loss: 0.22763, box loss: 0.15772, 0.176s/4-batch (fw: 0.050s, bw: 0.126s), 22.7 im/s, lr: 0.0001
[ 148/20000] focal loss: 0.21997, box loss: 0.18400, 0.585s/4-batch (fw: 0.047s, bw: 0.144s), 6.8 im/s, lr: 0.0001
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.52674
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.91450
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.35172
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61881
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.58824
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.61765
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.61765
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61765
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
Saving model: 148
Π§ΡΠΎ Π±Ρ ΠΈΠ·ΡΡΠΈΡΡ Π²Π΅ΡΡ Π½Π°Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅
retinanet/main.py
Π ΠΎΠ±ΡΠ΅ΠΌ ΠΎΠ½ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΠΊΡΠΈΠΈ, ΠΈ Ρ Π½ΠΈΡ Π΅ΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠΆΠ΄ΠΈΡΠ΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ². ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²:
retinanet/infer_example.py
ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
/opt/conda/bin/python retinanet/main.py infer retinanet_rn34fpn.pth
--images /workspace/mounted_vol/dataset/test/images
--annotations /workspace/mounted_vol/dataset/val.json
--output result.json
--resize 256
--max-size 512
--batch 32
Π ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠΆΠ΅ Π²ΡΡΡΠΎΠ΅Π½ Focal Loss ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ backbone, Π° ΡΠ°ΠΊ ΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ Π²ΠΏΠΈΠ»ΠΈΠ²Π°ΡΡΡΡ ΡΠ²ΠΎΠΈ
retinanet/backbones/*.py
Π ΡΠ°Π±Π»ΠΈΡΠΊΠ΅ Π°Π²ΡΠΎΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ:
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡΡ backbone ResNeXt50_32x4dFPN ΠΈ ResNeXt101_32x8dFPN, Π²Π·ΡΡΡΠΉ ΠΈΠ· torchvision.
ΠΠ°Π΄Π΅ΡΡΡ Ρ Π΄Π΅ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, Π½ΠΎ ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠ°ΠΏ 5. ΠΠΊΡΠΏΠΎΡΡ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Unet c ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠΎΠΌ Resnet
ΠΠ°ΠΊ Π²Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΎΠ±ΡΠ°ΡΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π² Dockerfile Π±ΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ Π»ΠΈΠ±Π°
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈ ΡΠΊΡΠΏΠΎΡΡΠ΅ Unet-like ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΠ· ONNX Π² TensoRT β ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Upsample ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ConvTranspose2D:
import torch.onnx.symbolic_opset9 as onnx_symbolic
def upsample_nearest2d(g, input, output_size):
# Currently, TRT 5.1/6.0 ONNX Parser does not support all ONNX ops
# needed to support dynamic upsampling ONNX forumlation
# Here we hardcode scale=2 as a temporary workaround
scales = g.op("Constant", value_t=torch.tensor([1., 1., 2., 2.]))
return g.op("Upsample", input, scales, mode_s="nearest")
onnx_symbolic.upsample_nearest2d = upsample_nearest2d
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠΊΡΠΏΠΎΡΡΠ΅ Π² ONNX, Π½ΠΎ ΡΠΆΠ΅ Π² 7 Π²Π΅ΡΡΠΈΠΈ TensorRT ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ, ΠΈ Π½Π°ΠΌ ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΆΠ΄Π°ΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ³Π΄Π° Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ docker Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΡΠΎΠΌΠ½Π΅Π½ΠΈΡ Π½Π° ΡΡΡΡ Π΅Π³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΌΠΎΠΈΡ Π·Π°Π΄Π°Ρ. Π ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΌΠΎΠΈΡ Π°Π³ΡΠ΅Π³Π°ΡΠΎΠ² ΡΠ΅ΠΉΡΠ°Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΡΠ°ΡΠΈΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΌΠ΅ΡΠ°ΠΌΠΈ.
Π Π°Π·Π½ΡΠ΅ ΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΡΡΠΎΡΠ°Ρ
ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎΠ± ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠΌ overhead Π½Π° ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π½Π° VOLUME, ΠΏΠ»ΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌΡ Π½Π΅Π²Π΅Π΄ΠΎΠΌΡΠΉ ΠΈ ΡΡΡΠ°ΡΠ½ΡΠΉ GIL, Π° ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ΅ΠΌΠΊΠ° ΠΊΠ°Π΄ΡΠ°, ΡΠ°Π±ΠΎΡΠ° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ ΡΠ΅ΡΠΈ ΠΊΠ°Π΄ΡΠ° ΡΠ²Π»ΡΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ hard real-time, Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π² ΡΠ΅ΡΠΈ Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΠΎΡΠ΅Π½Ρ ΠΊΡΠΈΡΠΈΡΠ½Ρ.
ΠΠΎ Π²ΡΡ ΠΎΠ±ΠΎΡΠ»ΠΎΡΡ =)
P.S. ΠΡΡΠ°ΡΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π°Ρ Π»ΡΠ±ΠΈΠΌΡΠΉ ΡΡΠ΅ΠΉΠ½ Π»ΡΠΏ Π΄Π»Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½!
ΠΠ»Π°Π³ΠΎΠ΄ΡΠ°Π½ΠΎΡΡΠΈ
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Ρ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π² production ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ!
Aurorai, llc
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com