Как заставить OpenGL очистить объект для обработки буфера с помощью QOpenGLWidget? - PullRequest
0 голосов
/ 04 февраля 2019

Я разработал инструмент с графическим интерфейсом (используя PyQt5), который интегрирует графику OpenGL (используя ModernGL ) с нейронной сетью, чтобы изучить, как нейронные сети терпят неудачу при представлении с определенными позами объектов.Полный исходный код доступен здесь .Для режимов «детектор» и «картограф», когда пользователь запрашивает нейронную сеть нажатием клавиши, прогнозы нейронной сети отображаются поверх объекта, например:

No class activation map. With class activation map.

Важно, что я попытался настроить его так, чтобы, если пользователь запрашивает нейронную сеть второй раз, ничего не изменяя, инструмент 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(), я получу следующую информацию:

enter image description here enter image description here

гдетепловая карта изменяется при каждом запросе, потому что нейронная сеть использует сцену с тепловой картой в качестве входных данных.Тем не менее, инструмент также имеет «живой» режим, в котором get_prediction вызывается каждый раз, когда вызывается paintGL, и даже если строка model.clear() не закомментирована, средство рендеринга демонстрирует второе поведение, когда тепловая карта постоянно меняется, а неоставаясь статичным.Как вы можете видеть в приведенном выше коде, я попытался вызвать finish в контексте после вызова model.clear(), который должен " Дождаться завершения всех команд рисования, " (как glFinish), но это не сработало.Я также попытался установить поведение обмена QSurfaceFormat с помощью:

fmt.setSwapBehavior(QSurfaceFormat.SingleBuffer)

, но это также не сработало.Любые советы будут с благодарностью!

1 Ответ

0 голосов
/ 05 февраля 2019

Тот факт, что он работал, когда не в режиме реального времени, был красной селедкой, которая отправила меня по неверному пути.Исправление было очевидным - убедиться, что я правильно очищаюсь и отображаю все в правильном порядке.Коммит можно найти здесь .

...