AttributeError: ‘NoneType’ 객체에는 ‘Shape’ 속성이 없습니다 문제 해결하기

NumPy는 행렬, 배열 및 수학 함수를 포함한 숫자 계산을 위한 인기 있는 도구입니다. NumPy 배열의 shape 속성은 배열의 차원을 보여주는 튜플을 반환합니다. 그리고 NumPy 배열의 재구성 및 조작에 관해서는 이 속성이 중요합니다.

다음은 shape 속성 함수의 사용 방법입니다:

Python

 

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

출력:

Python

 

(2, 2)

shape 속성은 판다스 또는 OpenCV에서도 중요합니다.

다음은 OpenCV에서 shape 속성의 사용 방법입니다:

Python

 

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

출력 결과:

Python

 

(1280, 1920, 3)

관찰 결과, 프로그램은 (1280, 1920, 3)의 형태를 실행하고 반환합니다. 제공된 세부 사항은 배열의 구조를 나타내므로 이를 기반으로 작업을 수행할 수 있게 해줍니다.

그러나 때로는 shape 속성에 접근하려 할 때 AttributeError: NoneType 객체에는 shape 속성이 없다는 오류 메시지를 받게 됩니다. 이 오류는 NumPy가 None 값으로 할당되었거나 초기화되지 않았을 때 발생합니다. 따라서 배열이 제대로 정의되지 않았음을 나타내며, 이를 사용하여 작업을 수행할 수 없습니다.

이 기사에서는 판다스 및 NumPy와 같은 데이터 처리 라이브러리를 사용하여 개발을 완료할 수 있는 오류 해결 작업 솔루션에 대해 알아보겠습니다.

우선 간단한 요약으로 솔루션을 다루고, 이어서 자세한 설명을 제공하겠습니다. 시작해보겠습니다.

너무 길다고요? 빠른 해결책

  • 유효한 값으로 배열을 초기화하거나 함수가 None을 반환하지 않도록 합니다.
  • 이미지나 비디오 경로가 정확한지 확인하세요. 잘못된 경로는 오류를 유발합니다. 또한, OpenCV가 지원하지 않는 Unicode 문자를 포함하지 않은 경로를 제공하세요. 또는 이미지나 비디오의 위치를 변경하십시오.
  • 이미지/프레임을 로드한 후 어설트를 추가하는 것도 좋습니다. 또 다른 방법은 오류를 처리하기 위해 try/except를 사용하는 것입니다.
  • 인공지능을 사용하여 생성된 이미지를 저장한 후 이미지를 열 때 오류가 발생한 경우, dtype=np.uint8를 추가해야 합니다. 이를 통해 인공지능으로 생성된 이미지를 저장할 수 있습니다. 또한 기기의 카메라가 다른 프로그램에 의해 사용 중이지 않은지 확인하세요. 만약 사용 중이라면, 해당 프로그램을 완전히 종료하여 카메라를 현재 프로젝트에 전담하게 만드십시오.
  • 또한, attributeerror는 OpenCV의 구형 버전에서 발생할 수 있으니, 이 버전을 업데이트해보십시오.

1. 경로 확인

앞서 언급한 바와 같이, 오류의 주된 원인은 잘못된 경로를 사용할 때입니다. 따라서 os.path.exists() 메서드를 사용하여 해당 경로가 기기에 존재하는지 확인하는 것이 좋습니다. os.getcwd() 함수는 현재 디렉토리를 출력하므로 경로를 구성하는 데 중요합니다.

Python

 

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

2. Try/Except 사용

오류를 관리하기 위해 try/except 문을 사용할 수도 있습니다. 해결 방법은 다음과 같습니다:

Python

 

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

먼저, try 섹션이 실행되고, AttributeError가 발생하면 except 블록이 실행됩니다.

3. ‘If Else’ 문을 사용하여 변수가 ‘None’인지 확인하기

오류를 수정하려면 None 값이 어디서 오는지 파악해야 합니다. 오류가 발생하는 일반적인 경우를 생각해 보겠습니다. 이 경우는 NumPy 배열을 사용할 때입니다. NumPy 배열을 사용할 때, 초기화되지 않은 배열이나 None 값이 할당된 배열을 사용하면 오류가 발생할 수 있습니다.

예를 들어:

Python

 

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

위의 결과:

Python

 

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

주어진 문장을 확인하고 모양 속성에 접근하기 전에 반환하는 변수 유형을 판단할 수 있습니다. if-else 문은 이러한 경우에 유용하며, 이를 통해 shape를 알 수 있고, shape가 값을 반환하지 않을 때 None을 반환합니다.

다음은 예시입니다:

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')

출력:

Python

 

variable is Nonetype object

위의 경우, 먼저 절대 경로를 지정했습니다. if 블록은 변수가 None이 아닌 유효한 값을 저장할 때만 실행되며, 그 외의 경우 else 블록이 실행됩니다. 경로가 존재하지 않기 때문에 variable is Nonetype object 오류 메시지를 얻습니다. 이 단계는 사용하는 운영 체제에 관계없이 작동합니다. 경로를 입력하기만 하면 됩니다.

4. 유효한 값으로 배열 초기화하기

NumPy를 사용하는 동안 오류를 만나면 유효한 값을 사용하도록 하는 또 다른 방법은 파일이나 다른 소스에서 데이터를 읽거나 NumPy 함수인 zeros와 ones를 사용하는 것입니다.

여기서 우리는 배열을 0으로 초기화하도록 코드를 수정합니다:

Python

 

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

출력:

Python

 

(3, 3)

결론

반면 AttributeError: NoneType 객체에는 shape 속성이 없습니다. 프로그래밍에서 일반적이지만, 이를 선택하고 해결할 수 있는 여러 가지 방법이 있습니다. 중요한 것은 객체의 모양 속성에 액세스하려고 하기 전에 객체가 None인지 확인하는 것입니다. 그것이 None이면, 그런 다음 None을 반환하고, 그렇지 않으면 shape에 반환합니다.

이제 오류를 해결하고 문제 해결을 계속할 수 있습니다.

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