làm thế nào để định dạng dữ liệu hình ảnh để đào tạo / dự đoán khi hình ảnh có kích thước khác nhau?


87

Tôi đang cố gắng đào tạo mô hình của mình để phân loại hình ảnh. Vấn đề tôi gặp phải là, chúng có kích thước khác nhau. tôi nên định dạng hình ảnh / hoặc kiến ​​trúc mô hình của mình như thế nào?


2
Vui lòng hiển thị những gì bạn đã cố gắng cho đến nay và những gì dường như không hiệu quả với bạn.
Keith John Hutchison

16
Và bam có mã của Inception v4. Tôi không đồng ý với nhận xét lạc quan đó. Thêm một chút thông tin đầu vào sẽ rất hay - giống như loại mạng mà chúng ta đang nói đến - nhưng số phiếu phản đối không hợp lý chút nào. Đó một vấn đề thực sự ở đó.
trời vào

4
Câu hỏi đặt ra là ImageNet định dạng dữ liệu hình ảnh của họ như thế nào để hữu ích cho việc đào tạo?
mskw

Câu trả lời:


146

Bạn không nói bạn đang nói về kiến ​​trúc gì. Vì bạn nói rằng bạn muốn phân loại hình ảnh, tôi cho rằng đó là một mạng một phần phức hợp, một phần được kết nối đầy đủ như AlexNet, GoogLeNet, v.v. Nói chung, câu trả lời cho câu hỏi của bạn phụ thuộc vào loại mạng bạn đang làm việc.

Ví dụ: nếu mạng của bạn chỉ chứa các đơn vị tích tụ - nghĩa là không chứa các lớp được kết nối đầy đủ - thì nó thể bất biến với kích thước của hình ảnh đầu vào. Một mạng như vậy có thể xử lý các hình ảnh đầu vào và lần lượt trả về một hình ảnh khác ("phức tạp tất cả các cách"); bạn sẽ phải đảm bảo rằng kết quả đầu ra phù hợp với những gì bạn mong đợi, vì tất nhiên bạn phải xác định khoản lỗ theo một cách nào đó.

Tuy nhiên, nếu bạn đang sử dụng các đơn vị được kết nối đầy đủ, bạn sẽ gặp rắc rối: Ở đây bạn có một số trọng lượng đã học cố định mà mạng của bạn phải làm việc, vì vậy các đầu vào khác nhau sẽ yêu cầu một số trọng lượng khác nhau - và điều đó là không thể.

Nếu đó là vấn đề của bạn, đây là một số điều bạn có thể làm:

  • Đừng quan tâm đến việc bóp méo hình ảnh. Dù sao thì một mạng cũng có thể học cách hiểu nội dung; quy mô và quan điểm có ý nghĩa gì đối với nội dung không?
  • Cắt giữa các hình ảnh thành một kích thước cụ thể. Nếu bạn sợ mình mất dữ liệu, hãy thực hiện nhiều lần cắt và sử dụng chúng để tăng thêm dữ liệu đầu vào của bạn, để hình ảnh gốc sẽ được chia thànhN các ảnh khác nhau có kích thước phù hợp.
  • Đặt các hình ảnh có màu đồng nhất thành kích thước bình phương, sau đó thay đổi kích thước.
  • Làm một sự kết hợp của điều đó.

Tùy chọn đệm có thể tạo ra một nguồn lỗi bổ sung cho dự đoán của mạng, vì mạng có thể (đọc: có khả năng sẽ) thiên vị với các hình ảnh chứa đường viền được đệm như vậy. Nếu bạn cần một số ý tưởng, hãy xem phần Hình ảnh của tài liệu TensorFlow, có những phần nhưresize_image_with_crop_or_pad vậy sẽ mang lại công việc lớn hơn.

Đối với việc không quan tâm đến việc bóp méo, đây là một phần của đường ống tiền xử lý của mạng Inception nổi tiếng:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Họ hoàn toàn nhận thức được điều đó và bằng mọi cách làm.

Tùy thuộc vào mức độ bạn muốn hoặc cần phải đi, thực sự có một bài báo ở đây có tên là Spatial Pyramid Pooling trong Deep Convolution Networks for Visual Recognition xử lý các đầu vào có kích thước tùy ý bằng cách xử lý chúng theo một cách rất đặc biệt.


11
Chủ đề này có vẻ phức tạp hơn nhiều khi bạn xử lý việc phát hiện đối tượng và phân đoạn cá thể, vì kích thước hộp neo cũng là siêu tham số cần phải điều chỉnh nếu bạn có tập dữ liệu với kích thước hình ảnh có phương sai cao.
CMCDragonkai

Tỷ lệ khung hình đóng một vai trò khá quan trọng đối với một mạng lưới đó là phân biệt giữa hình tròn và hình elip.
HelloGoodbye

1
Một nhận xét chung khác là các lô không nhất thiết phải có cùng kích thước; lô đầu tiên có thể xử lý hình ảnh 4: 3, lô thứ hai với 16: 9, v.v., miễn là các lớp dày đặc được quan tâm.
sunide

1
@Tobitor, luôn làm cho các đầu vào của mạng gần với dữ liệu thực tế (thử nghiệm hoặc thời gian suy luận) nhất có thể. Nếu tất cả hình ảnh của bạn rộng hơn nhiều so với mức cao, bạn cũng nên lập mô hình mạng để xử lý hình ảnh của bạn như thế này. Điều đó nói rằng, nếu bạn không thể nói dữ liệu "sử dụng" của bạn sẽ như thế nào, bạn phải hy sinh một số trong quá trình đào tạo. Và trong trường hợp đó, thay đổi kích thước hình ảnh từ 1000x200 thành 256x256 nói chung là ổn (hãy tưởng tượng bạn đang nhìn biển số xe đó ở góc 60 độ - bây giờ nó rất gần vuông).
trời

2
@Tobitor Không có yêu cầu nào đối với hình ảnh phải là hình vuông, nó chỉ là sự cân bằng tồi tệ nhất nếu bạn không biết kích thước hình ảnh thực tế trong quá trình suy luận. : ^) Về kích thước, càng nhỏ càng tốt, nhưng hình ảnh cần phải đủ lớn để vẫn nắm bắt được những chi tiết cần thiết tốt nhất - nói chung, chỉ cần lưu ý rằng nếu bạn, là một chuyên gia về con người, không thể xác định được những gì trong hình ảnh, mạng cũng sẽ không thể.
trời

11

Hãy thử tạo một lớp gộp kim tự tháp không gian. Sau đó, đặt nó sau lớp chập cuối cùng của bạn để các lớp FC luôn nhận được các vectơ có chiều không đổi làm đầu vào. Trong quá trình đào tạo, đào tạo các hình ảnh từ toàn bộ tập dữ liệu bằng cách sử dụng kích thước hình ảnh cụ thể cho một kỷ nguyên. Sau đó, đối với kỷ nguyên tiếp theo, hãy chuyển sang kích thước hình ảnh khác và tiếp tục đào tạo.


Bạn có thể giải thích một chút về "gộp kim tự tháp không gian" so với gộp thông thường là gì?
Matthieu

xin vui lòng đọc tổng hợp kim tự tháp không gian trong các mạng chập sâu sắc đối với sự công nhận hình ảnh trong blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed
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.