Mayavi: Le rendu hors écran de Mayavi ne fonctionne pas pour VTK 7.1.0

Créé le 18 janv. 2017  ·  21Commentaires  ·  Source: enthought/mayavi

J'utilise vtk avec le pilote MesaOS car je souhaite exécuter le rendu dans le cadre d'un notebook jupyter en mode sans tête, quelques détails supplémentaires sur la configuration du package peuvent être trouvés ici :
https://github.com/conda-forge/vtk-feedstock/issues/20

Lorsque j'utilise l'exemple VTK hors écran, cela fonctionne bien :

#! ./local/bin/python

from vtk import (vtkSphereSource, vtkPolyDataMapper, vtkActor, vtkRenderer,
        vtkRenderWindow, vtkWindowToImageFilter, vtkPNGWriter)

sphereSource = vtkSphereSource()
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sphereSource.GetOutputPort())

actor = vtkActor()
actor.SetMapper(mapper)

renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)

renderer.AddActor(actor)
renderer.SetBackground(1, 1, 1)

renderWindow.Render()

windowToImageFilter = vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()

writer = vtkPNGWriter()
writer.SetFileName("sphere.png")
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()

Mais lorsque je teste l'exemple hors écran de mayavi, cela ne fonctionne pas :

# Author: Prabhu Ramachandran <[email protected]>
# Copyright (c) 2007, Enthought, Inc.
# License: BSD Style.

from os.path import join, abspath, dirname

# The offscreen Engine.
from mayavi.api import OffScreenEngine

# Usual MayaVi imports
from mayavi.scripts.util import get_data_dir
from mayavi.sources.api import VTKXMLFileReader
from mayavi.modules.api import Outline, ScalarCutPlane, Streamline


def main():
    # Create the MayaVi offscreen engine and start it.
    e = OffScreenEngine()
    # Starting the engine registers the engine with the registry and
    # notifies others that the engine is ready.
    e.start()

    # Create a new scene.
    win = e.new_scene()

    # Now setup a normal MayaVi pipeline.
    src = VTKXMLFileReader()
    src.initialize(join(get_data_dir(dirname(abspath(__file__))),
                        'fire_ug.vtu'))
    e.add_source(src)
    e.add_module(Outline())
    e.add_module(ScalarCutPlane())
    e.add_module(Streamline())
    win.scene.isometric_view()
    # Change the size argument to anything you want.
    win.scene.save('offscreen.png', size=(800, 800))


if __name__ == '__main__':
    main()

Le message d'erreur que j'obtiens est :

ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x30ced20): bad X server connection. DISPLAY=Aborted

Il me semble donc que l'initialisation hors écran n'est pas correctement transmise à VTK. Malheureusement, je n'ai pas pu localiser l'initialisation de VTK dans mayavi moi-même. Pour moi, cela semble se produire dans tvtk_access.py , mais je ne vois toujours pas d'option pour forcer directement le rendu hors écran.

Commentaire le plus utile

J'ai eu un problème assez similaire lors de l'utilisation de Mayavi dans un Jupyter-Notebook fourni par un serveur distant Jupyter-Hub. Le problème était qu'il n'y a pas de serveur X en cours d'exécution.

Je l'ai résolu en installant xvfbwrapper et le back-end Xvfb. Avant de faire quoi que ce soit avec mayavi, démarrez un affichage.

Exemple

#The following 3 lines must be before doing anything with mayavi (even importing)
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1920, height=1080)
vdisplay.start()

from mayavi import mlab
mlab.init_notebook()
s = mlab.test_plot3d()
s

S'il n'y a pas de moyen plus élégant, je pense qu'il serait bon de le mentionner dans le manuel.

Tous les 21 commentaires

J'ai trouvé qu'en définissant ETS_TOOLKIT='null' je pouvais reproduire cette erreur en utilisant :

>>> from mayavi import mlab
>>> mlab.options.offscreen = True
>>> mlab.test_plot3d()
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x2e027d0): bad X server connection. DISPLAY=Aborted (core dumped)

Si ETS_TOOLKIT='null' n'est pas défini, même l'importation ne fonctionne pas. Donc pour le moment le script ci-dessus échoue quand j'essaye de créer une scène new_scene()

@jan-janssen -- Pouvez-vous s'il vous plaît tester avec le dernier maître, cela devrait être corrigé maintenant. Vous aurez toujours besoin du export ETS_TOOLKIT=null mais le reste devrait fonctionner maintenant.

J'ai testé cela en utilisant les packages osmesa conda-forge vtk et je ne peux pas le faire fonctionner sans serveur X. Je pense que j'ai correctement configuré l'environnement.

Ce que j'ai fait c'est :

$ export ETS_TOOLKIT='null'
$ conda create -n mayavi_osmesa -c conda-forge mesalib pyqt numpy vtk
$ pip install git+https://github.com/enthought/mayavi
$ python -c "from mayavi import mlab; mlab.options.offscreen=True; mlab.test_plot3d(); mlab.savefig('test.png')"
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 445
vtkXOpenGLRenderWindow (0x1c58c80): bad X server connection. DISPLAY=Aborted (core dumped)

