가변 크기의 이미지를 컨볼 루션 신경망에 대한 입력으로 제공 할 수 있습니까?


17

물체 감지를 위해 컨볼 루션 신경망에 입력으로 가변 크기의 이미지를 제공 할 수 있습니까? 가능하다면 어떻게 할 수 있습니까?


그러나 이미지를 자르려고하면 이미지의 일부를 잃어 버리고 크기를 조정하려고하면 이미지의 선명도가 사라집니다. 이미지 선명도가 주요 고려 사항 인 경우 고유 네트워크 속성을 사용하는 것이 가장 좋다는 것을 의미합니까?

답변:


9

여러 가지 방법이 있습니다. 이 중 대부분은 이미 StackOverflow, Quora 및 기타 콘텐츠 웹 사이트를 통해 여러 게시물에서 다루었습니다.

요약하면, 나열된 대부분의 기술은 두 가지 솔루션 클래스로 그룹화 할 수 있습니다.

  1. 변환
  2. 고유 네트워크 속성

변환에서 다음과 같은 기술을 찾을 수 있습니다

  • 언급 된 모든 기술 중 가장 간단한 크기 조정
  • 자르기 -정보가 손실 된 슬라이딩 창 또는 일회성 자르기로 수행 가능

또한 네트워크를 구성하는 계층 동작 덕분에 입력의 크기에 영향을받지 않는 고유 한 속성을 가진 네트워크를 조사 할 수 있습니다. 이것의 예는

  • 커널 및 단계 크기가 설명되면 각 계층의 회선은 해당 입력에 따라 적절한 차원 출력을 생성 할 수 있기 때문에 입력 크기에 제한이없는 완전 컨벌루션 네트워크 (FCN) .

  • SPP (Spatial Pyramid Pooling) , FCN은 고밀도 레이어가 완전히 연결되어 있지 않기 때문에 이미지 크기와 무관하지만 입력 변환을 고려하지 않고 고밀도 레이어를 사용 하려면 레이어를 설명 하는 흥미로운 종이 가 있습니다. 딥 러닝 네트워크.

참고 문헌 :

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

추신 : 나는 몇 가지 기술을 인용하여 놓친 것 같습니다. 이것을 철저한 목록이라고 주장하지 않습니다.


1
이론 상으로는 들리지만 Tensorflow에서는 작동하지 않습니다. 누구든지 구현이 있습니까?
Hossein

1
@Hossein 또한 실제 구현에서 몇 가지 문제가 발생했지만 Tensorflow Keras 2.x에서 가변 크기 CNN을 사용하여 오늘 몇 가지 제한 사항이 있습니다. 실용적인 세부 사항 중 일부와 관련하여 내 대답에 접근 방식에 대한 개요를 게시했습니다. 행운을 빌어 요!
J Trana

4

컨볼 루션 레이어와 풀링 레이어 자체는 입력 차원과 무관합니다. 그러나 컨볼 루션 레이어의 출력은 크기가 다른 이미지의 공간 크기가 다르므로 나중에 완전히 연결된 레이어가 있으면 문제가 발생할 수 있습니다 (완전히 연결된 레이어에는 고정 된 크기의 입력이 필요하기 때문). 이에 대한 몇 가지 솔루션이 있습니다.

1. 글로벌 풀링 : 컨볼 루션 레이어의 끝에서 완전히 연결된 레이어를 피하고 대신 풀링 (글로벌 평균 풀링)을 사용하여 피쳐 맵을 (N, H, W, C) 모양에서 글로벌 풀 전에 줄입니다. )를 (N, 1,1, C) (글로벌 풀 이후)

로 형상화합니다 . 여기서 : N = 미니 배치 샘플 수
H = 지형도의 공간 높이
W = 지형도의 공간 너비
C = 지형도 (채널)의 수

As 출력 차원 (N * C)은 이제 피쳐 맵의 공간 크기 (H, W)와 무관합니다. 분류의 경우 클래스에 대한 로짓을 얻기 위해 맨 위에 완전히 연결된 레이어를 계속 사용할 수 있습니다.

2. 가변 크기 풀링 :가변 크기 풀링 영역을 사용하여 다른 입력 크기에 대해 동일한 기능 맵 크기를 얻으십시오.

