Có thể cung cấp hình ảnh có kích thước thay đổi như là đầu vào cho một mạng thần kinh tích chập?


17

Chúng ta có thể cung cấp hình ảnh với kích thước thay đổi làm đầu vào cho mạng thần kinh tích chập để phát hiện đối tượng không? Nếu có thể, làm thế nào chúng ta có thể làm điều đó?


Nhưng nếu chúng ta cố gắng cắt hình ảnh, chúng ta sẽ mất một phần hình ảnh và nếu chúng ta cố gắng thay đổi kích thước, thì độ rõ của hình ảnh sẽ bị mất. Có nghĩa là sử dụng thuộc tính mạng vốn có là tốt nhất nếu độ rõ của hình ảnh là điểm chính được xem xét?

Câu trả lời:


9

Có một số cách để làm điều đó. Hầu hết trong số này đã được đề cập trong một số bài đăng trên StackOverflow, Quora và các trang web nội dung khác.

Tóm lại, hầu hết các kỹ thuật được liệt kê có thể được nhóm thành hai loại giải pháp, cụ thể là

  1. Biến đổi
  2. Vốn có tài sản Mạng

Trong các phép biến đổi, người ta có thể tra cứu các kỹ thuật như

  • Thay đổi kích thước , đơn giản nhất trong tất cả các kỹ thuật được đề cập
  • Cắt , có thể được thực hiện dưới dạng cửa sổ trượt hoặc cắt một lần với mất thông tin

Người ta cũng có thể nhìn vào các mạng có thuộc tính vốn có để miễn nhiễm với kích thước của đầu vào nhờ vào hành vi của lớp tạo nên mạng. Ví dụ về điều này có thể được tìm thấy trong điều khoản của,

  • Các mạng chập hoàn toàn (FCN) , hoàn toàn không có giới hạn về kích thước đầu vào vì một khi kích thước hạt nhân và bước được mô tả, tích chập ở mỗi lớp có thể tạo ra các đầu ra kích thước phù hợp theo các đầu vào tương ứng.

  • Spingial Pyramid Pooling (SPP) , các FCN không có lớp dày đặc được kết nối đầy đủ và do đó không tin vào kích thước hình ảnh, nhưng nói rằng nếu người ta muốn sử dụng lớp dày đặc mà không xem xét các biến đổi đầu vào, thì có một bài báo thú vị giải thích lớp đó một mạng lưới học tập sâu.

Người giới thiệu:

  1. https://www.quora.com/How-are-variably-shoped-and-sized-images-given-inputs-to-convoluting-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

PS tôi có thể đã bỏ lỡ trích dẫn một vài kỹ thuật. Không tuyên bố đây là một danh sách đầy đủ.


1
Về lý thuyết thì điều này nghe có vẻ ổn, nhưng không hoạt động trên Tensorflow. Có ai có bất kỳ triển khai cho nó?
Hossein

1
@Hossein Tôi cũng gặp phải một số vấn đề khi triển khai thực tế, nhưng tôi đã có một CNN có kích thước thay đổi hoạt động trong Tensorflow Keras 2.x ngày nay với một số hạn chế. Tôi đã đăng một phác thảo về cách tiếp cận trong câu trả lời của tôi liên quan đến một số chi tiết thực tế. May mắn nhất!
J Trana

4

Bản thân các lớp chập và các lớp gộp là độc lập với kích thước đầu vào. Tuy nhiên, đầu ra của các lớp chập sẽ có kích thước không gian khác nhau cho các hình ảnh có kích thước khác nhau và điều này sẽ gây ra vấn đề nếu chúng ta có một lớp được kết nối đầy đủ sau đó (vì lớp được kết nối đầy đủ của chúng tôi yêu cầu đầu vào có kích thước cố định). Có một số giải pháp cho vấn đề này:

1. Pooling toàn cầu: Tránh các lớp được kết nối đầy đủ ở cuối các lớp chập và thay vào đó sử dụng pooling (như Global Average Pooling) để giảm các bản đồ đặc trưng của bạn từ hình dạng (N, H, W, C) (trước nhóm chung ) để định hình (N, 1,1, C) (sau nhóm toàn cầu), trong đó:

N = Số lượng mẫu xe buýt nhỏ
H = Chiều cao không gian của bản đồ đặc trưng
W = Chiều rộng không gian của bản đồ tính năng
C = Số bản đồ tính năng (kênh)

Như có thể thấy, kích thước đầu ra (N * C) hiện không phụ thuộc vào kích thước không gian (H, W) của các bản đồ đặc trưng. Trong trường hợp phân loại, sau đó bạn có thể tiến hành sử dụng một lớp được kết nối đầy đủ ở trên cùng để có được các bản ghi cho các lớp của bạn.