ok en fait, l'exemple pur de VTK donné dans l'OP ne fonctionne pas non plus, donc je suppose qu'il y a quelque chose qui ne va pas avec mon env. J'obtiens la même chose avec un pip install git+https://github.com/enthought/mayavi direct, donc je suppose qu'il me manque quelque chose dans vtk quelque part.

Merci pour le test, pouvez-vous vérifier si le VTK installé a vtkOSOpenGLRenderWindow , c'est-à-dire
import vtk; print(hasattr(vtk, 'vtkOSOpenGLRenderWindow')) . Si ce n'est pas le cas, VTK n'a probablement pas été construit avec le support d'osmesa. Si c'est le cas, je devrai enquêter attentivement.

Il n'a pas cela. Je suppose que vous ne savez pas ce qui contrôle si cela existe ou non ?!

Lorsque VTK est construit, vous devez définir VTK_OPENGL_HAS_OSMESA sur ON.

hmmm, pour autant que je sache, le paquet conda-forge osmesa devrait le faire. Je vais y ouvrir un sujet.

Je pense que les nouvelles versions de mesa n'autorisent pas à la fois mesa et osmesa, donc les versions récentes de VTK peuvent désactiver automatiquement osmesa lorsque vtk_use_x est activé. Mais je n'en suis pas tout à fait sûr car beaucoup de choses auraient pu changer...

Si possible, pourriez-vous essayer avec une version plus ancienne comme VTK-7.x ou chaque fois que cela fonctionnait ?

J'ai le même message d'erreur sur Ubuntu 18, vtk 8.1.2, mayavi 4.6.2

J'ai aussi ce problème avec mayavi. Quelqu'un a-t-il trouvé une solution ? J'ai ce problème lors de l'utilisation de mayavi sur un serveur, bien que l'affichage soit transféré vers mon ordinateur local.

J'ai eu un problème assez similaire lors de l'utilisation de Mayavi dans un Jupyter-Notebook fourni par un serveur distant Jupyter-Hub. Le problème était qu'il n'y a pas de serveur X en cours d'exécution.

Je l'ai résolu en installant xvfbwrapper et le back-end Xvfb. Avant de faire quoi que ce soit avec mayavi, démarrez un affichage.

Exemple

#The following 3 lines must be before doing anything with mayavi (even importing)
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1920, height=1080)
vdisplay.start()

from mayavi import mlab
mlab.init_notebook()
s = mlab.test_plot3d()
s

S'il n'y a pas de moyen plus élégant, je pense qu'il serait bon de le mentionner dans le manuel.

@ max9111 vous souvenez-vous d'avoir fait autre chose ? J'ai essayé votre code après avoir installé xvfbwrapper . Mais après avoir ssh sur mon serveur à l'aide de l'indicateur -X, j'obtiens toujours l'erreur :

ERREUR : Dans ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, ligne 606
vtkXOpenGLRenderWindow (0x55b43e61d590) : Impossible de créer le contexte GLX. Abandonner.

@tjiagoM Peut-être avez-vous oublié d'installer xfb lui-même (sudo apt-get install xvfb) ?

@ max9111 oh, non, au départ j'ai fait cette erreur mais ils renverraient une erreur disant qu'aucun xvfb n'a été trouvé/actif (ou quelque chose de similaire)

@ max9111 J'ai du mal avec la même configuration, mayavi sur un jupyterhub distant. Avez-vous un exemple d'image docker utilisée par le hub ? J'ai essayé d'utiliser xvfbwrapper comme vous l'avez suggéré, mais cela n'a pas fonctionné pour moi. Merci d'avance!

@mirestrepo
Malheureusement, je n'ai pas d'image docker.

Ma configuration est :

  • Une machine virtuelle s'exécutant sur Kubuntu 18.04 (à l'aide de Virtual Box) sur un poste de travail distant qui s'exécute sur CentOS7.

  • Installé le plus petit JupyterHub

  • Rendre Jupyterhub disponible depuis l'extérieur (transfert de port, configuration du pare-feu)

  • XfVB installé dans la machine virtuelle comme ça
    Le point crucial ici est d'obtenir un serveur X fonctionnel (donc des didacticiels généraux sur la façon de faire quelque chose d'interface graphique dans une image Docker pourraient également aider). Je suggérerais d'essayer le script simple à partir du lien pour vérifier cela. Dans ce cas, vous obtiendrez également un message d'erreur significatif.

  • Si cela fonctionne, il est important de démarrer le X-Server avant de faire des choses liées à Mayavi, comme indiqué dans l'exemple ci-dessus. Si vous importez mayavi from mayavi import mlab avant d'initialiser le X-Server, mayavi plantera.

@ max9111 J'ai réussi à ignorer le wrapper xvfb en lançant xvfb au point d'entrée pour mon docker ENTRYPOINT ["tini", "-g", "--", "xvfb-run"] mais je ne peux obtenir que mlab pour travailler avec le png backend... Je n'ai pas essayé de construire vtk avec OSMesa cependant...

Le xvfb-run peut vous venir en aide :

 xvfb-run python your-py-script.py

Notez que vous devez installer xvfb avant d'exécuter la commande ci-dessus.

Cette page vous a été utile?
0 / 5 - 0 notes