Я простой человек, живущий в центре Нью-Йорка. Я надеваю ботинки по очереди, извиняюсь, когда нечаянно толкаю человека на улице, и использую искусственный интеллект, чтобы сбрасывать кепки на головы людей, которые стоят под окнами моей квартиры. Короче, самый обычный парень.

Я и сам такую ношу
Я и сам такую ношу

Под моим окном ежедневно проходит огромный поток людей. Я вижу море непокрытых голов под горячим солнцем. Я считаю, что DropofaHat.zone станет первым из многих «магазинов из окна». Здесь занятой житель Нью‑Йорка может выбрать удобное время, заплатить за кепку, постоять 3 секунды под моим окном, получить кепку прямо на голову и снова окунуться в свой чрезвычайно важный, чрезвычайно напряженный день — и все это в течение одной нью‑йоркской минуты.

Как использовать ИИ для бросков из окна:

Я мечтаю, чтобы из всех городских окон нам на голову постоянно что‑то падало. Вы можете приблизить эту мечту. Для этого вам понадобится Raspberry Pi, шаговый двигатель Adafruit для механизма падения, небольшой кусок верёвки, Roboflow для искусственного интеллекта и очень лёгкий, но очень крутой продукт (например, кепки с пропеллерами).

Как открыть окно

Это был настоящий челлендж. Моё окно открывается всего на 4 дюйма. Если бы мне не удалось решить эту проблему, у всего моего бизнеса не было бы шансов. По идее там должен был быть какой‑то ключ или винт, который мне следовало снять, чтобы открывать окно шире, но я не увидел никаких признаков чего‑нибудь похожего, кроме нескольких очень маленьких щелей внизу.

Если бы я мог просто посмотреть, какого типа у меня окно, то узнал бы, какой замок к нему идёт. Но всё оказалось очень запутанно. Думаю, у меня откидное (на картинке — awning) с двойным стеклом. Может быть… Каждый тип окна может напоминать многие другие типы.

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

Я был морально готов купить дюжину других вариантов ключей, но этот подошёл!

Выбор шляпы

Далее нужно было решить, какие шляпы я собираюсь продавать из окна. Моё окно расположено довольно высоко. Это должна быть шляпа, которая никому не причинит вреда при падении и при этом не вылетит в на дорогу.

Я решил, что мне нужно что‑то, что‑то футуристичное. Что‑то, что будет выглядеть красиво, когда изящно упадёт из окна вам на голову.

Идеально!
Идеально!

Кепка с пропеллером! Помимо всего прочего у неё есть деталь, символизирующая полёт, который кепка собирается совершить.

Механизм падения

Это было самое простое из того, что мне требовалось сделать для начала работы. У меня были Raspberry Pi и шаговый двигатель, поэтому я решил пустить их в дело.

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

Я просто скопировал это из руководства Adafruit по шаговому двигателю. Это отдельный файл Python на Raspberry Pi, который компьютер запустит, когда ИИ определит, что кто‑то стоит в нужном месте и готов получить свою шляпу.

"dropHat.py" на Raspberry Pi

    import time
    import board
    import digitalio

    enable_pin = digitalio.DigitalInOut(board.D18)
    coil_A_1_pin = digitalio.DigitalInOut(board.D4)
    coil_A_2_pin = digitalio.DigitalInOut(board.D17)
    coil_B_1_pin = digitalio.DigitalInOut(board.D23)
    coil_B_2_pin = digitalio.DigitalInOut(board.D24)

    enable_pin.direction = digitalio.Direction.OUTPUT
    coil_A_1_pin.direction = digitalio.Direction.OUTPUT
    coil_A_2_pin.direction = digitalio.Direction.OUTPUT
    coil_B_1_pin.direction = digitalio.Direction.OUTPUT
    coil_B_2_pin.direction = digitalio.Direction.OUTPUT

    enable_pin.value = True

    def forward(delay, steps):
        i = 0
        while i in range(0, steps):
            setStep(1, 0, 1, 0)
            time.sleep(delay)
            setStep(0, 1, 1, 0)
            time.sleep(delay)
            setStep(0, 1, 0, 1)
            time.sleep(delay)
            setStep(1, 0, 0, 1)
            time.sleep(delay)
            i += 1

    def setStep(w1, w2, w3, w4):
        coil_A_1_pin.value = w1
        coil_A_2_pin.value = w2
        coil_B_1_pin.value = w3
        coil_B_2_pin.value = w4

    # Run a full rotation (512 steps) with a 5 millsecond delay
    forward(5, int(512))

ИИ

Я полагал, что ИИ будет самой сложной частью, но всё удалось на удивление быстро. Я установил веб-камеру над окном и хотел, чтобы вывод результата выполнялся на видео в режиме реального времени. Я хотел, чтобы ИИ показывал мне, что он видит. Это позволило бы впоследствии вести прямую трансляцию. Кроме того, на это было очень интересно смотреть. Вот как выглядит трансляция с веб-камеры.

В качестве начальной модели я выбрал обнаружение объектов, а затем пару минут записывал на камеру пешеходов без головных уборов, проходящих под моим окном. Затем пришло время разметить изображения. Я хотел, чтобы модель говорила мне, когда кто‑то стоит на тротуаре прямо под моим окном. Я задал класс и подсказку «человек», и большая часть разметок была сделана за меня автоматически. В остальных случаях я устанавливал рамку вокруг человека, если он находился на нужной части тротуара, или отмечал её как нулевую, если нет.

Просмотреть размеченные изображения можно здесь: https://universe.roboflow.com/test-y7opj/drop-of-a-a-hat/browse.

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

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

Хотя всё работало, я понял, что время от времени буду задевать веб‑камеру и изображение будет смещаться, поэтому нужна более обобщенная модель. Я убрал обрезку, и это оказалось удачным решением. ИИ «обнаруживал» изображение только тогда, когда оно оказывалось в нужном месте. Несмотря на то, что я пробовал это только с одной подсказкой «человек» в аннотации, это работало на всех, кто проходил мимо.

Наконец у меня появилась работающая модель. Вы можете просмотреть её здесь: https://universe.roboflow.com/test-y7opj/drop-of-aa-hat/model/2

Теперь нужно запустить программу Python на компьютере, где установлена веб-камера. От этого кода мне нужны всего две вещи:

  1. Подтвердить, что кто-то стоит в правильном месте в течение 3 секунд.

  2. Обратиться к Raspberry Pi по прошествии 3 секунд.

На свой компьютер с веб-камерой установите pip библиотеку вывода и библиотеки SSH, которые я использовал.

pip3 install inference-sdk
pip3 install opencv-python
pip3 install paramiko

Это весь файл Python. Вам придётся ввести свой собственный ключ API. Свой не дам.

Он работает, вызывая модель каждую секунду, и если он подтверждает, что кто-то находится в этом месте 3 секунды подряд, он подключается по SSH к моему Raspberry Pi и запускает функцию dropHat.py.

import cv2
import time
import paramiko

from inference_sdk import InferenceHTTPClient

CLIENT = InferenceHTTPClient(
    api_url="https://detect.roboflow.com",
    api_key="API_KEY"
)

def ssh_execute(host, port, username, password, command):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.WarningPolicy)

    try:
        client.connect(host, port=port, username=username, password=password)
        stdin, stdout, stderr = client.exec_command(command)
        
        # Print command output
        print(stdout.read().decode().strip())
        
        if stderr.read().decode().strip():
            print('Error:', stderr)
    finally:
        client.close()

video = cv2.VideoCapture(0)  # 0 usually refers to the webcam

consec_detections = 0
while True:
    ret, frame = video.read()

    # Directly pass the frames to the Roboflow model
    result = CLIENT.infer(frame, model_id="drop-of-a-a-hat/2")

    # Check if a prediction is made
    if 'predictions' in result and len(result['predictions'])>0:
        consec_detections += 1
    else:
        consec_detections = 0

    # If there are three consecutive detections, perform an action (like printing a message)
    if consec_detections >= 3:
        # DROP THE HAT
        ssh_execute('raspberry.local', 22, 'pi', 'raspberry', 'python3 dropHat.py')
        # Reset counter
        consec_detections = 0

    # Delay before the next frame for 1 second
    time.sleep(1)

Великий замысел

А вот и моя большая мечта. Представьте себе мир, в котором вы можете гулять по Нью-Йорку, и всё, что вам нужно (за исключением кирпичей), падает на вас из окон. В любой момент, абсолютно в любой момент. Я хочу жить в этом мире. Вот почему я выложил это руководство, чтобы каждый мог сделать свой магазин из окна. Разве это не прекрасная идея?

Комментарии (5)


  1. de-Bill
    25.06.2024 09:25

    Качественное обслуживание подразумевает определение размера головы и выдача шапки нужного размера.


    1. killyself
      25.06.2024 09:25

      Такие кепки часто делятся только на 2 размера - детский и нет, так что задачу можно сильно упростить


  1. nikolz
    25.06.2024 09:25

    А у нас из окон домов на головы прохожих летят пустые бутылки и окурки.


  1. fedorro
    25.06.2024 09:25
    +2

    Сколько пафоса для скрипта, который используя готовую сеть, включает моторчик ...


  1. exTvr
    25.06.2024 09:25
    +1

    Как ИИ помогает бросать шапки из окна прямо на головы прохожих

    Круговорот воды на хабре.

    Прошло целых полтора суток с.

    Инженер с помощью ИИ автоматически сбрасывает панамы из окна на головы жителям Нью-Йорка

    Это уже даже не смишно становится.