Разработка Kirill Kazakov
27 253

Я решил проблему с парковкой у дома с помощью машинного обучения

Рассказывает Адам Гайтги, разработчик из Калифорнии.

В закладки

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

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

Можно подумать, что это сложно, но на деле всё довольно быстро и просто — надо лишь знать, где искать подходящие инструменты и как их объединить. Начнём!

Разбиваем проблему

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

Процесс обнаружения свободных парковочных мест я разбил на следующие этапы:

Вход (изображение с камеры) → Распознавание мест для парковки → Распознавание автомобилей → Распознавание свободных мест → Выход (SMS об освободившемся месте)

Входные данные для машинного обучения даёт обычная веб-камера, смотрящая на улицу:

Каждый кадр мы пропустим по цепочке выше, один за раз.

  • Первый шаг — найти в кадре все возможные места для парковки. Прежде чем определить, свободно ли место, нужно выяснить, где оно вообще.
  • Второй шаг — найти в кадре все машины. Это позволит отследить движение каждого автомобиля от кадра к кадру.
  • Третий шаг — установить, какие места заняты, а какие нет, для чего нужно объединить сведения, полученные на первом и втором шагах.
  • Наконец, когда место освобождается, нужно отправить уведомление. Это мы сможем сделать, отследив изменение положения машины между кадрами.

Теперь же погрузимся в детали!

Распознаём места для парковки

Итак, вот вид с камеры:

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

Места для парковки отмечены жёлтыми линиями

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

С одной стороны, можно ориентироваться по парковочным счётчикам, предположив, что место для парковки есть напротив каждого устройства.

Счётчики обведены жёлтым

Но тут есть ряд сложностей. Во-первых, не у каждого парковочного места есть счётчик (более того, мы зачастую ищем место, за которое не нужно платить). Во-вторых, расположение счётчика не указывает на точное расположение площадки для парковки, а только приближает к нему.

С другой стороны, можно построить модель, распознающую разметку.

Желтые отрезки показывают, где расположены метки, отделяющие одно место от другого

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

Когда перед вами сложная проблема, подумайте, можно ли подобраться к ней по другому пути, обойдя некоторые технические сложности. Что такое место для парковки? Место, где машина припаркована долго. А стоит ли вообще его распознавать? Почему бы просто не отыскать машины, которые долго не двигаются, и предположить, что они занимают парковочное место?

Иными словами, места для парковки — места, занятые стоящими автомобилями.

Нам не нужно искать собственно места для парковки, если мы можем определить, где стоят неподвижные машины

Распознаём машины

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

  • Гистограмма направленных градиентов. Это старая, не связанная с глубоким обучением техника работает довольно быстро, но не очень хорошо распознаёт машины с разных углов.

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

  • Нейросеть с архитектурой Mask R-CNN, Faster R-CNN или YOLO, которая объединяет точность свёрточной сети с хорошим исполнением и находками, в разы ускоряющими процесс распознавания. Эта система будет работать относительно быстро (на графическом процессоре) при условии, что у нас есть много данных для обучения модели.

В сущности, мы ищем самое простое решение, которое приведёт к желаемому результату, требуя при этом наименьшее количество данных для обучения; кроме того, мы не стремимся задействовать новейший алгоритм. Тем не менее в нашем случае разумный выбор — Mask R-CNN, несмотря на её очевидную помпезность и новизну.

Архитектура Mask R-CNN спроектирована так, что очень эффективно, с вычислительной точки зрения, распознаёт объекты на всём изображении. Словом, она работает быстро. На современном графическом процессоре система способна распознавать объекты на видео в высоком разрешении, обрабатывая несколько кадров в секунду. Должно хватить.

К тому же Mask R-CNN выдаёт различную информацию об обнаруженных объектах. Большинство алгоритмов распознавания на выходе дают лишь рамку, помечающую объект. А Mask R-CNN не только укажет на расположение каждого, но и сделает контур (или маску).

Для обучения Mask R-CNN нужно много изображений с предметами, которые мы собираемся распознавать. Можно выйти на улицу, поснимать машины и затем разметить фотографии, но это займёт как минимум пару дней. К счастью, немало людей связаны с распознаванием автомобилей, поэтому существует несколько открытых баз данных с нужными снимками.

Так, в базе COCO целых 12 тысяч изображений с машинами, на которые наложены маски. Вот она-то нам и подходит лучше всего.

Пример изображения из COCO c размеченными объектами

А так как многие работают с моделями для распознавания, опираясь именно на COCO, в открытом доступе есть и обученные сети. Поэтому, вместо того чтобы заниматься обучением самостоятельно, я могу пустить в ход модель, которая может распознавать машины сразу после установки. В этом проекте мы задействуем реализацию Mask R-CNN от Matterport.

Сразу после установки модель распознаёт на изображении с камеры объекты, заданные в COCO по умолчанию:

Как видно, модель обнаружила не только машины, но и светофоры и людей. Забавно, что дерево система определила как «растение в горшке».

У каждого объекта теперь есть четыре маркера:

  • Тип объекта. Модель, обученная на данных COCO, может распознавать 80 типов часто встречающихся объектов вроде машин или грузовиков. Полный список.
  • Точность распознавания. Чем выше показатель, тем увереннее модель в том, что она не ошиблась, распознавая предмет.
  • Двумерная рамка объекта.
  • Растровая маска, указывающая, какие пиксели внутри рамки принадлежат собственно объекту. Данными маски позволяют выделить и контур объекта.

Ниже — код для определения рамок машин на основе задействованной нами модели от Matterport вместе с библиотекой OpenCV.

import os import numpy as np import cv2 import mrcnn.config import mrcnn.utils from mrcnn.model import MaskRCNN from pathlib import Path # Configuration that will be used by the Mask-RCNN library class MaskRCNNConfig(mrcnn.config.Config): NAME = "coco_pretrained_model_config" IMAGES_PER_GPU = 1 GPU_COUNT = 1 NUM_CLASSES = 1 + 80 # COCO dataset has 80 classes + one background class DETECTION_MIN_CONFIDENCE = 0.6 # Filter a list of Mask R-CNN detection results to get only the detected cars / trucks def get_car_boxes(boxes, class_ids): car_boxes = [] for i, box in enumerate(boxes): # If the detected object isn't a car / truck, skip it if class_ids[i] in [3, 8, 6]: car_boxes.append(box) return np.array(car_boxes) # Root directory of the project ROOT_DIR = Path(".") # Directory to save logs and trained model MODEL_DIR = os.path.join(ROOT_DIR, "logs") # Local path to trained weights file COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5") # Download COCO trained weights from Releases if needed if not os.path.exists(COCO_MODEL_PATH): mrcnn.utils.download_trained_weights(COCO_MODEL_PATH) # Directory of images to run detection on IMAGE_DIR = os.path.join(ROOT_DIR, "images") # Video file or camera to process - set this to 0 to use your webcam instead of a video file VIDEO_SOURCE = "test_images/parking.mp4" # Create a Mask-RCNN model in inference mode model = MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=MaskRCNNConfig()) # Load pre-trained model model.load_weights(COCO_MODEL_PATH, by_name=True) # Location of parking spaces parked_car_boxes = None # Load the video file we want to run detection on video_capture = cv2.VideoCapture(VIDEO_SOURCE) # Loop over each frame of video while video_capture.isOpened(): success, frame = video_capture.read() if not success: break # Convert the image from BGR color (which OpenCV uses) to RGB color rgb_image = frame[:, :, ::-1] # Run the image through the Mask R-CNN model to get results. results = model.detect([rgb_image], verbose=0) # Mask R-CNN assumes we are running detection on multiple images. # We only passed in one image to detect, so only grab the first result. r = results[0] # The r variable will now have the results of detection: # - r['rois'] are the bounding box of each detected object # - r['class_ids'] are the class id (type) of each detected object # - r['scores'] are the confidence scores for each detection # - r['masks'] are the object masks for each detected object (which gives you the object outline) # Filter the results to only grab the car / truck bounding boxes car_boxes = get_car_boxes(r['rois'], r['class_ids']) print("Cars found in frame of video:") # Draw each box on the frame for box in car_boxes: print("Car: ", box) y1, x1, y2, x2 = box # Draw the box cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 1) # Show the frame of video on the screen cv2.imshow('Video', frame) # Hit 'q' to quit if cv2.waitKey(1) & 0xFF == ord('q'): break # Clean up everything when finished video_capture.release() cv2.destroyAllWindows()

Запустив скрипт, вы получите изображение, на котором каждая распознанная машина отмечена зелёной рамкой.

Вы также получите координаты пикселей каждой машины:

Cars found in frame of video: Car: [492 871 551 961] Car: [450 819 509 913] Car: [411 774 470 856]

Итак, мы распознали машины на изображении. Перейдём к следующему шагу.

Распознаём свободные парковочные места

Теперь мы знаем расположение пикселей каждой машины на изображении. И, глядя на несколько кадров подряд, мы с лёгкостью можем выяснить, какие машины стоят на месте, одновременно предположив, что под ними — места для парковки. Но как определить, когда машина покидает его?

Проблема в следующем: рамки машин на изображении частично пересекаются.

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

Величина, которую мы задействуем, называется пересечение над соединением (IoU); её значение равно числу пикселей в области пересечения двух объектов, поделённому на количество пикселей, занятых этими объектами.

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

А так как пересечение над соединением довольно часто используется в компьютерном зрении, оно будет реализовано в библиотеках, которые вы используйте. И действительно, библиотека Mask R-CNN содержит функцию mrcnn.utils.compute_overlaps(), поэтому можно просто положиться на неё.

Получив набор рамок, обозначающих парковочные места, очень легко узнать, есть ли внутри них машины:

# Filter the results to only grab the car / truck bounding boxes car_boxes = get_car_boxes(r['rois'], r['class_ids']) # See how much cars overlap with the known parking spaces overlaps = mrcnn.utils.compute_overlaps(car_boxes, parking_areas) print(overlaps)

Результат выглядит вот так:

[ [1. 0.07040032 0. 0.] [0.07040032 1. 0.07673165 0.] [0. 0. 0.02332112 0.] ]

В этом двумерном массиве каждый ряд обозначает одну из рамок места для стоянки, а каждая колонка — насколько сильно машины её пересекают. Если показатель равен единице, машина занимает участок полностью, если, например, 0,02 — машина только касается его.

Чтобы отделить незанятые места, нужно лишь проверить каждый ряд в массиве. Если все показатели равны нулю или очень малы, место с большой вероятностью не занято.

Помните, однако, что с потоковым видео распознавание не всегда работает хорошо. Несмотря на высокую точность Mask R-CNN, система время от времени упускает одну-две машины в кадре. Поэтому, перед тем как отмечать парковочное место пустым, нужно убедиться, что оно остаётся таким на протяжении небольшого промежутка времени. Хватит 5–10 кадров подряд.

Это не даст системе ошибиться со свободным местом после сбоя на одном кадре. Но как только становится ясным, что хотя бы одно место не занято в течение нескольких кадров, можно отправлять сообщение.

Отправляем уведомление

Последний шаг в цепочке — отправка SMS-сообщения.Тут на помощь приходит Twilio, популярный API, позволяющий отправлять SMS-сообщения едва ли не с любого языка программирования.

Разумеется, если вы предпочитаете другой сервис, можете использовать его. Просто мне Twilio первым приходит в голову.

Чтобы подключить Twilio, создайте пробную учётную запись и номер телефона, а также получите данные вашего аккаунта. Затем нужно установить клиентскую библиотеку:

pip3 install twilio

А вот весь код на Python, необходимый для отправки сообщения (просто замените значения данными своей учётной записи):

from twilio.rest import Client # Twilio account details twilio_account_sid = 'Your Twilio SID here' twilio_auth_token = 'Your Twilio Auth Token here' twilio_source_phone_number = 'Your Twilio phone number here' # Create a Twilio client object instance client = Client(twilio_account_sid, twilio_auth_token) # Send an SMS message = client.messages.create( body="This is my SMS message!", from_=twilio_source_phone_number, to="Destination phone number here" )

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

Сборка

Соберём всё в один Python-скрипт. Полный код:

import os import numpy as np import cv2 import mrcnn.config import mrcnn.utils from mrcnn.model import MaskRCNN from pathlib import Path from twilio.rest import Client # Configuration that will be used by the Mask-RCNN library class MaskRCNNConfig(mrcnn.config.Config): NAME = "coco_pretrained_model_config" IMAGES_PER_GPU = 1 GPU_COUNT = 1 NUM_CLASSES = 1 + 80 # COCO dataset has 80 classes + one background class DETECTION_MIN_CONFIDENCE = 0.6 # Filter a list of Mask R-CNN detection results to get only the detected cars / trucks def get_car_boxes(boxes, class_ids): car_boxes = [] for i, box in enumerate(boxes): # If the detected object isn't a car / truck, skip it if class_ids[i] in [3, 8, 6]: car_boxes.append(box) return np.array(car_boxes) # Twilio config twilio_account_sid = 'YOUR_TWILIO_SID' twilio_auth_token = 'YOUR_TWILIO_AUTH_TOKEN' twilio_phone_number = 'YOUR_TWILIO_SOURCE_PHONE_NUMBER' destination_phone_number = 'THE_PHONE_NUMBER_TO_TEXT' client = Client(twilio_account_sid, twilio_auth_token) # Root directory of the project ROOT_DIR = Path(".") # Directory to save logs and trained model MODEL_DIR = os.path.join(ROOT_DIR, "logs") # Local path to trained weights file COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5") # Download COCO trained weights from Releases if needed if not os.path.exists(COCO_MODEL_PATH): mrcnn.utils.download_trained_weights(COCO_MODEL_PATH) # Directory of images to run detection on IMAGE_DIR = os.path.join(ROOT_DIR, "images") # Video file or camera to process - set this to 0 to use your webcam instead of a video file VIDEO_SOURCE = "test_images/parking.mp4" # Create a Mask-RCNN model in inference mode model = MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=MaskRCNNConfig()) # Load pre-trained model model.load_weights(COCO_MODEL_PATH, by_name=True) # Location of parking spaces parked_car_boxes = None # Load the video file we want to run detection on video_capture = cv2.VideoCapture(VIDEO_SOURCE) # How many frames of video we've seen in a row with a parking space open free_space_frames = 0 # Have we sent an SMS alert yet? sms_sent = False # Loop over each frame of video while video_capture.isOpened(): success, frame = video_capture.read() if not success: break # Convert the image from BGR color (which OpenCV uses) to RGB color rgb_image = frame[:, :, ::-1] # Run the image through the Mask R-CNN model to get results. results = model.detect([rgb_image], verbose=0) # Mask R-CNN assumes we are running detection on multiple images. # We only passed in one image to detect, so only grab the first result. r = results[0] # The r variable will now have the results of detection: # - r['rois'] are the bounding box of each detected object # - r['class_ids'] are the class id (type) of each detected object # - r['scores'] are the confidence scores for each detection # - r['masks'] are the object masks for each detected object (which gives you the object outline) if parked_car_boxes is None: # This is the first frame of video - assume all the cars detected are in parking spaces. # Save the location of each car as a parking space box and go to the next frame of video. parked_car_boxes = get_car_boxes(r['rois'], r['class_ids']) else: # We already know where the parking spaces are. Check if any are currently unoccupied. # Get where cars are currently located in the frame car_boxes = get_car_boxes(r['rois'], r['class_ids']) # See how much those cars overlap with the known parking spaces overlaps = mrcnn.utils.compute_overlaps(parked_car_boxes, car_boxes) # Assume no spaces are free until we find one that is free free_space = False # Loop through each known parking space box for parking_area, overlap_areas in zip(parked_car_boxes, overlaps): # For this parking space, find the max amount it was covered by any # car that was detected in our image (doesn't really matter which car) max_IoU_overlap = np.max(overlap_areas) # Get the top-left and bottom-right coordinates of the parking area y1, x1, y2, x2 = parking_area # Check if the parking space is occupied by seeing if any car overlaps # it by more than 0.15 using IoU if max_IoU_overlap < 0.15: # Parking space not occupied! Draw a green box around it cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 3) # Flag that we have seen at least one open space free_space = True else: # Parking space is still occupied - draw a red box around it cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 1) # Write the IoU measurement inside the box font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, f"{max_IoU_overlap:0.2}", (x1 + 6, y2 - 6), font, 0.3, (255, 255, 255)) # If at least one space was free, start counting frames # This is so we don't alert based on one frame of a spot being open. # This helps prevent the script triggered on one bad detection. if free_space: free_space_frames += 1 else: # If no spots are free, reset the count free_space_frames = 0 # If a space has been free for several frames, we are pretty sure it is really free! if free_space_frames > 10: # Write SPACE AVAILABLE!! at the top of the screen font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, f"SPACE AVAILABLE!", (10, 150), font, 3.0, (0, 255, 0), 2, cv2.FILLED) # If we haven't sent an SMS yet, sent it! if not sms_sent: print("SENDING SMS!!!") message = client.messages.create( body="Parking space open - go go go!", from_=twilio_phone_number, to=destination_phone_number ) sms_sent = True # Show the frame of video on the screen cv2.imshow('Video', frame) # Hit 'q' to quit if cv2.waitKey(1) & 0xFF == ord('q'): break # Clean up everything when finished video_capture.release() cv2.destroyAllWindows()

Чтобы его запустить, нужно сначала установить Python 3.6+, Matterport Mask R-CNN и OpenCV. Отмечу: я нарочно держал код максимально «голым». Так, предполагается, что все машины в первом кадре припаркованы.

Не бойтесь подстраивать код под разные ситуации. Заменив идентификаторы объектов, вы найдёте коду совершенно иное применение.

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

#python #машинноеобучение

{ "author_name": "Kirill Kazakov", "author_type": "editor", "tags": ["\u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435","python"], "comments": 45, "likes": 88, "favorites": 84, "is_advertisement": false, "subsite_label": "dev", "id": 57372, "is_wide": true, "is_ugc": false, "date": "Sun, 03 Feb 2019 10:45:19 +0300" }
{ "id": 57372, "author_id": 127882, "diff_limit": 1000, "urls": {"diff":"\/comments\/57372\/get","add":"\/comments\/57372\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/57372"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 235819 }

45 комментариев 45 комм.

Популярные

По порядку

Написать комментарий...
26

Чо он врет? Нет у него никаких друзей!

Ответить
4

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

Ответить
0

Кто может реализовать? Готов заплатить разумную сумму).

Ответить
1

что именно реализовать ? )

Ответить
1

Мы пилим такое прямо сейчас, сейчас идет тестирование в полях.
Есть и приложение, которое показывает количество свободных парковочных мест рядом + сразу прокладывает маршрут по данным от детектора.
Правда у нас анализируется не видео, а фотография, которая делается раз в минуту и сама камера работает автономно, на солнечной батареи.
Также будет распознавание номеров.

Ответить
0

Раз в минуту - не редко?
Где базируетесь?

Ответить
0

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

Ответить
0

https://parcam.ru/
Можете в онлайне посмотреть как движется разработка. Работы осталось уже немного. Осталось к фронтэнду прикрутить вывод свободных мест. Планирую потом в опен-сорс выложить.

Видео камер беру прямо у друга. Самому жаба задушила покупать )

Ответить
0

оставьте контакт - как починю - сообщу.
все ж в динамике все....

Ответить
0

Сколько? Вот я могу, но смысла не вижу. Мест от этого больше не станет

Ответить
0

интернет-провайдер Интерсвязь, город Челябинск. С мая они реализовали "умные парковки"

Ответить
0

Работает как надо?

Ответить
2

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

Ответить
7

Ответ в самом тексте. Ручная оптимизация под текущую картинку уничтожит саму идею проекта.
В данной постановке можно включить камеру, направить ее на любой нужный участок и через день-два она начнет работать сама. А твоя система будет работать только там, где камера смотрит на бордюр. Другими словами эта система без переделок будет работать дома, в офисе, при смене работы или переезде фирмы, при пересадке внутри офиса, у друзей или на съемной квартире подружки, а твоя система потребует каждый раз полной переделки...

Ответить
2

Сомнительная история в плане выгоды, т.к. между получением СМС, реакцией на него и реальной возможностью занять парковочное место слишком большой промежуток времени. Обычно в плотной линии парковки если кто-то сваливает то не проходит и минуты чтобы не заехал другой водитель.

Ответить
1

Просто смотри, сколько там свободных мест. Если одно, глупо на это расчитывать, но если их пять - вполне.

Ответить
1

Проще было бы нормализованные сигнатуры изображений пустых мест собрать, и периодично проверять их на соответствие. А так да, интересно. :)

Ответить
0

Выглядит, как повод для стартапа, делаем много камер по городу, лепим приложение, водитель открывает приложение и видит где свободно, жмякает бронировать, оно пропадает у других, как свободное, едет, паркуется = профит. Из минусов, запарковаться может успеть совершенно неосведомленный о данной системе тип, так же могут просто бронировать и снимать с брони баловства ради, но это думаю фиксится примитивным антифродом )

Ответить
3

первый минус сразу и убивает идею с бронированием. Замкнутый круг - люди не будут активно использовать приложение так как неосведомленных будет большинство и особого смысла фича бронирования не будет иметь

Ответить
0

Бронировать можно так:
1. По тапу на бронировать списывается оплата с привязанной карты.
2. Одновременно с п.1 место блокируется любым механическим способом.
А лучше блочить место сразу после старта предыдущей машины.
Только в этом случае машинное обучение не нужно. Включен блок - место свободно.

Поэтому не ясно, как монетизировать идею с камерами.

Ответить
0

Ну да. Только затраты намкамеры приведут к тому, что проще арендовать место на паркинге. Да и вообще, каршеринг наше все. Можно в москвабаде в центре бесплатно встать

Ответить
0

Нельзя. Мест свободных нет. Замкнутый круг)

Ответить
0

Идея прекрасная, но едва ли получится в сколково то запустить. Реалии таковы, что получите протест от тех кому просто лень пользоваться приложением - они будут по сути дискриминированы.

Ответить
0

Кирилл, Хабра в соседней вкладке :)

Ответить
1

А, ясно, хаб «Разработка» ...

Ну, Ширяев, ну хитрец!
Хочет свой Хабр с блекджеком и без ебучей кармы запилить!

Ответить
–2

И что, после получения СМС надо ломиться к машине и перепарковывать её на свободное место?
Дрочево какое-то, простите.

Ответить
1

После получения смс Машиной она подключается к камере, узнает место, и перебазируется сама..
Гугл же уже реализовал всё

Ответить
1

Хорошая штука. Перспективная.
Можно, например, отслеживать появление первого круассана в пекарне напротив, или почтальона...
Я в восторге!

Ответить
1

У нас местный провайдер выпустил приложение с такой функцией в том году. Почти все значимые парковки города там есть в прямом эфире.

Ответить
0

а есть при этом возможность ткнуть "хочу припарковаться" и получить маршрут до места?

Ответить
0

Я ток хотел спросить , нельзя ли было после определения машин назначить остальное пространство местами для парковки, исключая проезжую часть итд?

Ответить
0

Интересно, как эта система работает в разную погоду - дождь, град, снег, а также, понимает ли она запаркованные мотоциклы.

Ответить
0

Запусти-ка эту сеть когда на улице нет ни одной машины, или убери первую / последнюю и стартани сеть

Ответить
0

отсутствие парковочных мест уже переросло в глобальную проблему. и решать ее надо глобально - кроме как строить паркинги в несколько этажей в голову больше ничего не приходит. а то сейчас сплошь и рядом - строят дом на 200 квартир, а парковку у дома делают на 20 машин. и ни одной автостоянки в радиусе 5 км.

Ответить
0

Паркинг у больших многоэтажек под домом. Стоит дорого - да. Но владение машиной с годами все дороже станет. Купить станет меньшей проблемой чем владеть (смотрите на Японию)

Ответить
0

Может, в Калифорнии все и встают на одни и те же места, а у нас это редкость. Так что расслабьтесь...

Ответить
0

Всё гениальное - просто.
В простонародье кто то встаёт на два места - «как бы бронирует для друга / подруга / итд.»
А тут с помощью системных данных бронировать места можно автономными «парковщиками», которые могли бы «удерживать» места до прибытия клиента (тут $ от времени удержания итд), а дальше уезжать на новый заказ или в «чистое поле».

Верный и прибыльный профит.

Ответить
0

Систему можно интегрировать в Яндекс. Карты, Google.maps, чтобы маршрут подбирался исходя их свободных парковочных мест рядом с пунктом прибытия на момент прибытия (ко времени прибытия), а еще лучше показывал вероятность свободных мест ко времени прибытия, даже не обязательно для платных мест и бронирований. Остается организовать партнерские взаимовыгодные условия сотрудничества, с одной стороны для организации отслеживаемого места и агрегатором с другой

Ответить
0

Неплохо бы совместить с навигатором.Сначала:"Маршрут построен",а в конце приятное:"Свободное место....."!

Ответить
0

Да вроде как сделали уже. Рисуются у них там парковки да отметки

Ответить
0

не работает

Ответить
0

значит сделают
они всех сжирают

Ответить
–1

Хабр торт!

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Нейронная сеть научилась читать стихи
голосом Пастернака и смотреть в окно на осень
Подписаться на push-уведомления
{ "page_type": "default" }