본문 바로가기

영상 화자 분리/개발

[Colab 학습 진행] Keras-frcnn 으로 이미지 학습시키기(2)

1. 목적 

train 과정 중, 발생했던 오류에 대한 정리하려고 합니다.

첫 번째, 'NoneType' object has no attribute 'shape'
두 번째, keras.backend' has no attribute 'image_dim_ordering
세 번째, expected convolution2d_input_1 to have shape (None, 96, 128, 1) but got array with shape (0, 1, 96, 128)

2. 항목과 종류

keras-frcnn 내 traceback 결과로 오류 지점 살피면 됩니다. 그 과정에서 구글링도 했지만, 정말 케이스 바이 케이스라서 적용되는 것을 찾기도 어려웠습니다. 이 정리해놓는 내용 수 많은 해결 사례 중 하나가 되겠지요.

 

(1) NoneType obeject has no attribute shape

-> Null 객체가 멤버 함수를 호출해서 생긴 문제입니다. 고로, 할당되는 지점을 찾아내서 검수합니다.

NonType  에러

에러를 찾기 위해 변수가 할당되는 data_augment.py 내부 동작을 살폈습니다. 보아하니, 변수 img가 빈 값이 생성되는 듯 했습니다. 첫 번째, 조취는 xml 내부 filepath를 찍어서 지정된 경로가 유효한지 확인했습니다.

data_augment.py

첫 번째 조취에 대한 유추는, ['My drive'와 My drive ] 문제입니다.

  • train.py에 넘기는 --path 정보도 ['My drive'],

  • [attonation] 내 xml의 filepath 또한 ['My drive'],

그럼에도 불구하고. data_augment 에서 출력되는 값은 [My drive]였습니다. 그리고 colab 코드 셀에서 그 차이를 보려고 했습니다.

두 번째는 실패합니다.

그래서 결론은, filepath에서 'My drive'를 없애는 것입니다. My drive를 도대체 왜 간격을 띄워서 고생스럽게 하는 지 모르겠고 이게 원인이 맞는지도 모르겠지만. 두 번째, 조취는 현재 경로를 [My drive] 내부로 당기는 것입니다. 

경로 이동

!cd가 먹으면 !cd로 하면 되고, %cd가 먹으면 %cd로 하면 됩니다. 명령어가 읽히면, 결과가 출력되니 확인하고 갑니다. 

그러고 나면, 아래와 같이 바뀝니다.

train 파라미터

(2) img_dim_ordering 문제

제 경우에 대한 이 원인은, 분명이 버전 차이에서 왔습니다.

버전을 낮추기 전에 사실 오픈 소스 내부 코드를 만져놓은 상태였습니다. 대표적으로 실수한 것이 'img_dim_ordering'을 'img_data_format'으로 단순히 변경하는 것입니다. 그래서는 안 됩니다. 하더라도 아래와 같이 수행합니다. 왼쪽이 deprecated된 것이고, 오른쪽이 새로운 사용법입니다.

변환 방식

출처 : https://github.com/keras-team/keras/issues/12649

 

(3) expected convolution2d_input_1 to have shape (None, None, None, 3) but got array with shape (1, 3, 300, 800)

이 에러는 위의 에러와 연관되었습니다. 제 경우는.

train.py 코드 내부

오류가 몇 번째 라인에서 발생했는 지 그걸 찾는 게 새삼 중요한 지 알게되었습니다.

이전에 어느 블로그에서 봤었던게, 

[ image_dim_ordering->image_data_format (x) ] 이름만 치환해주면 된다고 되있었습니다.

그러나, 그게 오류를 만들었습니다. 해서는 안 됩니다.