
ΠΠΎΠ»ΠΊΠ°ΡΠ° Π΅ ΡΠ°ΠΌΠΎ Π² ΠΏΡΡΠ²ΠΈΡ ΠΏΡΡ!
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! Π‘ΠΊΡΠΏΠΈ ΠΏΡΠΈΡΡΠ΅Π»ΠΈ, Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡΠ° ΡΠΈ Ρ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° TensorRT, RetinaNet, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (ΡΠΎΠ²Π° Π΅ ΡΠΎΡΠΊ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ ΡΠ΅ΠΏΠΎ ΠΎΡ , ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±ΡΡΠ·ΠΎ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ). ΠΡΠ΅Π²ΡΡΡΠ°ΠΉΠΊΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π² ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° , ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°ΠΌ Ρ Π²ΡΠΏΡΠΎΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° TensorRT ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π²ΡΠΏΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡΡ, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ
Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π±ΡΡΠ· ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ Ρ TensorRT, RetinaNet, Unet ΠΈ docker.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½: ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ Π΄Π°ΡΠ°ΡΠ΅ΡΠ°, Π΄Π° ΠΎΠ±ΡΡΠΈΠΌ ΠΌΡΠ΅ΠΆΠ° RetinaNet/Unet Π½Π° Pytorch1.3+, Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΠΆΠ΅ΡΡΠΈ Π² ONNX, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π² TensorRT engine ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² docker, Π·Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½Π΅ Π½Π° Ubuntu 18 ΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠ½ΠΎ Π½Π° ARM(Jetson)* Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΡΡΡΠ½Π°ΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. Π ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π³ΠΎΡΠΎΠ² Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° Π΅ΠΊΡΠΏΠΎΡΡΠ° ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° RetinaNet/Unet, Π½ΠΎ ΠΈ Π·Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°.
ΠΡΠ°ΠΏ 1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°
Π’ΡΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠΌ ΡΠ΅ ΠΎΡΠΊΠ°Π·Π°Π» ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° Π΄Π΅ΡΠΊΡΠΎΠΏ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π° devbox. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ, Π΅ python virtual environment ΠΈ cuda 10.2 (ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ Π΄ΠΎ Π΅Π΄ΠΈΠ½ Π΄ΡΠ°ΠΉΠ²Π΅Ρ nvidia) ΠΎΡ deb.
ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ Π½ΠΎΠ²ΠΎΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° Ubuntu 18. ΠΠ΅ΠΊΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ cuda 10.2(deb), ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π·Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½ΡΠΌΠ° Π΄Π° ΡΠΏΠΈΡΠ°ΠΌ, ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π°.
Π‘Π΅Π³Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ docker, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅ΡΠ° Π»Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ, Π΅ΡΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ , Π²Π΅ΡΠ΅ Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ 19+ β ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Ρ. Π Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ docker Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· sudo, ΡΠ°ΠΊΠ° ΡΠ΅ Π΅ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π½ΠΎ. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
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 ΠΈ Π΄Π° Π²Π»Π΅Π·Π΅ΠΌ. ΠΡΠΈΠ²Π°ΠΌΠ΅ ΡΡΠΊ , ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ ΠΈ ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²Π»Π΅Π·Π΅ΠΌ Π² NGC Cloud, Π½Π°ΡΠΈΡΠΊΠ°ΠΌΠ΅ SETUP Π² Π³ΠΎΡΠ½ΠΈΡ Π»ΡΠ² ΡΠ³ΡΠ» Π½Π° Π΅ΠΊΡΠ°Π½Π° ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΏΠΎ ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° . ΠΠ°ΡΠΈΡΠΊΠ°ΠΌΠ΅ βΠ³Π΅Π½Π΅ΡΠΈΡΠ°ΠΉ ΠΊΠ»ΡΡβ. ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅, ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΈ ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈ, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ, ΠΏΡΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° ΠΌΠ°ΡΠΈΠ½Π°, Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ.
ΠΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅:
docker login nvcr.io
Username: $oauthtoken
Password: - Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΡ ΠΊΠ»ΡΡ
ΠΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ 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/:/workspace/mounted_vol -d -P --rm --ipc=host -it retinanet:latestΠ‘Π΅Π³Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ ssh @localhost. Π‘Π»Π΅Π΄ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΎΡΠ²Π°ΡΡΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² PyCharm. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΡΠ²Π°ΡΡΠΌΠ΅
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ->ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°->ΠΠΎΠ±Π°Π²ΡΠ½Π΅->Ssh ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π‘ΡΡΠΏΠΊΠ° 1

