

TensorflowのSingle Shot MultiBox Detectorアルゴリズムについて質問をします．

チュートリアルが提供されている参考URLのソースコードSSD/Tensorflow/notebooks/ssd_notebook.ipynbをpython形式に変更しました．  
demoフォルダに予め格納されている画像ファイルから物体を認識したかったのですが  
実行すると下記のエラーを吐き出してしまいました．

[![エラー](https://i.stack.imgur.com/ES9vx.png)](https://i.stack.imgur.com/ES9vx.png)

もしこのような問題を解決する方法をご存じでしたら、ご教授をお願いします．  
よろしくお願いいたします．

参考URL  
<https://github.com/balancap/SSD-Tensorflow> (チュートリアル)

環境  
win10  
opencv 3.1.0  
python 3.6.0  
Anaconda 4.3.1(64bit)  
tensorflow '0.12.0-rc1'(CPU版)

フォルダ構成  
C:/Ana3/  
└ SSD/  
├notebooks/ssd_notebook.ipynb(jupyter用ファイル)  
│ └ssd_notebook.py(メインファイル)  
│  
├demo/(検出用画像フォルダ)  
├checkpoints/ssd_300_vgg(SSDモデルファイル)

ソースコード

[code]

    #https://github.com/balancap/SSD-Tensorflow(チュートリアル)
    #http://blog.csdn.net/jnulzl/article/details/68947496#t2 (python形式に変更)
    import os
    import math
    import random
    
    import numpy as np
    import tensorflow as tf
    import cv2
    
    slim = tf.contrib.slim
    
    #%matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    
    import sys
    sys.path.append('../')
    
    from nets import ssd_vgg_300, ssd_common, np_methods
    from preprocessing import ssd_vgg_preprocessing
    from notebooks import visualization
    
    # TensorFlow session: grow memory when needed. TF, DO NOT USE ALL MY GPU MEMORY!!!
    gpu_options = tf.GPUOptions(allow_growth=True)
    config = tf.ConfigProto(log_device_placement=False, gpu_options=gpu_options)
    isess = tf.InteractiveSession(config=config)
    
    # Input placeholder.
    net_shape = (300, 300)
    data_format = 'NHWC'
    img_input = tf.placeholder(tf.uint8, shape=(None, None, 3))
    # Evaluation pre-processing: resize to SSD net shape.
    image_pre, labels_pre, bboxes_pre, bbox_img = ssd_vgg_preprocessing.preprocess_for_eval(
        img_input, None, None, net_shape, data_format, resize=ssd_vgg_preprocessing.Resize.WARP_RESIZE)
    image_4d = tf.expand_dims(image_pre, 0)
    
    # Define the SSD model.
    reuse = True if 'ssd_net' in locals() else None
    ssd_net = ssd_vgg_300.SSDNet()
    with slim.arg_scope(ssd_net.arg_scope(data_format=data_format)):
        predictions, localisations, _, _ = ssd_net.net(image_4d, is_training=False, reuse=reuse)
    
    # Restore SSD model.モデルファイル
    ckpt_filename = 'C:\Ana3\SSD\checkpoints\ssd_300_vgg\ssd_300_vgg.ckpt'
    # ckpt_filename = '../checkpoints/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt'
    isess.run(tf.global_variables_initializer())
    saver = tf.train.Saver()
    saver.restore(isess, ckpt_filename)
    
    # SSD default anchor boxes.
    ssd_anchors = ssd_net.anchors(net_shape)
    
    
    # Main image processing routine.
    def process_image(img, select_threshold=0.5, nms_threshold=.45, net_shape=(300, 300)):
        # Run SSD network.
        rimg, rpredictions, rlocalisations, rbbox_img = isess.run([image_4d, predictions, localisations, bbox_img],
                                                              feed_dict={img_input: img})
    
        # Get classes and bboxes from the net outputs.
        rclasses, rscores, rbboxes = np_methods.ssd_bboxes_select(
            rpredictions, rlocalisations, ssd_anchors,
            select_threshold=select_threshold, img_shape=net_shape, num_classes=21, decode=True)
    
        rbboxes = np_methods.bboxes_clip(rbbox_img, rbboxes)
        rclasses, rscores, rbboxes = np_methods.bboxes_sort(rclasses, rscores, rbboxes, top_k=400)
        rclasses, rscores, rbboxes = np_methods.bboxes_nms(rclasses, rscores, rbboxes, nms_threshold=nms_threshold)
        # Resize bboxes to original image shape. Note: useless for Resize.WARP!
        rbboxes = np_methods.bboxes_resize(rbbox_img, rbboxes)
        return rclasses, rscores, rbboxes
    
    # Test on some demo image and visualize output.
    path = 'C:\Ana3\SSD\demo'
    image_names = sorted(os.listdir(path))
    
    img = mpimg.imread(path + image_names[-5])
    for it  in image_names:
        img = mpimg.imread(path + it)
        rclasses, rscores, rbboxes =  process_image(img)
    
        # visualization.bboxes_draw_on_img(img, rclasses, rscores, rbboxes, visualization.colors_plasma)
        visualization.plt_bboxes(img, rclasses, rscores, rbboxes)
    
[/code]


CC BY-SA 3.0
2017-06-06T08:36:52.557
35337
2017-06-06T09:11:53.397
23213
question
python tensorflow
Tensorflow SSD チュートリアル


SSD-Tensorflowが現在のtensorflowのzeros_initializerの型とあっていないようですね。  
<https://www.tensorflow.org/versions/master/api_docs/python/tf/zeros_initializer>  
上記のとおり第一引数にshapeが必要となります。

作者(balancap)さんの修正を待つかSSD-
Tensorflowのコード内でtf.zeros_initializer()を使用している箇所を直接以下の様に修正するしかないと思います。

[code]

    tf.constant_initializer(0.0)
    
[/code]

* * *

追記：  
tensorflow0.11と0.12の間で型が変わったようです。  
tensorflow側のバージョンに特にこだわりがなければ0.11以前を使用してもよいと思います。


CC BY-SA 3.0
2017-06-06T09:11:53.397
35340
2017-06-06T09:11:53.397
19716
35337
answer