Русский
Русский
English
Статистика
Реклама

Лидар

Прослушка с помощью лидаров пылесоса новая угроза частной жизни. Делаем лазерный микрофон в домашних условиях

22.11.2020 20:18:28 | Автор: admin


Подслушивание личных разговоров одна из самых распространённых и неприятных угроз приватности. Не зря многие заклеивают микрофоны и камеры на ноутбуках, чтобы сохранить в секрете самые личные и приватные моменты. Что ж, пришло время заклеивать также и лидары на вашем умном пылесосе. Потому что учёные из Национального университета Сингапура нашли способ прослушки помещений с помощью пылесоса.

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

Звуки это волны давления, которые распространяются через колебания среды. Следовательно, звуковая энергия в окружающей среде частично индуцируется на близлежащие объекты, создавая тонкие физические вибрации внутри этих твёрдых сред. Фундаментальная концепция LidarPhone заключается в том, чтобы воспринимать такие индуцированные вибрации в бытовых предметах с помощью лидарного датчика робота-пылесоса, а затем обрабатывать записанный вибрационный сигнал для восстановления следов звуков. Этот метод зондирования вдохновлён принципом работы лазерных микрофонов, которые используют отражённые лазерные лучи для восприятия звуков от вибрирующих объектов.


Принцип работы недорогого лидара

Хотя лазерные микрофоны требуют сложных настроек, вращающиеся лидарные датчики оснащены, по крайней мере, лазерным передатчиком и датчиком отражений. Это обеспечивает ключевые возможности для преобразования лидара в микрофон. Конечно, практическая реализация этой идеи требует преодоления ряда трудностей.

Одной из основных проблем при использовании лидара в качестве лазерного микрофона является чрезвычайно низкое отношение сигнал/шум (SNR) отражённых сигналов. Отчасти это связано с тем, что LidarPhone опирается на другие физические принципы, чем лазерные микрофоны, несмотря на их очевидное сходство на высоком уровне. Лазерные микрофоны нацелены на высокоотражающие материалы (т. е. производящие зеркальные отражения), такие как стеклянные окна с высоким SNR. В отличие от них, аппаратные усилители лидара и аналого-цифровой преобразователь (АЦП) настроены так, чтобы быть чувствительными только к сигналам низкой интенсивности, которые в основном отражаются от шероховатых поверхностей, таких как стены, тем самым производя рассеянные отражения. Следовательно, даже если лидар получает сигналы высокой интенсивности от стеклянного окна, он не получит полезной информации.


Разница между направленным зеркальным отражением для лазерного микрофона (слева) и рассеянным отражением с меньшим SNR, которое получает LidarPhone

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

Другая серьёзная проблема при разработке атаки LidarPhone была связана с низкой частотой дискретизации лидара. Учитывая его вращательное движение, частота дискретизации для одной точки на целевом объекте эквивалентна частоте вращения лидара. Учёные увеличили частоту выборки за счёт умножения частоты вращения лидара (5Гц) на количество сэмплов за один оборот (360). Таким образом, частота выборки выросла с 5Гц до 1,8кГц, а это важный показатель при обучении нейросети.

LidarPhone тщательно обрабатывает и извлекает следы звуковых сигналов из изначально зашумленных лазерных отражений. Таким образом происходит захват конфиденциальной информации (например, речь, испускаемая компьютерным динамиком, когда жертва участвует в телеконференции).

В этой научной работе в качестве эксперимента атака была проверена на роботе-пылесосе Xiaomi Roborock. Прототип LidarPhone обучался на цифрах из компьютерных колонок и на музыки из динамика телевизора: всего более 30 тысяч звуковых отрывков общей продолжительностью более 19 часов записанного звука. В итоге LidarPhone показал среднюю точность примерно 91% и 90% при классификации цифр и музыки, соответственно.

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


Фигура соответствует звукам в слове девять, полученным от а) оригинального аудио; b) микрофонной записи с расстояния 3 метра; с) обработанным записям лидара с отражения от мусорной корзины; d) пакета IKEA. Соответствующие звуковые файлы опубликованы по адресу bit.ly/lidarphone-sensys

