Цзяньтин Чжан, Шо Ван, Томсон Комер, Джош Паттерсон, Кит Краус, Марк Харрис, Суджит Бисвас

Интернет вещей (IOT) привел к взрывному росту данных с датчиков. Местоположение - это одна из наиболее важных сведений, генерируемых датчиками, а динамическое местоположение имеет жизненно важное значение в случае мобильных датчиков. Примеры: мобильные телефоны (GPS), автомобили, роботы и камеры.

Применение искусственного интеллекта (AI) к IOT в этом случае подразумевает понимание данных динамических датчиков в контексте операционной среды и использование этого понимания для оптимизации производительности системы, улучшения навигации и потока, обнаружения аномалий и мониторинга окружающей среды. Важнейшие идеи AI-IOT для позиционирования, навигации, поведения и понимания окружающей среды влияют на несколько областей, включая умные города, умный трафик и транспорт, складскую логистику, розничную торговлю, безопасность и безопасность. Однако это понимание может быть получено только путем интерпретации данных динамических датчиков в контексте более полустатических данных среды, обычно предоставляемых географическими информационными системами (ГИС) и системами управления информацией о зданиях (BIM). Мы создали cuSpatial, чтобы ускорить общие операции, необходимые для понимания данных датчиков с информацией ГИС.

Что такое cuSpatial?

cuSpatial - эффективная библиотека C ++, ускоренная на графических процессорах с использованием NVIDIA CUDA и cuDF, библиотеки DataFrame RAPIDS. Он включает привязки Python для использования сообществом специалистов по науке о данных. cuSpatial обеспечивает значительное ускорение на графическом процессоре обычных пространственных и пространственно-временных операций, таких как тесты точки в полигоне, расстояния между траекториями и кластеризация траекторий. Ускорение по сравнению с реализациями на базе ЦП составляет от 10x до 10,000x в зависимости от операции. На рисунке 2 показаны типичные операции по управлению пространственными и пространственно-временными данными.

Таблица 1 иллюстрирует уровни cuSpatial, показывая, как приложения более высокого уровня могут использовать функциональность cuSpatial.

cuSpatial фокусируется на нижних четырех уровнях таблицы 1: географическое представление, геооперации, индексирование и запросы. Верхние слои в таблице 1 сочетают функциональность cuSpatial с функциональностью графиков для создания пространственного и пространственно-временного анализа траектории более высокого уровня.

На рисунке 3 показан стек технологий cuSpatial и его интеграция с Python, cuDF и CUDA.

API-интерфейсы cuSpatial C ++ и Python работают с основными типами данных cuDF Series и DataFrame в Python. Данные cuSpatial размещаются в виде столбцов (столбчатый дизайн, верхняя часть рисунка 3) в памяти графического процессора для быстрой обработки данных с использованием массивного параллелизма данных графического процессора и высокой пропускной способности памяти.

cuSpatial разработан для бесперебойной работы с cuDF в сквозных рабочих процессах приложений. Например, операции cuDF ETL (извлечение-преобразование-загрузка), такие как фильтрация и объединение, могут использоваться для очистки и предварительной обработки геопространственных данных на основе негеометрических атрибутов перед их загрузкой в ​​cuSpatial для геопространственных операций. Соответственно, геопространственные операции могут использоваться для получения новых реляционных данных для дальнейшей обработки cuDF, таких как расстояния и скорости траекторий, которые получены из большого набора неупорядоченных и отмеченных временем местоположений точек объектов.

Местоположение объектов можно определить с помощью ряда датчиков, например видеокамер. Интеллектуальная видеоаналитика, применяемая к данным камеры, позволяет определять местоположения объектов и событий в пределах системы отсчета изображения. Эта система координат должна быть преобразована в геопространственную систему координат для последующей пространственной аналитики и визуализации на основе ГИС.

cuDF и cuSpatial вместе обеспечивают доступ к данным в широком наборе форматов, включая как реляционные (CSV, Parquet и т. д.), так и геопространственные / ГИС, такие как шейп-файлы. Что еще более важно, полученные данные могут передаваться из структур данных Python на процессорах (включая массивы Numpy и фреймы данных) в структуры данных cuDF / cuSpatial на графических процессорах автоматическим, прозрачным и эффективным способом.

Функциональность cuSpatial Release v0.10

Первый выпуск cuSpatial включает следующие функции.

  1. Столбцовое представление данных для точек, линий, многоугольников
  2. Получение данных о местоположении из образца JSON, CSV и двоичного формата
  3. Запрос пространственного окна
  4. Тест "точка в многоугольнике"
  5. Преобразование широты и долготы в координаты x, y.
  6. Гаверсинус расстояние между двумя парами точек широты и долготы.
  7. Попарные хаусдорфовы расстояния между множествами точек (например, траекториями)
  8. Получение траекторий из последовательностей мест и времени
  9. Расчет расстояния по траектории и скорости
  10. Вычисление пространственных ограничивающих рамок траектории

В него также входят:

  1. Привязки и тесты Python для всех вышеперечисленных функций
  2. Примеры приложений и сценариев оценки производительности

cuSpatial Performance

В таблице 2 показана производительность cuSpatial при выполнении наиболее важных операций.

Траектории кластеризации: пример приложения с использованием cuSpatial

cuSpatial можно использовать для ускорения многих задач анализа данных и машинного обучения, которые требуют пространственных и пространственно-временных вычислений. Мы реализовали пример, который ускоряет задачу кластеризации траектории с помощью cuSpatial на реальном наборе данных траектории транспортного средства. Набор данных содержит более 10 000 траекторий, извлеченных с помощью видеоаналитики с камер трафика. В этом конкретном случае использования cuSpatial сокращает время сквозных вычислений задачи кластеризации с более чем 5 часов до менее 15 секунд. Тестовая машина оснащена процессором Intel Core i7–6700K и графическим процессором NVIDIA Quadro GV100.

Задача кластеризации траекторий создает группы траекторий, которые больше похожи друг на друга, чем на траектории в других группах. Кластеризация полезна для таких задач, как извлечение паттернов движения, анализ поведения и т. Д. Задача кластеризации состоит из двух основных компонентов: метрики сходства и алгоритма поиска.

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

Мы используем расстояние Хаусдорфа как метрику подобия траекторий. Расстояние Хаусдорфа между двумя траекториями - это максимальное расстояние от первой траектории до ближайшей точки на второй траектории.

Мы использовали траектории, полученные с транспортной развязки, расположенной в городе среднего размера в США. Мы применили интеллектуальные методы видеоаналитики для извлечения реальных траекторий движения транспортных средств с нескольких камер дорожного движения. Этот набор данных является частью общегородской базы данных видео трафика, которая разработана для поддержки различных задач интеллектуального города и интеллектуального исследования трафика (см. AI City Challenge для более подробной информации).

Записную книжку Python для этого кода можно найти в репозитории записных книжек RAPIDS на Github.

Данные загружаются в список массивов Numpy, траекторий. Каждый массив Numpy в этом списке представляет одну траекторию с формой (trajectory_length, 2).

print(type(trajectories))
print(type(trajectories[0]))
print(trajectories[0].shape)
print(len(trajectories))
print(max([len(traj) for traj in trajectories]))
print(min([len(traj) for traj in trajectories]))
print(np.mean([len(traj) for traj in trajectories]))

выход:

<class ‘list’>
<class ‘numpy.ndarray’>
(67, 2)
10070
961
30
87.94061569016881

Мы создаем пустую матрицу dmatrix массива Numpy, и наша цель - заполнить ее расстоянием Хаусдорфа между всеми парами траекторий.

dmatrix=np.zeros((len(trajectories),len(trajectories)))

Сначала мы попытаемся вычислить симметричное хаусдорфово расстояние, используя

scipy.spatial.distance.directed_hausdorff. 

Мы проходим цикл, чтобы заполнить dmatrix.

from scipy.spatial.distance import directed_hausdorff

for i in range(dmatrix.shape[0]):
  for j in range(dmatrix.shape[1]):
    dmatrix[i][j] = directed_hausdorff(trajectories[i], trajectories[j])[0]

Хотя это может быть естественным способом решения этой проблемы для специалиста по обработке данных, он использует один поток ЦП, и для его завершения на ЦП Intel Core i7–6700K требуется около 5 часов. Несмотря на то, что мы решили предварительно вычислить матрицу сходства и рассчитать ее только один раз, было бы неприятно ждать несколько часов перед началом фактического исследования кластеризации. Представьте себе случай, когда нам нужно повторно вычислить матрицу сходства для каждой итерации поиска гиперпараметров кластеризации; Ускорение вычисления подобия дает огромные преимущества, поскольку делает эту аналитическую задачу интерактивной.

Мы можем ускорить это, используя

cuspatial.directed_hausdorff_distance

Эта функция cuSpatial принимает в качестве аргументов три объекта серии cuDF. Первые два содержат координаты x и y для всех точек в наборе данных траектории, а третий содержит длину каждой траектории.

Он возвращает попарно симметричное расстояние Хаусдорфа в другом объекте серии cuDF.

Здесь нам нужно сначала преобразовать траектории в правильный формат:

import cudf 
cnt = []
for traj in trajectories:
    cnt.append(len(traj))
cnt = np.asarray(cnt)
trajs = np.concatenate([np.asarray(traj) for traj in trajectories], 0)
x_s = trajs[:,0]
y_s = trajs[:,1]
pnt_x = cudf.Series(x_s)
pnt_y = cudf.Series(y_s)
cnt = cudf.Series(cnt)

Затем мы используем cuSpatial для вычисления расстояния Хаусдорфа.

dist = cuspatial.directed_hausdorff_distance(pnt_x,pnt_y,cnt)

Наконец, мы конвертируем результат обратно в массив Numpy.

urt = dist.data.to_array()
dmatrix = np.reshape(urt,(len(cnt),len(cnt)))

На NVIDIA Quadro GV100,

cuspatial.directed_hausdorff_distance 

Для завершения вычисления расстояния Хаусдорфа для всех пар траекторий требуется всего 13,38 секунды. Включая время преобразования и передачи данных, cuSpatial занимает в общей сложности 13,54 секунды. Вместо того чтобы ждать часами, теперь мы можем сразу перейти к исследованию кластеризации.

В этом примере мы применяем Агломеративную кластеризацию и DBSCAN из scikit-learn. Результаты кластеризации визуализируются в интерактивном режиме с использованием виджетов ipython, что позволяет пользователю поиграть с набором гиперпараметров и посмотреть, как реагируют результаты кластеризации. На рисунке 4 показан пример результата для агломеративной кластеризации, а на рисунке 5 показан пример результата для DBSCAN.

Попробуйте cuSpatial сегодня

cuSpatial стремится обеспечить высокую производительность и простоту использования для крупномасштабной геопространственной и пространственно-временной обработки. Существующие коммерческие ГИС-системы могут использовать cuSpatial для повышения своей производительности и значительного улучшения взаимодействия с конечными пользователями. Существующие коммерческие базы данных могут использовать cuSpatial для расширения охвата управления пространственными данными.

cuSpatial - это предварительная версия программного обеспечения с открытым исходным кодом. Первый официальный выпуск будет частью выпуска RAPIDS 0.10 в октябре 2019 года. Вы можете опробовать его сегодня, установив пакеты cuSpatial conda с помощью этой команды:

conda install -c rapidsai-nightly cuspatial

Или вы можете собрать из исходного кода из репозитория cuSpatial Github. Если вам нравится cuSpatial, отметьте репозиторий на GitHub! Вот несколько примеров записных книжек Python, которые помогут вам начать работу.

Об авторах

Доктор Цзяньтин Чжан - доцент кафедры географических информационных систем и компьютерных наук Городского колледжа Нью-Йорка. Он также является приглашенным преподавателем NVIDIA

Доктор Милинд Напад (Milind Naphade) - технический директор NVIDIA в области интеллектуальной видеоаналитики и искусственного интеллекта.

Марк Харрис - главный инженер по системному программному обеспечению в команде RAPIDS в NVIDIA

Суджит Бисвас (Sujit Biswas) - главный инженер группы интеллектуальной видеоаналитики в NVIDIA

Томсон Комер (Thomson Comer) - старший инженер по системному программному обеспечению в группе RAPIDS в NVIDIA

Доктор Шуо Ван (Shuo Wang) - специалист по данным в группе интеллектуальной видеоаналитики NVIDIA

Кейт Краус (Keith Kraus) - менеджер по разработке системного программного обеспечения в группе RAPIDS в NVIDIA

Джошуа Паттерсон - генеральный менеджер по науке о данных в NVIDIA