Respostas no Fórum

Visualizando 15 posts - 181 até 195 (de 402 do total)
  • Autor
    Posts
  • Gabriel Alves
    Moderador

      Olá Roberto!

      Nesse curso você encontra diversas abordagens usadas para segmentação, se a ideia for construir esse programa do zero então encontrará as técnicas de segmentação que são envolvidas nesse processo. Se o seu objetivo é fazer isso voltado para reconhecimento de caracteres, sugiro dar uma olhada também no nosso outro curso Reconhecimento de Textos – com OCR e Python, em um dos projetos mostra como treinar do zero um modelo para fazer a classificação de caracteres – porém é uma abordagem baseada em redes neurais artificiais.

      Entretanto, se entendi bem a descrição do seu problema, eu acho que ele se refere a classificar números digitais com base no preenchimento ou não de determinadas regiões. Há um artigo que explica como fazer exatamente isso, você pode visualizá-lo aqui. Nesse artigo o autor explica detalhadamente como criar uma lógica de segmentação+classificação usando como base o display de sete segmentos, que é a forma mais popular e conhecida para exibição de números digitais. Acredito que seria bem próximo ou até exatamente o que você precisa, mas caso não seja, peço que forneça mais detalhes do seu projeto.

      • Esta resposta foi modificada 1 ano, 10 meses atrás por Gabriel Alves.
      em resposta a: Reconhecimento de textos em imagem #41618
      Gabriel Alves
      Moderador

        Opa! Disponha, Carlos! Que bom que funcionou bem para você =)

        Realmente o tempo de processamento pode ser bem elevado nesses casos pois o OCR é executado dezenas de vezes na mesma imagem, por isso é bem interessante pensar nessas formas de otimização que você comentou. O que ajuda bastante é processar na GPU, caso já não esteja fazendo isso. Mas no geral, para aperfeiçoar a performance em si vai exigir muita tentativa e erro para tentar ajustar ao máximo, por exemplo se for manter a detecção de círculos em seu algoritmo é interessante testar com diferentes parâmetros para manter somente os círculos mais perfeitos ou não tão pequenos – dá para facilmente criar um filtro com base na área em pixels do círculo, assim ignorando os círculos muito pequenos ou muito grandes detectados na imagem e que portanto seriam falsos-positivos, já que todos os círculos de interesse (que possuem o número dentro) tem o mesmo tamanho.

        Em último caso, se a sua aplicação não exigir que o resultado seja apresentado instantaneamente no mesmo segundo então seria interessante se concentrar mais agora em maneiras de garantir a precisão do que garantir a velocidade, portanto seguindo essa mesma lógica já pode ser o suficiente.

        Gabriel Alves
        Moderador

          Olá!

          Primeiramente parabéns pelo seu resultado, e obrigado por contribuir apresentando sua solução!

          Realmente encontramos essa limitação ao usar a versão gratuita do Colab, devido à memória oferecida pela GPU, o que pode ser um problema ao tentar definir parâmetros muito robustos para alguns algoritmos (como é especialmente o caso do CNN) que exigem um poder computacional muito maior. Mas conforme você comprovou, nesses casos é possível encontrar um modo bem mais otimizado e ainda assim bem preciso usando esses algoritmos mais leves como o Haarcascade.

          Gabriel Alves
          Moderador

            Olá,

            • Sim, os dois valores são alocados individualmente, por isso que os dois somados não devem exceder a sua memória.
            • Os dois estão igualmente relacionados ao uso e alocação da memória durante processos da etapa de treinamento, o algoritmo de treinamento do OpenCV faz a distinção entre os dois, porém na prática a recomendação é que esses valores sejam iguais. Mas caso queira saber detalhes mais técnicos sobre a diferença:
              • “Valores de features pré-calculadas” se refere aos valores numéricos intermediários que são calculados durante o processo de avaliação de features/características do tipo Haar (Haar-like features) nas amostras de treinamento. Esses valores são basicamente o resultado daqueles cálculos matemáticos baseados nas intensidades de pixels das regiões da imagem (representado por aqueles “quadradinhos” preto e branco, conforme mostrado na aula teórica); ao pré-calcular esses valores e armazená-los na memória, o processo de treinamento pode se tornar mais eficiente. Ou seja, esse parâmetro permite controlar a memória alocada especificamente para esses valores.
              • “Índices de features pré-calculadas” se referem aos índices ou posições das características do tipo Haar que são computadas dentro do conjunto de features. Esses índices ajudam a rastrear quais features foram avaliadas em uma determinada amostra durante o processo de treinamento; ou seja, ao pré-calcular e armazenar esses índices o OpenCV pode otimizar o processo de treinamento pois evita avaliações redundantes das mesmas features nas mesmas amostras, já que essas informações podem ser rapidamente acessadas na memória.
            • Esta resposta foi modificada 1 ano, 11 meses atrás por Gabriel Alves.
            Gabriel Alves
            Moderador

              Olá Roberto!

              Esse erro ocorre devido a um erro de digitação, pois ali na linha ao invés de COLOR_BGR2GRB deveria ser COLOR_BGR2RGB

              Basta fazer essa correção ali em seu código e deve funcionar normal.

              Caso deseje, você pode ver aqui o código da aula para checar se o restante está ok também:
              https://colab.research.google.com/drive/1t2vGUlNDolMD0QtJPrHtSSGOAvHQmluU?usp=sharing#scrollTo=uPo6n5V66Nxh

              Gabriel Alves
              Moderador

                Olá Roberto!

                Esse erro ocorre pois o programa não localiza a variável em questão apontada na mensagem, até então não foi declarada e portanto o programa não tem como acessar o valor.

                Veja que acontece porque a indentação da função exibir_limiarizacao() está incorreta – a linha onde tem “titulos =” (e as abaixo dela) devem estar indentadas 1 posição à direita, alinhadas às 5 primeiras linhas da função.

                Então, o problema é que esse restando do código é executado fora da função porém nele é mencionado uma variável que só existe dentro da função, por isso dá erro de “not defined”.

                Para resolver, basta corrigir a indentação do código conforme expliquei.

                Caso tenha dúvidas, veja aqui o código correto da aula:
                https://colab.research.google.com/drive/1t2vGUlNDolMD0QtJPrHtSSGOAvHQmluU?usp=sharing#scrollTo=uPo6n5V66Nxh

                Gabriel Alves
                Moderador

                  Olá!

                  Esses parâmetros controlam o tamanho do buffer, portanto é usado para otimizar o treinamento através de um maior uso da memória disponível. O -precalcValBufSize corresponde ao tamanho do buffer para valores de features pré-calculadas (em Mb); e o -precalcIdxBufSize é o tamanho do buffer para índices de features pré-calculadas (em Mb). Quanto mais memória você atribuir, mais rápido o processo de treinamento. No entanto, é importante ressaltar que -precalcValBufSize e -precalcIdxBufSize combinados não devem exceder a memória disponível. Então, caso tenha memória o suficiente você pode aumentar esses valores, para que o comando de treinamento tire proveito de buffers maiores.

                  em resposta a: Onde você encontrou esses arquivos ? #41461
                  Gabriel Alves
                  Moderador

                    Olá!

                    Eles vem junto com o OpenCV caso tenha instado no Windows. Entretanto, nas versões mais recentes esses arquivos .exe do createsamples e traincascade não estão vindo, então você precisa ou compilar eles com o CMake ou (mais recomendado) você pode instalar a versão 3.4.x do OpenCV ou alguma outra anterior à 4. Recomendamos atualmente a 3.4.6, link aqui.

                    Caso já tenha instalado basta desinstalar essa e instalar a outra anterior, pois com essa versão anterior é pra dar certo.

                    Gabriel Alves
                    Moderador

                      Olá Roberto!

                      O código de cada seção ou tema você pode acessar clicando no link dentro da aba Materiais, que está presente na primeira aula onde aquele assunto é tratado. Por exemplo, para essa aula “Importação das Bibliotecas” é referente à primeira seção do curso (segmentação usando Técnicas Clássicas), ele é abordado a primeira vez na aula Introdução (link da aula aqui). Na página dessa aula, basta clicar na aba Materiais e clicar no link onde tá escrito “Código fonte – Google Colab”.

                      Para a aula em questão, o link é esse aqui https://colab.research.google.com/drive/1t2vGUlNDolMD0QtJPrHtSSGOAvHQmluU?usp=sharing

                      mas para as próximas agora você sabe como localizar o código-fonte completo desenvolvido em aula.

                      E quanto às imagens usadas durante o curso, todas os arquivos estão presentes dentro da pasta do Drive compartilhado na aula “Recursos para download”, na seção Introdução.

                      • Esta resposta foi modificada 1 ano, 11 meses atrás por Gabriel Alves.
                      em resposta a: Modelo corrompido #41380
                      Gabriel Alves
                      Moderador

                        Opa! Ah sim, nesse caso pode influenciar mesmo. Bom, que ótimo que conseguiu identificar, mas caso ainda esteja dando erros relacionados a isso é só avisar.

                        em resposta a: Reconhecimento de textos em imagem #41379
                        Gabriel Alves
                        Moderador

                          Olá Carlos!

                          Nesse caso tenho alguma sugestões. A primeira (e mais rápida) seria testar com o algoritmo EasyOCR, que é mostrado nas seções seguintes do curso. Pode ser que apenas usando ela já consiga resultados ideais ou próximos dos ideais, o que apenas demandaria mais alguns ajustes. Eu não sei qual é o tamanho original da imagem que você está enviando para fazer o OCR, mas se for essa que você mandou então eu recomendo fazer o redimensionamento dela, aumentando em 2x o seu tamanho, provavelmente obterá resultados melhores (você pode tentar o mesmo com o EAST também, só para ver quais serão os resultados).

                          Para detectar os números dentro do círculo, tem algumas abordagens que você poderia tentar. Primeiro seria detectar a localização dos círculos na imagem, isso pode ser feito usando o método HoughCircles, veja aqui https://www.geeksforgeeks.org/circle-detection-using-opencv-python/

                          Com isso, obtém-se as coordenadas da localização dos círculos na imagem, então você pode filtrar apenas essas regiões e descartar o resto. Ou melhor: processar cada região por vez (colocar o código do processamento + OCR dentro do laço de repetição, que percorre todos os círculos detectados). Assim, será processado cada um dos círculos por vez.

                          Após localizados, você pode aplicar dentro das regiões do círculos as técnicas de pré-processamento mostradas no curso. Eu indicaria primeiro realizar o redimensionamento (aumentar a imagem em pelo menos 2x) assim você terá uma probabilidade maior de reconhecimento correto.

                          em resposta a: Modelo corrompido #41335
                          Gabriel Alves
                          Moderador

                            Olá Carlos!

                            Acredito que dependa de como está o restante do seu código, tal interferência poderia ocorrer porém ela ocorrer “isolada” de modo semelhante ao descrito geralmente é difícil, ainda mais se você percebeu esse comportamento ocorrer do nada de uma hora para outra, nesse caso significaria que há outra coisa interferindo (pois para a grande maioria das técnicas, é bem improvável corromper o arquivo sozinho assim).

                            Qual técnica ou algoritmo você usou para fazer a classificação/detecção?

                            em resposta a: Usando cGAN para detectar anomalias. #41282
                            Gabriel Alves
                            Moderador

                              Olá Luiz!

                              Sim você pode usar como base o cGAN para resolver esses problemas, por exemplo a arquitetura AD-CGAN foi criada pensando nisso e é bastante citada como solução nesses casos. Além dessa, uma ideia seria testar outras GANs projetadas para esse objetivo, ou que são conhecidas por lidarem melhor nessas situações, como por exemplo a AnoGAN ou EGBAD.

                              Nesse artigo é apresentado um estudo comparativo entre essas GANs e outras usadas para detecção de anomalias, sugiro dar uma olhada. É usado como principal referência esse paper, mas o artigo é o suficiente para entender e principalmente lá está bem mais claro para tirar as conclusões.

                              Admito que até então não havia pesquisado tanto sobre o uso de GANs aplicados nessa situação que você mencionou (ataque DDoS) mas achei interessante procurar por estudos que abordem isso, encontrei esse aqui que pode ser útil. O autor propõe uma GAN especificamente para isso (GADoT), se o seu projeto se baseia nessa tarefa talvez seja mais interessante dar uma olhada nessa solução também, ver o quão viável seria. Lá no artigo é detalhado o porquê de ter feito desse jeito e a dificuldade encontrada com outras GANs, então não precisa necessariamente usar a GAN proposta, mas a partir desse estudo fica mais fácil decidir qual dela seria apropriada para resolver o problema (o que dependerá do dataset também, principalmente).

                              Gabriel Alves
                              Moderador

                                Olá 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).

                                em resposta a: Identificação de objetos errados nas imagens. #41135
                                Gabriel Alves
                                Moderador

                                  Olá Pedro!

                                  Estive analisando o seu caso, primeiramente vou passar algumas dicas referentes a como você pode imediatamente melhorar. Mais pro final, vou explicar resumidamente duas ideias que eu pensei e que eu pelo menos faria nessa situação; a primeira dará mais garantia na precisão da detecção (mantendo a qualidade da segmentação) da classe e assim evitar falsos-positivos, que é o que acontece no caso do tomate que é segmentado/detectado como carne; a outra seria em relação à questão da gordura, que você comentou.

                                  Quanto às dicas:

                                  1. A primeira sugestão continua sendo a da minha resposta anterior. Adicionar mais dados de treinamento vai ajudar o modelo a aprender características mais discriminativas e generalizar melhor para diferentes objetos e cenários. Mas além de apenas aumentar a quantidade de imagens, certifique-se de incluir uma variedade de exemplos de diferentes objetos, ângulos de visão, tamanhos e fundos. Isso ajuda o modelo a capturar a variação na aparência dos objetos da classe que você está segmentando, assim ele vai generalizar melhor e se for bem treinado isso indica também que aprenderá a diferenciar melhor. Obs: se estiver complicado conseguir novas amostras, pode utilizar técnicas de data augmentation.
                                  2. Em seguida, após adicionar mais imagens treine por mais tempo. Não tem um limite, mas recomendo fazer testes comparativos com os modelos mais recentes treinados, para evitar que não pegue um modelo que passou pelo overfitting.
                                  3. Se possível, certifique-se de que as anotações das instâncias estejam corretas e alinhadas com as imagens. Erros ou imprecisões nas anotações podem levar a resultados incorretos. Eu acredito que o seu dataset esteja, mas as vezes nunca é demais certificar isso já que tem total impacto.
                                  4. Teste com diferentes hiperparâmetros, que podem ser definidos na função ConfigRede(). Experimente ajustar esses parâmetros para obter melhores resultados. No geral esses que foram passados já são o suficiente, mas como cada dataset é um caso, é aconselhável testar com outros. Dê uma olhada nesse artigo aqui que pode lhe apresentar algumas ideias.
                                  5. Em último caso, se tiver tempo considere explorar diferentes arquiteturas de rede neural, como variantes do Mask R-CNN ou outras redes de segmentação de instâncias, que podem se adequar melhor ao seu problema. Exemplo: YOLACT.

                                   

                                  Agora as ideias que eu havia mencionado, eu pelo menos faria assim caso não conseguisse resultado bons com as dicas acima (ou testaria mesmo se conseguisse bons resultados, para comparar as abordagens)

                                  1. A ideia é usar algum algoritmo de detecção de objetos para a detecção, como o YOLOv8, que é mais recente e bastante preciso. Eu treinaria com ele para garantir uma melhor detecção do objeto, pois lembre aqui que você tem um problema grande por exemplo com os tomates que são classificados como carne, isso pode ser complicado de eliminar totalmente com soluções de segmentação de instâncias já que no geral elas podem não ser tão precisas quanto um detector de objetos seria (na verdade elas podem ser quase tão precisas quanto, mas precisa ser bem treinada antes, o que leva tempo).
                                    1. Então, a lógica seria usar o YOLOv8 para garantir uma detecção precisa da classe (e assim ignorar melhor outros objetos parecido com carne mas que não sejam) e então depois de detectado o objeto você pode aplicar na região de interesse (a área dentro da caixa delimitadora) uma solução para segmentação genérica, como o SAM (Segment Anything Model). Ele funciona bem para a grande maioria das coisas, pode ser que retorne uma máscara bem mais precisa até que o Mask R-CNN (repare que tem muitas falhas, e isso é normal até para um modelo bem treinado).
                                    2. Caso tenha dúvidas de como fazer isso na prática, veja esse artigo que já mostra como usar os dois em conjunto.
                                  2. A outra ideia que pensei seria referente ao problema de segmentação de gorduras que você mencionou nessa outra resposta. Se a sua ideia é saber a porcentagem de gordura então é ideal segmentar essa gordura usando as técnicas classicas de segmentação, que são apresentadas na primeira seção. Acredito que alguma delas vá funcionar muito melhor que usar Mask R-CNN para segmentar as gorduras (e sem falar que exigirá muito menos esforço, já que não precisa treinar um modelo).
                                    1. Pode ser segmentação por cores ou a limiarização por exemplo, veja um exemplo parecido aqui. Claro que nem toda a área branca ali da carne será a gordura, mas você pode fazer testes e ajustar, encontrar um método de limiarização que faça bem a separação entre a carne e gordura.
                                    2. É aconselhável esses tipos de técnicas pois a gordura não possui um formato tão específico, e muitas vezes ela pode aparecer ali com um formato bem fino. Por isso que caso esteja com dificuldade de fazer isso com o Mask R-CNN pode partir para essas outras técnicas.
                                Visualizando 15 posts - 181 até 195 (de 402 do total)