LidarPhone преодолевает ограничения современных методов прослушки, которые требуют некоего подслушивающего оборудования, что увеличивает шансы обнаружения. Здесь никаких жучков и постороннего оборудования. Только обычный пылесос, который скромно стоит в углу и не вызывает подозрений.

Исследователи пишут, что в качестве микрофонов теоретически можно использовать и многие другие световые сенсоры, в том числе на смартфонах. Недавно в ряде научных работ были обнаружены варианты использования неакустических датчиков смартфонов, которые потенциально позволяют записывать разговоры без разрешения. Речь идёт об использовании акселерометра, гироскопа и вибромотора (1, 2, 3, 4).

Но использование смартфона для прослушки банально и предсказуемо. Совсем другое дело бытовые приборы с лидарами, которые никто не может заподозрить в подслушивании разговоров. Такие как пылесос. В общем,, распространение интеллектуальных устройств в наших домах открывает множество возможностей для акустических атак такого типа с прослушиванием приватных разговоров. Главное, нужно помнить, что лидар это фактически готовый лазерный микрофон.

Научная статья обнародована 16 ноября 2020 года на виртуальной конференции SenSys20 в Японии.



Подробнее..

Можно порешать задача про лидарное облако откоманды беспилотных автомобилей Яндекса

20.10.2020 12:19:01 | Автор: admin


Меня зовут Андрей Гладков, я разработчик в направлении беспилотных автомобилей. Сегодня я поделюсь с сообществом Хабра задачей, которая связана с важнейшим сенсором беспилотника лидаром, и с тем, как мы обрабатываем лидарные данные. Вы можете попробовать решить задачу самостоятельно на платформе Контест. Система проверит решение с помощью автотестов и сразу сообщит результат. Разбор и код решения в спойлерах ближе к концу поста. Тем, кто был на митапе в нашем цехе в прошлом году, задача покажется знакомой мы предлагали её в качестве входного билета, но публично никогда ей не делились.

Условие

Ограничение времени 15 секунд
Ограничение памяти 64 МБ
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Беспилотный автомобиль стоит на ровной асфальтовой площадке, на крыше автомобиля установлен лидар. Даны измерения, полученные лидаром за один период сканирования.

Измерения представляют собой множество из $N$ точек, имеющих координаты $x$, $y$ и $z$. Больше 50% точек принадлежат дороге. Моделью положения принадлежащих дороге точек в пространстве является плоскость с параметризацией

$A\cdot x+B \cdot y + C \cdot z + D=0.$

Точки, которые принадлежат дороге, отклоняются от модели не больше чем на заданную величину $p$.

Необходимо найти параметры $A, B, C$ и $D$ соответствующей дороге плоскости. Число точек, отклоняющихся от модели не больше чем на $p$, должно составлять не менее 50% от общего числа точек.

Формат ввода


Входные данные заданы в текстовом формате. Первая строка содержит фиксированный порог $p$$(0.01p0.5)$. Вторая строка содержит число точек $N$$(3 N 25 000)$. Следующие $N$ строк содержат координаты $x$, $y$ и $z$$(100x, y, z100)$ для каждой точки, разделителем является символ табуляции (формат строки "x[TAB]y[TAB]z"). Вещественные числа имеют не более 6 десятичных знаков.

Формат вывода


Выведите параметры $A$, $B$, $C$ и $D$ соответствующей дороге плоскости. Числа разделяйте пробелами. Выведенные параметры должны задавать корректную плоскость.

Пример 1

Ввод Вывод
0.013200010-10010100
0.000000 0.000000 1.000000 0.000000

Пример 2

Ввод Вывод
0.013200310-10210102
-0.099504 0.000000 0.995037 -0.995037

Пример 3