3. 입력 이미지 자르기 / 크기 조정 / 패드 : 입력 이미지를 모두 같은 모양으로 크기 조정 / 자르기 / 패드를 시도 할 수 있습니다.


전이 학습의 맥락에서 모델이 학습 한 원래 입력과 다른 크기의 입력을 사용할 수 있습니다. 여기에는 몇 가지 옵션이 있습니다.

4. 완전히 연결된 새 레이어 만들기 : 원래 완전히 연결된 레이어를 완전히 버리고 필요한 차원으로 완전히 연결된 새 레이어를 초기화하고 처음부터 학습 할 수 있습니다.

5. 완전히 연결된 레이어를 컨볼 루션으로 취급 : 일반적으로 피쳐 맵을 완전히 연결된 레이어에 공급하기 전에 (N, H, W, C)에서 (N, H * W * C)로 재구성합니다. 그러나 완전히 연결된 레이어를 수용 필드 (H, W)의 컨볼 루션으로 취급 할 수도 있습니다. 그런 다음 크기에 상관없이이 커널을 지형지 물 맵과 연관시킬 수 있습니다 (필요한 경우 제로 패딩 사용) [http://cs231n.github.io/transfer-learning/ ].


1

나는 오늘이 문제를 해결해야했기 때문에 내가 찾은 것을 공유한다고 생각했습니다. 나는 웹상에서 "이것은 이론적으로 작동 할 수있다"는 대답과 성가심이 많지만 실제적인 "여기서 구체적으로 이것을 구현하는 방법"은 적다는 것을 알았다.

Tensorflow Keras를 사용하여 이것을 구현하려면 다음을 수행해야했습니다. 다른 사람이이 중 일부를 수정, 완화 또는 제거 할 수 있음을 알 수 있습니다.

  1. input_shape에서 "없음"을 자리 표시 자 차원으로 사용하여 가변 크기 입력을 허용하도록 네트워크 입력을 설정하십시오. Francois Chollet의 답변은 here을 참조 하십시오 .
  2. 글로벌 풀링 작업이 발생할 때까지만 컨볼 루션 레이어를 사용하십시오 (예 : GlobalMaxPooling2D). 이제 크기가 고정되었으므로 밀도가 높은 레이어 등을 사용할 수 있습니다.
  3. 배치 크기는 1 만 사용하십시오. 이렇게하면 배치 내에서 혼합 크기를 처리하지 않아도됩니다.
  4. 입력 목록에서 크기가 1 인 배치를 만드는 작은 사용자 정의 시퀀스를 작성하십시오. 단일 Numpy 배열 내에서 다른 크기를 처리하지 않기 위해이 작업을 수행했습니다.
  5. 교육 및 유효성 검사를 위해 사용자 지정 시퀀스에서 Model.fit_generator를 사용하십시오. (vs. Model.fit)
  6. 어떤 이유로, 위와 같이 시퀀스를 사용할 때도 Model.predict_generator가 터졌습니다. 개별 입력에 Model.predict를 사용해야했습니다.

Model.predict를 호출하면 성능에 대해 불평했지만 솔루션의 비 효율성을 고려할 때 놀라운 것은 아니지만 작동합니다!


-2

예, 입력 이미지의 크기에 의존하지 않는 적절한 백본 네트워크를 선택하면 정확한 값이됩니다. 대부분의 네트워크는이 기준을 충족합니다.


3
당신은 틀리지 않지만 대답은 그리 유익하지 않습니다. 현대 CNN이 가변 크기 이미지로 작업 할 수 있는지 설명하기 위해 확장하는 것은 어떻습니까? 또한이 가변성의 한계는 무엇입니까 (예 : 동일한 미니 배치에서 다른 크기의 이미지를 혼합하려고 시도하지 마십시오 ...)? 구식 MLP (입력 길이가 고정되어 있음) 또는 성가신 Flatten계층이있는 구식 CNN (AlexNet & VGG-1X)에서 온 대부분의 사람들 은 현대 CNN이 원칙적으로 어떤 크기의 이미지를 촬영할 수 있는지 이해하지 못합니다.
DeltaIV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.