Dockerfile
Não se esqueça de excluir todos os recursos que foram utilizados ao longo do workshop.
Agora que já temos o modelo criado, podemos criar nossa própria imagem para detecção de placas de trânsito. Assim como a imagem da YOLOv5 que usamos até aqui, todas as imagens são definidas por um arquivo Dockerfile, que contêm todas as instruções necessárias para criar alguma imagem. O Dockerfile do YOLOv5 pode ser encontrado em seu GitHub (opens in a new tab).
A imagem que iremos criar é bem mais simples, porque podemos continuar construíndo acima da imagem que eles já criaram. Da mesma forma, é possível ver que a imagem deles é construída em cima da imagem do pytorch (opens in a new tab). As imagens do docker são, portanto, construídas em camadas. Cada linha de nosso Dockerfile constrói uma nova camada.
A primeira linha do Dockerfile vai ser sempre iniciada pelo comando FROM, que vai definir qual o nosso ponto de partida, que será a imagem do YOLOv5, mas poderia ser também a imagem do Ubuntu, ou do python, ou do cuda, e assim por diante.
Em nosso Dockerfile, vamos utilizar os seguintes comandos:
FROM: Definir o ponto de partida de nossa imagem.RUN: Este comando é utilizado para rodar um comando no terminal. É muito utilizado, por exemplo, para instalar algum pacote, ou clonar um repositório do github, etc. Em nosso dockerfile, ele não é necessário, e foi incluído somente como exemplo.WORKDIR: É utilizado para definir o nosso ambiente de trabalho dentro da imagem. É como se déssemos um comandocdpara este novo caminho. Qualquer comando futuro terá como ponto de partida o caminho definido aqui. Da mesma forma, ao criarmos um container desta imagem, também iniciaremos neste caminho.COPY: É utilizado para copiar algum arquivo de nosso host para a imagem que será criada. Vamos utilizar para passar o modelo que treinamos anteriormente, para que possamos fazer novas detecções sem a necessidade de novos treinamentos.ENV: Cria variáveis de ambiente dentro da imagem. Em nosso Dockerfile, estamos utilizando para definir um valor padrão de confiança do modelo, e para receber, quando alguém rodar nossa imagem, qual o caminho das fotos que ele gostaria realizar a detecção.CMD: É o comando que será executado em si quando alguém derrunem nossa imagem. Note que estamos passando o script de detecção, que utilizamos na etapa anterior, e também esperamos receber as variáveis de ambiente previamente definidas. Por fim, é passado os melhores pesos que foram gerados pelo modelo.
FROM ultralytics/yolov5
RUN apt-get update -y
WORKDIR /usr/src/app
COPY ./runs/train/exp/weights/best.pt ./
ENV IMAGES_FOLDER=
ENV CONF=0.25
CMD python3 detect.py --source ${IMAGES_FOLDER} --conf ${CONF} --weights best.ptConstruindo a imagem
Após termos definido nosso modelo, em um arquivo chamado Dockerfile, podemos construir nossa imagem, com o comando build. Após o build, devemos passar o caminho que servirá de contexto para a imagem. Neste caso, passamos simplesmente ., indicando que o contexto deve ser a mesma pasta em que estamos no momento. Fazemos isto pois já estamos na pasta em que temos o modelo salvo. Note que no Dockerfile acima, o comando COPY é também relativo a este caminho. Por fim passamos a flag -t para atribuir um nome à imagem que estamos criando. Como não passamos nenhuma tag, ou seja, algum nome após um :, o docker automaticamente atribuirá uma tag de latest a esta imagem.
docker build . -t podesta/docker-workshop-yolov5

Testando a imagem
Por fim, podemos testar a imagem, passando novas fotos para que o modelo possa fazer a detecção nelas. Muito similar ao que fizemos anteriormente, devemos novamente passar as flags de volume, indicando onde estão as imagens para que o modelo faça a inferência, além de uma pasta para que a imagem nos retorne os resultados, com as bounding box. Opcionalmente, podemos passar um valor de confiança para o modelo, que definimos em nosso Dockerfile.
docker run \
--env CONF=0.3 \
--env IMAGES_FOLDER="/images-to-detect" \
--volume /home/ubuntu/podesta/new-images/:/images-to-detect \
--volume /home/ubuntu/podesta/results:/usr/src/app/runs/detect \
podesta/docker-workshop-yolov5