Pull to refresh

Металлопоиск и… нейросеть

Reading time10 min
Views15K
Принцип работы импульсного металлодетектора
Одним из популярных вариантов конструктивного исполнения устройств для металлопоиска является импульсный (pulse induction (PI)) металлодетектор- неприхотливый и надежный аппарат (хорошая глубина обнаружения, устойчивость к повышенной минерализации грунта, способность работать в соленой воде), имеющий различные сферы применения — от военного дела (традиционные пользователи «импульсников») до поиска золота (особенно популярно это хобби в Австралии).
Но и у него есть существенный недостаток — большие сложности с дискриминацией, т.е. определением типа мишени, например, узнать — из цветного металла она или из черного, или отличить противопехотную мину в пластиковом корпусе от кучки металлического мусора? Какая же причина этой проблемы?
Рассмотрим принцип работы импульсного металлодетектора.


Электронный ключ (обычно MOSFET, выдерживающий напряжение в несколько сотен вольт — например, в этом творении малайзийских инженеров применен популярный IRF740, а в этом проекте на основе программируемой аналого-цифровой матрицы GreenPAK используется менее мощный IRF730) управляет подключением поисковой катушки к источнику питания (аккумуляторной батарее). При подаче на затвор транзистора управляющего импульса (обычно с частотой несколько десятков-сотен герц ) MOSFET открывается — цепь замкнулась, через катушку начинает протекать нарастающий (постепенно — из-за переходного процесса) ток. Ждем несколько десятков или сотен микросекунд нарастания тока до желаемого уровня и… разрываем цепь — управляющий импульс закончился. Ток $i$ через катушку и, соответственно, магнитный поток $\Phi$ катушки резко уменьшается (для ускорения процесса закрытия MOSFET-а управляющий импульс подается не непосредственно на затвор, а через специальный драйвер), что из-за явления электромагнитной индукции вызывает возникновение ЭДС самоиндукции $e_L = -w {d\Phi \over dt}$ и резкое повышение напряжения на катушке. Затем уровень напряжения на катушке начинает уменьшаться. Но если вблизи катушки находится проводящий объект («мишень»), то уменьшающийся вместе с током магнитный поток через катушку наводит вихревые токи $i_в$ в этой мишени. Эти вихревые токи создают свой магнитный поток $\Phi_в$, который пытается поддержать затухающее магнитное поле катушки. Этот эффект приводит к увеличению длительности затухания напряжения на катушке, которая является показателем отсутствия либо наличия мишени (решение принимается либо посредством интегрирования сигнала и оценки интегрального значения (а) либо на основании значений сигнала в нескольких точках (б)):


Примечание: импульсы могут быть и двуполярными (например, в металлодетекторе Vallon VMH2 — классический аппарат, используемый при разминировании):

(источник)
При этом средняя величина (постоянная составляющая) магнитного поля, создаваемого металлодетектором, близка к нулю, что должно (как осторожно пишут в каталогах, «по сведениям производителя») предотвратить подрыв при поиске мин, реагирующих на магнитное поле (хотя, как сказано в книге «Metal detector handbook for humanitarian demining», при гуманитарном разминировании такой инцидент маловероятен).

Наряду с описанным вариантом с одной катушкой, совмещающей функции передающей и приемной, существуют импульсные металлодетекторы с двумя отдельными катушками. Эта схема применяется не только в сфере металлопоиска, но и в дефектоскопии (Pulsed Eddy Current (PEC) Testing) — ссылка 1, ссылка 2. При этом одна из катушек (transmit/drive coil) служит для возбуждения в мишении вихревых токов, а другая (receive/pickup coil) является датчиком магнитного поля. Такой подход дает возможность анализировать магнитное поле не только на этапе убывания (после отключения источника питания от передающей катушки), но и на этапе возрастания (после подключения источника питания к передающей катушке):

Вот отличное описание этой технологии:
The Eddy Current Decay Method for Resistivity Characterization of High Purity Metals

Проблема дискриминации
Проблема распознавания типа металла возникает из-за того, что на результирующую кривую напряжения на катушке оказывают влияние размеры и форма мишени, ее удаление от катушки и электрические (удельная проводимость $\sigma$) и магнитные (магнитная проницаемость $\mu$) свойства материала мишени.
Вот несколько цитат на эту тему:

