티스토리 뷰

Research (연구 관련)

Pyrender사용법

홍돌 2020. 9. 17. 16:43

udpate 2021.03.10

AttributeError: 'GLXPlatform' object has no attribute 'OSMesa'

현재 osmesa를 I2L-MeshNet_RELEASE보고 쓰려 헀는데, 이런 에러가 뜨는데, 알고보니

import pyrender  전에 os.environ["PYOPENGL_PLATFORM"] = "osmesa"를해줘야 되는 것이었다.

그리고 egl이 아니라 osmesa를 쓰게되면

rgb, depth = self.renderer.render(self.scene, flags=render_flags)
valid_mask = (depth > 0)[:, :, np.newaxis]
output_img = rgb * valid_mask + (1 - valid_mask) * img
image = output_img.astype(np.uint8)

로 코드를 바꿔줘야 한다. 원래 rgb, _ 가 아니라 rgdb, _였따.


나는 대부분의 작업을 내 로컬(맥북)에서 ssh로 접속한 서버에서 하고 결과물 확인을 X11 forwarding을 통해서 한다. 

그런데 ssh로 이런 headless 서버 (모니터가 없는 서버)에 접속하기 때문에, OpenGL을 쓰는  Pyrender 를 쓸 때 문제가 발생했다. 

Pyrender의 OffscreenRendering이라는 기능을 사용하려면 Pyglet, OSMesa, EGL 같은 백엔드 interface 중 하나를 택하여 사용해야 한다. 

Pyglet은 모니터 (active display manger)를 요구하기 때문에 나 같은 상황에서 쓸 수 없고, OSMesa나 EGL 중 하나를 써야 한다. 

참고: pyrender.readthedocs.io/en/latest/examples/offscreen.html

둘의 차이는 자세히 모르나 OSMesa가 좀 더 최신이고, 운영체제 상관없이 쓸 수 있는 것 같다. 하지만 새로 설치가 필요하기 때문에 귀찮아서 EGL을 쓰는데, 이런 버그가 떴다.

Traceback (most recent call last):
  File "lib/python3.6/site-packages/OpenGL/latebind.py", line 41, in __call__
    return self._finalCall( *args, **named )
TypeError: 'NoneType' object is not callable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "examples/egl_example.py", line 36, in <module>
    color, depth = r.render(scene)
  File "pyrender/examples/../pyrender/offscreen.py", line 100, in render
    return self._renderer.render(scene, flags)
  File "pyrender/examples/../pyrender/renderer.py", line 121, in render
    self._update_context(scene, flags)
  File "pyrender/examples/../pyrender/renderer.py", line 709, in _update_context
    p._add_to_context()
  File "pyrender/examples/../pyrender/primitive.py", line 324, in _add_to_context
    self._vaid = glGenVertexArrays(1)
  File "lib/python3.6/site-packages/OpenGL/latebind.py", line 45, in __call__
    return self._finalCall( *args, **named )
  File "lib/python3.6/site-packages/OpenGL/wrapper.py", line 657, in wrapperCall
    result = wrappedOperation( *cArguments )
  File "lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 401, in __call__
    if self.load():
  File "lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 390, in load
    error_checker = self.error_checker,
  File "lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 148, in constructFunction
    if (not is_core) and not self.checkExtension( extension ):
  File "lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 270, in checkExtension
    result = extensions.ExtensionQuerier.hasExtension( name )
  File "lib/python3.6/site-packages/OpenGL/extensions.py", line 98, in hasExtension
    result = registered( specifier )
  File "lib/python3.6/site-packages/OpenGL/extensions.py", line 105, in __call__
    if not specifier.startswith( self.prefix ):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

처음에는 내 코드에 문제가 있는 줄 알았으나, 알고보니 Pyrender가 사용하는 python과 OpenGL간의 인터페이스인 PyOpenGL이 OpenGL API를 참조하지 않고 GL API를 참조하기 때문에 생기는 에러였다. 

이슈의 조언대로 OpenGL/platform/egl.py를 직접 수정해서 PyOpenGL이 OpenGL API를 참조하도록 할 수 있었다. 이미 제대로 참조가 되어있었다면 에러가 나지 않을 것이다.

SPIN 데모코드를 사용할 때도 같은 문제가 있을 것이다.

redstarhong.tistory.com/94

 

spin demo 코드 이해 및 이용

spin github: https://github.com/nkolot/SPIN spin 깃헙을 보면 demo.py라고 자기들의 mesh output을 image에 projection 시켜서 visualize하는 코드가 있다. mesh를 여전히 3D처럼 보이게 하면서 이미지에 겹쳐..

redstarhong.tistory.com

 

PP2Mesh 결과

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함