2016-04-01 15 views
13

Tôi đang sử dụng tính năng imageNet trained model của tensorflow để trích xuất các tính năng của lớp gộp cuối cùng làm vectơ đại diện cho tập dữ liệu hình ảnh mới.khắc phục Graphdef không được lớn hơn 2GB trong lưu lượng kế

Mô hình này như là dự đoán về một hình ảnh mới như sau:

python classify_image.py --image_file new_image.jpeg 

Tôi chỉnh sửa các chức năng chính vì vậy mà tôi có thể mất một thư mục hình ảnh và trả lại dự đoán trên tất cả các hình ảnh cùng một lúc và viết các tính năng vectơ trong tệp csv. Dưới đây là cách tôi đã làm điều đó:

def main(_): 
    maybe_download_and_extract() 
    #image = (FLAGS.image_file if FLAGS.image_file else 
    #   os.path.join(FLAGS.model_dir, 'cropped_panda.jpg')) 
    #edit to take a directory of image files instead of a one file 
    if FLAGS.data_folder: 
    images_folder=FLAGS.data_folder 
    list_of_images = os.listdir(images_folder) 
    else: 
    raise ValueError("Please specify image folder") 

    with open("feature_data.csv", "wb") as f: 
    feature_writer = csv.writer(f, delimiter='|') 

    for image in list_of_images: 
     print(image) 
     current_features = run_inference_on_image(images_folder+"/"+image) 
     feature_writer.writerow([image]+current_features) 

Nó chỉ làm việc tốt với giá khoảng 21 hình ảnh nhưng sau đó bị rơi với các lỗi sau:

File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1912, in as_graph_def 
    raise ValueError("GraphDef cannot be larger than 2GB.") 
ValueError: GraphDef cannot be larger than 2GB. 

Tôi nghĩ bằng cách gọi phương thức run_inference_on_image(images_folder+"/"+image) các dữ liệu hình ảnh trước đó sẽ là ghi đè để chỉ xem xét các dữ liệu hình ảnh mới, mà dường như không phải là trường hợp. Làm thế nào để giải quyết vấn đề này?

Trả lời

17

Vấn đề ở đây là mỗi cuộc gọi tới run_inference_on_image()thêm các nút vào cùng một biểu đồ, cuối cùng vượt quá kích thước tối đa. Có ít nhất hai cách để sửa lỗi này:

  1. Các dễ dàng nhưng chậm cách là sử dụng một đồ thị mặc định khác nhau cho mỗi cuộc gọi đến run_inference_on_image():

    for image in list_of_images: 
        # ... 
        with tf.Graph().as_default(): 
        current_features = run_inference_on_image(images_folder+"/"+image) 
        # ... 
    
  2. Các tham gia nhiều hơn nhưng cách hiệu quả hơn là sửa đổi run_inference_on_image() để chạy trên nhiều hình ảnh. Di chuyển vòng lặp for của bạn để bao quanh this sess.run() call và bạn sẽ không còn phải tạo lại toàn bộ mô hình trên mỗi cuộc gọi, điều này sẽ giúp xử lý từng hình ảnh nhanh hơn nhiều.

+2

Tôi đã đi với tùy chọn thứ hai và nó nhanh hơn. Cảm ơn ý tưởng! Tuy nhiên, – MedAli

+0

một câu hỏi là có cách để truyền một mảng hình ảnh thay vì chỉ một phần trong phần dự đoán của sess.run '' 'dự đoán = sess.run (pool_3_tensor, {'DecodeJpeg/contents: 0': image_data }) '' ' – MedAli

+1

Tôi nghĩ rằng điểm cấp dữ liệu cụ thể chỉ hoạt động trên một hình ảnh duy nhất. Có thể thay đổi đồ thị sao cho nó lấy một loạt ảnh, nhưng điều này đòi hỏi phải tạo một chuỗi tìm nạp trước (sử dụng 'tf.train.batch()') để kết hợp các hình ảnh thành một lô (mà sẽ phải tất cả đều có cùng kích thước), và sau đó nạp vào một chút sau đó trong mạng. Bạn sẽ phải sử dụng đối số 'input_map' để' tf.import_graph_def() 'để thay đổi tensor được sử dụng làm đầu vào. Vì cấu trúc của biểu đồ cụ thể đó không có giấy tờ, nó có thể là một thách thức mặc dù ... – mrry

2

Bạn có thể di chuyển đến một nơi nào create_graph()trước vòng lặp này for image in list_of_images: (mà vòng qua các tập tin).

Tính năng này thực hiện suy luận nhiều lần trên cùng một biểu đồ.

+0

bạn có thể hiển thị ví dụ về điều này để làm rõ không? Cảm ơn bạn. – Moondra

0

Cách đơn giản nhất là đặt create_graph() ở vị trí đầu tiên của chức năng chính. Sau đó, nó chỉ tạo biểu đồ chỉ

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