Ищете предложения, чтобы избавиться от неэффективного цикла в радиовещании - PullRequest
0 голосов
/ 02 июля 2019

В настоящее время я работаю над проектом по измерению объема объектов на производственной линии в режиме реального времени с использованием 3D-камер глубины.Там будет запутывание и худшие или лучшие углы, и поэтому мы хотим смоделировать различные конфигурации камеры, прежде чем мы построим буровую установку и протестируем ее в производстве.У нас есть большое количество КТ-сканирований этих объектов, и на их основе мы хотим смоделировать различные виды камеры.То, что мы хотим смоделировать, это точечное облако, которое генерируется камерой в заданной позиции.

Каждый найденный мной метод отслеживает один луч за раз, и вы должны зацикливать лучи в петле питона.Это медленная часть, и я ищу способ избавиться от этого цикла Python.Моя интуиция заключается в том, что должна быть ускоренная библиотека на GPU, которая может делать это очень быстро, но я не смог ее найти, я обычно делаю сегментацию и регистрацию компьютерных томограмм, а не 3d-графики.Ниже немного подробностей о том, что я пробовал до сих пор.

У меня есть класс камеры.Для этих расчетов у меня есть исходная точка self.pos и плоскость точек, которые я хочу проецировать на self.points_plane - это точки в трехмерном пространстве.Таким образом, все лучи происходят в self.pos и заканчиваются на одном из элементов в self.points_plane.Первоначально я пытался использовать scipy.ndimage.map_coordinates:

for point in self.points_plane:
    dist = int(np.sqrt((self.pos[0]-point[0])**2+(self.pos[1]-point[1])**2+(self.pos[2]-point[2])**2))
    z_line = np.linspace(self.pos[0],point[0],dist)
    y_line = np.linspace(self.pos[1],point[1],dist)
    x_line = np.linspace(self.pos[2],point[2],dist)

    stack = ndimage.map_coordinates(array,np.vstack((z_line,y_line,x_line)),order=1,cval=-1000)
    # Hounsfield value check, air is -1000 and our objects are in the range -200:1000
    intersections = np.argwhere(stack > -500) 
    if intersections.size > 0:
         point_cloud.append([z_line[intersections[0][0]],y_line[intersections [0][0]],x_line[intersections [0][0]]])

Это работает, и результат выглядит хорошо, но он слишком медленный, и мы закончили бы имитацию в следующем году ... CuPy - это реализация numpy / в CUDA.scipy, и это была следующая попытка, так как все необходимые методы существовали.Координаты карты были быстрее, но передача в GPU и обратно была медленной, и у нас все еще есть цикл python.Не очень значительное улучшение, код практически идентичен коду без CUDA.

Я попробовал методы VTK.vtkOBBTree () и obbTree.IntersectWithLine (), чтобы проверить, было ли это хорошим решением и подходит ли оно для небольшого количества точек.Метод IntersectWithLine берет начальную и конечную точки для каждой строки и проверяет пересечения с obbTree, сгенерированным из файла STL.Этот метод быстр, пока мы не перебираем слишком много точек, в масштабах, с которыми мы работаем, для моделирования соответствующих данных все равно потребуется около месяца.

for point in self.points_plane:
    pointsVTKintersection = vtk.vtkPoints()
    obbTree.IntersectWithLine(self.pos, point,pointsVTKintersection,None)
    pointsVTKIntersectionData = pointsVTKintersection.GetData()
    noPointsVTKIntersection = pointsVTKIntersectionData.GetNumberOfTuples()

    if noPointsVTKIntersection > 0:
        point_c.append(pointsVTKIntersectionData.GetTuple3(0))
    self.point_cloud = np.array(point_c)

Любые рекомендации о том, как мне избавиться от этого цикла for, есть ли библиотека, которая делает это параллельно для нескольких лучей?

1 Ответ

0 голосов
/ 04 июля 2019

Я не знаю, будет ли trimesh быстрее, но, вероятно, стоит попробовать.У меня есть пример здесь .

...