Forum Replies Created

Viewing 15 posts - 106 through 120 (of 415 total)
  • Author
    Posts
  • in reply to: Divisão de imagem #45807
    Gabriel Alves
    Keymaster

      Olá João!

      Para dividir uma imagem maior em várias subimagens você pode usar dois loops para cortar a imagem em blocos de 640 x 640 pixels.

      A ideia é basicamente iterar sobre as coordenadas da imagem original e através dessas coodenadas xy você delimita o inicio/fim de cada pedaço da imagem, de forma que a cada iteração uma subimagem seja extraída e armazenada.

      Aqui está um exemplo de código:

      # Carrega a imagem
      imagem = cv2.imread('sua_imagem.jpg')
      
      # (Tamanho das subimagens)
      altura_subimagem = 640
      largura_subimagem = 640
      
      # Obter as dimensões da imagem original
      altura, largura, _ = imagem.shape
      
      # Loop para cortar as subimagens
      for i in range(0, altura, altura_subimagem):
        for j in range(0, largura, largura_subimagem):
          # Coordenadas para cortar
          subimagem = imagem[i:i+altura_subimagem, j:j+largura_subimagem]
      
          # Salvar ou processar a subimagem
          nome_arquivo = f'subimagem_{i}_{j}.jpg'
          cv2.imwrite(nome_arquivo, subimagem)

      O loop corta a imagem em subimagens e cada subimagem é salva como um arquivo separado. Você pode ajustar o nome dos arquivos conforme necessário. Com isso, sua imagem original de 3.000 x 4.000 pixels será fragmentada em várias imagens menores, todas do tamanho que você especificou (640 x 640 pixels).

      Gabriel Alves
      Keymaster

        Opa, que ótimo que melhorou bastante o desempenho!

        Comparando esses dois testes, dá para comprovar que ambas as abordagens têm suas vantagens e desvantagens. Usar base64 resulta em um arquivo significativamente menor (710 KB contra 9.002 KB com pickle), o que é vantajoso para armazenamento e transmissão de dados. No entanto, a performance de pickle é superior tanto no tempo de cadastro quanto carregamento e processamento.

        Portanto, a escolha entre as duas depende das suas prioridades. Se o objetivo principal for economizar espaço de armazenamento e garantir portabilidade, base64 é a melhor opção. Por outro lado, se a prioridade for performance e rapidez na leitura e escrita de dados, pickle é mais recomendado. Avalie o que é mais importante para seu projeto e escolha a abordagem que melhor se alinha às suas necessidades. Caso escolha a pickle devido à velocidade, você pode ainda tentar aplicar técnicas para reduzir o tamanho em disco, como explicado nesse artigo por exemplo.

        Gabriel Alves
        Keymaster

          Olá Cesar!

          Para melhorar a performance ao armazenar e exibir imagens coloridas em um DataFrame eu acredito que algumas mudanças podem ser feitas na sua abordagem.

          No código de cadastro de usuários no DataFrame, atualmente você está convertendo cada imagem em uma lista antes de armazenar, o que pode ser bem ineficiente em termos de espaço e tempo de execução. Além disso, ao ler as imagens do DataFrame, você está usando ast.literal_eval para converter as strings de volta em listas, o que também pode vir a ser extremamente lento.

          Uma abordagem mais eficiente seria armazenar as imagens codificadas em base64 diretamente no dataframe. Isso não só melhora a performance, mas também facilita a manipulação dos dados.

          E codificando as imagens em base64 você reduz o tempo necessário para converter entre diferentes formatos de dados. Armazenar imagens codificadas como strings base64 em um CSV pode ser mais eficiente do que armazenar listas de números, além de facilitar a manipulação dos dados. Isso deve resolver o problema de performance que você está enfrentando e tornar o processo de armazenamento e recuperação de imagens mais eficiente.

          Aqui está uma sugestão de código com base no que você informou:

          [ ... importações e restante do código ] 
          
          # Função para converter imagem para base64
          def image_to_base64(image):
            _, buffer = cv2.imencode('.jpg', image)
            image_base64 = base64.b64encode(buffer).decode('utf-8')
            return image_base64
          
          # Função para converter base64 para imagem
          def base64_to_image(image_base64):
            image_data = base64.b64decode(image_base64)
            image_np = np.frombuffer(image_data, dtype=np.uint8)
            image = cv2.imdecode(image_np, cv2.IMREAD_COLOR)
            return image
          
          # Cadastrar usuario no Dataframe
          def cadastra_dataframe(full_name, imagem):
            nome = [full_name]
            imagem_base64 = [image_to_base64(imagem)]
          
            # Abrindo df existente
            df = pd.read_csv('usuario.csv')
          
            # Dados para ser incluído o dataframe existente
            dados = {'full_name': nome, 'imagem': imagem_base64}
            dados = pd.DataFrame(dados)
          
            df = pd.concat([df, dados], ignore_index=True)
            df.to_csv('usuario.csv', index=False)
          
          # Exibir as imagens gravadas no dataframe
          dados_df = pd.read_csv('usuario.csv')
          
          ### E para iterar sobre cada linha do DataFrame para exibir as imagens
          for i in range(len(dados_df)):
            full_name = dados_df['full_name'][i]
            print(full_name)
          
            inicio = time.time()
            imagem_base64 = dados_df['imagem'][i]
            imagem_array = base64_to_image(imagem_base64)
            fim = time.time()
            execucao = fim - inicio
            print(f'tempo de execucao : {execucao:.6f} segundos')
          
            cv2.imshow('Imagem Recuperada', imagem_array)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
          in reply to: Reconhecimento Facial com CFTV #45623
          Gabriel Alves
          Keymaster

            Olá Douglas!

            Com o conhecimento do curso de Reconhecimento e Detecção Facial com Python você conseguirá criar sim a sua solução de reconhecimento facial. E seguir o restante da trilha é também recomendado para obter uma maior intuição e aprender a dominar melhor as principais bibliotecas de visão computacional, como OpenCV e Dlib (e assim saber o caminho adequado para desenvolver sua própria solução).

            Embora não tenha atualmente um curso na trilha com a proposta específica de desenvolver um sistema próprio e completo com esse objetivo, você terá todo o conhecimento sobre a IA necessária para a tarefa de reconhecimento e saberá como fazer o treinamento da mesma, para que ela aprenda a reconhecer qualquer rosto. Portanto, o curso citado não mostra como criar passo a passo tal aplicação, pois isso foge do propósito (nesse caso procurar por cursos de desenvolvimento de sistemas, ou desenvolvimento de interfaces por exemplo, como é possível encontrar aqui na plataforma também).

            Apesar de ensinar a usar técnicas modernas e robustas, o uso dessas técnicas de reconhecimento facial em sistemas de CFTV podem ser um pouco mais desafiadoras devido a fatores como qualidade de câmera, ângulo, etc – portanto, requer uma atenção maior a certos detalhes. Mas qualquer dúvida que tiver sobre o conteúdo ou dicas adicionais você pode perguntar aqui no fórum.

            in reply to: Erro na hora de abrir a interface NGROK 3200 #45607
            Gabriel Alves
            Keymaster

              Olá Vinicius!

              O que resolve esse erro geralmente é interromper o Kernel, reiniciar o ambiente de execução (na página inicial do painel do SageMaker) e abrir novamente ao ambiente com GPU.

              Se persistir, peço que compartilhe aqui um print das últimas informações que aparecem na saída da célula onde há o comando para abrir a interface (etapa 4), se possível um print ou pode copiar e colar se preferir, mostrando as últimas informações que foram exibidas antes de aparecer esse problema. Talvez com essas informações adicionais eu consiga verificar melhor o que poderia estar causando e assim determinar como resolver.

               

              in reply to: Transformação para passar na rede neural #45593
              Gabriel Alves
              Keymaster

                Olá Victor!

                Para passar para a rede neural as imagens são geralmente convertidas para vetores (um array unidimensional), pois essas camadas trabalham com dados em formato vetorial. Por isso que anteriormente você viu ser feito dessa forma.

                No entanto, para visualização e algumas operações específicas é mais conveniente e necessário trabalhar com imagens no formato matricial (bidimensional). No código que você mencionou, o X_teste[0].reshape(28,28) está convertendo o vetor de volta para uma matriz de 28×28 pixels para que possamos visualizar a imagem original de maneira mais intuitiva. Ou seja, é apenas para visualizarmos a imagem (repare que para isso estamos usando a função plt.imshow, que é justamente usada para exibir a imagem).

                Portanto, essa conversão não é necessária para o processamento na rede neural, mas é útil para a visualização e interpretação dos dados. Então, embora a imagem seja processada internamente como um vetor ao passar pelas camadas densas, ela é reformatada em uma matriz para facilitar a visualização.

                in reply to: Erro ao instalar o Dlib #45592
                Gabriel Alves
                Keymaster

                  Olá Cesar!

                  Nesse caso você vai precisar instalar antes o CMake, disponível para baixar aqui https://cmake.org/download/

                  Em seguida, instale também o compilador Visual studio tools:  https://visualstudio.microsoft.com/visual-cpp-build-tools/. Durante a instalação, certifique-se de selecionar os componentes de desenvolvimento de C++.

                  Para evitar alguns erros comuns que podem vir a ocorrer, eu sugiro dar uma olhada nesse artigo, que contém algumas dicas de como evitar os erros, como por exemplo adicionar o CMake às variáveis de ambiente do Windows.

                  Gabriel Alves
                  Keymaster

                    Olá Victor!

                    Para fazer uma cópia do arquivo da aula no Colab, selecione a opção “Arquivo > Fazer uma cópia no Drive”, no menu do topo.
                    Caso tenha dúvidas, veja a aula “Carregamento e processamento da imagem”, isso é mostrado no minuto 1:33 do vídeo.

                    Como alternativa você pode fazer o download do .ipynb dentro da mesma opção Arquivo e depois fazer o upload no Colab, mas desse modo acima acaba sendo mais prático.

                    O link para o Colab contendo o código está presente sempre na primeira aula da seção, ou da primeira aula onde aquele código é exibido. E quanto aos demais arquivos que serão usados ao longo do curso, estão no drive da aula “Recursos para download”.

                    in reply to: Valores Matriz de confusão #45420
                    Gabriel Alves
                    Keymaster

                      Olá!

                      Na verdade está um pouco invertido de acordo com a ordem que você apresentou. O correto seria:

                      • Verdadeiro Positivo = 129
                      • Falso Positivo = 60  (pois a predição foi ‘isoladores’ e o real era ‘fundo’, portanto é incorretamente marcado como positivo)
                      • Falso Negativo = 89  (pois a predição foi ‘fundo’ mas na realidade era ‘isoladores’, portanto é incorretamente marcado como negativo)
                      • Verdadeiro Negativo = (não aplicável)

                      Portanto, talvez assim estaria mais próxima da ordem que você mencionou estar mais acostumado, embora não exatamente ainda. Aliás, acredito que não deve haver uma forma “correta”, se for pesquisar verá que não há uma unanimidade nesse sentido pois pode-se encontrar diversos materiais e artigos sérios onde tanto o FP quanto o FN estão em cima, ou outros onde segue essa mesma ordem que você passou. No entanto, possivelmente a ordem mais usada é onde o Verdadeiro Positivo esteja no canto superior esquerdo e o Verdadeiro Negativo esteja no canto inferior direito (aliás, se pesquisar em inglês observará que é mais comum ainda seguirem essa mesma ordem que o YOLO usa).

                      in reply to: Melhor época de treinamento do modelo #45406
                      Gabriel Alves
                      Keymaster

                        Olá Brenda!

                        Para saber qual a época que corresponde ao melhor modelo treinado (o best.pt) você pode consultar o arquivo results.csv que é executado durante o treinamento. Este arquivo registra métricas como precisão, recall, mAP e perda de valor para cada época. Procure a época com melhor desempenho (geralmente a menor perda de validação ou o maior mAP, dependendo de qual best.pt foi selecionado) para identificar a época a que corresponde o seu modelo best.pt. Lembrando que esse arquivo best.pt (contendo os pesos salvos para o melhor resultado) também está acessível dentro do diretório de treinamento, junto ao last.pt (os pesos mais recentes salvos, independente de serem os melhores ou não).

                        in reply to: Estimativa de pose #45404
                        Gabriel Alves
                        Keymaster

                          Olá Brenda!

                          A estimativa de pose do YOLOv8 pode ser feita usando os recursos implementados nessa seção. Para carregar o modelo você pode usar o mesmo método “YOLO()” porém ao invés de passar como parâmetro o nome do arquivo contendo os pesos do modelo de detecção você vai colocar o nome do modelo de estimativa de pose.

                          Para ver um exemplo e mais informações sobre os parâmetros, veja aqui https://docs.ultralytics.com/pt/tasks/pose/#models

                          in reply to: Texto Não e reconhecido #45334
                          Gabriel Alves
                          Keymaster

                            Disponha =)

                            in reply to: Como instalar o automatic1111 (local) com esses plugins? #45333
                            Gabriel Alves
                            Keymaster

                              Olá Arthur!

                              Deve estar mostrando diferente por causa das extensões, para deixar com a configuração mais próxima à do curso eu sugiro executar os comandos listado no bloco dentro do passo 2 (Instalação das bibliotecas e recursos essenciais). Pode deixar na mesma ordem que eles aparecem lá.

                              Nesse bloco é feita a instalação de algumas bibliotecas e de várias extensões diferentes que serão carregadas ao abrir o Automtic1111. Cada linha contendo o git clone corresponde a uma extensão/plugin diferente. Por exemplo, o comando  “!git clone –depth 1 https://github.com/ahgsql/StyleSelectorXL”   irá instalar a extensão de seletor de estilos. Ao executar localmente, a única diferença é que você deve retirar a exclamação do início do comando (já o resto pode deixar igual).

                              in reply to: Valores Matriz de confusão #45332
                              Gabriel Alves
                              Keymaster

                                Olá Francisco!

                                Esse conceito de ‘background’ existe no contexto da matriz de confusão e é usado para indicar previsões falso-positivas do seu modelo quando ele vê objetos inexistentes em segundo plano. Ou seja, o background (fundo) seria aquilo que não é o objeto, desse modo é possível calcular e visualizar melhor os falsos positivos, que são os objetos incorretamente detectados.

                                Os demais conceitos são os mesmos encontrados em qualquer tipo de matriz de confusão. Não sei o quão familiarizado está com esse método de avaliação, mas só para lembrar rapidamente que a matriz de confusão é uma tabela que compara as previsões do modelo com os valores reais, organizada de forma que as linhas representam as classes reais e as colunas representam as classes preditas. Cada célula da matriz contém o número de amostras que correspondem a uma combinação específica de classe real e classe predita. Os valores dentro da matriz são divididos em quatro categorias principais: Verdadeiro Positivo (TP), Verdadeiro Negativo (TN), Falso Positivo (FP) e Falso Negativo (FN). TP indica o número de instâncias em que o modelo corretamente previu a classe positiva; TN é o número de instâncias corretamente identificadas como negativas; FP refere-se às instâncias incorretamente classificadas como positivas; e FN são as instâncias que foram incorretamente classificadas como negativas. O eixo X (horizontal) da matriz de confusão corresponde às classes classes reais, enquanto o eixo Y (vertical) corresponde às preditas.

                                Nesse diagrama aqui é mostrado o processo de criação da matriz de confusão. Se desejar uma explicação bem mais detalhada do processo, recomendo esse artigo.

                                in reply to: Texto Não e reconhecido #45324
                                Gabriel Alves
                                Keymaster

                                  Olá, que ótimo!

                                  Quanto ao exemplo fornecido, o que pode estar dificultando o reconhecimento é a perspectiva de placa na foto, veja que pelo fato de não estar alinhada o texto fica na diagonal e isso pode dificultar o OCR. Para corrigir isso, você pode usar alguns conjuntos de técnicas de processamento para fazer a correção da perspectiva, veja esse código aqui de exemplo.

                                Viewing 15 posts - 106 through 120 (of 415 total)