Ввод Вывод
0.011020-100.22000.220100.215-100.151500.1515100.1510-100.110100.120181.715-151.2
-0.010000 0.000000 0.999950 0.000000
Данные примеры синтетические. В реальном облаке точек объектов значительно больше: поработайте над edge-кейсами.

Где порешать


Попробовать свои силы можно на Контесте: https://contest.yandex.ru/contest/12698/enter/

Разбор и готовый код


Разбор
Сначала давайте задумаемся над тем, что должны представлять из себя входные данные. Больше 50% точек, как сказано в условии, относятся к дороге, остальные, как мы можем догадаться, к другим объектам, которые возвышаются над дорогой. Это могут быть другие автомобили, пешеходы, столбы и т. д. Их возвышение над дорогой может быть достаточно большим по сравнению с заданной величиной отклонения точек дороги $p$.

Получается, для решения задачи нам нужен метод оценки параметров модели, устойчивый к большому количеству выбросов. Одним из таких методов является RANSAC (ссылка на Википедию). Метод итеративно перебирает гипотезы (наборы параметров модели), построенные по случайно выбранным точкам, и выбирает из гипотез лучшую.

Применительно к задаче шаг его итерации можно описать так:

  • Берем случайные три точки, вычисляем по ним параметры плоскости (гипотезу).
  • Оцениваем, насколько гипотеза хороша сколько точек с учетом заданного порога $p$ можно отнести к плоскости дороги, а сколько нужно признать выбросами.
  • Обновляем лучшую гипотезу, если текущая оказалась лучше.

В базовом варианте шаг реализовывается довольно просто. Ниже пример кода. Пример не является продакшен-кодом и опирается на то, что входные данные соответствуют описанию задачи.

