Суть проблемы:
У меня есть пул потоков для генерации изображений для обучения машинному обучению.Я заполняю пул всеми изображениями, которые были аннотированы, и я генерирую изображения из этого.(это работает)
Затем я добавляю шаг визуализации, т. е. генерирую красивые изображения, понятные человеку.Для этого я использую 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)