Запись рисунка в Google Cloud Storage вместо локального диска - PullRequest
0 голосов
/ 16 января 2019

Я хочу загрузить рисунок, созданный с помощью matplotlib, в GCS.

Текущий код:

from tensorflow.gfile import MakeDirs, Open
import numpy as np
import matplotlib.pyplot as plt
import datetime

_LOGDIR = "{date:%Y%m%d-%H%M%S}".format(date=datetime.datetime.now())

_PATH_LOGDIR = 'gs://{0}/logs/{1}'.format('skin_cancer_mnist', _LOGDIR)
MakeDirs(_PATH_LOGDIR))


def saving_figure(path_logdir):
    data = np.arange(0, 21, 2)
    fig = plt.figure(figsize=(20, 10))
    plt.plot(data)
    fig.savefig("{0}/accuracy_loss_graph.png".format(path_logdir))
    plt.close()

saving_figure(_PATH_LOGDIR)

"/ Library / Frameworks / Python.framework / Versions / 3.5 / lib / python3.5 / site-packages / matplotlib / backends / backend_agg.py", строка 512, в print_png filename_or_obj = open (filename_or_obj, 'wb')

FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'gs: //skin_cancer_mnist/logs/20190116-195604/accuracy_loss_graph.png'

(каталог существует, я проверял)

Я мог бы изменить исходный код matplotlib, чтобы использовать метод Open tf.Gfile.Open, но должен быть лучший вариант ...

1 Ответ

0 голосов
/ 17 января 2019

Вы не можете напрямую загрузить файл в Google Cloud Storage с помощью функции python open (которая используется matplotlib.pyplot.savefig за кулисами). Вместо этого вам следует использовать клиентскую библиотеку облачного хранилища * 1003 для Python . Проверьте эту документацию для получения подробной информации об использовании этой библиотеки. Это, среди прочего, позволит вам манипулировать файлами и загружать / скачивать их в GCS.

Вам нужно будет импортировать эту библиотеку, чтобы использовать ее, вы можете установить ее, запустив pip install google-cloud-storage и импортировать ее как from google.cloud import storage.

Кроме того, поскольку plt.figure является объектом, а не фактическим .png изображением, которое вы хотите загрузить, вы также не можете напрямую загрузить его в Google Cloud Storage.

Однако вы можете выполнить одно из следующих действий:

Вариант 1 : сохранить изображение локально, а затем загрузить его в облачное хранилище Google:

Используя ваш код:

from google.cloud import storage

def saving_figure(path_logdir):
    data = np.arange(0, 21, 2)
    fig = plt.figure(figsize=(20, 10))
    plt.plot(data)
    fig.savefig("your_local_path/accuracy_loss_graph.png".format(path_logdir))
    plt.close()


    # init GCS client and upload file
    client = storage.Client()
    bucket = client.get_bucket('skin_cancer_mnist')
    blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png')  # This defines the path where the file will be stored in the bucket
    your_file_contents = blob.upload_from_filename(filename="your_local_path/accuracy_loss_graph.png")

Вариант 2 : сохранить результат изображения из рисунка в переменную, а затем загрузить его в GCS в виде строки (в байтах):

Я нашел следующий ответ StackOverflow, который, кажется, сохраняет изображение фигуры в байтовую строку .png, однако я сам не пробовал.

Опять же, исходя из вашего кода:

from google.cloud import storage
import io
import urllib, base64

def saving_figure(path_logdir):
    data = np.arange(0, 21, 2)
    fig = plt.figure(figsize=(20, 10))
    plt.plot(data)
    fig_to_upload = plt.gcf()

    # Save figure image to a bytes buffer
    buf = io.BytesIO()
    fig_to_upload.savefig(buf, format='png')
    buf.seek(0)
    image_as_a_string = base64.b64encode(buf.read())

    # init GCS client and upload buffer contents
    client = storage.Client()
    bucket = client.get_bucket('skin_cancer_mnist')
    blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png')  # This defines the path where the file will be stored in the bucket
    your_file_contents = blob.upload_from_string(image_as_a_string, content_type='image/png')

Редактировать : в обоих вариантах предполагается, что в среде, в которой вы запускаете сценарий, установлен Cloud SDK и активирована аутентифицированная учетная запись Google Cloud (если вы этого не сделали, вы можете проверить эту документацию , которая объясняет, как это сделать).

...