Π‘ΡΡΠΏΠΊΠ° 2

Π‘ΡΡΠΏΠΊΠ° 3

ΠΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΊΠ°ΠΊΡΠΎ Π½Π° Π΅ΠΊΡΠ°Π½Π°,
ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ -> /opt/conda/bin/pythonβ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ln Π½Π° Python3.6 ΠΈ
Π‘ΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°ΡΠ° ΠΏΠ°ΠΏΠΊΠ° -> /workspace/retinanetΠΠ°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΠΈΠ·ΡΠ°ΠΊΠ²Π°ΠΌΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ ΠΈ Π²ΡΠΈΡΠΊΠΎ, ΡΡΠ΅Π΄Π°ΡΠ° Π΅ Π³ΠΎΡΠΎΠ²Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅!
ΠΠΠΠΠ!!! ΠΠ΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠ·ΡΠ΅Π³Π»Π΅ΡΠ΅ ΠΎΡ docker ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Retinanet. Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΡΠΎ ΠΌΠ΅Π½Ρ Π² ΠΊΠΎΡΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΡ
ΠΠ΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½Ρ->ΠΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ΠΠΎΡΠ²ΡΠ²Π°Ρ ΡΠ΅ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈ Π΄Π²Π΅ ΠΏΠ°ΠΏΠΊΠΈ build, retinanet.egg-info ΠΈ _Π‘.so

ΠΠΊΠΎ Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°, Π·Π½Π°ΡΠΈ ΡΡΠ΅Π΄Π°ΡΠ° Π²ΠΈΠΆΠ΄Π° Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π½ΠΈΠ΅ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° RetinaNet.
ΠΡΠ°ΠΏ 4. Π Π°Π·Π±ΠΈΠ²ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ°
ΠΠ° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ β ΠΏΡΠΈΡΡΠ΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Π· ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π±ΡΡ Π° ΠΏΠΎΠΏΡΠ°Π²Π΅Π½ΠΈ ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΡΡΠ΅ ΠΌΠ°ΡΠΊΠΈΡΠ°Π»ΠΈ Π½Π°Π±ΠΎΡΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΡΠ΅ Π³ΠΎ ΠΈΠ·ΡΠ΅Π³Π»ΠΈΠ»ΠΈ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π² Π½Π°ΡΠΈΡ RetinaNet, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΡΠΎΡΠΌΠ°Ρ ΠΈ Π·Π° ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π² COCO. ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π·Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π²:
markup_utils/supervisly_to_coco.pyΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΡΠ° Π² ΡΠΊΡΠΈΠΏΡΠ° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ Π²ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ (Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΡΠ° ΡΠΎΠ½)
categories = [{'id': 1, 'name': '1'},
{'id': 2, 'name': '2'},
{'id': 3, 'name': '3'},
{'id': 4, 'name': '4'}] ΠΠ²ΡΠΎΡΠΈΡΠ΅ Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° ΡΠ΅ΡΠΈΡ Π°, ΡΠ΅ ΠΎΡΠ²Π΅Π½ COCO/VOC Π½ΡΠΌΠ° Π΄Π° ΠΎΠ±ΡΡΠ°Π²Π°ΡΠ΅ Π½ΠΈΡΠΎ Π·Π° Π΄Π΅ΡΠ΅ΠΊΡΠΈΡ, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΡΠ°ΠΉΠ»
retinanet/dataset.pyΠΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ ΡΡΠΊ Π»ΡΠ±ΠΈΠΌΠΈΡΠ΅ ΡΠΈ Π°ΡΠ³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΡΠ΅ ΡΡΡΠΎΠ³ΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΎΡ COCO. ΠΠΌΠ° ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·ΡΠ΅ΠΆΠ΅ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΈΡ, Π°ΠΊΠΎ ΡΡΡΡΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ°Π»ΡΠΊ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ =), ΠΈ Π½ΠΈΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, Π½ΠΎ Π·Π° ΡΠΎΠ²Π° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
ΠΠ±ΡΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, train loop ΡΡΡΠΎ Π΅ ΠΎΡΡΠ»Π°Π±Π΅Π½; ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠΎΠΉ Π½Π΅ Π·Π°ΠΏΠ°Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠΎΠ²Π΅ΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½ΡΠΊΠ°ΠΊΡΠ² ΡΠΆΠ°ΡΠ΅Π½ scheduler ΠΈ Ρ.Π½. ΠΠΎ ΡΠ΅Π³Π° Π²ΠΈ ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ backbone ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅.
/opt/conda/bin/python retinanet/main.pyΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ:
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
Π ΠΊΠΎΠ½ΡΠΎΠ»Π°ΡΠ° ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅:
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°...
ΠΌΠΎΠ΄Π΅Π»: RetinaNet
ΠΎΡΠ½ΠΎΠ²Π°: ResNet18FPN
ΠΊΠ»Π°ΡΠΎΠ²Π΅: 2, Π°Π½ΠΊΠ΅ΡΠΈ: 9
ΠΠ·Π±ΡΠ°Π½ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π΅Π½ Π½ΠΈΠ²ΠΎ O0: Π§ΠΈΡΡΠ° FP32 ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΠΊΠ°.
ΠΡΠ΅Π΄ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Π·Π° ΡΠΎΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎ Π½ΠΈΠ²ΠΎ ΡΠ°:
Π²ΠΊΠ»ΡΡΠ΅Π½ : ΠΡΡΠ½ΠΎ
ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎ Π½ΠΈΠ²ΠΎ : O0
ΡΠΈΠΏ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° : torch.float32
ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ° Π½Π° torch ΡΡΠ½ΠΊΡΠΈΠΈ : ΠΠ΅Π²ΡΡΠ½ΠΎ
Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° batchnorm fp32 : ΠΡΠΌΠ°
ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ΅Π³Π»Π° : ΠΠ΅Π²ΡΡΠ½ΠΎ
ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° Π·Π°Π³ΡΠ±Π° : 1.0
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ (Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ kwargs, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΠΡΠΌΠ°)...
Π‘Π»Π΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠ΅Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅, ΠΎΠΏΡΠΈΠΈΡΠ΅ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ°:
Π²ΠΊΠ»ΡΡΠ΅Π½ : ΠΡΡΠ½ΠΎ
ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎ Π½ΠΈΠ²ΠΎ : O0
ΡΠΈΠΏ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° : torch.float32
ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ° Π½Π° torch ΡΡΠ½ΠΊΡΠΈΠΈ : ΠΠ΅Π²ΡΡΠ½ΠΎ
Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° batchnorm fp32 : ΠΡΠΌΠ°
ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ΅Π³Π»Π° : ΠΠ΅Π²ΡΡΠ½ΠΎ
ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° Π·Π°Π³ΡΠ±Π° : 128.0
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ...
Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅: pytorch
ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠ°Π·ΠΌΠ΅Ρ: [1024, 1280], ΠΌΠ°ΠΊΡ: 1280
ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ: 4 gpu
ΠΏΠ°ΡΡΠΈΠ΄Π°: 4, ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ: ΡΠΌΠ΅ΡΠ΅Π½Π°
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Π·Π° 20000 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ...
[ 1/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.95619, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.51584, 4.042s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.698s, bw: 0.459s), 1.0 ΠΈΠΌ/s, lr: 0.0001
[ 12/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.76191, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.31794, 0.187s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.055s, bw: 0.133s), 21.4 ΠΈΠΌ/s, lr: 0.0001
[ 24/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.65036, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.30269, 0.173s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.045s, bw: 0.128s), 23.1 ΠΈΠΌ/s, lr: 0.0001
[ 36/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.46425, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.23141, 0.178s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.047s, bw: 0.131s), 22.4 ΠΈΠΌ/s, lr: 0.0001
[ 48/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.45115, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.23505, 0.180s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.047s, bw: 0.133s), 22.2 ΠΈΠΌ/s, lr: 0.0001
[ 59/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.38958, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.25373, 0.184s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.049s, bw: 0.134s), 21.8 ΠΈΠΌ/s, lr: 0.0001
[ 71/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.37733, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.23988, 0.174s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.049s, bw: 0.125s), 22.9 ΠΈΠΌ/s, lr: 0.0001
[ 83/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.39514, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.23878, 0.181s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.048s, bw: 0.133s), 22.1 ΠΈΠΌ/s, lr: 0.0001
[ 94/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.39947, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.23817, 0.185s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.050s, bw: 0.134s), 21.6 ΠΈΠΌ/s, lr: 0.0001
[ 105/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.37343, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.20238, 0.182s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.048s, bw: 0.134s), 22.0 ΠΈΠΌ/s, lr: 0.0001
[ 116/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.19689, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.17371, 0.183s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.050s, bw: 0.132s), 21.8 ΠΈΠΌ/s, lr: 0.0001
[ 128/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.20368, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.16538, 0.178s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.046s, bw: 0.131s), 22.5 ΠΈΠΌ/s, lr: 0.0001
[ 140/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.22763, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.15772, 0.176s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.050s, bw: 0.126s), 22.7 ΠΈΠΌ/s, lr: 0.0001
[ 148/20000] ΡΠΎΠΊΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π°: 0.21997, Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΡΡΠΈΡ: 0.18400, 0.585s/4-ΠΏΠ°ΡΡΠΈΠ΄Π° (fw: 0.047s, bw: 0.144s), 6.8 ΠΈΠΌ/s, lr: 0.0001
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets=100 ] = 0.52674
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.50 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets=100 ] = 0.91450
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.75 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets=100 ] = 0.35172
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= ΠΌΠ°Π»ΡΠΊ | maxDets=100 ] = 0.61881
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ=ΡΡΠ΅Π΄Π΅Π½ | maxDets=100 ] = -1.00000
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ (AP) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π³ΠΎΠ»ΡΠΌ | maxDets=100 ] = -1.00000
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets= 1 ] = 0.58824
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets= 10 ] = 0.61765
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π²ΡΠΈΡΠΊΠΎ | maxDets= 100 ] = 0.61765
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= ΠΌΠ°Π»ΡΠΊ | maxDets=100 ] = 0.61765
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ=ΡΡΠ΅Π΄Π΅Π½ | maxDets=100 ] = -1.00000
Π‘ΡΠ΅Π΄Π½Π° ΠΡΠ·Π²ΡΠ°ΡΠ½Π° Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (AR) @[ IoU=0.50:0.95 | ΠΎΠ±Π»Π°ΡΡ= Π³ΠΎΠ»ΡΠΌ | maxDets=100 ] = -1.00000
ΠΠ°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°: 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 Ρ Π΅Π½ΠΊΠΎΠ΄Π΅Ρ Resnet.
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΡΠ΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Π»ΠΈ, Π² Dockerfile Π±ΡΡ Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΏΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΡΡΡΠ°Ρ ΠΎΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° . Π ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠ½Π΅Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ ΠΈ Π΅ΠΊΡΠΏΠΎΡΡ Π½Π° pytorch ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠΈ Π² engine TensorRT.
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π° Unet-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΡ ONNX Π² TensoRT Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΡΠΈΠΊΡΠΈΡΠ°Π½ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° Upsample ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ConvTranspose2D:
import torch.onnx.symbolic_opset9 as onnx_symbolic
def upsample_nearest2d(g, input, output_size):
# Π ΠΌΠΎΠΌΠ΅Π½ΡΠ°, TRT 5.1/6.0 ONNX Parser Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ ONNX ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
# Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ upsampling ONNX ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΠΈ
# Π’ΡΠΊ ΡΠ²ΡΡΠ΄ΠΎ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ scale=2 ΠΊΠ°ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
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. ΠΡΡΠ°Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π²Π°ΡΠΈΡ Π»ΡΠ±ΠΈΠΌΠΈ train loop Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ!
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΡΠΎ , Π±Π΅Π· ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ! ΠΠ³ΡΠΎΠΌΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ , ΠΊΠΎΠΉΡΠΎ ΠΌΠ΅ Π½Π°ΠΊΠ°ΡΠ° Π΄Π° ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ Ρ DL, Π·Π° Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ Π±Π΅Π·ΡΠ΅Π½Π½ΠΈ ΡΡΠ²Π΅ΡΠΈ ΠΈ ΠΈΠ·Π²ΡΠ½ΡΠ΅Π΄Π΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΡΠΌ!
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ!
Aurorai, llc
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