(источник: Ahmet S. Turk, Koksal A. Hocaoglu, Alexey A. Vertiy Subsurface Sensing)
Discrimination of Metal Types – Since Pulse Induction detects metal via the length of time it takes for the anomalies’ pulses to decay, it is usually only used to detect the metal, rather than determine the type of metal.
(источник)
...size, depth, surrounding targets and soil response may alter the signal in such a way that proper discrimination is not possible.
(источник)
Было сделано много попыток создать импульсные металлоискатели, способные различать железо, серебро и медь, однако все эти попытки имели очень ограниченный успех. Это связано с физикой импульсного сигнала.
(источник)

Одним из подходов к решению этой задачи является использование Double-D (DD) катушек вместо обычной монопетлевой (monoloop), например, в популярных металлодетекторах Minelab серии GPX:

(источник)
В такой катушке разделены передающая (TX) и приемная (RX) обмотки:

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

(источник)
А как же быть с монопетлевой катушкой? Во многих работах (ссылка 1 ссылка 2 ссылка 3) указывается, что сигнал в катушке от мишени можно представить как взвешенную сумму затухающих экспоненциальных сигналов, максимальные значения и постоянные времени которых индивидуальны и зависят от материала, размера и формы мишени:
$u(t) = \sum_{i=1}^NA_ie^{-t/\tau_i}$
В работе "Discrimination experiments with the U.S. Army's standard metal detector" сообщается, что при проведенных авторами статьи экспериментах объекты небольшого размера хорошо характеризовались одной экспонентой $Ae^{-{\alpha}t}$, а для больших объектов требовались уже две — $Ae^{-{\alpha}t}+Be^{-{\beta}t}$.
В этой статье указывается, что постоянная времени экспоненциальной составляющей может быть представлена как отношение эквивалентных индуктивности и сопротивления $ {\tau}_e = { L_e \over R }$ и приводятся ее выражение для цилиндра с радиусом основания $R$ и высотой $h$:
$\tau = {{\mu_r \mu_0 \sigma R^2 h} \over 8}$
В этой работе приводится выражение постоянной времени затухания вихревых токов для сферы радиусом $R$:
$\tau = {{\mu_r \mu_0 \sigma R^2} \over \chi^2}$,
где $\chi$ — результат решения уравнения $tg \chi = {{(\mu_r-1)\chi} \over {\mu_r-1+{\chi}^2}}$

Примечание: такие аналитические выражения возможно получить только для простых симметричных тел. Поэтому для изучения вихревых токов можно использовать программные пакеты численного моделирования электромагнитных процессов. В качестве примера можно привести моделирование электромагнитного тормоза на вихревых токах в пакете COMSOL Multiphysics:

(источник)

Как видно, в выражения для постоянной времени вместе входят магнитная проницаемость, электрическая проводимость и размеры мишени. Выделить влияние этих факторов по отдельности, что и требуется для дискриминации, не так уж и просто.
В уже упомянутой этой работе предлагается использовать Байесовский классификатор, чтобы отличать мины от металлического мусора (тестируются две гипотезы: $H_0$ — мусор, $H_1$ — мина), но при этом требуется дополнительная оценки симметрии сигнала и т.п. (интересно, что в состав используемых факторов входит энергия сигнала, оцениваемая как $\sum_{i=1}^N{u_i^2\cdot{\Delta}t}$).
Для иллюстрации я построил на экране своего экспериментального стенда оригинальной конструкции графики напряжения на катушке для различных мишеней:
нет мишени:

мишень №1 (черный металл) на различном удалении от катушки:

мишень №2 (черный металл):

мишень №3 (цветной металл) на различном удалении от катушки:

мишень №4 (цветной металл):

Как видно, у мишеней из черного металла из-за большей магнитной проницаемости начальный уровень сигнала больше, чем у мишеней из цветного металла, но сигнал при этом затухает быстрее из-за меньшей удельной электрической проводимости.
НЕЙРОСЕТЬ
Как же, основываясь на этих весьма нестрогих признаках, классифицировать мишень, тем более при изменении расстояния от мишени до катушки металлодетектора? У нас есть чудесный инструмент — искусственная нейронная сеть. Нейросети играют в крестики-нолики, блэкджек, покер, предсказывают погоду и качество вина, рассчитывают сопротивление движению сельскохозяйственной техники… Так применим нейросеть для решения проблемы дискриминации!
Доказательством того, что это возможно, служит статья «Improving the performance of the PI systems through the use of neural network» иранских исследователей:

