Возврат функции Flask недействительным при ошибке основного потока - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над проектом python (3.6) с использованием Tensorflow и Flask. Мне нужно запустить модель Tensorflow внутри функции колбы, но она возвращает ошибку.

Вот мой код:

app.py

app = Flask(__name__)


@app.route('/<path:image_url>')
def grab_image(image_url):
    url = str(image_url)
    r = requests.get(url, allow_redirects=True)
    print('Url is as: {}'.format(url))
    filename = url.split('/')[-1]
    open(filename, 'wb').write(r.content)
    img = Image.open(filename)
    # img.show()
    img.save('/Users/abdul/PycharmProjects/ImgSeg/uploads/photo.jpg', 'JPEG')

    # create_new_images('/Users/abdul/PycharmProjects/ImgSeg/uploads/photo.jpg')

    class DeepLabModel(object):
        """Class to load deeplab model and run inference."""

        INPUT_TENSOR_NAME = 'ImageTensor:0'
        OUTPUT_TENSOR_NAME = 'SemanticPredictions:0'
        INPUT_SIZE = 513
        FROZEN_GRAPH_NAME = 'frozen_inference_graph'

        def __init__(self, tarball_path):
            """Creates and loads pretrained deeplab model."""
            self.graph = tf.Graph()

            graph_def = None
            # Extract frozen graph from tar archive.
            tar_file = tarfile.open(tarball_path)
            for tar_info in tar_file.getmembers():
                if self.FROZEN_GRAPH_NAME in os.path.basename(tar_info.name):
                    file_handle = tar_file.extractfile(tar_info)
                    graph_def = tf.GraphDef.FromString(file_handle.read())
                    break

            tar_file.close()

            if graph_def is None:
                raise RuntimeError('Cannot find inference graph in tar archive.')

            with self.graph.as_default():
                tf.import_graph_def(graph_def, name='')

            self.sess = tf.Session(graph=self.graph)

        def run(self, image):
            """Runs inference on a single image.
            Args:
              image: A PIL.Image object, raw input image.
            Returns:
              resized_image: RGB image resized from original input image.
              seg_map: Segmentation map of `resized_image`.
            """
            width, height = image.size
            resize_ratio = 1.0 * self.INPUT_SIZE / max(width, height)
            target_size = (int(resize_ratio * width), int(resize_ratio * height))
            resized_image = image.convert('RGB').resize(target_size, Image.ANTIALIAS)
            batch_seg_map = self.sess.run(
                self.OUTPUT_TENSOR_NAME,
                feed_dict={self.INPUT_TENSOR_NAME: [np.asarray(resized_image)]})
            seg_map = batch_seg_map[0]
            return resized_image, seg_map

    def create_pascal_label_colormap():
        """Creates a label colormap used in PASCAL VOC segmentation benchmark.
        Returns:
          A Colormap for visualizing segmentation results.
        """
        colormap = np.zeros((256, 3), dtype=int)
        ind = np.arange(256, dtype=int)

        for shift in reversed(range(8)):
            for channel in range(3):
                colormap[:, channel] |= ((ind >> channel) & 1) << shift
            ind >>= 3
        return colormap

    def label_to_color_image(label):
        """Adds color defined by the dataset colormap to the label.
        Args:
          label: A 2D array with integer type, storing the segmentation label.
        Returns:
          result: A 2D array with floating type. The element of the array
            is the color indexed by the corresponding element in the input label
            to the PASCAL color map.
        Raises:
          ValueError: If label is not of rank 2 or its value is larger than color
            map maximum entry.
        """
        if label.ndim != 2:
            raise ValueError('Expect 2-D input label')

        colormap = create_pascal_label_colormap()

        if np.max(label) >= len(colormap):
            raise ValueError('label value too large.')

        return colormap[label]

    def vis_segmentation(image, seg_map):
        """Visualizes input image, segmentation map and overlay view."""
        plt.figure(figsize=(15, 5))
        grid_spec = gridspec.GridSpec(1, 4, width_ratios=[6, 6, 6, 1])

        plt.subplot(grid_spec[0])
        plt.imshow(image)
        plt.axis('off')
        plt.title('input image')

        plt.subplot(grid_spec[1])
        seg_image = label_to_color_image(seg_map).astype(np.uint8)
        plt.imshow(seg_image)
        plt.axis('off')
        plt.title('segmentation map')

        plt.subplot(grid_spec[2])
        plt.imshow(image)
        plt.imshow(seg_image, alpha=0.7)
        plt.axis('off')
        plt.title('segmentation overlay')

        unique_labels = np.unique(seg_map)
        ax = plt.subplot(grid_spec[3])
        plt.imshow(
            FULL_COLOR_MAP[unique_labels].astype(np.uint8), interpolation='nearest')
        ax.yaxis.tick_right()
        plt.yticks(range(len(unique_labels)), LABEL_NAMES[unique_labels])
        plt.xticks([], [])
        ax.tick_params(width=0.0)
        plt.grid('off')
        plt.show()
        return seg_image

    LABEL_NAMES = np.asarray([
        'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus',
        'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike',
        'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tv'
    ])

    FULL_LABEL_MAP = np.arange(len(LABEL_NAMES)).reshape(len(LABEL_NAMES), 1)
    FULL_COLOR_MAP = label_to_color_image(FULL_LABEL_MAP)

    # @title Select and download models {display-mode: "form"}

    MODEL_NAME = 'mobilenetv2_coco_voctrainaug'  # @param ['mobilenetv2_coco_voctrainaug', 'mobilenetv2_coco_voctrainval', 'xception_coco_voctrainaug', 'xception_coco_voctrainval']

    _DOWNLOAD_URL_PREFIX = 'http://download.tensorflow.org/models/'
    _MODEL_URLS = {
        'mobilenetv2_coco_voctrainaug':
            'deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz',
        'mobilenetv2_coco_voctrainval':
            'deeplabv3_mnv2_pascal_trainval_2018_01_29.tar.gz',
        'xception_coco_voctrainaug':
            'deeplabv3_pascal_train_aug_2018_01_04.tar.gz',
        'xception_coco_voctrainval':
            'deeplabv3_pascal_trainval_2018_01_04.tar.gz',
    }
    _TARBALL_NAME = 'deeplab_model.tar.gz'

    model_dir = tempfile.mkdtemp()
    tf.gfile.MakeDirs(model_dir)

    download_path = os.path.join(model_dir, _TARBALL_NAME)
    print('downloading model, this might take a while...')
    urllib.request.urlretrieve(_DOWNLOAD_URL_PREFIX + _MODEL_URLS[MODEL_NAME],
                               download_path)
    print('download completed! loading DeepLab model...')

    MODEL = DeepLabModel(download_path)
    print('model loaded successfully!')

    def run_visualization(url):
        """Inferences DeepLab model and visualizes result."""
        try:
            # f = urllib.request.urlopen(url)
            # jpeg_str = f.read()
            # original_im = Image.open(BytesIO(jpeg_str))
            original_im = Image.open(url)
        except IOError:
            print('Cannot retrieve image. Please check url: ' + url)
            return

        print('running deeplab on image %s...' % url)
        resized_im, seg_map = MODEL.run(original_im)

        seg_img = vis_segmentation(resized_im, seg_map)
        plt.imsave('img/masked_image.jpg', seg_img)
        return seg_img

    run_visualization(url='/Users/abdul/PycharmProjects/ImgSeg/uploads/photo.jpg')


if __name__ == '__main__':
    app.run(port=8000)

Но когда я запускаю мое приложение фляги, оно возвращает ошибку как:

2018-09-05 11: 08: 54.952 Python [3772: 69116] ВНИМАНИЕ: области перетаскивания NSWindow должны быть только признан недействительным в главной теме! Это вызовет исключение в

будущее. Вызывается из (0 AppKit
0x000000010fb50647 - [NSWindow (NSWindow_Theme) _postWindowNeedsToResetDragMarginsUnlessPostingDisabled] + 180

1 AppKit 0x000000010fb47a22 - [NSWindow _initContent: styleMask: backing: defer: contentView:] + 1488

2 AppKit 0x000000010fb4743e - [NSWindow initWithContentRect: styleMask: backing: defer:] + 45

3 _macosx.cpython-36m-darwin.so 0x000000010fae2230 - [Окно initWithContentRect: styleMask: backing: defer: withManager:] + 80 4
_macosx.cpython-36m-darwin.so 0x000000010fae5747 FigureManager_init + 327

...