2016-10-26 29 views
5

Tôi muốn chụp khung hình từ video có python và opencv rồi phân loại ảnh Mat đã chụp bằng tensorflow. Vấn đề là tôi không biết cách chuyển đổi định dạng de Mat thành biến 3D Tensor. Đây là cách tôi đang làm bây giờ với tensorflow (tải hình ảnh từ tập tin):Chuyển đổi hình ảnh mat python opencv sang dữ liệu hình ảnh tensorflow

image_data = tf.gfile.FastGFile(imagePath, 'rb').read() 
with tf.Session() as sess: 
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 
    predictions = sess.run(softmax_tensor, 
          {'DecodeJpeg/contents:0': image_data}) 

tôi sẽ đánh giá cao bất kỳ sự giúp đỡ, cảm ơn trước

+0

Bản sao có thể trùng lặp của [import tensor with mat format to tensorflow] (http://stackoverflow.com/ques tions/37620330/import-tensor-with-mat-format-to-tensorflow) – thesonyman101

Trả lời

7

tải hình ảnh OpenCV sử dụng imread, sau đó chuyển đổi nó vào một mảng NumPy.

Để nạp vào khởi động v3, bạn cần sử dụng điểm kéo đa: 0 điểm, điều này mong đợi một Tensor 4 chiều có bố trí: [Chỉ mục hàng loạt, Chiều rộng, Chiều cao, Kênh] Ba cuối cùng là hoàn hảo tốt từ một cv :: Mat, cái đầu tiên chỉ cần là 0, vì bạn không muốn nuôi một loạt các hình ảnh, nhưng một hình ảnh duy nhất. Mã này trông giống như:

liên quan
#Loading the file 
img2 = cv2.imread(file) 
#Format for the Mul:0 Tensor 
img2= cv2.resize(img2,dsize=(299,299), interpolation = cv2.INTER_CUBIC) 
#Numpy array 
np_image_data = np.asarray(img2) 
#maybe insert float convertion here - see edit remark! 
np_final = np.expand_dims(np_image_data,axis=0) 

#now feeding it into the session: 
#[... initialization of session and loading of graph etc] 
predictions = sess.run(softmax_tensor, 
          {'Mul:0': np_final}) 
#fin! 

Kind,

Chris

Chỉnh sửa: Tôi chỉ nhận thấy, rằng mạng khi thành lập muốn cường giá trị bình thường như nổi tới [-0.5,0.5], vì vậy vui lòng sử dụng mã này để chuyển đổi chúng trước khi tạo hình ảnh RGB:

np_image_data=cv2.normalize(np_image_data.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX) 
+1

Cảm ơn bạn! nó hoạt động – Txeif

1

Bạn sẽ có thể chuyển đổi các định dạng opencv mat đến một NumPy mảng như:

np_image_data = np.asarray(image_data) 

một khi bạn có các dữ liệu như là một mảng numPy bạn có thể vượt qua nó để dòng chảy tensor qua một feeding mechanism như trong liên kết mà @ thesonyman101 tham chiếu:

feed_dict = {some_tf_input:np_image_data} 
predictions = sess.run(some_tf_output, feed_dict=feed_dict) 
3

Có vẻ như bạn đang sử dụng mô hình Bắt đầu được đào tạo và được xác định trước, có một bộ kéo có tên là DecodeJpeg/contents:0. Nếu vậy, tensor này dự kiến ​​một chuỗi vô hướng chứa các byte cho một ảnh JPEG.

Bạn có một vài tùy chọn, một là để xem xét thêm xuống mạng cho nút nơi JPEG được chuyển thành ma trận. Tôi không chắc định dạng MAT là gì, nhưng đây sẽ là biểu diễn [height, width, colour_depth]. Nếu bạn có thể nhận được hình ảnh của mình ở định dạng đó, bạn có thể thay thế chuỗi DecodeJpeg... bằng tên của nút bạn muốn nạp vào.

Các tùy chọn khác là chỉ cần chuyển đổi hình ảnh của bạn để hình ảnh JPEG và cho chúng ăn thẳng vào.

+0

Cảm ơn Mark, tôi đã giải quyết được sự cố khi lưu hình ảnh opencv Mat thành tệp tạm thời và sau đó tải dưới dạng bài đăng. Nó không phải là giải pháp sạch nhất nhưng nó hoạt động – Txeif

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