Данные для нейросети
Для наполнения массива данных для обучения, валидации и тестирования нейросети при нажатии кнопки на корпусе моего стенда производится измерение 8 точек (число точек выбрано эмпирически) на кривой напряжения и выдача отсчетов АЦП ATmega328 в символьной форме в последовательный порт, связанный с USB-разъемом компьютера.
В стенде перед входом операционного усилителя включен диодный ограничитель, но, как показало моделирование, на интересующем нас участке (с низким напряжением на катушке) его влияние на значение напряжения ничтожно:

Включив в терминальной программе (например, Tera Term) режим логирования, получаем «сырые» данные (для удобства в Tera Term можно добавлять в протокол комментарии). Маленькая утилита, написанная на Go, преобразует эти данные в формат, пригодный для потребления нейросетью:
i1 i2… i8 o1 o2
Пример строки с набором значений:
588 352 312 280 252 240 206 192 0 1
Входные данные i1 i2… i8 представляют собой отсчеты 10-битного АЦП в диапазоне 0...1023.
Выходные данные o1 o2 представлены в форме:
«черный металл» (1 0), «цветной металл» (0 1).
Я собрал данные при наличии вблизи катушки мишени из черного металла (мишень №1, мишень №2), при мишени из цветного металла (мишень №3, мишень №4), причем мишени располагались на различных расстояниях от поисковой катушки. Для дальнейшего использования отбирались данные, соответствующие достаточному уровню сигнала — с хотя бы двумя ненулевыми значениями. Также отбрасывались наборы данных, соответствующие перегрузке входа АЦП — содержащие несколько максимально возможных значений (1023):

Для иллюстрации я выполнил для одного набора данных регрессионный анализ:

Принятый сигнал хорошо описывается суммой двух экспонент:
$437,9e^{-{0,29}x}+93,1e^{-{12,1}x}$, где $x$ — номер отсчета.
Я выделил большую часть данных (110 наборов значений, файл train.dat) для обучения (training dataset) (при загрузке они дополнительно подвергаются рандомизации — перемешиванию), а меньшую часть (40 наборов, файл test.dat) — для валидации нейросети (validation dataset) — кросс-проверки в ее простейшем варианте (на отложенных данных (holdout dataset)).
Структура нейросети
Создаваемая классическая нейросеть прямого распространения будет иметь три слоя:
входной слой — из 8 нейронов — воспринимают точки кривой напряжения;
скрытый слой — из трех нейронов;
выходной слой — из двух нейронов.

(сеть «8-3-2»)
Иранцы в вышеупомянутой работе использовали два отсчета (соответственно, два входных нейрона) и три нейрона в двух скрытых слоях (схема нейросети изображена и описана в их статье не слишком наглядно).
Состояние нейрона $z$ определяется как взвешенная ($w$ — веса) сумма $n$ входных сигналов $x$ (воспринимаемых дендритами) и смещения $b$:
$z=\sum_{i=1}^nw_i \cdot x_i+w_{i+1} \cdot b$
(добавление смещения можно представить как влияние дополнительного нейрона смещения)
Состояние нейрона преобразуется в выходной сигнал (на терминалах аксона) с помощью функции активации $f$:
$y=f(z)$
Входные сигналы нейросети, поступающие на нейроны входного слоя, передаются на их выходы без изменений, что соответствует линейной функции активации:
$f(z)=z$
Для нейронов скрытого и выходного слоя используется нелинейная функция активации — «сигмоида», точнее ее весьма популярный вариант — логистическая функция — с интервалом значений (0; 1):
$f(z)={1 \over {1 + e^{-z}}}$
Этот выбор функции активации отлично подходит для неотрицательных отсчетов АЦП. Но при этом требуется, естественно, нормализация входных значений — делим их на 1024, что гарантирует значение меньше 1.
Иранцы использовали в качестве функции активации гиперболический тангенс.
Значения на выходах нейронах выходного слоя определяют результаты работы нейросети. Нейрон с максимальным выходным значением и укажет на решение (выигравший класс), принятое сетью: первый класс — «черный металл», второй класс — «цветной металл».
Иранцы использовали три выходных нейрона, указывающие на железо, медь и свинец.
Для решения задач машинного обучения часто используется PythonPyTorch, Keras, TensorFlow, CNTK, библиотеки и фреймворки для нейросетей созданы и для JavaScriptSynaptic, JavaDeeplearning4j, C++CNTK, не отстает и MATLAB.
Но для последующего «полевого» использования в металлодетекторе эти фреймворки/библиотеки малопригодны, поэтому для детального понимания процесса я построил свою нейросеть без использования дополнительных библиотек поддержки ИНС. Нейросеть, конечно, можно написать и на BASIC :-). Но под влиянием своих субъективных пристрастий я выбрал Go.
Обучение и валидация нейросети
При создании сети веса инициализируются случайными значениями в диапазоне (-0,1;0,1).
Я применил для обучения сети метод стохастического градиентного спуска (stochastic gradient descent (SGD)).
Нейросеть выполняет одную итерацию процесса обучения, используя последовательно один из предоставленных для обучения наборов данных. При этом сначала выполняется операция прямого распространения — сеть обрабатывает поданный на вход набор сигналов из обучающего примера. Затем на основании полученного решения реализуется алгоритм обратного распространения. Для обновления весов в процессе обучения я применил формулу «ванильного» градиентного спуска, в которой используется один гиперпараметр — коэффициент скорости обучения (learning rate) $\alpha$ (иногда обозначается $\eta$), т.е. не используется второй популярный гиперпараметр — фактор момента $\gamma$ (momentum factor).
Эпоха обучения завершается после использования всего массива обучающих данных. После окончания эпохи вычисляется средний квадрат ошибки (Mean Squared Error (MSE)) обучения, нейросети «скармливается» набор значений для валидации (кросс-проверка на отложенных данных), определяется средний квадрат ошибки валидации, точность предсказаний (accuracy) и цикл повторяется. Цикл останавливается после достижения требуемого уровня среднего квадрата ошибки валидации.
После компиляции исходного кода (файл nn4md.go) и запуска исполнимого файла в консоли отображается процесс обучения — номер эпохи (Epoch), средний квадрат ошибок обучения и валидации (MSE) и точность предсказаний на массиве данных для валидации (Acc.).
Вот фрагмент такого протокола:

Изменение стартового числа влияет на начальные значения весов нейросети, что приводит к небольшим отличиям в процессе обучения. При коэффициенте скорости обучения 0,1 обучение завершается (при достижении MSE = 0,01 на тестовом наборе) примерно за 300 эпох.
Точность решений на массиве данных для валидации составляет 100% (программа выдает номер выигравшего нейрона, начиная от 0- «0» — первый нейрон, черный металл; «1» — второй нейрон, цветной металл):
0 -> 0
0 -> 0
0 -> 0

1 -> 1
1 -> 1
1 -> 1

Итоговые веса нейросети после обучения сохраняются для последующего использования в текстовом файле nn4md.json в JSON-формате. Кстати, для кодирования JSON-структур на Go удобно использовать вот этот онлайн-инструмент.
Так как общепринятого и удобного стандарта на формат хранения настроек нейросетей до сих пор не выработано (хотя есть, конечно, NNEF — но для такой простой сети это IMHO чересчур), то я использовал свой формат:

Тестирование нейросети
А теперь тестируем обученную нейросеть на распознавании новых мишеней (test dataset).
Мишень №5 (из черного металла):
Вид кривой:

Набор значений:
768 224 96 48 14 0 0 0
Мишень №6 (из цветного металла):
Вид кривой:

Набор значений:
655 352 254 192 152 124 96 78
После завершения обучения программа ожидает ввода данных для тестирования.
Проверяем для мишени №5:

Успех — «0» — черный металл.
А теперь проверим для мишени №6:

Успех — «1» — цветной металл.
Вот такой получился почти "proof-of-concept".
Файлы с наборами данных, файл весов сети и исходный код доступны в репозитарии на GitHub.
Tags:
Hubs:
+32
Comments42

Articles