Господи, этот уровень был самым лёгким из всего 3 уровня. Почему это стало такой проблемой поколения?)
Как по мне таких болей которые описывают для этого уровня достойно всё что начинается именно на летающих гонках. Вот там даже с сейвами ты хрен пройдешь. Один хомяк с миной чего стоит. Вот там я поверю что это было сложно.
А тут разнылись в самом начале игры. Слабаки вы, вот вы кто. Нюни свои подберите, вам в Марио нужно играть. Сопляки.
Динозавры — это особое увлечение, которое некоторые люди проносят сквозь годы с самого детства. По неизвестной причине очень многим мальчикам лет с 3–4 начинают дико нравиться эти древние существа. Возможно, потому что детей восхищают большие размеры, грозность и сила.
Для тех, кто пронёс свою любовь к динозаврам сквозь года, есть несколько замечательных песочниц, в которых можно построить парк динозавров своей мечты и утонуть во множестве увлекательных механик на сотни часов.
Jurassic World Evolution (трилогия)
Единственная на данный момент серия ААА-игр (по крайней мере по цене!) про создание парка динозавров, хотя есть ещё один довольно масштабный проект, о котором ниже. Что касается Jurassic World Evolution, то любая часть — мастхэв для любителей динозавров.
Единственный проект в индустрии, способный создать достойную конкуренцию Jurassic World Evolution. Вышедшая в 2022 году игра до сих пор получает активную поддержку и летом получила крупное обновление, преобразившее игру и добавившее много новых механик, включая бои динозавров.
В этой игре мы создаём не просто зоопарк, а самый настоящий заповедник, в котором динозавры обитают в естественной для них среде и даже могут охотиться друг на друга.
Let's Build a Zoo
Для тех, кому не очень нравится предельный реализм, есть немного шуточная и милая казуальная игра про зоопарк с ДНК-экспериментами. Удивительно, как разработчикам удалось реализовать в чём-то мрачную тему скрещивания несовместимых видов животных в таком милом и легкомысленном формате яркой пиксельной песочницы. Короче, в этой игре, помимо динозавров, вы можете выводить новых нелепых животных вроде слоножирафа (жирафа с головой слона).
Ещё одна игра про строительство и развитие парка динозавров с несколькими интересными механиками. Основной геймплей связан с проектированием парка так, чтобы обеспечить комфорт динозаврам и в то же время сделать парк коммерчески выгодным и привлекательным для посетителей.
Чтобы выращивать динозавров, нам приходится перемещаться во времени и находить яйца динозавров в прошлом! А ещё мы можем переключаться на вид от первого лица, чтобы лечить заболевших и раненых динозавров.
Dino Park Manager
Ещё не вышедшая игра, которую я добавил в эту подборку авансом. В этой нише настолько мало игр, что разбрасываться ими просто преступление. Тем более что у этой игры заявлена весьма любопытная фича, согласно которой нам нужно обустраивать парк со строгим соблюдением уникальных потребностей разных видов динозавров, и, более того, нам нужно учитывать не просто потребности вида, но и характер конкретной особи! Свой характер в изменённом виде динозавры будут передавать потомству.
"Дима, что-то ты стал какой-то толстый" - сказал мне мой врач лет 5 назад и написал рекомендацию "снижение веса и набор мышечной массы". Это был 2021 год, тогда я весил около 90 килограмм при росте 176 см и не имел никаких мышц. Скинуть лишний вес я пытался и до этого. Ещё когда у меня родился первый ребёнок осенью 2019 года, я весил 86 кг и старался тренироваться, питаться и делать что-то, чтобы этот вес убрать. Годы шли, сидячая работа с высокими нервными нагрузками продолжалась, вес лишь набирался, тренировки и правильное питание забрасывались.
Но за последний год я смог похудеть на 20 килограмм и достичь пары небольших спортивных целей. Сейчас расскажу как!
Ку-ку.
Я Дмитрий Тимуш, Python-разработчик из Томска с почти 10-летним стажем.
А с этих фотографий на вас смотрят почти 103 килограмма того успешного разработчика только что закрывшего большой проект для госкомпании:
Июнь 2025 - Почему-то грифон, а не боров на футболке любителя вкусно покушать под Героев 3
Июль 2025 - Накопленный стресс немножко выпирает в районе талии
Лето 2025 - Человек-паук, которого уже никуда не несёт его паутина
Так выглядела моя стартовая точка. Я не мог ни подтянуться, ни отжаться от пола, пыхтел как паровоз от банальной ходьбы, а когда завязывал шнурки - дыхание спирало, а в глазах темнело.
Что не получалось до этого?
А не получалось два момента:
Соблюдать ограничения в питании;
Стабильно заниматься с отягощениями.
За эти годы я несколько раз пробовал:
Отказаться от сладкого и мучного;
Подсчитывать калории с помощью "умных" приложений, которые после настройки входных данных выставляют тебе всего лишь 1600 калорий на день;
Питаться по кетодиете;
Ходить в зал или заниматься дома по 2-3 раза в неделю.
Все эти "диеты" и подходы приводили к тому, что я целыми днями думал о пирожках (хотя казалось бы, на кетодиете съедается вкусный жареный кусок мяса с салатом - чего ещё можно хотеть?), плохо себя чувствовал от слишком большого дефицита калорий, психовал, становилось тяжело думать и работать и, в конце-концов, спустя пару недель, я срывался и прекращал эту диету. С залом тоже не заладилось - сначала COVID, ипотека (много работал и гасил вперёд), потом кризис и постоянные задержки зарплат, второй ребёнок родился, да и помимо многомесячных денежных задержек работа постоянно подливала масла в огонь, пришлось даже обращаться за психологической помощью и пару лет пить таблетки.
Что же поменялось?
Как раз летом 2025 сошлось несколько точек.
Во-первых, после сдачи проекта и окончания работы с психотерапевтом, до меня наконец дошло, что свои границы надо блюсти, и себе можно и нужно уделять время. Никто не умрёт, если 1 час в день я отключусь и позанимаюсь исключительно своими делами. Как раз это поспособствовало тому, что я перестал регулярно перерабатывать и перераспределил освободившееся время на то, чтобы тренироваться 3 раза по часу в неделю и ходить каждый день по полтора часа.
Во-вторых, где-то в этот же период я наткнулся на контент Максима "Антитренера" Донченко. И в одном из своих роликов он показывал своего ученика +- моей антропометрии, который за, кажется, 4 месяца сбросил 18 кг, поддерживая калорийность около 2000 и периодически закусывая курочкой в KFC. Я подумал - а почему все эти фитнес-приложения говорят мне соблюдать ограничение в 1600-1700 калорий? Может быть я могу есть больше, те же самые - 2000, но при этом я буду чувствовать себя нормально, просто, может быть, не так быстро сбрасывать вес? Да и в 2000 сильно проще вписать какую-нибудь привычную вкусняшку, чтобы не думать о ней 24/7.
В-третьих, через год мой старший ребёнок должен был пойти в школу, а я хотел уметь научить его подтягиваться, отжиматься, да и вообще быть примером для него, потому что у меня такого в жизни не было, и мне хотелось дать своему сыну больше, чем получил я сам. Ещё хотел научиться отжиматься от брусьев (даже, можно сказать, мечтал!) - я никогда не мог этого сделать ни разу, хотя в 18-20 я мог подтянуться раз 10 и отжаться от пола раз 20. Тут удачно подвернулась программа Дениса Борисова Full Body 90. Я её немножко подкрутил и модифицировал под свои цели (подтягиваться и отжиматься от брусьев), и вдруг впервые за все свои попытки тренировок я увидел реальный прогресс за достаточно небольшой срок.
В-четвёртых, накопилась масса оборудования - с 2012 по 2025 год были куплены и подарены - две пары разборных гантелей, скамья с регулируемым углом, напольные брусья, беговая дорожка, масса эспандеров и даже пара гирь. Не хватало только турника, но об этом позже.
Что я в итоге делал?
Какие ограничения ввёл?
Старался придерживаться двух чисел - 2000 калорий и 140 грамм белка. 2000 калорий - я уже писал - взял фактически с потолка - просто увидел такое число у другого человека, а 140 грамм белка - из рекомендации есть 2 грамма белка на килограмм массы тела. Так как в студенчестве я всегда весил примерно около 70 кг, это число я и выбрал целью, 70 умножить на 2 как раз и будет те самые 140 грамм белка. Больше никаких ограничений.
И это сработало!
Во-первых, этого количества еды оказалось достаточно - я хорошо себя чувствовал, наедался, ограничения не мешали мне качественно выполнять свои рабочие обязанности, постоянные мысли о пирожках меня не посещали.
Во-вторых, в это количество еды вполне можно вписать тот же самый пирожок или булочку, которую так хочется съесть.
В-третьих, ранее я не пробовал соблюдать повышенную норму белка, и оказалось, что это один из ключей к хорошему самочувствию и сытости - белок дольше утоляет голод.
Как считал?
Как я уже писал выше, я пользовался калькуляторами калорий, но ещё до того, когда там появились сканеры штрихкодов, нормальные базы данных продуктов и всё такое. Да и остался к ним негатив из-за того, что автоматически по моим параметрам они предлагали мне слишком уж мало еды в день. Анализаторы на основе ИИ я использовать тоже не стал, так как довелось мне работать в одном американском AI-native фудтех стартапе, и я непонаслышке знал, что эти анализаторы дают погрешность 50-60% при оценке того, что там им было прислано на фото, а такой уровень точности никуда не годится. Поэтому решение было простое - онлайн Excel-таблица, блокнот с ручкой и записи себе в ЛС в подручном мессенджере.
Табличка совершенно простая. На скриншоте ниже мой самый первый день подсчётов на весах 102.5 кг - 22 сентября 2025 года. Да, не идеально, по белку не дотянул 20 грамм, по калориям немножко выскочил за отсечку (целых 60 ккал!) - но вот так оно получается в реальных условиях и ничего страшного в этом нет.
22 сентября 2025 года - первый день ограничений
Отдельно вынес табличку с текущим весом и историей еженедельных взвешиваний. Каждый день табличку просто копировал вниз, менял дату и вбивал новые продукты. Кстати, оказалось, что в Яндекс Документах таблицы ограничены тысячей строк, поэтому по достижении этого предела, приходилось начинать новый лист и переносить туда историю взвешиваний и другие служебные ячейки.
Таблица целиком
У многих возникнет логичный вопрос - а не сильно ли это запарно собирать свою локальную базу данных продуктов со всеми БЖУ? Да в принципе, нормально. На самом деле, мы на постоянной основе едим не так много различных продуктов как может показаться, поэтому рано или поздно база устоится, и вносить новое будет требоваться только, если пробуется что-то новенькое. Остальное просто - CTRL + F по листу (если на листе нет, можно быстро проверить на соседних), CTRL + C, CTRL + V - и все дела.
Следующий логичный вопрос - а как можно автоматизировать внесение данных в таблицу? А никак. Ну может как-то и можно, но я этим не парился, всё равно к компу подходить в течение дня придётся.
Но ведь бегать каждый раз до компа неудобно! Ну да, тут-то и пригодятся другие вспомогательные средства. Утром я всегда готовлю завтрак сам - и просто записываю в блокнот ручкой всё, что я съел со всеми граммовками. Если в составе завтрака есть новый продукт - пишу его БЖУ рядышком с этим продуктом.
Блокнот с завтраками, за год его потрепало. 1, 2 - пример новых продуктов с выписанным БЖУ.
Обед обычно готовит жена - она записывает граммовки маркером на холодильнике, либо скидывает мне в ЛС. Если я что-то перекусываю, готовлю обед сам, или жена мне сказала устно - я просто пишу сам себе в ЛС сокращённую заметку со списком продуктов. Иногда нет времени выписать с этикетки себе что-то в заметки, тогда делаю так: продукты типа мяса, рыбы, консерв и других, которые могут завонять - фотографирую этикетку и выбрасываю, всякие булко-печенько-хлебо-снеки - просто складываю в специальное место на кухне.
Шкура 30 - это надо вычесть из веса манго :)
Ужин немного отличается. Перед ужином я беру все этикетки с кухни, сажусь и забиваю все данные в таблицу и смотрю, а сколько калорий и белка мне осталось. Обычно это занимает минут 10. С результатом - бывает по-разному. Если много перекусывал или что-то попробовал наобум, может остаться 200 калорий, а если ел привычные продукты и не перебирал с перекусами - может и 700. Может быть по белку сильный недобор, например. Тут приходится подстраиваться, чтобы добрать. На днях купил себе сочень с творогом (очень хотел) и съел его в перекус между завтраком и обедом. Он весил 105 грамм, а на сайте магазина я вечером выяснил, что там был один жир и целых 410 ккал на 100 грамм. Сочень - футакимбыть, больше я тебя не покупаю! В итоге ужин оказался совсем скудным - намешал стакан протеина с молоком, съел один хлебец - и всё.
А как же лазанья?
Мм, лазанья...
Дайте две! В смысле, читмилы - должны быть обязательно. Раз в 2-3 недели обязательно делаю хотя бы 1 приём пищи, в который я вообще ничего не считаю и не взвешиваю. Как правило, это происходит в выходные или приурочивается к праздникам. Опционально, если прогресс устраивает, и есть усталость, можно не считать целый день, на крайний случай - даже два дня. На Новый год я не считал неделю.
Вот примеры моих записей про читмилы:
22-23 октября: Болел, ел всё подряд
Вот тут кстати важное замечание - когда болеете, не утруждайте себя ограничениями хотя бы в острую фазу. Догоните и перегоните потом, когда встанете на ноги.
29 октября: Ел 2 куска вишнёвого пирога
1 ноября закрыл ипотеку, устроил отдых и небольшой праздник на следующий день
Обязательно празднуем свои победы и достижения!
Конец ноября: день рождения жены, не считал калории ... Начало декабря: свой день рождения, ел клубнику в шоколаде ... 9 января: Осталось 500 калорий на день - съел кусок домашнего суши-торта ... 8 марта - день отдыха. Съел фондан, 2 порции плова, 2 куска бананового кекса, 3 окошка шоколада, полкиндера, 1 конфету ... 1-2 мая пропустил, был в гостях, потом на субботнике - много работал, старался не объедаться
Ну и так далее. На самом деле, записи о читмилах достаточно частые, просто листал дневник и брал первые попавшиеся с каждого листа. Как правило, на листе (1-1.5 месяца) их 2-4 штуки. Были и срывы. Как-то работал на гик-ярмарке, сделал с собой сэндвичей, всё посчитал, ел по часам только то, что принёс с собой. Но к концу дня - целый день на ногах за прилавком - устал так, что когда вернулись с женой домой, заказали себе и детям 5-6 пицц, каких-то десертов, закусок и так далее - и цинично всё это приговорили, несмотря на то, что утром еда была заготовлена и посчитана на весь день. Усталость и желание просто наконец выдохнуть и развалиться перед телевизором меня пересилили, что я с превеликим удовольствием и сделал. И это нормально, так бывает - не корите себя за это.
Рассказываешь, как худел? Покажи результат!
Что ж, статья получилась достаточно длинной, поэтому про занятия физкультурой и еду напишу в следующий раз, а пока что подведём текущие итоги сражения с толстопузостью.
Сегодня, когда я дописываю эту статью, 7 сентября 2026 года (упс, уже 17ое), мой вес - 82.1 кг. То есть суммарная потеря составила 20.4 кг. Вот график еженедельных взвешиваний.
Средняя скорость похудения - 408 грамм в неделю
Цифры-цифры, себя тоже надо показать. Но контента в стиле NSFW не будет, извините. Постарался просто сделать фотографии в той же одежде и с +- тех же ракурсов, что и год назад.
Смотрите, колобок над поясом уже не такой объёмный! И вообще теперь эта футболка висит...
Вспоминаю как пускать паутину, может уже полечу?
Ещё пока не грифон, но уже точно не боров!
В общем, такие вот они, мои итоги почти что года похудения. Надеюсь, кому-то было полезно, кого-то, может быть, смотивировало, ведь я как минимум поделился личным опытом подсчёта калорий с помощью подручных средств, без платных программ и сложных приложений, а также показал реальный значимый результат.
Я иду худеть дальше, в следующий раз напишу про свой рацион, глядишь, кому пригодится.
Я живу один, и обычно знаю, кто может быть у меня дома. Но во время отъезда в голову иногда лезут неприятные мысли. «А вдруг кто-то всё-таки заходил, пока меня не было?». Это мог быть сосед, родственник или мастер, но без камеры остаётся только гадать.
И захотелось закрыть этот вопрос одним простеньким скриптом. Камера видит человека у двери, а в Telegram приходит сообщение и кадр. В процессе немного перестарался. Получился бот с поддержкой нескольких камер, тревогой, голосом, распознаванием лиц и возможностью вынести обработку данных на отдельный сервер.
В этой статье расскажу, зачем здесь вообще нужна YOLO и почему простого детектора движения оказалось мало. Как я проверял работоспособность проекта в реальных условиях, почему не отправляю в чат обычные фотографии людей и как организована приватность. А также как подключить телефон в качестве камеры и вынести тяжёлую обработку на удалённый сервер.
Написано специально для облачного провайдера ▶️Timeweb Cloud и читателей Pikabu.
❯ Кто такой YOLO
You Only Look Once — YOLO. Семейство моделей компьютерного зрения для поиска объектов на изображениях и видео. Первая модель появилась в 2015 году и изменила подход к детекции объектов. Вместо двух этапов «найти возможные области и классифицировать каждую» она за один запуск в сети предсказывала рамки объектов, их классы и уверенность в предсказании.
За один проход YOLO возвращает координаты объекта, класс и уверенность
Технология постоянно развивается. Самые первые версии решали только примитивные задачи в определении объектов, но за 11 лет вышло множество версий, и технология далеко ушла вперёд.
Главное преимущество YOLO — это баланс скорости, точности и удобства. Поэтому её часто используют для камер, видеоаналитики, ритейла, спорта и контроля производства. YOLO хороша не потому, что всегда лучшая, а потому, что во многих реальных задачах её проще всего довести до работающего результата.
Популярность технологии в продакшене обеспечена тем, как развивался инструментарий вокруг неё. Раньше обучение детектора требовало долгой ручной компиляции Си-библиотек под архитектуру конкретной видеокарты. Современные версии семейства превратились в готовые Python-пакеты с минимальным порогом входа, поддерживающие экспорт в открытые форматы прямо из коробки.
Эволюция экосистемы и архитектур:
YOLO на практике:
Розничная торговля и сетевой ритейл:
В розничной торговле и сетевом ритейле YOLO может работать внутри систем контроля очередей и полочного пространства. Камеры над торговым залом детектируют тележки, корзины и самих покупателей, передавая позиции в трекер. Это даёт ритейлеру точную тепловую карту посещаемости отделов и автоматически формирует уведомление администратору магазина, если у касс самообслуживания скопилось больше пяти человек. При интеграции с сегментацией система фиксирует пустоты на полках с товарами повышенного спроса.
Промышленность:
На промышленных карьерах и стройплощадках модель могут встраивать в бортовые компьютеры карьерных самосвалов и экскаваторов. Камеры кругового обзора с легковесной версией YOLO Nano в реальном времени детектируют людей в жилетах, легковой транспорт и крупные валуны на пути тяжёлой техники. Бортовой терминал подаёт громкий звуковой сигнал водителю при опасном сближении, предотвращая наезды в условиях слепых зон зеркал и густой пыли.
Общественная безопасность:
В системах общественной безопасности комплексы видеоаналитики на базе YOLO могут установить на автобусах и других городских транспортных средствах. Во время обычного рейса камеры анализируют окружающую обстановку, обнаруживают подозрительные действия, оставленные без присмотра предметы, конфликты, падения людей или проникновение в ограниченные зоны. Если система фиксирует потенциально опасное событие, она сохраняет фрагмент записи, определяет его координаты и передаёт уведомление оператору городского ситуационного центра для дальнейшей проверки.
Все предоставленные примеры лишь пример того, как можно использовать данную технологию.
Не всё так круто, как хотелось бы
Тем не менее в индустрии видеонаблюдения YOLO остаётся стандартом по умолчанию. Она даёт готовую архитектурную базу, вокруг которой разработчик может за несколько дней собрать работающий конвейер от сбора видеопотока с RTSP-камеры до отправки алертов в базу данных
❯ DotEye: Охранник в Telegram
При всех сильных сторонах у технологии есть ощутимые минусы
Проблема смещения домена (domain shift): предобученная на датасете COCO модель отлично видит людей днём при хорошей погоде, но моментально слепнет в цехе металлургического завода при свете натриевых ламп и дыме, требуя сбора сотен собственных размеченных кадров.
Сложность работы с окклюзиями: если один объект наполовину перекрыт другим (например, пешеход за столбом или коробка под другой коробкой), сеть часто теряет уверенность или путает класс предмета.
Зависимость от разрешения входного тензора: чтобы найти мелкие детали на обзорной уличной панораме, приходится увеличивать размер входного изображения с 640 до 1280 пикселей, что квадратично роняет частоту кадров.
Накопление ошибок трекинга: на сложных ракурсах временные трекеры вроде DeepSort или ByteTrack могут терять идентификатор человека при длительном перекрытии и присваивать ему новый номер после выхода из слепой зоны.
Telegram-бот, который следит за комнатой. Включаешь режим охраны, подключаешь камеру, и бот начинает «охранять вашу комнату». Если в ней появляется человек, то приходит уведомление, что кто-то вошёл или вышел из кадра.
Сначала фото отправлялось при каждом движении, но это было ошибкой. Движений было настолько много, что бот устраивал мне спам-атаку на ровном месте. Поэтому я сделал так, что движение только будит детектор, а YOLO подтверждаёт вторжение человека в комнату. После этого IoU-трекер сопоставляет рамки между кадрами и не даёт боту спамить одинаковыми сообщениями.
В панели можно включить охрану, настроить тихие часы, выбрать модель, посмотреть состояние камеры. У каждой камеры могут быть свои настройки.
Есть и голосовой режим. При входе незнакомого человека бот может включить сирену и произнести заданную фразу через динамики компьютера. По умолчанию «Внимание, посторонний человек. Покиньте помещение!». В тихие часы обычные приветствия можно выключить, но тревогу оставить. Если распознавание лиц включено и камера узнаёт меня, тревога снимается. Если нет, то её можно снять кнопкой в чате.
Пикселизация фотографий
По умолчанию бот не отправляет в Telegram исходное фото с человеком. Каждое фото автоматически пикселизуется. Чтобы понять, что кто-то вошёл, мне не нужно видеть лицо. Исходный кадр остаётся на компьютере в зашифрованном виде и никуда не отправляется.
❯ Почему одного кадра недостаточно
YOLO смотрит на отдельный кадр. Но уведомление нужно не про кадр, а про событие во времени. Человек мог стоять у двери пять секунд, мог пройти мимо камеры или выйти и вернуться через минуту. Если не связать результаты между соседними кадрами, бот будет считать каждую новую рамку новым человеком.
Здесь работает IoU-трекер. Он сравнивает, насколько текущая рамка пересекается с прошлой. Если пересечение большое, это тот же объект с прежним ID. Если появляется новая рамка, возникает вход. Если рамка пропала на заданное время, возникает выход. Это простая логика, но именно она убрала поток почти одинаковых фотографий из чата.
Трекер помнит человека между кадрами
У такого подхода есть предел. Если человек полностью закрылся дверью или вышел из кадра, а потом сразу вернулся с другого края, трекер может дать новый ID. Для моего проекта это не критично. Важнее не потерять событие, чем идеально вести статистику перемещений.
Шалость удалась
Чтобы проверить функционал на практике, я попросил друга поучаствовать в небольшом эксперименте.
Утром включил охрану и ушёл, друг должен был зайти без предупреждения. А так же он не знал, что там настроена звуковая система оповещений.
В какой-то момент пришло сообщение: «Обнаружен незнакомый человек». Сразу за ним, кадр с фотографией озадаченного друга. В комнате прозвучала заранее заданная голосовая фраза, а следом сирена. Друг явно засмущался, быстро вышел из комнаты и написал, что тревогу можно выключать.
Шалость удалась. А я убедился, что бот действительно работает.
❯ Как запустить проект
Покажу пример, как запустить проект локально и на одном устройстве. А после разберём как вынести основную нагрузку на отдельный сервер.
Локальный запуск:
Не забудьте склонировать репозиторий перед работой. Создаём виртуальное окружение и ставим зависимости:
После старта бот присылает статус в Telegram. Там же открывайте /panel, подключайте камеру, включайте охрану и проверяйте, что бот работает.
Вместо камеры можно использовать телефон:
Подключить можно встроенную веб-камеру, IP-камеру или телефон. Для Android достаточно приложения, которое отдаёт MJPEG или RTSP. Например, после запуска трансляции через приложение «IP Webcam» на экране появляется локальный адрес. Телефон и компьютер с ботом должны быть в одной сети.
Камеру можно добавить через интерфейс бота: «Панель -> Камера -> Изменить список камер». Или указать источник в настройках:
Адрес выше примерный. У телефона будет свой IP, его и нужно подставить. Allowlist обязателен, это одна из базовых систем защиты. Если его не настроить, к серверу сможет подключиться любой, кто узнаёт адрес и порт.
❯ Как вынести обработку на сервер
На домашнем компьютере DotEye работает нормально, пока камер немного и процессора хватает. Но камера, Telegram-бот и инференс решают разные задачи. Я захотел оставить камеру и управление дома, а YOLO вынести на отдельную машину.
Домашний компьютер продолжает читать поток камеры, хранить события и отправлять уведомления в Telegram. На сервер уходит зашифрованный JPEG-кадр, назад возвращаются только координаты рамок. Постоянный видеопоток на сервер не передаётся.
Создаём и настраиваем сервер
Для первого запуска я выбрал Timeweb Cloud и публичный IP-адрес. Это временный сценарий. Для постоянной работы лучше использовать домен и автоматически продлеваемый TLS-сертификат.
1. Регистрируем аккаунт в Timeweb Cloud и подтверждаю почту.
Переходим в Timeweb Cloud и создаём аккаунт. После регистрации открывается панель управления, из которой можно создавать серверы, управлять IP-адресами, SSH-ключами и правилами Cloud Firewall.
2. Пополняем баланс на нужную сумму.
3. В панели открываем «Облачные серверы» и нажимаю «Создать сервер».
4. Выбираем конфигурацию будущего сервера.
В панели открываем раздел облачных серверов и нажимаем «Создать сервер». Выбираем чистый образ Ubuntu. Для этой инструкции используем Ubuntu 26.04 и локацию «Москва».
Сервер лучше размещать ближе к дому или месту, где работает камера. Это не ускорит YOLO само по себе, но уменьшит задержку между домашним DotEye и VPS.
С конфигурацией каждый решает под свои задачи. Мне будет достаточно этой:
Во вкладке «Сеть» обязательно выбираем публичный IP, без него мы не сможем подключиться к серверу.
Во вкладке «Безопасность» можете оставить настройки по умолчанию.
Всё, теперь жмём кнопку «Заказать» и ожидаем.
5. Подключаемся к серверу.
дашборде копируем пароль от сервера, открываем консоль и подключаемся к серверу по SSH.
ssh root@<server_ip>
Если SSH-ключ был добавлен заранее, пароль не понадобится. Для постоянного сервера такой вариант предпочтительнее входа по паролю.
6. Подготавливаем сервер к remote-режиму
На этом шаге сервер уже создан, публичный IP сохранён, а SSH-сессия открыта. На этом этапе только подготовка. Устанавливаем Docker и копируем исходный код. Remote-сервер пока не запускаем, сертификат не выпускаем и настройки домашнего DotEye не меняем.
Обновляем список пакетов и устанавливаем Git с Docker:
На этом подготовка VPS закончена. На сервере есть Docker, Docker Compose и исходный код проекта.
Запускаем remote-сервер
Remote-сервер использует два маршрута:
GET /health — отвечает, что сервис работает;
POST /detect — принимает зашифрованный кадр и возвращает координаты найденных объектов.
Обычный HTTP для внешнего подключения не подходит. DotEye разрешает его только для localhost и режима разработки. Через remote передаются кадры помещения, поэтому сервер должен работать по HTTPS.
В каталоге проекта запускаем генератор конфигурации:
DOTEYE_CRYPTO_KEY: Нажимаем Enter, чтобы создать новый ключ, и сохраняем его в менеджере секретов. Тот же ключ понадобится на домашней машине.
Тип развёртывания: Выбираем 2 - IP-адрес.
IP: Вставляем публичный IPv4 VPS.
Выбираем устройство и модель: Для обычного VPS без NVIDIA GPU используем cpu и yolov8n.pt.
Скрипт создаст deploy/.env.remote и deploy/docker-compose.remote.yml. В IP-режиме Compose уже содержит TLS-пути, порт 8099 и выбранную модель. Ручное редактирование конфигурации не требуется.
Теперь выпускаем самоподписанный сертификат. В subjectAltName обязательно указываем IP сервера: иначе клиент правильно откажется подключаться к сертификату.
В Cloud Firewall добавляем входящее правило для TCP-порта 8099. Если домашнее подключение использует постоянный внешний IP, ограничиваем источником только его. При динамическом IP порт придётся открыть шире, поэтому особенно важно не отключать TLS-проверку и не передавать DOTEYE_CRYPTO_KEY третьим лицам.
Приватный server.key остаётся на VPS. На домашний компьютер копируем только публичный сертификат:
Команда предполагает, что репозиторий на сервере находится в /root/DotEye. Если он склонирован в другой каталог, меняем путь после двоеточия.
На домашнем компьютере добавляем в .env:
DOTEYE_REMOTE_PROCESSING=1 DOTEYE_REMOTE_URL=https://<IP\\_СЕРВЕРА>:8099 DOTEYE_ALLOWED_URL_HOSTS=<IP_СЕРВЕРА>,<IP_КАМЕРЫ> DOTEYE_REMOTE_CA_CERT=<абсолютный путь к скопированному server.crt> DOTEYE_REMOTE_FALLBACK=1 DOTEYE_CRYPTO_KEY=<ТОТ_ЖЕ_КЛЮЧ_ИЗ_deploy/.env.remote>
DOTEYE_ALLOWED_URL_HOSTS содержит точный список сетевых адресов, к которым DotEye может обращаться. Если камера подключена напрямую к компьютеру, оставляем только IP Сервера. Если источником служит телефон, RTSP-камера или HTTP-поток, добавляем и IP камеры.
Путь /app/certs/doteye-remote.crt используется при запуске основного DotEye через Docker Compose. Если проект запускается напрямую через Python, указываем абсолютный путь к сертификату на домашнем компьютере.
Если /health вернул {"status": "ok"}, домашний DotEye сможет отправлять кадры на сервер. При временной недоступности сервера DOTEYE_REMOTE_FALLBACK=1 переключит обработку на локальный детектор. Бот пришлёт сообщение о сбое и отдельное сообщение, когда remote снова станет доступен.
Самоподписанный сертификат действует 365 дней. Перед окончанием срока его нужно перевыпустить на сервере, перезапустить remote-контейнер, скопировать новый server.crt на домашнюю машину и перезапустить DotEye. Это главный недостаток IP-варианта. Для постоянной работы лучше использовать домен и автоматический TLS.
Если сервер станет недоступен, то обработка автоматически переключается на локальное устройство
❯ Заключение
DotEye вырос из простой задачи: хотелось понимать, кто заходил в комнату, но не получать по сотне одинаковых кадров из-за теней, света из окна или движения шторы. Решение оказалось не в том, чтобы бесконечно гонять YOLO по видеопотоку, а в нормальном разделении задач.
Сначала срабатывает детектор движения. Только после этого кадр уходит в YOLO, а IoU-трекер и задержка убирают повторы. Камера, история событий и Telegram-бот остаются на домашнем компьютере. Когда локальных ресурсов не хватает, инференс берёт на себя сервер. А если сервер перестаёт отвечать, бот автоматически переключается на локальный детектор, а после восстановления возвращается к remote-обработке.
После шутки над другом, которого система встретила голосовым оповещением и тревогой, я понял, что проект перестал быть просто экспериментом с YOLO и стал полноценным пет-проектом.