Я разработал инструмент с графическим интерфейсом (используя PyQt5), который интегрирует графику OpenGL (используя ModernGL ) с нейронной сетью, чтобы изучить, как нейронные сети терпят неудачу при представлении с определенными позами объектов.Полный исходный код доступен здесь .Для режимов «детектор» и «картограф», когда пользователь запрашивает нейронную сеть нажатием клавиши, прогнозы нейронной сети отображаются поверх объекта, например:
Важно, что я попытался настроить его так, чтобы, если пользователь запрашивает нейронную сеть второй раз, ничего не изменяя, инструмент firstочищает старый прогноз перед созданием нового прогноза для визуализации.Вот этот фрагмент кода:
def get_prediction(self):
self.model.clear()
# self.scene.CTX.finish()
buffer = QtCore.QBuffer()
buffer.open(QtCore.QIODevice.ReadWrite)
qimage = self.grabFramebuffer()
qimage.save(buffer, "PNG")
strio = io.BytesIO()
strio.write(buffer.data())
buffer.close()
strio.seek(0)
pil_im = Image.open(strio)
pil_im = pil_im.resize(self.scene.WINDOW_SIZE)
self.model.predict(pil_im)
model.clear()
освобождает текстуру предсказания, массив вершин и буфер вершин.Эта , кажется, работает в том смысле, что если я нажимаю клавишу запроса несколько раз, визуализированное изображение остается тем же самым (т. Е. Нейронная сеть использует только сцену для создания тепловой карты, а не сцену с тепловой картой).Если я закомментирую строку model.clear()
, я получу следующую информацию:
гдетепловая карта изменяется при каждом запросе, потому что нейронная сеть использует сцену с тепловой картой в качестве входных данных.Тем не менее, инструмент также имеет «живой» режим, в котором get_prediction
вызывается каждый раз, когда вызывается paintGL
, и даже если строка model.clear()
не закомментирована, средство рендеринга демонстрирует второе поведение, когда тепловая карта постоянно меняется, а неоставаясь статичным.Как вы можете видеть в приведенном выше коде, я попытался вызвать finish
в контексте после вызова model.clear()
, который должен " Дождаться завершения всех команд рисования, " (как glFinish
), но это не сработало.Я также попытался установить поведение обмена QSurfaceFormat
с помощью:
fmt.setSwapBehavior(QSurfaceFormat.SingleBuffer)
, но это также не сработало.Любые советы будут с благодарностью!