
ΠΠΎΠ»ΠΊΠ°ΡΠ° Π΅ ΡΠ°ΠΌΠΎ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ!
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! Π‘ΠΊΡΠΏΠΈ ΠΏΡΠΈΡΡΠ΅Π»ΠΈ, Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡΠ° ΡΠΈ Ρ TensorRT ΠΈ RetinaNet, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (ΡΠΎΠ²Π° Π΅ ΡΠΎΡΠΊ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΎΡ , ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±ΡΡΠ·ΠΎ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ). ΠΡΠ΅Π»ΠΈΡΡΠ²Π°ΠΉΠΊΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π² ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° , ΡΡΠ΅ΡΠ°ΠΌ Π²ΡΠΏΡΠΎΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° TensorRT, ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π²ΡΠΏΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡΡ, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ
Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π±ΡΡΠ·ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ Ρ TensorRT, RetinaNet, Unet ΠΈ docker.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ Π΄Π°ΡΠ°ΡΠ΅ΡΠ°, Π΄Π° ΠΎΠ±ΡΡΠΈΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ° RetinaNet/Unet Π½Π° Pytorch1.3+, Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Π³Π»Π° Π² ONNX, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π² TensorRT engine ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² docker, Π·Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½Π΅ Π½Π° Ubuntu 18 ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½ΠΎ Π½Π° ARM(Jetson)* Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΡΡΠ½Π°ΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π³ΠΎΡΠΎΠ² Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° RetinaNet/Unet, Π½ΠΎ ΠΈ Π·Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Ρ Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ.
ΠΡΠ°ΠΏ 1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°
Π’ΡΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ Π½Π°ΠΏΠΎΡΠ»Π΅Π΄ΡΠΊ ΡΡΠΌ ΡΠ΅ ΠΎΡΠΊΠ°Π·Π°Π» Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° Π΄Π΅ΡΠΊΡΠΎΠΏ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π° devbox. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ, Π΅ python Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΡΠ΅Π΄Π° ΠΈ cuda 10.2 (ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈ Π΄ΠΎ Π΅Π΄ΠΈΠ½ nvidia Π΄ΡΠ°ΠΉΠ²Π΅Ρ) ΠΎΡ deb.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΠ²Π΅ΠΆΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° Ubuntu 18. Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ cuda 10.2(deb), ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΠ° ΠΏΠΎ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΎΠ½Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½ΡΠΌΠ° Π΄Π° ΠΎΠ±ΡΡΠΆΠ΄Π°ΠΌ, ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π°.
Π‘Π΅Π³Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ docker, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π° 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. Π‘Π»Π΅Π΄Π²Π° Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ
Settings->Project Interpreter->Add->Ssh Interpreter Π‘ΡΡΠΏΠΊΠ° 1

Π‘ΡΡΠΏΠΊΠ° 2

Π‘ΡΡΠΏΠΊΠ° 3

ΠΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΡΠΊΡΠΈΠΉΠ½ΡΠΎΡΠΈΡΠ΅,
Interpreter -> /opt/conda/bin/pythonβ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ 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ΠΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ ΡΡΠΊ Π»ΡΠ±ΠΈΠΌΠΈΡΠ΅ Π°ΡΠ³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅ ΡΠ²ΡΡΠ΄ΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΎΡ COCO. ΠΠΌΠ° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΎΡΡΠ΅ΠΆΠ΅ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΈΡ, Π°ΠΊΠΎ ΡΡΡΡΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ°Π»ΡΠΊ dataset =), ΠΈ Π½ΠΈΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, Π½ΠΎ Π·Π° ΡΠΎΠ²Π° Π΄ΡΡΠ³ ΠΏΡΡ.
ΠΠ±ΡΠΎ Π²Π·Π΅ΡΠΎ, ΡΠΈΠΊΡΠ»ΡΡ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎ Π΅ ΡΠ»Π°Π±, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π½Π΅ Π·Π°ΠΏΠ°Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠΎΠ²Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½ΡΠΊΠ°ΠΊΡΠ² ΡΠΆΠ°ΡΠ΅Π½ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΠΈ Ρ.Π½. ΠΠΎ ΡΠ΅Π³Π° ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ 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 ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ:
Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ : True
ΡΡΠΎΠ²Π΅Π½Ρ_ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ : O0
ΡΠΈΠΏ_ΠΌΠΎΠ΄Π΅Π»ΠΈ_ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ : torch.float32
Π·Π°ΠΌΠ΅Π½ΠΈΡΡ_ΡΡΠ½ΠΊΡΠΈΠΈ_torch : False
ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ_batchnorm_fp32 : None
Π³Π»Π°Π²Π½ΡΠ΅_Π²Π΅ΡΠ° : False
ΠΌΠ°ΡΡΡΠ°Π±_ΠΏΠΎΡΠ΅ΡΡ : 1.0
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ kwargs, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ°Π²Π½Ρ None)...
ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ:
Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ : True
ΡΡΠΎΠ²Π΅Π½Ρ_ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ : O0
ΡΠΈΠΏ_ΠΌΠΎΠ΄Π΅Π»ΠΈ_ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ : torch.float32
Π·Π°ΠΌΠ΅Π½ΠΈΡΡ_ΡΡΠ½ΠΊΡΠΈΠΈ_torch : False
ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ_batchnorm_fp32 : None
Π³Π»Π°Π²Π½ΡΠ΅_Π²Π΅ΡΠ° : False
ΠΌΠ°ΡΡΡΠ°Π±_ΠΏΠΎΡΠ΅ΡΡ : 128.0
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
...
Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ: pytorch
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅_ΡΠ°Π·ΠΌΠ΅ΡΠ°: [1024, 1280], ΠΌΠ°ΠΊΡ: 1280
ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ: 4 gpu
ΠΏΠ°ΠΊΠ΅Ρ: 4, ΡΠΎΡΠ½ΠΎΡΡΡ: ΡΠΌΠ΅ΡΠ°Π½Π½Π°Ρ
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 20000 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ...
[ 1/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.95619, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.51584, 4.042Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.698Ρ, Π½Π°Π·Π°Π΄: 0.459Ρ), 1.0 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 12/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.76191, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.31794, 0.187Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.055Ρ, Π½Π°Π·Π°Π΄: 0.133Ρ), 21.4 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 24/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.65036, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.30269, 0.173Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.045Ρ, Π½Π°Π·Π°Π΄: 0.128Ρ), 23.1 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 36/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.46425, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.23141, 0.178Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.047Ρ, Π½Π°Π·Π°Π΄: 0.131Ρ), 22.4 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 48/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.45115, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.23505, 0.180Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.047Ρ, Π½Π°Π·Π°Π΄: 0.133Ρ), 22.2 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 59/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.38958, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.25373, 0.184Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.049Ρ, Π½Π°Π·Π°Π΄: 0.134Ρ), 21.8 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 71/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.37733, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.23988, 0.174Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.049Ρ, Π½Π°Π·Π°Π΄: 0.125Ρ), 22.9 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 83/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.39514, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.23878, 0.181Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.048Ρ, Π½Π°Π·Π°Π΄: 0.133Ρ), 22.1 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 94/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.39947, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.23817, 0.185Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.050Ρ, Π½Π°Π·Π°Π΄: 0.134Ρ), 21.6 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 105/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.37343, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.20238, 0.182Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.048Ρ, Π½Π°Π·Π°Π΄: 0.134Ρ), 22.0 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 116/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.19689, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.17371, 0.183Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.050Ρ, Π½Π°Π·Π°Π΄: 0.132Ρ), 21.8 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 128/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.20368, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.16538, 0.178Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.046Ρ, Π½Π°Π·Π°Π΄: 0.131Ρ), 22.5 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 140/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.22763, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.15772, 0.176Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.050Ρ, Π½Π°Π·Π°Π΄: 0.126Ρ), 22.7 ΠΈΠ·ΠΎΠ±Ρ./Ρ, lr: 0.0001
[ 148/20000] ΡΠΎΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠ΅ΡΡ: 0.21997, ΠΏΠΎΡΠ΅ΡΡ ΠΏΠΎ Π±ΠΎΠΊΡΡ: 0.18400, 0.585Ρ/4-ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΏΠ΅ΡΠ΅Π΄: 0.047Ρ, Π½Π°Π·Π°Π΄: 0.144Ρ), 6.8 ΠΈΠ·ΠΎΠ±Ρ./Ρ, 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-like ΠΎΡ ONNX Π² TensorRT Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΡΠΈΠΊΡΠΈΡΠ°Π½ ΡΠ°Π·ΠΌΠ΅Ρ Upsample ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ConvTranspose2D:
import torch.onnx.symbolic_opset9 as onnx_symbolic
def upsample_nearest2d(g, input, output_size):
# Π ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΠΏΠ°ΡΡΠ΅ΡΡΡ ONNX Π½Π° TRT 5.1/6.0 Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ ONNX ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ,
# Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ upsampling
# Π’ΡΠΊ ΡΠΌΠ΅ Ρ
Π°ΡΠ΄ΠΊΠΎΠ΄ΠΈΡΠ°Π»ΠΈ 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. ΠΡΡΠ°Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π»ΡΠ±ΠΈΠΌΠΈΡ ΡΠΈ ΡΡΠ΅ΠΉΠ½ Π»ΡΠΏ Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ!
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° , Π±Π΅Π· Π½Π΅Ρ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅! ΠΠ³ΡΠΎΠΌΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ , ΠΊΠΎΠΉΡΠΎ ΠΌΠ΅ Π½Π°ΠΊΠ°ΡΠ° Π΄Π° ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ Ρ DL, Π·Π° Π±Π΅Π·ΡΠ΅Π½Π½ΠΈΡΠ΅ ΠΌΡ ΡΡΠ²Π΅ΡΠΈ ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΡΠΌ!
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ!
Aurorai, llc
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
