Инженер из Нью-Йорка презентовал необычный проект 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)
Источник: habr.com