2016-08-12 38 views
13

Có một số hoạt động hình ảnh trong TensorFlow được sử dụng để bóp méo hình ảnh đầu vào trong quá trình đào tạo, ví dụ: tf.image.random_flip_left_right(image, seed=None)tf.image.random_brightness(image, max_delta, seed=None) và một số mục khác.TensorFlow hoạt động hình ảnh cho các lô

Các chức năng này được thực hiện cho các hình ảnh đơn lẻ (tức là các đai 3-D có hình dạng [chiều cao, chiều rộng, màu kênh]). Làm thế nào tôi có thể làm cho chúng hoạt động trên một loạt hình ảnh (tức là 4-D tensors với hình dạng [batch, height, width, color-channel])?

Ví dụ làm việc sẽ được đánh giá cao!

Trả lời

22

Một khả năng là sử dụng toán tử một ảnh mới nhất cho từng phần tử của lô.

result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images) 

hiệu quả này được xây dựng đồ thị tương tự như keveman suggests xây dựng, nhưng nó có thể hiệu quả hơn cho quy mô lô lớn hơn, bằng cách sử dụng hỗ trợ TensorFlow cho vòng lặp.

+1

Cảm ơn nó hoạt động! Có một lý do nào đó các chức năng trong tf.image không có sẵn tính năng này? Tôi đã thực hiện tất cả các biến dạng hình ảnh của tôi trong một tiền tố chức năng đơn() được gọi từ tf.map_fn(). Tôi tin rằng điều này gây ra các biến dạng ngẫu nhiên là khác nhau cho tất cả các hình ảnh bởi vì map_fn() gọi preprocess() liên tục với các giá trị ngẫu nhiên mới. Vui lòng giải thích sự khác biệt giữa câu trả lời của bạn và câu trả lời khác được đề xuất và tại sao map_fn() là một giải pháp tốt hơn. Tôi đoán tf.map_fn() vòng qua các hình ảnh tại thời gian chạy, do đó, nó không thêm ops vào biểu đồ cho mỗi hình ảnh trong lô? – questiondude

+0

Cảm ơn. Tôi đã làm điều này, và nó hoạt động. Nhưng đào tạo bây giờ chậm hơn 5 lần so với không có biến đổi, vì vậy nó không phải là hiệu quả :-( –

3

Bạn có thể gọi thao tác hình ảnh trong một vòng lặp và nối kết quả. Ví dụ:

transformed_images = [] 
for i in range(batch_size): 
    transformed_images.append(
    tf.expand_dims(tf.image.random_flip_left_right(image[i, :, :, :]), 0)) 
retsult = tf.concat(0, transformed_images) 
+0

Được thăng hạng để cảm ơn câu trả lời nhanh! Tôi nghĩ về một cái gì đó như thế này, nhưng tôi tin rằng điều này sẽ thêm ops vào đồ thị TensorFlow cho mỗi hình ảnh trong lô và do đó sẽ không làm việc cho các kích cỡ lô khác nhau.Tôi đoán tôi có thể xây dựng một biểu đồ cho mỗi lô kích thước tôi cần, nhưng nó có vẻ khá lộn xộn. Câu trả lời khác có vẻ giống như cách thích hợp để làm điều đó. Cảm ơn một lần nữa mặc dù. – questiondude

2

TLDR: bạn có thể tạo hàng đợi, xác định đọc và xử lý dữ liệu cho một phần tử của hàng đợi và hơn là tạo hàng loạt - tất cả điều này với phương thức TF.

Tôi không chắc chắn cách thức hoạt động nhưng nếu bạn sử dụng hàng đợi và tạo lô và đọc hình ảnh bằng phương pháp lưu lượng, bạn có thể làm việc với hàng loạt như với một hình ảnh.

Tôi chưa thử nghiệm trên bộ dữ liệu lớn và không biết nó tốt như thế nào (tốc độ, mức tiêu thụ bộ nhớ, v.v.). Có thể là bây giờ nó tốt hơn để tạo ra hàng loạt của chính mình.

Tôi đã thấy điều này trong ví dụ cifar10. Bạn có thể xem tại đây https://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10

  1. Trước hết, họ tạo hàng đợi với tf.train.string_input_producer. https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222 Bạn có thể sử dụng loại hàng đợi khác. Ví dụ: tôi cố gắng sử dụng tf.train.slice_input_producer cho nhiều hình ảnh. Bạn có thể đọc về điều này tại đây Tensorflow read images with labels
  2. Sau đó, họ thực hiện tất cả các thao tác cần thiết đối với một hình ảnh. Nếu họ chỉ cần đọc nó chỉ là đọc, nếu họ muốn xử lý họ cắt hình ảnh và làm công cụ khác. Đọc được mô tả trong read_cifar10. Chế biến trong distorted_inputs, nó là ở đây https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138
  3. Họ vượt qua kết quả của để tf.train.batch hoặc tf.train.shuffle_batch tùy thuộc vào các thông số và gửi lại từ inputs()distorted_inputs() chức năng.
  4. Họ đọc nó giống như images, labels = cifar10.distorted_inputs() và thực hiện công việc sau. Đó là ở đây https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66
0

Bạn có thể sử dụng để mô phỏng tf.reverse tf.image.random_flip_left_right và tf.image.random_flip_up_down trên tensors 4-D với hình dạng [mẻ, chiều cao, chiều rộng, kênh].

Các vấn đề liên quan