Проблемы с работой с Open3d, многопроцессорностью python и обнаружением функций - PullRequest
0 голосов
/ 05 мая 2020

Недавно я начал работать с Intel Open3d , потому что он очень хорошо обрабатывает 3D-визуализацию (в отличие от matplotlib по моему опыту и с меньшими накладными расходами, чем pangolin ) .

Я весь день сталкивался с этой ошеломляющей проблемой и понятия не имел, почему что-то не работает: в моем основном процессе я запускаю неблокирующий визуализатор open3d, и в отдельном процессе Я выполняю некоторую обработку изображений, включающую обнаружение функций (как ORB , так и SuperPoint ) - но функция обнаружения функций никогда не завершается.

Ниже приведен минимальный (нерабочий) пример:

import time
import multiprocessing as mp

import cv2
import open3d as o3d
import numpy as np


class Viewer:
    def __init__(self, stop_flag):
        self._stop_flag = stop_flag
        self._vis = o3d.visualization.Visualizer()
        self._vis.create_window()

    def run(self):
        while not stop_flag.is_set():
            self._vis.update_geometry()
            self._vis.poll_events()
            self._vis.update_renderer()

        self._vis.destroy_window()


def worker(stop_flag, num_iterations):
    def _generate_img():
        return np.random.randn(400, 400, 3).astype(np.float32)

    def _do_work():
        print("Processing image...")
        orb = cv2.ORB.create()
        orb.detect(_generate_img(), mask=None)
        print("Finished processing")

    for i in range(num_iterations):
        _do_work()
        time.sleep(0.5)
    stop_flag.set()


if __name__ == "__main__":
    stop_flag = mp.Event()
    viewer = Viewer(stop_flag)
    worker_p = mp.Process(target=worker, args=[stop_flag, 10])
    worker_p.start()
    viewer.run()
    worker_p.join()

Однако процесс работает нормально, когда я изменяю любой из трех задействовали игроков следующими способами:

  • Переключение с многопоточности на многопоточность
if __name__ == "__main__":
    import threading
    stop_flag = threading.Event()
    viewer = Viewer(stop_flag)
    worker_t = threading.Thread(target=worker, args=[stop_flag, 10])
    worker_t.start()
    viewer.run()
    worker_t.join()
  • Выполнение другой задачи обработки изображений, отличной от orb или super point обнаружение
* 10 36 *
  • Замена окна open3d на окно opencv
class Viewer:
    def __init__(self, stop_flag):
        self._stop_flag = stop_flag

    def run(self):
        while not stop_flag.is_set():
            frame = np.random.randn(400, 400)
            cv2.imshow("Frame", frame)
            cv2.waitKey(1)

        cv2.waitKey(1)
        cv2.destroyAllWindows()
        cv2.waitKey(1)


Я знаю, что это суперспецифично c, но любая помощь приветствуется!


...