2. Pooling biến kích thước:Sử dụng các vùng gộp có kích thước thay đổi để có cùng kích thước bản đồ cho các kích cỡ đầu vào khác nhau.

3. Cắt / Thay đổi kích thước / Pad hình ảnh đầu vào: Bạn có thể cố gắng thay đổi / cắt / đệm hình ảnh đầu vào của mình để tất cả có cùng hình dạng.


Trong ngữ cảnh học chuyển, bạn có thể muốn sử dụng các đầu vào có kích thước khác với đầu vào ban đầu mà mô hình đã được đào tạo. Dưới đây là một số tùy chọn để thực hiện:

4. Tạo các lớp được kết nối hoàn toàn mới: Bạn có thể bỏ hoàn toàn các lớp được kết nối đầy đủ ban đầu và khởi tạo một lớp được kết nối đầy đủ mới với kích thước mà bạn cần và huấn luyện nó từ đầu.

5. Xử lý lớp được kết nối đầy đủ dưới dạng tích chập: Thông thường, chúng tôi định hình lại các bản đồ đặc trưng từ (N, H, W, C) đến (N, H * W * C) trước khi đưa nó vào lớp được kết nối đầy đủ. Nhưng bạn cũng có thể coi lớp được kết nối đầy đủ như một tổ hợp với trường tiếp nhận (H, W). Sau đó, bạn chỉ có thể kết hợp hạt nhân này với bản đồ tính năng của mình bất kể kích thước của chúng (sử dụng phần đệm bằng 0 nếu cần) [http://cs231n.github.io/transfer-learning/ ].


1

Tôi đã phải giải quyết vấn đề này ngày hôm nay vì vậy tôi nghĩ tôi muốn chia sẻ những gì tôi thấy rằng nó đã hoạt động. Tôi đã thấy rằng có khá nhiều câu trả lời "điều này có thể hoạt động trên lý thuyết" và các mẩu tin trên web nhưng ít hơn từ thực tế "đây là cách bạn cụ thể thực hiện điều này".

Để thực hiện điều này bằng cách sử dụng máy ảnh Tensorflow, tôi phải làm như sau. Có lẽ ai đó khác có thể tìm thấy một số trong số này có thể được sửa đổi, thư giãn hoặc bỏ.

  1. Đặt đầu vào của mạng để cho phép đầu vào có kích thước thay đổi bằng cách sử dụng "Không" làm thứ nguyên giữ chỗ trên input_shape. Xem câu trả lời của Francois Chollet tại đây .
  2. Chỉ sử dụng các lớp chập cho đến khi xảy ra thao tác gộp chung (ví dụ GlobalMaxPooling2D). Sau đó, các lớp dày đặc vv có thể được sử dụng vì kích thước hiện đã được cố định.
  3. Chỉ sử dụng cỡ lô 1. Điều này tránh việc xử lý các kích cỡ hỗn hợp trong một lô.
  4. Viết một chuỗi tùy chỉnh nhỏ tạo ra các lô có kích thước 1 từ danh sách các đầu vào. Tôi đã làm điều này để tránh xử lý các kích thước khác nhau trong một mảng Numpy.
  5. Sử dụng Model.fit_generator trên Trình tự tùy chỉnh của bạn để đào tạo và xác nhận. (so với Model.fit)
  6. Vì một số lý do, Model.predict_generator xuất hiện ngay cả khi sử dụng Chuỗi như trên. Tôi đã phải sử dụng Model.predict trên các đầu vào riêng lẻ.

Lưu ý rằng các cuộc gọi đến Model.predict đã phàn nàn về hiệu suất - điều này không có gì đáng ngạc nhiên khi giải pháp không hiệu quả - nhưng nó hoạt động!


-2

Có, chỉ cần chọn một mạng trục chính phù hợp không dựa vào kích thước của hình ảnh đầu vào để có giá trị chính xác - hầu hết các mạng đều đáp ứng tiêu chí này.


3
Bạn không sai, nhưng câu trả lời của bạn không có nhiều thông tin - vậy còn việc mở rộng nó để giải thích tại sao hầu hết CNN hiện đại có thể hoạt động với hình ảnh có kích thước thay đổi? Ngoài ra, các giới hạn cho tính biến đổi này là gì (ví dụ: không thử trộn các hình ảnh kích thước khác nhau trong cùng một lô nhỏ ...)? Hầu hết mọi người đến từ các MLP kiểu cũ (độ dài đầu vào là cố định) hoặc CNN kiểu cũ (AlexNet & VGG-1X), với các Flattenlớp pesky của họ , về nguyên tắc, các CNN hiện đại có thể chụp ảnh ở bất kỳ kích thước nào.
DeltaIV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.