Corrigir AttributeError: ‘NoneType’ objeto não tem atributo ‘Shape’

NumPy é uma ferramenta popular para cálculos numéricos envolvendo matrizes, arrays e funções matemáticas. O atributo shape de um array NumPy retorna uma tupla mostrando as dimensões do array. E quando se trata de remodelar e manipular arrays NumPy, esse atributo é crucial.

A seguir, como funciona o atributo shape:

Python

 

import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)

Saída:

Python

 

(2, 2)

O atributo shape também é importante em pandas ou OpenCV.

Veja como o atributo shape é usado no OpenCV:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)

A saída é:

Python

 

(1280, 1920, 3)

Como observado, o programa executa e retorna a forma de (1280, 1920, 3). O detalhe fornecido é importante, pois permite apresentar a estrutura do array e, portanto, torna possível realizar operações nele.

No entanto, às vezes você pode tentar acessar o atributo shape, mas acabar recebendo a mensagem de erro AttributeError: NoneType object has no attribute shape. O erro ocorre quando o NumPy foi atribuído ao valor None ou não foi inicializado. Isso indica que o array não está devidamente definido e, portanto, você não pode usá-lo para realizar operações.

Neste artigo, você aprende sobre soluções de trabalho para resolver o erro para que você possa concluir o desenvolvimento usando bibliotecas de processamento de dados como Pandas e NumPy.

Primeiro abordamos as soluções em resumo e depois em detalhes. Vamos mergulhar.

Muito longo? Aqui está uma solução rápida

  • Inicialize um array com valores válidos ou garanta que as funções não retornem None.
  • Confirme se o caminho da imagem ou vídeo está correto, pois um caminho incorreto acarreta um erro. Além disso, forneça um caminho que não contenha caracteres Unicode, já que o OpenCV não suporta tais caracteres. Como alternativa, mude a localização da imagem ou vídeo.
  • Adicione uma afirmação após carregar a imagem/frame. Outra opção é usar try/except para lidar com o erro.
  • Se você estiver usando imagens criadas por inteligência artificial e as salvou, mas encontrou um erro ao tentar abrir a imagem, note que você precisa adicionar dtype=np.uint8 para que possa salvar imagens criadas por inteligência artificial. Além disso, verifique se a câmera do seu dispositivo não está aberta para outro programa. Se estiver, feche o programa inteiramente para que a câmera seja dedicada ao projeto em questão.
  • Em outros casos, o AttributeError surge de versões desatualizadas do OpenCV, portanto, tente atualizar essa versão.

1. Verificar Caminho

Como mencionado anteriormente, a principal causa do erro é ao usar um caminho incorreto. Portanto, é uma boa ideia verificar se o caminho está presente no dispositivo ou não com a ajuda do método os.path.exists(). O método os.getcwd() então imprime o diretório atual e, portanto, é fundamental se você deseja construir um caminho.

Python

 

import os
print(os.path.exists('1.jpg'))
print(os.getcwd())

2. Usar Try/Except

Também é possível gerenciar o erro usando a declaração try/except. Aqui está como a solução funciona:

Python

 

import cv2
img = cv2.imread('1.jpg')
try:
     print(img.shape)
except AttributeError:
     print('The ultimate value: ', img)

Primeiro, o segmento try será executado, e se um AttributeError for encontrado, então o bloco except é executado.

3. Verificar se a Variável é ‘None’ Usando a Declaração ‘If Else’

Para corrigir o erro, você precisa identificar de onde vem o valor None. Vamos considerar um caso comum onde o erro ocorre; ao trabalhar com uma matriz NumPy. Ao trabalhar com uma matriz NumPy, você pode receber o erro ao trabalhar com uma matriz não inicializada ou uma que foi atribuída o valor None.

Por exemplo:

Python

 

import numpy as np
arr = None
print(arr.shape)

A saída para o exemplo acima é:

Python

 

AttributeError: 'NoneType' object has no attribute 'shape'

Você pode verificar uma determinada instrução e determinar o tipo de variável que ela retorna antes de acessar o atributo de forma. O uso da declaração if-else é útil nestes casos, pois permite saber a forma e retorna None quando a forma não retorna nenhum valor.

Aqui está um exemplo:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(5)\2.jpg')
if img is not None:
     print(img.shape)
else:
     print('variable is Nonetype object')

Saída:

Python

 

variable is Nonetype object

No caso acima, especificamos primeiro o caminho absoluto. O bloco if executa apenas quando a variável armazena um valor válido que não é None, e o bloco else executa quando o valor da variável é None. Recebemos a mensagem de erro variable is Nonetype object porque o caminho não existe. Os passos funcionam independentemente do tipo de sistema operacional que você está usando, pois você só precisa inserir o caminho.

4. Inicializar Array com Valores Válidos

Outra opção quando você encontra um erro ao usar NumPy é garantir que você use valores válidos. Isso pode ser alcançado quando lemos dados de um arquivo ou de uma fonte diferente ou usamos funções do NumPy como zeros e uns.

Aqui modificamos o código para inicializar o array com zeros:

Python

 

import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)

Saída:

Python

 

(3, 3)

Conclusão

Embora AttributeError: NoneType objeto não tem atributo shape seja comum em programação, existem várias maneiras de optar e solucioná-lo. O importante é garantir que, antes de tentar acessar o atributo shape de um objeto, verifique se ele é None. Se for None, então retorne None senão, retorne ao shape.

Agora você pode resolver o erro e continuar resolvendo problemas.

Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut