Waik

Waik

Пикабушник
Дата рождения: 1 января
в топе авторов на 641 месте
3727 рейтинг 314 подписчиков 0 подписок 25 постов 8 в горячем
Награды:
Пикабу 17 лет!10 лет на Пикабу За успехи в мемологии
13

Собрал себе «Омегу». Ну, почти⁠⁠

ИНТРО

Друзья, привет! Я неравнодушен к наручным часам. Не фанатик и большой коллекции не имею, но тема меня однозначно цепляет.

Кто торопится — видео со сборкой и во сколько мне это обошлось, в конце поста, листайте вниз.

А ещё я обожаю медитативные видео, где кто-то что-то собирает или чинит. Пару лет назад подсел на зарубежные ролики, где часы собирают из готовых комплектующих — как правило, это оммажи известных моделей. Идея засела в голове: попробовать самому.

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

p/s самым сложным оказалось съемка, Ну я старался как мог.

ЧТО СОБИРАЕМ

Сразу скажу: меня больше интересовал сам процесс. Я даже не был уверен, что буду эти часы носить, — хотелось собрать и заснять.

Выбор пал на оммаж Omega Speedmaster Silver Snoopy. Оригинал я вряд ли когда-нибудь куплю (но не стоит себя недооценивать) , а дизайн мне нравится. Самое то для хобби-проекта и пробы пера.

Факт про оригинал. В 1970 году у «Аполлона-13» взорвался кислородный бак, электронику пришлось отключить. 14-секундное включение двигателя экипаж засекал по своим Speedmaster, и за это Omega получила от NASA награду Silver Snoopy. К её 50-летию Omega выпустила эти часы. На задней крышке оригинала при запуске хронографа Снупи в капсуле облетает Луну. У меня Луна просто нарисована)

ИНСТРУМЕНТЫ

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

Составил список и заказал. Часть пришла настолько плохого качества, что я от неё отказался, — поэтому первая сборка прошла без пресса, подушки, съёмника и кисточек. Но обо всём по порядку.

  1. Держатель механизма — фиксирует механизм во время сборки.

  2. Пресс для стрелок, груша для сдувания пыли, подушка для часов.

  3. Пинцеты разных типов.

  4. Съёмник стрелок.

  5. Кисточки и прочее — чистить стекло и убирать пылинки.

  6. Кусачки для штока. Я обошёлся своими бокорезами для электроники.

  7. Надфиль. Вместо него — маленький диск для дремеля.

  8. Штангенциркуль. Достался ещё от деда.

  9. Фиксатор резьбы — был свой.

  10. Запасные штоки. Решил, что хватит одного. Не хватило — пришлось дозаказывать.

  11. Напальчники — если не хочется заляпать часы. Мне не хотелось.

  12. Смазка для уплотнителя — ей смазывается прокладка задней крышки.

Стрелки я прижимал подручными средствами, собирал прямо на столе, снимал стрелки пинцетом — и без кисточек всё вышло чисто. Но на будущее этот инструмент точно не лишний.

КОМПЛЕКТУЮЩИЕ

Дальше — выбрать узлы. Тут чуть сложнее. Искал параллельно на AliExpress и Ozon, в итоге получилось так:

1. Механизм — сердце часов. Японский Seiko VK63, гибридный кварц (Meca-Quartz).

2. Корпус. Очевидно, он должен подходить под механизм. Выбирал максимально похожий на оригинал — даже с «лунным» рисунком на задней крышке.

3. Циферблат. Диаметр 32,5 мм, с логотипом и зелёным люмом, под VK63.

4. Стрелки. Подбирал в комплект к циферблату — у продавца на Али это оказалось несложно.

5. Ремешок — любой на ваш вкус. Я искал похожий на оригинал: быстросъёмный, ширина 20 мм.

основные комплектующие

СБОРКА

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

Батарейка. Достаём механизм и ставим батарейку. Тут проблем быть не должно. На механизме есть фиксирующая скоба с защёлкой — обязательно защёлкните её.

Шток и головка. Откручиваем заводную головку с корпуса и накручиваем её на шток (один идёт в комплекте с механизмом). Вставляем шток в механизм — отверстие между кнопками, до щелчка.

Циферблат. Надеваем напальчники, если почему-то ещё не надели. На обороте циферблата две ножки — совмещаем их с отверстиями в механизме и прижимаем до щелчка. Ошибиться тут сложно.

совмещаем ножки циферблата с механизмом

совмещаем ножки циферблата с механизмом

Стрелки — на мой взгляд, самый ответственный этап. Они очень тонкие и легко гнутся, поэтому доставайте их из пакета пинцетом. Пальцами почти наверняка погнёте.

Начинаем с часовой. Ставим её ровно на 12 и плотно прижимаем. Сразу проверяем: вытягиваем головку в положение установки времени и плавно прокручиваем, чтобы стрелка сделала полный оборот. Задача — убедиться, что она ничего не задевает и ходит плавно. Возвращаем на 12.

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

Лирическое отступление. Во время одной из переустановок стрелка хронографа сделала «пыньь!». Отвлёкся на секунду, слышу характерный звук, смотрю на пинцет — стрелки нет. Искал минут 30.
На столе лежали вещи для съёмки — объективы, переходники, коробки от ND-фильтров, — и каждую пришлось перебрать: стрелка могла отскочить куда угодно. Отсюда я вывел для себя главное правило сборки: стол должен быть АБСОЛЮТНО пустым и чистым.

Нашёл, поставил, едем дальше.

Проверка хронографа. Заодно убедитесь, что стрелка сидит надёжно. Верхняя кнопка (над головкой) запускает хронограф, повторное нажатие останавливает, нижняя — сбрасывает. При сбросе стрелка резко прыгает на ноль, и если посажена слабо — в худшем случае улетит. Имейте в виду.

Малые циферблаты. Остальные стрелки ставим так:

— 24-часовая — на 12/24;

— минутный счётчик хронографа — на 60;

— малая секундная — в любое положение.

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

ФИНИШНАЯ ПРЯМАЯ

Теперь механизм нужно поставить в корпус, а для этого сначала вынуть шток. Переворачиваем механизм, нажимаем на кнопку с надписью PUSH и одновременно тянем шток. Я в первый раз потратил на это кучу времени: сначала вытянул шток до упора и только потом жал на кнопку — так не работает. Шток должен быть утоплен, в рабочем положении: нажали кнопку — и он легко выходит.

достаем шток

достаем шток

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

1 фото - механизм в корпусе. 2 фото - добавили приставочное кольцо

Подгонка штока. Вставляем шток с головкой через корпус. Штангенциркулем меряем зазор между головкой и резьбой на корпусе, куда она закручивается (у меня вышло около 3 мм). Переворачиваем корпус, жмём кнопку, вынимаем шток. Откручиваем головку, отмеряем это расстояние от конца штока со стороны головки и отрезаем. Срез зачищаем надфилем или шкуркой.

Накручиваем головку, вставляем шток в корпус и проверяем: шток должен нормально входить в механизм, все функции — работать, а головка — закручиваться в корпус. Если нет — подрезаем ещё.

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

Задняя крышка. Достаём прокладку, смазываем, возвращаем в паз. Продуваем крышку и плотно закручиваем.

прокладка для задней крышки

прокладка для задней крышки

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

Ремешок. Тут без инструкций: если вы дочитали до этого места, они вам уже не нужны.

Готово! Ещё раз проверьте все функции.

ВПЕЧАТЛЕНИЯ

Удовольствие я получил, но меньше, чем мог бы. Причин две.

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

Вторая — снимал весь процесс. С фото я чувствую себя более-менее уверенно, а видео для меня дело относительно новое. И второго дубля тут нет: разбирать и собирать часы заново ради пересъёмки не хотелось.

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

Для тех кто дочитал до конца. примерно так это выглядело:

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

Стоимость

  1. Корпус - 2600

  2. Стрелки - 300

  3. Механизм - 2000

  4. Ремешок - 370

  5. Циферблат - 700

Стоимость инструмента не считал.

Итого - 5970 руб.

ЧТО ДАЛЬШЕ?

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

Куда всё это приведёт — не знаю. На всякий случай завёл ТГ-канал, буду дублировать информацию там + ссылки на комплектующие. Тг -канал это скорее мой собственный дневник, но будет дополнительной мотивацией если вам это понравилось.

Кому интересно — заходите, вместе решим, что собирать дальше и судьбу эти часов.

Телеграм

Видео сборки

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

Ч.4 Я снова сделал систему распознавания номеров. Как работает детектор⁠⁠

Серия распознавание номеров

Предыдущие части: Часть 1 | Часть 2 | Часть 3

Привет!

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

Спойлер: я изобрел велосипед, но сам!

Спойлер 2: Система еще на этапе разработки, пока только делюсь с вами процессом.

Как это всё начиналось — версия 2022 года

Моя первая система распознавания номеров работала по совершенно другому принципу. Камера сама должна была поймать момент — по детекции движения, по пересечению линии, по любому встроенному триггеру — и отправить готовый кадр в систему, например по FTP. Система видела новый файл и пыталась найти на нём номер.

В целом выглядит логично. На практике — куча ограничений:

Не каждая камера умеет автоматически определять транспортное средство из коробки. Настройка FTP на камере c кривой прошивкой — это отдельный квест.


У серьёзных брендов всё это есть, но мой проект был рассчитан на сегмент попроще, где камера с AliExpress. С непонятной прошивкой)

Там никакого FTP нет а если есть, работает по настроению. Кстати у меня как раз такая камера)

Плюс качество кадра по триггеру — это лотерея. Моя камера срабатывала когда хотела, номер мог быть размытым, обрезанным, или вообще не попасть в кадр. Иногда она просто отправляла мне пустой кадр, хотя триггер стоял на автомобиль в кадре.

Недавно я решил переделать всё с нуля, первое решение было очевидным: система должна сама анализировать RTSP-поток. Подключил камеру — и забыл. Никаких FTP, никаких триггеров на стороне камеры, никаких танцев с бубном при настройке.

Так я пришёл к связке YOLOv8 + ByteTrack + OCR для номеров. YOLOv8 находит автомобили в кадре, ByteTrack следит за каждым из них как за отдельным объектом, OCR(оптическое распознавание символов c кадра) читает номер.

Архитектуру я продумал заранее. А вот с реализацией — всё оказалось сложнее, чем казалось.

Первый запуск. Первое видео

У меня не было реального RTSP-потока для тестов. Пришлось скачивать видео с YouTube — записи с трасс, парковок, перекрёстков. Качество разное, углы обзора разные, трафик машин разный.

Я не стал хвататься за всё сразу. Решил начать с того что казалось самым сложным — видео с трассы. Камера специально установлена для фиксации номеров, машины едут под одним углом, номер всегда в кадре, никаких засветок. Идеально сложные условия, как мне тогда казалось. Отрезок на распознавание небольшой, скорость у машин высокая.

Запустил. В логах поплыли результаты распознавания. "УРА!" — подумал я. Проект закончен, я молодец.

Потом открыл папку с сохранёнными кадрами...

кадр где видно только бампер въезжающей машины

кадр где видно только бампер въезжающей машины

Система радостно фиксировала каждую машину в момент когда та только появлялась в кадре. На фото — наверное 20% автомобиля, остальное за краем экрана. Я-то понимаю что это машина и что она сейчас въедет полностью, и можно поймать более удачный кадр. Система — нет. Только увидела авто — сохранила.

Проблема первая: кадр слишком ранний

Решение: не сохранять сразу. Вместо этого — собрать несколько кадров пока машина в кадре, дождаться пока она уедет, и только потом выбрать лучший.

Но какой кадр лучший? Первое что пришло в голову — тот где машина занимает наибольшую площадь в кадре. Больше площадь — машина ближе, номер крупнее, читать легче.

Так появилась первая переменная в коде:

BEST_FRAME_WINDOW — сколько кадров собрать для анализа

Стало лучше. Но не идеально. Машина "максимально" в кадре, но номер плохо читаемый, вот бы захватить кадр чуть-чуть раньше....

Проблема вторая: кадр большой, но неудачный

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

Тут я вспомнил что OCR-движок вместе с результатом отдаёт уверенность — число в диапазоне от 0 до 1 насколько он сам уверен в своём ответе.

Теперь правлю логику: если система несколько раз попробовала распознать номер(помним про BEST_FRAME_WINDOW ) и получила результаты с разной уверенностью — берём тот где уверенность выше.

Теперь логика выбора кадра стала такой: не просто "наибольшая площадь", а "наибольшая уверенность OCR". Если OCR вообще не сработал ни на одном кадре — тогда fallback на наибольшую площадь.

Появилась ещё одна переменная:

RECOGNIZE_INTERVAL — OCR запускается раз в N кадров

система делает несколько снимков одного ТС и в данному примере выберет второй кадр из карусели.

Парковка и пробка — где всё сломалось и перестало работать

Трасса оказалась самым простым случаем. Машины едут быстро, в кадре недолго, в кадре одновременно 2-3 штуки максимум. Номер всегда видно.

Настоящий ад начался когда я взял видео с парковки.

Парковка: машина стоит и это проблема

Попробуйте угадать что произошло. Подсказка: машина стоит на парковке и никуда не едет.

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

Решение: кулдаун. После того как событие зафиксировано, на этом номере N секунд тишины.

COOLDOWN_SECONDS — пауза между повторными записями одного и того же номера

Особенно актуально для пробок и перекрёстков — там машина может стоять в кадре несколько минут, медленно ехать, снова стоять и так далее.

Пробка: всё сложно одновременно

Видео с пробкой стало главным экзаменом. Несколько полос, машины едут медленно, некоторые стоят, номер то видно то не видно — водитель прижался к переднему авто и номер перекрыт на всё время пока машина в кадре.

И главная проблема с которой я столкнулся сразу: когда две машины в кадре одновременно, распознавался только один номер.

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

Режимы: single и multi

Single — для сценариев где в кадре одна машина: ворота, въезд, автосервис. Меньше нагрузка на систему, логика проще.

Multi — для потока: дорога, парковка, пробка. Здесь будет задействован ByteTrack — каждой машине присваивается уникальный ID и система следит за каждым авто независимо.

Добавляю очередные параметры в систему:

DETECTION_MODE — single или multi

DISAPPEAR_FRAMES — сколько кадров машина должна отсутствовать чтобы считаться уехавшей из кадра и начать распознавание.

В multi-режиме каждая машина живёт в своём "треке" — система помнит её историю, лучший кадр, лучший результат OCR, и ждёт финала когда машина уедет.

Триггерная зона: подсказываем системе где смотреть

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

Незачем гонять OCR на весь кадр всё время. Можно заранее сказать системе: "смотри только вот в этой области". Если машина туда ещё не въехала или уже выехала — OCR не запускаем.

Новые параметры:

TRIGGER_ZONE_TOP — верхняя граница зоны (доля высоты кадра, 0.0–1.0)

TRIGGER_ZONE_BOTTOM — нижняя граница зоны

Так я получил двойной эффект: меньше нагрузка на процессор и меньше шансов поймать неудачный кадр — система как бы заранее знает где будет лучший ракурс.

интерфейс выбора зоны распознавания

интерфейс выбора зоны распознавания

Streak и ранее сохранение: не ждём вечно

Ещё одна история из пробки. Система честно ждала пока машина уедет из кадра, и только потом финализировала событие. Логика правильная — но на практике машина в пробке в кадре может ехать три минуты или десят. Все это время ждать результата?

Решение: если система несколько раз подряд распознала у конкретной машины одинаковый номер — считаем что мы уже знаем ответ, и незачем ждать пока машина уедет. Сохраняем сразу.

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

Несколько раз подряд один и тот же номер — streak набран. Система не ждёт пока машина уедет за кадр, она уже уверена в ответе. Событие сохраняется прямо сейчас, с кадра №3 где уверенность максимальная.

А вот другой сценарий — номер то появляется, то перекрывается соседним авто:

На второй попытке номер считался неполностью — streak сбросился. Счётчик начинается заново с попытки №3. На попытке №4 снова два совпадения подряд — сохраняем событие

Это называется streak — серия одинаковых результатов подряд. Набрали нужное количество совпадений, достигли нужного уровня уверенности — "отпускаем" машину не дожидаясь её физического ухода из кадра.

Новая переменная:

PLATE_CONFIRM_COUNT — сколько одинаковых OCR-результатов подряд нужно

для уверенного распознавания

Пресеты: чтобы не настраивать каждый раз вручную

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

Трасса — машины быстрые, нужен маленький DISAPPEAR_FRAMES.

Ворота — одна медленная машина, совсем другая логика.

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

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

Пример выбора пресета

Пример выбора пресета

Схема логики детектора

Чтобы было понятнее как всё это работает вместе — вот упрощённая схема.

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

Конечно, система сложнее, я описал только основные моменты логики и проблемы с которыми столкнулся.

Что в итоге

Я не смог найти подробных примеров того, как работают такие системы и придумал свой велосипед. Уверен, что можно лучше и знаю что в комментариях вы мне подскажете что поправить.
Детектор прошёл долгий путь от глупого бесконечного поиска номеров в каждом кадре до системы с трекингом, фоновым OCR, триггерными зонами и автоматическим выбором лучшего момента для сохранения.

Каждая переменная — это конкретная проблема которую я встретил в ходе разработки. Не наугад , а именно: "вот кривое распознавание, вот так можно починить, вот ручка/переменная чтобы можно было отрегулировать".

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

Друг с 3D-принтером — это не человек, это сервис⁠⁠

Принёс вот. Без повода. Увидел модель, распечатал, подарил.

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

Открывашка для бутылок. Разборная.

Зачем это нужно? Понятия не имею. Но факт — работает, и выглядит круто

Мортира в разобранном виде

Мортира в разобранном виде

пятка из какого-то мягкого пластика, как резина. Видимо, чтобы "снаряд" не разбился

пятка из какого-то мягкого пластика, как резина. Видимо, чтобы "снаряд" не разбился

Сошки регулируются. Все продумано.

Сошки регулируются. Все продумано.

Показать полностью 3
914

Ч.3 Я снова сделал систему распознавания номеров. Или почти⁠⁠

Серия распознавание номеров

Всем привет!

Если вы читали мои статьи 2022 года — вы знаете эту историю. Если нет — краткое содержание: Я IT-шник, у меня случайно появилась ip-камера, думал что с ней сделать, прикрутил к ней распознавание номеров и установил на подоконник следить за парковкой, написал об этом статью "для себя", и неожиданно получил отклик сообщества.

Мои старые статьи:
Первая часть
Вторая часть


Это было приятно. Я не ожидал.

Потом проект тихо умер.

Нет, не из-за какой-то конкретной причины. Просто я сделал что хотел — система работала, номера читала, ворота открывались. Задача выполнена. Развивать дальше не стал. Сначала я отключил из розетки Raspberry PI, потом в дождь зависла камера, отключил и её. Raspberry PI я отформатировал спустя время уже под другой проект. Код лежал где-то на диске, покрывался пылью, и в какой-то момент просто... потерялся.

Даже скриншотов интерфейса не осталось. Нечего плохой код хранить — говорю я себе утешая, когда становится грустно от этого факта. Потому что было бы здорово запустить старую версию рядом с новой и сравнить. ДО и ПОСЛЕ. Но увы.

А люди всё равно писали. Периодически в личку прилетало что-то вроде "а проект ещё живой?". Я честно отвечал: нет, заброшен, RIP. При этом чувствовал лёгкую вину.

Так прошло почти четыре года.

Идея не отпускала


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

За четыре года я стал заметно опытнее в IT-инфраструктуре. И в какой-то момент картинка в голове наконец сложилась — я понял что хочу сделать и примерно представлял как.

Так что я сел и написал это заново. С нуля.

Зачем это нужно дома или в небольшом бизнесе
Если вы первый раз слышите о распознавании номеров — давайте разберёмся зачем это вообще нужно дома или в небольшом бизнесе. Когда мне писали с вопросом "жив ли проект" я иногда так-же спрашивал какой вариант использования их интересует. Таким образом, хоть немного появилось понимание того, что нужно сделать.

Сценарии на самом деле очень разные:

  • Въезд во двор или на парковку. Камера видит машину, читает номер, открывает шлагбаум или ворота. Никаких брелоков, никаких карточек — свои заехали, чужие нет.

  • Автосервис или автомойка. Машина въезжает — система фиксирует номер и время. Никто ничего не записывает вручную, история въездов всегда под рукой.

  • "Умное" Видеонаблюдение. Камера на воротах дачи или во дворе — хочется знать какие машины приезжали, когда и сколько раз, без просмотра часов записи.

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

Как это устроено


Логика работы моей системы простая:

упрощенная схема логики работы системы

упрощенная схема логики работы системы

Система состоит из нескольких частей.

  • Камера — обычная IP-камера с RTSP-потоком. Никакого специального железа, подойдёт любая приличная камера за 3–10 тысяч рублей. Главное — нормальный поток и видимость номерного знака. Место установки играет очень важную роль.

  • Детектор — локальный сервис, который смотрит в камеру и думает. Для каждой камеры — отдельный детектор. Внутри работает YOLOv8, нейросеть, которая находит автомобили в кадре. Когда машина найдена — в дело вступает распознавание номера. В первой версии 2022 года это делал облачный сервис, сейчас всё работает локально.

  • База данных — все события, номера и фотографии хранятся у вас. Никуда не отправляется.

  • Веб-интерфейс — открываете браузер, заходите на локальный адрес, видите ленту событий, историю, настройки. Работает с телефона и компьютера, никакой установки приложений.

Всё это поднимается через Docker Compose одной командой. Установка занимает минуты, не часы. Да, если вы только только освоили смену шрифта в Word - будет сложно.

простой запуск с использованием docker compose

простой запуск с использованием docker compose

Что умеет система


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

Главная страница с лентой событий

Главная страница с лентой событий

История событий. Полная история с фильтрами: по номеру (работает частичный поиск), по дате, по камере, по типу транспорта. Выгружается в CSV — открывается в Excel.

страница событий

страница событий

Профили детектора. Это одна из вещей, которой не было в первой версии. Разные сценарии требуют разных настроек — машина едет через шлагбаум со скоростью 5 км/ч и машина на трассе делают 90 км/ч — совсем разные истории. Когда я тестировал детектор на разных видео, то понял: универсального подхода нет. Код обрастал переменными, и я сгруппировал их в готовые профили.

  • Въезд / Ворота — медленный подъезд, одна машина в кадре.

  • Парковка — машина может долго стоять, не нужно получать сотни одинаковых событий.

  • Трасса — быстрое движение, нужна быстрая реакция а требования к распознаванию можно снизить.

  • Пробка / Перекрёсток — много машин одновременно, едут медленно.

Выбираете профиль под ваш случай — система настраивается автоматически. Хотите покрутить параметры вручную — можно.

Два режима работы


Автоматический — детектор непрерывно смотрит в камеру. Увидел машину — проанализировал — сохранил событие. Подходит для въезда, парковки, любого места где нужна непрерывная фиксация.

Ручной — детектор пассивен, держит актуальный снимок с камеры. Событие создаётся только когда оператор нажимает кнопку. Удобно там, где оператор и так видит машину — например на проходной.

Где взять машины если машин нет


Казалось бы, написал детектор — теперь нужно его проверить. Берёшь камеру, смотришь на дорогу, смотришь как система работает. Всё просто.

Только вот камеру я давно отключил. А даже если бы включил — у меня во дворе поток машин такой что за день наберётся материала на пять минут тестирования. Не густо.

Окей, думаю — найду открытые RTSP-потоки с камер наблюдения где-нибудь в интернете. Трафик, парковки, въезды. Такое же есть, правда?

Есть. Но не то.

Нашёл несколько потоков с камер на трассах по всему миру. Машины есть. Но едут где-то на горизонте, номера в кадр не попадают вообще. Нашёл камеры в США — там отдельная история: во многих штатах передний номерной знак не обязателен. Камера стоит удачно, машины едут прямо на неё, угол хороший — а номеров спереди просто нет. У половины машин. Законно.

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

Вот некоторые примеры того, как я тренировался:

Первое видео — с него начал:

Вариант с неподвижными машинами в кадре:

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

Проход по парковке:

Я показываю вам честно как оно есть, мой код не идеален. Есть ошибки. Но я еще веду разработку.

Community Edition — почему бесплатно


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

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

CE будет в открытом доступе (GitHub). Пока я дописываю документацию, провожу тесты и довожу до состояния, которое мне будет не стыдно показать.

Что дальше


Сначала я хотел полностью дописать систему и только потом рассказывать о ней. Но разработка в одиночку — тратит очень много времени и сил. Когда проект будет закончен — не очень понятно. Поэтому решил не ждать и поделиться тем что есть уже сейчас.

Может ваша поддержка пополнит мои запасы энтузиазма. А может выяснится что тема уже никому не интересна — тоже полезно знать.

В следующей части разберём детектор изнутри: как YOLOv8 находит машины в кадре, почему распознавание номера — это отдельная и нетривиальная задача, и как система справляется когда в кадре одновременно пять машин. Будет скучно и много текста)

Еще, очень хочется придумать проекту имя и это неожиданно самая сложная задача.

Если есть вопросы или сценарий который хотите обсудить — пишите в комментарии. Читаю всё.

До встречи!

Показать полностью 4 4
19

Эксперимент в стиле “сам себе дизайнер”⁠⁠

Решил собрать часы в необычном формате — вместо стрелок и цифр они показывают время словами. Получилось что-то вроде светящейся головоломки 🙂

Идею придумал не я, часы такого типа вы можете поискать под названием WordClock.

Пока покажу просто несколько фото первого прототипа.

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

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

WordClock своими руками: что это вообще за штука?⁠⁠

Привет, Пикабу!

Мой друг недавно загорелся идеей собрать себе WordClock — часы, где время отображается не цифрами, а словами. Он нашёл проект в интернете, попросил меня помочь с электрикой. Он шарит в моделировании и имеет какой-то крутой 3d-принтер, но схемотехника для него дремучий лес.

Прототип, проекта из сети. Первое включение.

Прототип, проекта из сети. Первое включение.

Я, как и положено зануде, посмотрел на схему, поковырял код... и честно сказал:

"Ну, такое. Схема мне не нравится, код... страшно открыть. Короче, давай я лучше сам спроектирую— с блэкджеком и микроконтроллером".

Так я и начал делать свой прототип WordClock'ов. Пока что всё довольно грубо, но уже работает в эмуляторе — показывает время словами с помощью адресной ленты и микроконтроллера.

Лучше свой кривой код, чем чужой кривой код )))


Проект на стадии «пишу код, рисую схему», и я думаю сделать пост (или серию) с:

  • качественным дизайном, без соплей из термоклея и пауком из проводов,

  • рассуждением по коду и логике,

  • и вообще рассказать, как сделать такую штуку самому, чтобы сборка была простой, в удовольствие.

Но перед тем как писать текст, снимать фото и рисовать схемы — хотел бы узнать, такой контент здесь интересен? Я уже публиковал здесь несколько DIY статей, реакция была разной. В этот раз решил поинтересоваться заранее)


Если здесь такое интересно, сделаю нормальный пост с фотками, пайкой, фейлами и не совсем.

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

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

Как я потерял бронь и деньги на Авито из-за хамства арендодателя и равнодушия поддержки⁠⁠

Решил поделиться своей историей, потому что она меня откровенно выбесила. И, надеюсь, кому-то поможет избежать подобных ситуаций.


Спойлер: Авито встал на сторону арендодателя, несмотря на здравый смысл и факты.

📅 Ситуация: я заранее бронирую квартиру на Авито

Я бронирую квартиру посуточно — за несколько дней до нужной даты, чтобы спокойно выехать из одного города в другой. Платёж прошёл, бронь подтверждена, всё ок.

📞 В день заезда — странный звонок

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

Он: "Чего не звоните? Квартира нужна?" — грубым тоном.
Я: "Да, конечно, всё в силе. Я выезжаю, буду вечером."
Он: "Тогда переводите полную оплату."
Я: "Нет, переводить заранее не буду. Увидим квартиру — оплачу. Бронь же уже внесена."
Он: "Бросает трубку."

⏱ Длительность разговора — ~ минута.

🚫 После этого он просто исчезает

Я несколько раз пытаюсь перезвонить — ноль реакции. Потом, наконец, он берёт трубку и говорит:

"Отменяйте бронь." — и снова бросает трубку.

⏱ Второй разговор — 17 секунд.


🏃 Я вынужден срочно искать другую квартиру

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

🤦 Поддержка Авито: "Он говорит, что всё в порядке"

Параллельно звоню в Авито — обещают разобраться. Выезжаю в другой город. Позже, когда уже на трассе межгород перезванивают с другого номера (другой сотрудник, надо всё рассказывать заново), говорят:

ТП:"Арендодатель говорит, что он готов вас заселить, проблем не было."
Я: "У меня есть скриншоты звонков. Общались ~20 секунд. Потом он просто исчез. Я бы не стал срочно искать другую квартиру, если бы всё было ок."

ТП: "Скиньте скриншоты что вы звонили и общались, мы перепроверим информацию."

вторая бронь. Первая, к сожалению исчезла у меня из ЛК словно "её и не было"

вторая бронь. Первая, к сожалению исчезла у меня из ЛК словно "её и не было"

По приезду в город, вечером скинул скриншоты в поддержку. Занимался своими делами, периодически проверяя ответы поддержки - ответа нет.

🕐 В 01:00 ночи (!) мне снова звонит поддержка

Я уже заселён в новую квартиру, лег спать — звонок от Авито.

ТП: "Мы ознакомились со скриншотами, их недостаточно. Если бы у вас была запись разговора — можно было бы что-то решить. А так — решение в пользу арендодателя."

Я в шоке. Говорю:

Я: "А как же скриншоты звонков, подтверждение другой брони, логика? Я что, просто так вторую квартиру снял и снова платил предоплату?"

ТП: "Мы вас понимаем, но ничем не можем помочь." - зачем тогда нужна техподдержка, подумал я про себя

Я: "Сейчас ситуация где мое слово против его. Но в мою пользу логика, скриншоты и факты."

🤬 Самое абсурдное: "Вы можете заселиться в ту квартиру"

Продолжение разговора:

ТП: "Так вы можете сейчас поехать и заселиться у первого арендодателя."

Я: "Это в 01:00 ночи. Когда я уже в другой квартире. Когда первый арендодатель хамил и бросал трубки."

ТП:"Вы можете написать владельцу чтобы он подтвердил слова об отмене брони и скинуть нам переписку чат"

Я:"Если он вам отвечает что все в силе, на мои звонки не отвечает. Почему он будет общаться со мной и отвечать. Тем более в час ночи."

ТП:"Ничем не можем помочь, вы можете сейчас заселиться в ту квартиру"

Я:"Ясно, спасибо"

Лег спать. Утром след. дня решил попробовать написать арендодателю, где косвенно проговорил всю ситуацию и попросил ответов. Ну, на мой взгляд раз арендодатель не отвечает из разряда " все было не так" - а просто хамит - значит с тезисом об отмене брони арендодатель согласен.

Данную переписку я скинул в поддержку. Но решение так и осталось в пользу арендодателя.

❌ В итоге: авито — не на стороне клиента

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

Если бы я хотел "отказаться" от квартиры, я бы просто не поехал. Но у меня:

  • внесена предоплата;

  • подтверждён выезд;

  • попытки дозвониться;

  • бронь новой квартиры;

  • дополнительные расходы;

  • и полное хамство со стороны арендодателя.

🔚 Мораль

Авито в этой ситуации показал себя как платформа, не защищающая добросовестного клиента. Если вы не записываете разговоры (что, кстати, не всегда законно и не все умеют), — вас просто "перебивают" фразой арендодателя "всё было нормально", и всё.
А то, что вы вносите предоплаты и теряете деньги — уже никого не волнует.

P/S

Ну, главное что зафиксируют мое недовольство )))

Агент поддержки

Здравствуйте!

Мы видим, что вы не согласны с решением, и мы обязательно зафиксируем это в качестве обратной связи. Но само решение сейчас не изменится — оно окончательное.

Если вам понадобится помощь по другому вопросу, обращайтесь, будем рады помочь.

Показать полностью 5
13

Оживляю "смартфон" из 90ых⁠⁠

Попался в руки дисковый телефон. Интересно стало изучить его конструкцию.

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

Удалось научиться общаться с ним, считывать и преобразовать полученные данные в набранный пользователем номер.

Предлагаю вам на пару секунд окунуться в прошлое.

Думаю полностью восстановить его (он рабочий, но дать ему вторую жизнь) и реализовать как "приема звонков с телеграм" или предложите свои варианты.

Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества