편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2023.05.22

    확장 칼만필터 파이썬 코드로 구현 중 ValueError 발생


    import cv2
    import numpy as np
    
    class ExtendedKalmanFilter:
        def __init__(self, initial_state, initial_covariance):
            self.state = initial_state
            self.covariance = initial_covariance
    
        def predict(self, control_input, motion_model, motion_noise_cov):
            predicted_state = motion_model(self.state, control_input)
            predicted_covariance = np.matmul(np.matmul(motion_model(self.state, control_input), self.covariance), np.transpose(motion_model(self.state, control_input))) + motion_noise_cov
    
            self.state = predicted_state
            self.covariance = predicted_covariance
    
        def update(self, measurement, measurement_model, measurement_noise_cov):
            innovation = measurement - measurement_model(self.state)
            innovation_covariance = np.matmul(np.matmul(measurement_model(self.state), self.covariance), np.transpose(measurement_model(self.state))) + measurement_noise_cov
            kalman_gain = np.matmul(np.matmul(self.covariance, np.transpose(measurement_model(self.state))), np.linalg.inv(innovation_covariance))
    
            self.state = self.state + np.matmul(kalman_gain, innovation)
            self.covariance = np.matmul((np.identity(self.state.shape[0]) - np.matmul(kalman_gain, measurement_model(self.state))), self.covariance)
    
    def main():
        # 카메라 캡처 초기화
        cap = cv2.VideoCapture(0)
    
        # 얼굴 인식을 위한 Haar Cascade 분류기 로드
        face_cascade = cv2.CascadeClassifier('C:/Users/82107/Desktop/haarcascade_frontalface_default.xml')
    
        # 초기 상태와 공분산 설정
        initial_state = np.array([0, 0, 0, 0], dtype=np.float32)
        initial_covariance = np.identity(4, dtype=np.float32)
    
        # 초기화된 확장 칼만 필터 생성
        ekf = ExtendedKalmanFilter(initial_state, initial_covariance)
    
        while True:
            ret, frame = cap.read()
    
            if not ret:
                break
    
            # 그레이스케일 변환
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
            # 얼굴 인식
            faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    
            for (x, y, w, h) in faces:
                # 얼굴 중심 좌표 계산
                center_x = x + w // 2
                center_y = y + h // 2
    
                # 칼만 필터 예측
                ekf.predict(None, motion_model, motion_noise_cov)
    
                # 칼만 필터 업데이트
                ekf.update(np.array([center_x, center_y], dtype=np.float32), measurement_model, measurement_noise_cov)
    
                # 업데이트된 위치 추적
                prediction = ekf.state[:2]
                prediction = prediction.astype(int)
    
                # 예측 위치를 원으로 표시
                cv2.circle(frame, (prediction[0], prediction[1]), 10, (0, 255, 0), -1)
    
                # 얼굴 위치를 사각형으로 표시
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
            # 결과 출력
            cv2.imshow('Face Tracking', frame)
    
            # 'q' 키를 누르면 종료
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
        # 종료 후 리소스 해제
        cap.release()
        cv2.destroyAllWindows()
    
    def motion_model(state, control_input):
        # 모션 모델 함수 구현
        # 예시: 상태와 제어 입력을 사용하여 다음 상태를 예측
        # 필요한 경우 상태 공간 모델을 사용하여 구현해야 함
        if state is None or control_input is None:
            return None
        A = np.array([[1, 0, 0, 0], [0, 1, 0, 0]])  # 예시: 상태 공간 모델의 행렬 A
        next_state = np.matmul(A, state) + control_input
        return next_state
    
    def measurement_model(state):
        # 측정 모델 함수 구현
        # 예시: 상태를 사용하여 측정 예측
        # 필요한 경우 측정 모델을 사용하여 구현해야 함
        return state[:2]
    
    def motion_noise_cov():
        # 모션 모델의 노이즈 공분산 행렬 설정
        # 필요한 경우 노이즈 공분산 행렬을 조정해야 함
        noise_std = 0.1
        motion_noise_cov = np.diag([noise_std**2, noise_std**2, noise_std**2, noise_std**2])
        return motion_noise_cov
    
    def measurement_noise_cov():
        # 측정 모델의 노이즈 공분산 행렬 설정
        # 필요한 경우 노이즈 공분산 행렬을 조정해야 함
        noise_std = 1.0
        measurement_noise_cov = np.diag([noise_std**2, noise_std**2])
        return measurement_noise_cov
    
    if __name__ == '__main__':
        main()
    

    위 코드를 실행했을 때

    ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)

    다음과 같은 에러가 발생합니다. 해결 방법을 아시는 분 계신가요????

  • 프로필 ㅈㅅㅇ님의 편집
    날짜2023.05.21

    확장 칼만필터 파이썬 코드로 구현 중 ValueError 발생


    ```import cv2 import numpy as np

    class ExtendedKalmanFilter: def init(self, initial_state, initial_covariance): self.state = initial_state self.covariance = initial_covariance

    def predict(self, control_input, motion_model, motion_noise_cov):
        predicted_state = motion_model(self.state, control_input)
        predicted_covariance = np.matmul(np.matmul(motion_model(self.state, control_input), self.covariance), np.transpose(motion_model(self.state, control_input))) + motion_noise_cov
    
        self.state = predicted_state
        self.covariance = predicted_covariance
    
    def update(self, measurement, measurement_model, measurement_noise_cov):
        innovation = measurement - measurement_model(self.state)
        innovation_covariance = np.matmul(np.matmul(measurement_model(self.state), self.covariance), np.transpose(measurement_model(self.state))) + measurement_noise_cov
        kalman_gain = np.matmul(np.matmul(self.covariance, np.transpose(measurement_model(self.state))), np.linalg.inv(innovation_covariance))
    
        self.state = self.state + np.matmul(kalman_gain, innovation)
        self.covariance = np.matmul((np.identity(self.state.shape[0]) - np.matmul(kalman_gain, measurement_model(self.state))), self.covariance)
    

    def main(): # 카메라 캡처 초기화 cap = cv2.VideoCapture(0)

    # 얼굴 인식을 위한 Haar Cascade 분류기 로드
    face_cascade = cv2.CascadeClassifier('C:/Users/82107/Desktop/haarcascade_frontalface_default.xml')
    
    # 초기 상태와 공분산 설정
    initial_state = np.array([0, 0, 0, 0], dtype=np.float32)
    initial_covariance = np.identity(4, dtype=np.float32)
    
    # 초기화된 확장 칼만 필터 생성
    ekf = ExtendedKalmanFilter(initial_state, initial_covariance)
    
    while True:
        ret, frame = cap.read()
    
        if not ret:
            break
    
        # 그레이스케일 변환
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
        # 얼굴 인식
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    
        for (x, y, w, h) in faces:
            # 얼굴 중심 좌표 계산
            center_x = x + w // 2
            center_y = y + h // 2
    
            # 칼만 필터 예측
            ekf.predict(None, motion_model, motion_noise_cov)
    
            # 칼만 필터 업데이트
            ekf.update(np.array([center_x, center_y], dtype=np.float32), measurement_model, measurement_noise_cov)
    
            # 업데이트된 위치 추적
            prediction = ekf.state[:2]
            prediction = prediction.astype(int)
    
            # 예측 위치를 원으로 표시
            cv2.circle(frame, (prediction[0], prediction[1]), 10, (0, 255, 0), -1)
    
            # 얼굴 위치를 사각형으로 표시
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
        # 결과 출력
        cv2.imshow('Face Tracking', frame)
    
        # 'q' 키를 누르면 종료
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 종료 후 리소스 해제
    cap.release()
    cv2.destroyAllWindows()
    

    def motion_model(state, control_input): # 모션 모델 함수 구현 # 예시: 상태와 제어 입력을 사용하여 다음 상태를 예측 # 필요한 경우 상태 공간 모델을 사용하여 구현해야 함 if state is None or control_input is None: return None A = np.array([[1, 0, 0, 0], [0, 1, 0, 0]]) # 예시: 상태 공간 모델의 행렬 A next_state = np.matmul(A, state) + control_input return next_state

    def measurement_model(state): # 측정 모델 함수 구현 # 예시: 상태를 사용하여 측정 예측 # 필요한 경우 측정 모델을 사용하여 구현해야 함 return state[:2]

    def motion_noise_cov(): # 모션 모델의 노이즈 공분산 행렬 설정 # 필요한 경우 노이즈 공분산 행렬을 조정해야 함 noise_std = 0.1 motion_noise_cov = np.diag([noise_std*2, noise_std2, noise_std2, noise_std*2]) return motion_noise_cov

    def measurement_noise_cov(): # 측정 모델의 노이즈 공분산 행렬 설정 # 필요한 경우 노이즈 공분산 행렬을 조정해야 함 noise_std = 1.0 measurement_noise_cov = np.diag([noise_std*2, noise_std*2]) return measurement_noise_cov

    if name == 'main': main()

    
    
    
    위 코드를 실행했을 때 
    ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1) 다음과 같은 에러가 발생합니다. 해결 방법을 아시는 분 계신가요????