• Как найти паттерн на картинке с OpenCV?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформи код, нечитаемо. Кнопка </> в помощь.
    Во-вторых, matchTemplate(), насколько я знаю, не-инвариантна к поворотам и масштабу. Иными словами, поворот или изменение размера целевого объекта сломают сопоставление.
    В-третьих, на показанном кадре более одного экземпляра целевого объекта. Так предполагается или нет? Если предполагается, сколько экземпляров ожидается? Потому что разница очень большая с точки зрения методики.

    Варианта тут три.
    1. пытаться обучать под задачу нейронку. А лучше дообучить существующую, скажем, YOLOv5. Но тебе потребуется минимум несколько сотен размеченных изображений объекта в разных комбинациях, плюс в 2-3 раза больше похожих изображений без целевого объекта. Готовить такую базу будет утомительно, да и само обучение требует понимания что ты делаешь.
    2. попробовать зафиксировать угол поворота или масштаб (т.е. допустить, что он всегда одинаков). Тогда другой параметр можно будет подбирать. Например, мы фиксируем масштаб и делаем 16 изображений объекта в разных поворотах, а потом поочерёдно ищем каждый вариант на кадре. Потом анализируем силу откликов - сколько их, насколько они сильные и т.д. Скорее всего, будет медленно
    3. взять за основу поиск по локальным особенностям. Он справляется с масштабом и поворотом, но не справляется с несколькими экземплярами объекта. Это можно забороть, если использовать скользящее окно. Иными словами, находим на кадре узнаваемые точки - локальные особенности (желательно достаточно много и достаточно плотно), используя алгоритмы вроде ORB или SIFT. Затем выбираем те из них, которые попадают в прямоугольную рамку-окно. Затем сверяем эти особенности с особенностями объекта, используя RANSAC или подобный метод. Если получилось хороше совпадение - значит, в этой рамке есть объект или значительная его часть, и мы можем оценить его позицию в кадре в целом. Повторяем процесс, сдвигая рамку, пока оно не "обойдёт" всё изображение. Тоже может быть небыстро, так как нам требуется неоднократный поиск по картинке.
    Ответ написан
    Комментировать
  • Проблемы с ядром от ИСП РАН?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Возможно. Но будет:

    1) Высокая нагрузка в простое
    2) Характерный свист дросселей
    3) Не работать Wi-Fi
    Ответ написан
    Комментировать
  • Как откатить состояние папки в Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Отменить все незакоммиченные изменения в рабочем каталоге поможет команда
    git reset --hard

    PS. Немного подумав мне теперь нравится такой универсальный и более корректный способ.
    git restore --source=хеш_коммита --staged --worktree .

    Затем не забудьте закоммитить новые изменения.

    Указывая --source=хеш_коммита, вы говорите Git использовать содержимое файлов из этого коммита.

    Флаг --staged значит, что изменения будут сразу проиндексированы, как если бы вы их добавили с помощью git add. Этот флаг особенно полезен, если вы хотите сбросить изменения, которые уже были добавлены в индекс, но ещё не закоммичены.

    Флаг --worktree указывает Git восстановить файлы в рабочем каталоге до состояния указанного коммита. Это означает, что любые незакоммиченные изменения в рабочих файлах будут сброшены, и файлы будут восстановлены до состояния, соответствующего указанному коммиту.

    Точка в конце команды указывает, что операция восстановления должна быть применена ко всем файлам в текущем каталоге и его подкаталогах. Это значит, что все файлы в проекте будут восстановлены до состояния, соответствующего указанному коммиту.
    Ответ написан
    5 комментариев
  • В браузере brave определяется двухсторонний пинг на 2ip, а в хроме нет. Почему и как обойти?

    @agpecam
    В хроме запрещен JavaScript или какое-то расширение его режет. Проверка на двусторонний пинг осуществляется примерно так: вы заходите на 2ip с адреса vps, 1) 2ip пингует адрес vps и засекает время ответа. 2) код страницы 2ip в вашем браузере на домашнем компе дергает пустую страницу с сайта 2ip. Пишут, что с помощью XMLHttpRequest, но я бы на это не полагался. Время ответа опять засекается. Так как ваш домашний комп объективно дальше от сервера 2ip, чем vps из-за туннеля ( t(browser -> vps -> 2ip) больше, чем t(vps -> 2ip)), вы палитесь на этом тесте. Глобально можно просто дропать ICMP Echo Request на vps, чтобы 2ip не мог выполнить п. 1)
    Ответ написан
    Комментировать
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    vabka
    @vabka Куратор тега Rust
    Не скажу ничего про алгоритм и корректность замеров, но время t01 и t02 ты точно измеряешь неправильно

    subsec_nanos
    Returns the fractional part of this Duration, in nanoseconds.

    This method does not return the length of the duration when represented by nanoseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one billion).
    https://doc.rust-lang.org/std/time/struct.Duration...

    У структуры Duration есть операторы для сравнения, так что тебе не обязательно знать конкретное число, пока ты не выводишь его в консоль

    let mut t01 = Duration::MIN;
    let mut t02 = Duration::MAX;
    if duration> t01 {
          t01 = duration; // здесь
       }
       if duration< t02 {
          t02 = duration; // и здесь
       }


    UPD:


    Комп 6 ядер 12 потоков ничем не нагружен. Если не накосячил с кодом, а так
    захватывается периодически ресурс потоков компа, то как такое решить
    и получать расхождение в пределах 20%?

    1. Такой разброс, как у тебя показан - это норма. Нужно смотреть не на минимум/максимум, а на распределение (в комментах скинул график - там тоже минимум и максимум сильно различаются, но прогонов с таким временем мало)
    2. Я не увидел в вопросе описания того, как происходит запуск. Хотябы в --release компилировал?
    3. У тебя данные вполне статичные, так что компилятор при желании мог очень много наоптимизировать, что даст тебе некорректные результаты, но на распределение это влиять не должно.
    Ответ написан
    5 комментариев
  • Как сделать kill switch для докера?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Нужен не киллсвитч, а ограничение по памяти для контейнера. Делается одной директивой.
    Ответ написан
    2 комментария
  • Как быстро и легко зашифровать трафик?

    @Everything_is_bad
    http и https можно поднимать на любом порту, просто его придется явно указывать в отличие от дефолтных. Самое просто это делать через проксирование в нормальные веб-серверы, nginx и подобные.
    Ответ написан
    1 комментарий
  • Если любой из элементов массива слов имеется в строке - выдать true, как?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Проходишься по своему массиву и спрашиваешь присутствует ли твое слово в тексте который ввел пользователь.
    2. В результате получаешь массив булевых значений True False
    3. Если в массиве есть True, значит в тексте введенным пользователем есть слово из твоего массива слов.

    Детали реализации: any и list comprehension
    Ответ написан
    Комментировать
  • Почему объект копируется, а не создаётся заново?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Понять разницу между объектом класса, и объектом экземпляра класса.
    2. Понять разницу между атрибутами класса и атрибутами экземпляра класса.
    Ответ написан
    Комментировать
  • Как ввести несколько строк в стандартный ввод python?

    Vindicar
    @Vindicar
    RTFM!
    Стандартный ввод - это файл, и его технически можно "прочитать до конца". Пример:
    import sys
    for line in sys.stdin:
        print('Got', repr(line))
    print('Done')

    Запусти как обычно, введи несколько строк, а потом в терминале (если под виндой) нажми Ctrl-Z, затем Enter.
    Это пошлёт сигнал "конец файла", и дальнейшие попытки ввода через input() будут не успешными.

    Также можешь записать строки в текстовик, и запустить файл с перенаправлением ввода:
    python3 main.py < data.txt
    Тогда скрипт тоже получит сигнал о конце ввода, когда файл закончится.
    Ответ написан
    1 комментарий
  • Что делать с пайтоном на телефоне?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делать с пайтоном на телефоне?

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

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Мне необходимо создавать и записывать данные в новый файл

    Читать 1 файл (mode='r') можно неограниченному количеству скриптов единовременно.

    Чтение с возможностью записи (w, a или r+):
    - В винде файл может блокироваться первым читающим, остальные сосут чупик.
    - В линуксе возможно не блокирование файла, но могут возникнуть проблемы с записью, если не реализован механизм синхронизации.

    Самое простое - использовать контролируемую блокировку файла на уровне скрипта, который взаимодействует с файлами (fcntl==linux, msvcrt==win):
    import fcntl
    
    with open('file.txt', 'a') as f:
        fcntl.flock(f, fcntl.LOCK_EX)  # файл кем то заблокирован, ждем
        try:
            f.write("Some data\n")  # файл разблочился, блокируем его и работаем с ним
        finally:
            fcntl.flock(f, fcntl.LOCK_UN)  # что то пошло не так, снимаем блокировку с файла принудительно
    Ответ написан
    Комментировать
  • Что использовать в качестве workerА для отложенных задач?

    Vindicar
    @Vindicar
    RTFM!
    Я бы вообще изобрёл велосипед, если честно.
    У тебя есть список или база активных (неслучившихся) событий. Пусть это будет пара ID-метка времени, остальная инфа нам без надобности.
    При запуске бота выбираем из списка ближайшее событие, и вычисляем время ожидания (с небольшим запасом) и спим в корутине. В случае, если ожидание прервано раньше - повторяем то же самое, чтобы либо "доспать", либо переключиться на ожидание более близкого события.
    Если же ожидание закончилось успешно, обрабатываем событие и снова повторяем поиск ближайшего события.
    Если список событий изменился, прерываем текущее ожидание, чтобы корутина ожидания могла адаптироваться к изменениям.

    Кода - строк на пятьдесят, не больше, и выносится в отдельный класс на ура. Как мне кажется, если бот не супер-нагружен (в том смысл, что список хранимых событий изменяется не каждую минуту, и событтия тоже срабатывают не так часто), то этого будет вполне достаточно.
    А когда он будет так нагружен - проще будет раз в минуту выбирать то, что должно сработать сейчас.
    Ответ написан
  • БД и Микросервис в одном pod, но разных контейнерах - хорошо или нет?

    @d-stream
    Готовые решения - не подаю, но...
    Обычно подразумевается что микросервис/под - это одноразовая рыбка без памяти. В любой момент экземпляр микросервиса может быть убит и трафик будет передан другому экземпляру например в другом месте (нода, локация и т.п.). Грубо следует ориентироваться что сервис обслуживает один запрос и мрёт.

    А вот база данных - долговременное (постоянное, надёжное) хранение данных. Если говорить о популярных реляционных СУБД, то на сегодня это с большой вероятностью - postgress
    То что касается "изоляции" данных разных микросервисов - у него уже всё есть. К примеру в его терминах "каждому микросервису по базе данных" - это "каждому микросервису по схеме" (ибо БД растяжимое понятие и database в терминах pg - это чуть иное) притом естественно к каждой схеме отдельная УЗ (роль)
    Ответ написан
    7 комментариев
  • Как сделать чтобы дискорд бот сидел с телефона?

    Vindicar
    @Vindicar
    RTFM!
    Такой механизм не предусмотрен библиотекой. Быстрый гугл по discord.py phone status показывает, что для этого приходится патчить код класса discord.gateway.DiscordWebSoсket, чтобы при отправке пакета identify устройство/клиент идентифицировалось как 'Discord Android'.
    В связи с этим вопрос: тебе оно вот прямо нужно? Или это просто понты?
    Мненада!11

    Более-менее вменяемым (в плане риска что-то сломать при обновлении библиотеки) мне показался такой вариант со стэковерфлоу.
    from discord.gateway import DiscordWebSocket
    
    
    class MyDiscordWebSocket(DiscordWebSocket):
        async def send_as_json(self, data):
            if data.get('op') == self.IDENTIFY:
                if data.get('d', {}).get('properties', {}).get('$browser') is not None:
                    data['d']['properties']['$browser'] = 'Discord Android'
                    data['d']['properties']['$device'] = 'Discord Android'
            return await super().send_as_json(data)
    
    
    DiscordWebSocket.from_client = MyDiscordWebSocket.from_client

    Пробуй на свой страх и риск.


    И это, завязывай с упоминаниями юзеров в вопросах. Это хороший способ заставить людей тебя игнорировать.
    Ответ написан
    Комментировать
  • Как реализована анимация SVG элементов (персонажей) в web app?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Могу предположить что что-то на подобии gsap

    Если рассматривать эту задачу в целом, без привязки к конкретному сайту, то это задача по созданию мультиков, в больших количествах, на потоке, в рамках сформированной дизайнерской системы. Делать это за счет фронтендеров - такая себе идея. Сложно всех синхронизировать, очень много накладных расходов. Это будет реально дорогая разработка. И разработчики нужны очень прошаренные по части анимаций, чтобы они были со всей командой дизайнеров на одной волне. Таких днем с огнем не найдешь. Более простой и дешевый подход состоит в том, чтобы этим всем занимались моушен-дизайнеры в рамках экосистемы Lottie. А со стороны разработки мы только интегрировали готовые сценки в сайт или приложение. В последние годы обычно все так и делают. Наш стек здесь не имеет значения, равно как и умения разработчиков.
    Ответ написан
    5 комментариев
  • Как найти количество помеченных связных графов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Формула включения-исключения. Берете все графы, где хотя бы одна вершина соединена со всеми (их n*2^(n-2)*(n-1)), вычитаете все графы, где хотя бы две вершины соеденины со всеми (2 раза, ведь они 2 раза подсчитались), прибавляете графы, где хотя бы 3 вершины соеденины со всеми (3 раза)... И т.д.

    Графов, где хотя бы k вершин имеют степень n-1 - C(n, k)*2^{(n-k-1)(n-k)/2}: тут можно выбрать k вершин и для каждого ребра из оставшихся n-k вершин есть 2 варианта - оно или есть, или нет.

    Это будет за O(n log n) решение, если пердподсчитать все факториалы и обратные к им по модулю в задаче. Ну, или O(n^2), если считать сочетания через треугольник паскаля.

    Ражеванное объяснение:

    Сложно подсчитать количество графов где ровно 1 вершина такая полная. Но легко подсчитать те, где k или более таких. Мы их такие зафиксируем и нарисуем от них все ребра. А все оставшиеся ребра в графе могут быть любыми. Во-первых, можно выбрать эти k вершин - поэтому у нас есть множитель C[n,k]. Оставшиеся, незафиксированные ребра идут между любыми двумя оставшимся n-k вершин. Их (n-k)(n-k-1)/2. И каждое может быть или проведено или нет.

    Поэтому всего таких графов, с не менее k вершин: F(k)=C[n,k]*2^{(n-k)(n-k-1)/2}.

    Теперь, как подсчитать графы ровно с 1 вершиной? Можно взять F(1). Но мы насчитали много лишнего, Графы с 2мя такими вершинами мы в F(1) подсчитали 2 раза. Поэтому вычтем 2F(2). Теперь графы ровно с 3 вершинами мы подсчитали 3 раза в F(1) и 3 раза в каждом F(2). Поэтому пока мы их насчитали 3-2*3 = -3 раза. Поэтому прибавим 3F(3). И далее, получится, что графы ровно с 4-мя вершинами мы подсчитали 4 раза (4-2*6+3*4). И т.д.
    Ответ написан
    6 комментариев
  • Как использовать poetry в Dockerfile и нужно ли вообще?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    # install poetry - respects $POETRY_VERSION & $POETRY_HOME
    RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
    
    # copy project requirement files here to ensure they will be cached.
    WORKDIR $PYSETUP_PATH
    COPY poetry.lock pyproject.toml ./
    
    RUN poetry install --no-dev


    Подробнее.
    Ответ написан
    6 комментариев
  • Как проверить и заменить индексы в словаре?

    Vindicar
    @Vindicar
    RTFM!
    Делаешь словарь с набором значений по умолчанию, потом вызываешь на нём метод update(), передав туда словарь, полученный извне. Это обновит первый словарь, добавив/перезаписав ключи, пришедшие из второго словаря.
    Ответ написан
    4 комментария
  • Есть ли визуальный редактор как в telegra.ph с лицензией MIT?

    victormayorov
    @victormayorov
    Frontend разработчик
    Есть dante editor. github
    под лицензией MIT и есть возможность с (+) добавлять контент
    Ответ написан
    1 комментарий