Home › Fóruns › Fórum Detecção de Objetos com YOLO, Darknet, OpenCV e Python › Cores diferentes nas segmentações, até para as de mesma classe.
Marcado: Segmentação+de+imagens+(YOLOv8)
- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 1 ano, 9 meses atrás por
Gabriel Alves.
- AutorPosts
- 29 de junho de 2023 às 17:13 #41061
Boa tarde!
Poderia passar um exemplo de código python onde eu consiga percorrer o resultado da segmentação e colocar cada objeto segmentado com uma cor diferente, e depois salvar a imagem com todas estas segmentações em um outro diretório?
Obrigado!
Everton Almeida
4 de julho de 2023 às 11:43 #41136Olá Everton!
É possível sim, para fazer essa alteração basta usar a implementação via Python (não pela CLI, já que não tem liberdade para fazer esse tipo de alteração a não ser que mude o código da própria biblioteca), a função que precisa modificar é desenha_caixas() dentro de funcoes_desenho.py (que disponibilizamos para fazer esse tipo de implementação). Na linha onde tem o “colors = “, repare que para essa variável é atribuída uma lista com vários valores RGB. Nessa lista os valores de cores serão atribuídos de forma fixa, e conforme a ordem dos itens cadastrados na variável labels, que está logo acima nesse mesmo código. Ou seja, o valor (89, 161, 197) corresponde à primeira classe listada em labels, já o valor (67, 161, 255) corresponde à segunda, e assim consecutivamente.
Mas para fazer com que seja atribuída uma cor diferente para cada instância (e não mais usar a classe como critério para diferenciação de cor) precisa mudar a lógica, para isso não vai mais usar essa lista com valores fixos, agora fará com que seja gerada uma cor aleatória para cada segmento detectado. A linha que deverá ser mudada é a dentro da condição “if conf :” (que controla se a segmentação possui confiança o suficiente para ser exibida), lá na linha “color = colors[int(box[-1])]”; o que precisa é mudar isso para que o valor de color seja um valor aleatório.
Você pode usar esse código para gerar uma cor aleatória: color = np.random.randint(0, 255, size=(1, 3), dtype=”uint8″)
Como deve ser feito para cada instância, deve colocar esse código dentro do laço de repetição “for box in boxes:”. Ou, pode gerar antes desse laço uma lista com os valores aleatórios, de modo que o tamanho da lista seja baseada na quantidade de instâncias detectadas na imagem, usando o len(boxes) para indicar a quantidade de cores aleatórias a serem geradas. Assim:
lista_cores = np.random.randint(0, 255, size=(len(boxes), 3), dtype=”uint8″)
E aí só acessar a cor através dos colchetes, especificando a posição com base na iteração atual.
Já para separar a segmentação do fundo e salvar em uma imagem, veja a aula “Modelo pré-treinado 6” do curso “Segmentação de Imagens com Python de A à Z”, lá mostra como você pode fazer isso. E para salvar a imagem em disco basta usar a função cv2.imwrite(), que foi mostrada anteriormente mas você pode ver mais detalhes sobre ela aqui. Lembrando de nomear a imagem de modo que fique com nome diferente sempre, tipo assim (ou gerando um nome aleatório único, como nesse exemplo aqui).
- AutorPosts
- Você deve fazer login para responder a este tópico.