티스토리 뷰
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 데모코드를 사용할 때도 같은 문제가 있을 것이다.
'Research (연구 관련)' 카테고리의 다른 글
VIBE 환경세팅 (0) | 2020.10.28 |
---|---|
ubuntu에 swap memory 만드는 법 (0) | 2020.10.03 |
Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB Image (5) | 2020.07.01 |
detectron2 install (0) | 2020.06.23 |
spin demo 코드 이해 및 이용 (0) | 2020.06.10 |
- Total
- Today
- Yesterday
- 비전
- 문경식
- 컴퓨터비전
- Virtual Camera
- VAE
- pyrender
- pytorch
- 에디톨로지
- Interview
- part segmentation
- 2d pose
- deep learning
- 머신러닝
- focal length
- 인터뷰
- nerf
- 컴퓨터비젼
- world coordinate
- Transformation
- Pose2Mesh
- nohup
- spin
- Machine Learning
- camera coordinate
- densepose
- 헬스
- Generative model
- Docker
- 피트니스
- demo
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |