FabLabCFU

Крым
На Пикабу
7131 рейтинг 24 подписчика 22 подписки 5 постов 5 в горячем
Награды:
5 лет на Пикабу Отпетый киноман
4338

Лада Гранта и фреон

Купили зимой новую Гранту, с кондиционером. Уже в июле, к первому ТО, кондишка практически не охлаждала. На ТО у офлилера обнаружили почти полное отсутствие фреона и заправили его, дополнительно содрав около 5 т. р.
Заподозрив дилера в плохой предпродажной подготовке и попытках съехать с гарантии на кондишку, написали изготовителю. Ответ удивил)

Лада Гранта и фреон Лада Гранта, Фреон, Дилер, Авто, Гарантийное обслуживание, Длиннопост
Лада Гранта и фреон Лада Гранта, Фреон, Дилер, Авто, Гарантийное обслуживание, Длиннопост

Вот так вот, несмотря на герметичность системы, происходит уменьшение объема. Прошло полтора месяца, опять холодит всё слабее...
Параллельно катаюсь на Киа Спортейдж (не реклама), на пробеге 113 тысяч отрыгнул масляный насос, но кондишка холодит как в первый день покупки, без всяких дозаправок.
Корейский фреон в объемах не уменьшился.
Продолжаю наблюдение.

Показать полностью 2
409

Как достать обломанный метчик из алюминиевой детали?

По закону Мерфи, если у вас есть метчик, рано или поздно он сломается в заготовке. Если эта деталь из алюминия и не слишком большого размера, значит, вам повезло )
Берем подходящую ёмкость, можно из нержавейки, опускаем туда деталь (или пострадавшую часть детали, если целиком не влезает), заливаем водой, добавляем лимонной кислоты (для начала - примерно пару чайных ложек на литр воды), доводим до кипения и оставляем тихонько кипеть часов 5 - 6.

По мере выкипания добавляем понемногу воды и подсыпаем лимонной кислоты.

Часов через пять можно начинать проверять, как там идут дела. Когда резьба метчика достаточно разъестся кислотой, он просто вытряхнется при постукивании деталью об стол.

Как достать обломанный метчик из алюминиевой детали? Металлообработка, Метчик, Застрял, Химия, Лимонная кислота, Алюминий, Лайфхак, Видео, Длиннопост, Вертикальное видео

Ни один алюминий при этом не пострадает.

Как достать обломанный метчик из алюминиевой детали? Металлообработка, Метчик, Застрял, Химия, Лимонная кислота, Алюминий, Лайфхак, Видео, Длиннопост, Вертикальное видео
Показать полностью 2
31

Прошивка для платы управления двигателем RMD-X8 Pro

В рамках создания комплекса экзокисти под управлением нейрокомпьютерного интерфейса написал прошивку для Arduino Mega, которая через CAN-контроллер управляет серводвигателем RMD-X8 Pro, приводящим в движение механизм экзокисти. Модель экзокисти создавали наши студенты, прошивка представляла собой скетч, вырезанный из другого проекта, двигатель мог управляться только с помощью джойстика. Причем джойстик при движении вперед раскручивал двигатель вперед, а при отклонении джойстика в обратную сторону постепенно останавливал его и начинал неконтролируемые движение в обратном направлении. При остановке джойстика движение также не прекращалось. Контроля углов вращения не было.

Прошивка для платы управления двигателем RMD-X8 Pro Arduino, Json, Сервопривод, Прошивка, Экзоскелет, Программирование, Вертикальное видео, Видео, Длиннопост

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


Для двигателя есть настроечная программа, которая работает по протоколу serial-232, имеются варианты интерфейса двигателей с RS485 у которого больше возможностей, чем у CAN, который через один датафрейм может передать максимум 8 байт. В тестовой вкладке программы настройки примеры интерфейса управлением двигателя работают не так, как хотелось бы, но зато оказалось, что там есть команды, не описанные в документации. При использовании тестовых режимов программа указывает, какие данные она пересылает в датафрейме, и стало видно, что кроме команд позиционирования А1-А6 также используются команды А7 и А8, и последняя команда как раз подошла для нашей задачи.

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

Энкодер двигателя очень чувствительный – он позволяет позиционировать двигатель с точностью до сотых долей градуса. При команде на остановку двигатель по инерции проходит еще несколько сотых градуса, и без усреднения данных положения энкодер постоянно пытался бы вернуть двигатель точно в заданное положение, опять бы проскакивал его по инерции и т.д., что вызывало бы постоянное дерганье. Усреднил показания позиции, разделил их на 100 и отбросил дробную часть, чтобы сравнивались только целые градусы углов, поскольку точность в 1 градус вполне достаточна, а лишних дерганий удается избежать.


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

Также добавил в прошивку работу с внешними интерфейсами через последовательный порт в формате JSON, через которые прошивка будет получать команды от внешней управляющей программы. На Java написана ретранслирующая программа, которая принимает пакеты по протоколу UDP, пересылает их в Ардуино по serial, с последовательного же порта получает ответ от платы и пересылает его обратно в управляющую программу высокого уровня по UDP. Это необходимо для обратной совместимости со сторонним программным обеспечением.

Показать полностью 1 1
46

Одна задача – три конвертера

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

Для создания нейроинтерфейса я использую платформу OpenVIBE, которая поддерживает LabStreamingLayer (LSL) - протокол для обмена потоковыми данными между приложениями - и содержит в себе драйвер нашей модели энцефалографа - NVX52. Это позволяет отправлять результаты ЭЭГ-съемки с энцефалографа сразу в поток LSL, который совмещает наши ЭЭГ с метками стимуляций – моментами, когда на экране человек, согласно сценарию OpenVIBE, видит стрелки влево и вправо и должен представлять соответствующие движения.

Но у OpenVIBE есть давняя, но до сих пор не решенная проблема - он не может нормально записывать сигналы в формате EDF+, то есть в формате ЭЭГ с указанными временными метками событий. Внутренний формат OpenVIBE OV или обычный текстовый формат CSV он сохраняет корректно, а файлы EDF+ в итоге получаются с нулевой длиной, он их не обрабатывает.

Поскольку разработчики OpenVIBE пока не предложили подходящего решения, пришлось вспомнить Java и написать конвертер самому.

Одна задача – три конвертера Нейронные сети, Конвертер, Программирование, ЭЭГ

Теперь можно удобно и быстро конвертировать файлы CSV to EDF+ с сохранением временных меток событий. Сейчас работаю над тем, чтобы на этапе конвертирования частотными фильтрами убирать помехи.

Это уже не первый конвертер, который мне пришлось написать самостоятельно для обработки научных данных. Во время предыдущего исследования мы работали на энцефалографе NVX52, который через программу ExoHead записывал данные в формате BCI собственной версии, который вообще ничем не читался. Пришлось сделать конвертер BCI to EDF+.

Ну и наконец, для облегчения работы с данными при обучении ИНС для распознавания различных состояний по сигналам ЭЭГ написал конвертер EDF-файлов в несколько форматов CSV: для Deeplearning4j, Keras и обратно в OpenVibe. Кроме того, конвертер умеет понижать частоту сигнала ЭЭГ, применять фильтры, убирать шумы. Для ускорения конвертации работает в 4 потока, задействуя 4 ядра процессора.

Одна задача – три конвертера Нейронные сети, Конвертер, Программирование, ЭЭГ

Все три программы будут выложены в свободном доступе.

Показать полностью 2
861

На пути к нейросети

Мы занимаемся разработкой экзоскелета кисти с биологической обратной связью для реабилитации детей с синдромом ДЦП. А точнее, пытаемся обучить нейросеть распознавать сигналы мозга для управления экзокистью.

Хочу рассказать, с чего началось и как продвигается наше исследование.

Несколько месяцев назад мы начали подготовку данных - сняли около 1000 энцефалограмм, которые содержат признаки, характерные для мысленного представления определенных движений кистью. Всего планируем снять 2000 ЭЭГ, но уже сейчас у нас достаточно данных для начала работы.

Следующий этап - установка видеокарты GeForce RTX 3090 c GDDR6 24Гб. Она позволяет обрабатывать большие обучающие выборки благодаря наличию большого объема памяти и использованию технологии CUDA. Но в новизне видеокарты скрывались подводные камни, которые я не без труда, но с успехом преодолел.

На пути к нейросети Нейронные сети, Глубокое обучение, Cuda, Длиннопост, Nvidia, Текст, ЭЭГ

Видеокарта «взлетела» не сразу. Для начала стало ясно, что она не помещается ни в один из имеющихся в наличии корпусов. Был приобретен новый корпус Full Tower и отдельно блок питания на 750Вт. При попытке задействовать возможности CUDA в обучении нейронных сетей возникла следующая проблема – видеокарта слишком новая, фреймворки и библиотеки для искусственного интеллекта (DeepLearning4j, Theano, TensorFlow) её еще не поддерживают. Выход – скачать исходники фреймворков для ИИ и самостоятельно перекомпилировать их для поддержки видеокарты. Однако в процессе оказалось, что эти фреймворки ускоряются не только за счет ресурсов видеокарты, но и требуют поддержки современных инструкций процессора. Был приобретен современный процессор Inter Core I7-10700K с поддержкой AVX, AVX2 команд – , вместе с новой материнской платой и 32 Гб DDR4.


И вот наконец GeForce RTX 3090 смогла продемонстрировать свои возможности!


На первом графике видно, как задействуется память видеокарты и ресурсы GPU при обучении Convolution 1D — сверточной одномерной сети, обрабатывающей временные ряды — данные исследований ЭЭГ. Ранее обучение нейронной сети на этом датасете занимало около 4 часов. На новой видеокарте — порядка 3-4 секунд.

На пути к нейросети Нейронные сети, Глубокое обучение, Cuda, Длиннопост, Nvidia, Текст, ЭЭГ

А вот задача посложнее: LSTM — рекуррентная сеть с долгой краткосрочной памятью. Те же данные считаются дольше — около 2 минут, и нагрузка на GPU выше:

На пути к нейросети Нейронные сети, Глубокое обучение, Cuda, Длиннопост, Nvidia, Текст, ЭЭГ

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


Таким образом, видеокарту удалось запустить в Keras, используя только что вышедшее обновление TensorFlow в версии для GPU.

Однако эти решения используют Python, который при всех его положительных качествах (возможность быстрого прототипирования нейронных сетей, развитые библиотеки для работы с данными, простота и скорость разработки приложений) плохо подходит для многопоточных задач, когда в пределах одного приложения надо получать данные с устройства в реальном масштабе времени, обрабатывать их, подавать на вход ИНС, сохранять в файл, управлять внешними устройствами, рисовать данные на экране и т.д.

Поэтому необходимо было получить возможность работать с ИНС в Java-приложениях, но с этим из-за использования слишком нового железа возникли трудности. Описанными в мануалах способами GPU никак не хотел подключаться, и решения на тематических форумах на сайте разработчиков и GitHub не было, а те рецепты решения проблемы, которые советовали разработчики, не помогали.


Возникло понимание, что причина проблемы - в несовместимости ряда библиотек, компонентов фреймворка, с новыми библиотеками CUDA от NVIDIA.

Пришлось скачивать исходники и пытаться собирать библиотеки под необходимые платформы: CUDA 11.* и CuDNN 8.*, что оказалось нетривиальной задачей: имелось несколько тысяч файлов и масса условий окружения для нормальной сборки, а мануалы описывали сборки устаревших версий и не работали с новыми.

Кроме того, в исходных кодах возникали некоторые ошибки компиляции, одинаковые как для компиляции из Windows 10 (VS2019), так и из Ubuntu (gcc).

Удалось скомпилировать, после правки исходных кодов, часть зависимых библиотек проекта - libnd4j, а затем уже с ними библиотеку nd4j-cuda-11.1.


Ранее поддержка проекта рекомендовала использовать snapshots - версии библиотек из специального репозитория:


«we’ll be releasing a version with 11.0 in a bit, for now you can use snapshots and see if that works? https://deeplearning4j.konduit.ai/config/config-snapshots»


Однако, как оказалось, часть необходимых для работы файлов там отсутствовала, и рекомендация не помогла.


https://oss.sonatype.org/service/local/artifact/maven/redire...

404 — Not Found

Path /org/nd4j/nd4j-cuda-11.0/1.0.0-SNAPSHOT/nd4j-cuda-11.0-1.0.0-20201117.023522-181-windows-x86_64.jar not found in local storage of repository «Snapshots» [id=snapshots]


Что и обусловило компиляцию недостающих файлов. К счастью, версия deeplearniung4j для 11.0 версии CUDA импортировалась, и, добавив в проект в виде отдельных jar и dll файлов скомпилированные библиотеки, удалось запустить приложение на видеокарте!


Часть POM файла работоспособного проекта:

На пути к нейросети Нейронные сети, Глубокое обучение, Cuda, Длиннопост, Nvidia, Текст, ЭЭГ

Скомпилированные библиотеки добавлены в зависимости вручную:

На пути к нейросети Нейронные сети, Глубокое обучение, Cuda, Длиннопост, Nvidia, Текст, ЭЭГ

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


Вот так я сам добавил поддержку современных видеокарт в Deeplearniung4j, чтобы не дожидаться, пока это сделают разработчики.


Спасибо за внимание. Пока мы еще в начале пути, буду продолжать рассказывать о нашей работе!

Показать полностью 5
Отличная работа, все прочитано!