Matplotlib Threading;закрытие конкретного экземпляра фигуры - PullRequest
0 голосов
/ 07 июня 2018

Суть проблемы:

У меня есть пул потоков для генерации изображений для обучения машинному обучению.Я заполняю пул всеми изображениями, которые были аннотированы, и я генерирую изображения из этого.(это работает)

Затем я добавляю шаг визуализации, т. е. генерирую красивые изображения, понятные человеку.Для этого я использую matplotlib.(это работает)

Затем я хочу сделать это как дополнительный шаг в пуле, и мой код падает.Кажется, что проблема заключается в закрытом и ясном утверждении:

import matplotlib.pyplot as plt
[code for visualisation]
plt.savefig(f, bbox_inches='tight', pad_inches=0)
plt.cla()
plt.close()

plt.switch_backend(backend_org)

Когда один поток достигает последних строк, все остальные plt аварийно завершаются, поэтому в Matlab можно было указать имя переменной, с которой работалитакие, что close() или другие функции, выполняемые только на конкретном изображении.Мне не удалось найти подобную концепцию в matplotlib, но существует ли она?

Решение

Просто чтобы показать объектно-ориентированный код.

fig = plt.figure()
fig.subplots_adjust(left=0, right=1, top=1, bottom=0,
                    wspace=0, hspace=0)
ax = fig.add_subplot(1, 1, 1)

ax.margins(0, 0)

ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())

label_viz = label2rgb(label, img, n_labels=len(label_names)) #generate labels
ax.imshow(label_viz)
ax.axis('off')

plt_handlers = []
plt_titles = []
for label_value, label_name in enumerate(label_names):
    [...]
    #generate legend

ax.legend(plt_handlers, plt_titles, loc='lower right', framealpha=.5)

f = io.BytesIO()
fig.savefig(f, bbox_inches='tight', pad_inches=0)
#ax.cla() #resulting in crashes across the thread
plt.close(fig)

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, вам не следует использовать подход Pyplot, основанный на состоянии, а объектно-ориентированную версию, где вы работаете с экземпляром axes.Axes.В противном случае разные участки в разных процессах перепутаны.Краткий пример:

fig, ax = plt.subplots()
ax.plot(...)
fig.savefig(...)
...