2016-01-27 49 views
5

Tôi đã tạo một tập dữ liệu và lưu nó vào một tập tin TFRecord. Vấn đề là hình ảnh có kích thước khác nhau, vì vậy tôi muốn lưu kích thước cũng như với các hình ảnh. Vì vậy, tôi đã sử dụng TFRecordWriter và xác định các tính năng như:Cách đọc hình ảnh có kích thước khác nhau trong một tập tin TFRecord

example = tf.train.Example(features=tf.train.Features(feature={ 
    'rows': _int64_feature(image.shape[0]), 
    'cols': _int64_feature(image.shape[1]), 
    'image_raw': _bytes_feature(image_raw)})) 

Tôi mong rằng tôi có thể đọc và giải mã hình ảnh sử dụng TFRecordReader, nhưng vấn đề là tôi không thể nhận được giá trị của các hàng và cols từ tập tin, vì họ là tensors. Vì vậy, làm thế nào tôi phải làm gì để đọc kích thước động và định hình lại hình ảnh cho phù hợp. Cảm ơn guys

Trả lời

2

Bạn có thể gọi tf.reshape với thông số động shape.

image_rows = tf.cast(features['rows'], tf.int32) 
image_cols = tf.cast(features['cols'], tf.int32) 
image_data = tf.decode_raw(features['image_raw'], tf.uint8) 
image = tf.reshape(image_data, tf.pack([image_rows, image_cols, 3])) 
+0

nó nêu ra lỗi "Tất cả các hình phải được xác định đầy đủ: 1". từ nhật ký, có vẻ như nó có liên quan đến chức năng "tf.train.shuffle_batch()". Tôi phải làm gì đây? –

+0

lô cần biết hình dạng trong quá trình xây dựng biểu đồ (để biết số lượng bộ nhớ phân bổ cho hàng đợi), có lẽ sử dụng tf.image.resize_images trước tf.batch? Nếu bạn sử dụng bất kỳ thẻ con chuẩn nào, bạn sẽ cần phải đổi kích thước hình ảnh thành cùng kích thước, –

+0

+ Tong Shen, vì bạn đang xây dựng một lô, hình ảnh phải có cùng kích thước. Nếu bạn biết kích thước này trước, có thể bạn có thể gọi một cái gì đó như 'image.set_shape ([32,32,3])' để xác định đầy đủ hình dạng. – bgshi

2

Tôi đề nghị một công việc như:

TARGET_HEIGHT = 500 
TARGET_WIDTH = 500 

image = tf.image.decode_jpeg(image_buffer, channels=3) 
image = tf.image.convert_image_dtype(image, dtype=tf.float32) 

# Choose your bbox here. 
bbox_begin = ... (should be (h_start, w_start, 0)) 
bbox_size = tf.constant((TARGET_HEIGHT, TARGET_WIDTH, 3), dtype=tf.int32) 

cropped_image = tf.slice(image, bbox_begin, bbox_size) 

cropped_image có kích thước tensor liên tục, và sau đó có thể được ném vào một lô shuffle.

Bạn có thể truy cập động kích thước của hình ảnh đã giải mã bằng cách sử dụng tf.shape(image). Bạn có thể thực hiện tính toán trên các phần tử con kết quả và sau đó ghép chúng lại với nhau bằng cách sử dụng một cái gì đó như bbox_begin = tf.pack([bbox_h_start, bbox_y_start, 0]). Chỉ cần chèn logic của riêng bạn vào đó để xác định điểm bắt đầu của vụ cắt và những gì bạn muốn làm nếu hình ảnh bắt đầu nhỏ hơn mức bạn muốn cho đường ống của mình.

Nếu bạn muốn upsize chỉ nếu hình ảnh nhỏ hơn kích thước mục tiêu của bạn, bạn sẽ cần phải sử dụng tf.control_flow_ops.cond hoặc tương đương. Nhưng bạn có thể sử dụng các hoạt động tối thiểu và tối thiểu để đặt kích thước cửa sổ cắt của bạn để bạn trả lại hình ảnh đầy đủ iff nhỏ hơn kích thước được yêu cầu và sau đó điều chỉnh kích thước vô điều kiện lên đến 500x500. Hình ảnh đã cắt sẽ có kích thước 500x500, do đó thay đổi kích thước sẽ trở thành không có hiệu quả.

+0

là luồng công việc này có đang hoạt động với hàng đợi tệp FIFO không? Bây giờ vấn đề là tôi muốn cắt một cách ngẫu nhiên hình ảnh bằng cách sử dụng 500 * 500, cách của bạn dường như cắt một vùng cố định. Bây giờ tôi đã thay đổi kích thước hình ảnh trước để kích thước tối thiểu bằng hoặc lớn hơn 500. Điều duy nhất tôi đang phải đối mặt là làm thế nào để giải mã hình ảnh từ chuỗi thô và định hình lại kích thước ban đầu của nó. Vì trọng lượng và chiều cao thay đổi theo hình ảnh, chúng tôi không thể sử dụng kích thước cố định. –

+0

Phải, bạn cần chọn ngẫu nhiên khởi đầu của hộp 500x500. Bằng cách đặt bbox_size thành [500, 500, 3] (số 3 dành cho số kênh), bạn sẽ nhận được một vụ cắt 500x500. Bạn phải thiết lập các điểm bắt đầu cho cây trồng ngẫu nhiên của bạn, tùy thuộc vào thuật toán cây trồng ngẫu nhiên ưa thích của bạn. Do bạn đã thay đổi kích thước, bạn có thể chỉ cần thực hiện 'imageshape = tf.shape (image)' và sau đó thiết lập điểm bắt đầu, kết thúc như sau: 'h_start = tf.random_uniform ([], minval = 0, maxval = imageshape [0 ] -500, dtype = tf.int32) 'và tương tự cho w_start. – dga

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