Код на C++
#include <algorithm>#include <array>#include <cmath>#include <cstdint>#include <iostream>#include <random>#include <vector>struct Point3d {  double X = 0.0;  double Y = 0.0;  double Z = 0.0;};using PointCloud = std::vector<Point3d>;struct Plane {  double A = 0.0;  double B = 0.0;  double C = 0.0;  double D = 0.0;};bool CreatePlane(    Plane& plane,    const Point3d& p1,    const Point3d& p2,    const Point3d& p3) {  const double matrix[3][3] =    {{          0,           0,           0},  // this row is not used     {p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z},     {p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z}};  auto getMatrixSignedMinor = [&matrix](size_t i, size_t j) {    const auto& m = matrix;    return (m[(i + 1) % 3][(j + 1) % 3] * m[(i + 2) % 3][(j + 2) % 3] -            m[(i + 2) % 3][(j + 1) % 3] * m[(i + 1) % 3][(j + 2) % 3]);  };  const double A = getMatrixSignedMinor(0, 0);  const double B = getMatrixSignedMinor(0, 1);  const double C = getMatrixSignedMinor(0, 2);  const double D = -(A * p1.X + B * p1.Y + C * p1.Z);  const double norm_coeff = std::sqrt(A * A + B * B + C * C);  const double kMinValidNormCoeff = 1.0e-6;  if (norm_coeff < kMinValidNormCoeff) {    return false;  }  plane.A = A / norm_coeff;  plane.B = B / norm_coeff;  plane.C = C / norm_coeff;  plane.D = D / norm_coeff;  return true;}double CalcDistance(const Plane& plane, const Point3d& point) {  // assume that the plane is valid  const auto numerator = std::abs(      plane.A * point.X + plane.B * point.Y + plane.C * point.Z + plane.D);  const auto denominator = std::sqrt(      plane.A * plane.A + plane.B * plane.B + plane.C * plane.C);  return numerator / denominator;}int CountInliers(    const Plane& plane,    const PointCloud& cloud,    double threshold) {  return std::count_if(cloud.begin(), cloud.end(),      [&plane, threshold](const Point3d& point) {        return CalcDistance(plane, point) <= threshold; });}Plane FindPlaneWithFullSearch(const PointCloud& cloud, double threshold) {  const size_t cloud_size = cloud.size();  Plane best_plane;  int best_number_of_inliers = 0;  for (size_t i = 0; i < cloud_size - 2; ++i) {    for (size_t j = i + 1; j < cloud_size - 1; ++j) {      for (size_t k = j + 1; k < cloud_size; ++k) {        Plane sample_plane;        if (!CreatePlane(sample_plane, cloud[i], cloud[j], cloud[k])) {          continue;        }        const int number_of_inliers = CountInliers(            sample_plane, cloud, threshold);        if (number_of_inliers > best_number_of_inliers) {          best_plane = sample_plane;          best_number_of_inliers = number_of_inliers;        }      }    }  }  return best_plane;}Plane FindPlaneWithSimpleRansac(    const PointCloud& cloud,    double threshold,    size_t iterations) {  const size_t cloud_size = cloud.size();  // use uint64_t to calculate the number of all combinations  // for N <= 25000 without overflow  const auto cloud_size_ull = static_cast<uint64_t>(cloud_size);  const auto number_of_combinations =      cloud_size_ull * (cloud_size_ull - 1) * (cloud_size_ull - 2) / 6;  if (number_of_combinations <= iterations) {    return FindPlaneWithFullSearch(cloud, threshold);  }  std::random_device rd;  std::mt19937 gen(rd());  std::uniform_int_distribution<size_t> distr(0, cloud_size - 1);  Plane best_plane;  int best_number_of_inliers = 0;  for (size_t i = 0; i < iterations; ++i) {    std::array<size_t, 3> indices;    do {      indices = {distr(gen), distr(gen), distr(gen)};      std::sort(indices.begin(), indices.end());    } while (indices[0] == indices[1] || indices[1] == indices[2]);    Plane sample_plane;    if (!CreatePlane(sample_plane,                     cloud[indices[0]],                     cloud[indices[1]],                     cloud[indices[2]])) {      continue;    }    const int number_of_inliers = CountInliers(        sample_plane, cloud, threshold);    if (number_of_inliers > best_number_of_inliers) {      best_plane = sample_plane;      best_number_of_inliers = number_of_inliers;    }  }  return best_plane;}int main() {  double p = 0.0;  std::cin >> p;  size_t points_number = 0;  std::cin >> points_number;  PointCloud cloud;  cloud.reserve(points_number);  for (size_t i = 0; i < points_number; ++i) {    Point3d point;    std::cin >> point.X >> point.Y >> point.Z;    cloud.push_back(point);  }  const Plane plane = FindPlaneWithSimpleRansac(cloud, p, 100);  std::cout << plane.A << ' '            << plane.B << ' '            << plane.C << ' '            << plane.D << std::endl;  return 0;}

Комментарии к коду
Посмотрим на кусок кода, представленного выше:

  const double matrix[3][3] =    {{          0,           0,           0},  // this row is not used     {p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z},     {p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z}};  auto getMatrixSignedMinor = [&matrix](size_t i, size_t j) {    const auto& m = matrix;    return (m[(i + 1) % 3][(j + 1) % 3] * m[(i + 2) % 3][(j + 2) % 3] -            m[(i + 2) % 3][(j + 1) % 3] * m[(i + 1) % 3][(j + 2) % 3]);  };  const double A = getMatrixSignedMinor(0, 0);  const double B = getMatrixSignedMinor(0, 1);  const double C = getMatrixSignedMinor(0, 2);  const double D = -(A * p1.X + B * p1.Y + C * p1.Z);

В этих строках выполняется вычисление параметров плоскости по трем точкам (ссылка на Википедию). В первой строке $matrix$ должны стоять элементы $x - p1.X$, $y - p1.Y$ и $z - p1.Z$. Если вычислять определитель этой матрицы через алгебраические дополнения для первой строки, то дополнения войдут в итоговое выражение как коэффициенты при $x$, $y$ и $z$, то есть будут как раз коэффициентами $A$, $B$ и $C$ плоскости.

При выборе случайной тройки индексов можно дополнительно учитывать, какие тройки уже встречались. Для этого можно завести unordered_set и записывать в него идентификаторы троек.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru