Инженер из Нью-Йорка презентовал необычный проект DropofaHat.zone. Он применил ИИ, чтобы сбрасывать из окна своей квартиры панамы прямо на головы проходящих внизу пешеходов.
По словам автора проекта, любой желающий может выбрать удобное ему время, оплатить панаму и задержаться на 3 секунды под его окном, чтобы получить товар. Головные уборы вылетают из окна с 5-минутным интервалом.
Энтузиаст использовал Raspberry Pi, двигатель Adafruit, а также онлайн-инструмент для маркировки изображений Roboflow. Он остановился на лёгких панамках с пропеллерами.
Чтобы механизм спуска панам через окно работал, пришлось использовать немного пряжи. Она обёрнута вокруг шагового двигателя.
Когда ИИ определяет, что кто-то стоит под окном, запускается отдельный файл Python «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))
Отдельной задачей стало обучение ИИ. Энтузиаст записал на камеру несколько минут видео со своего окна, чтобы научить инструмент выявлять пешеходов без головных уборов. Он опубликовал обучающий датасет из 133 аннотированных изображений и уже работающую модель.
Программа Python на компьютере распознаёт, когда кто-то стоит в обозначенном месте под окном 3 секунды подряд. Спустя этот период на 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)