Изменения

Перейти к: навигация, поиск

Оценка положения

10 096 байт добавлено, 11:02, 24 апреля 2020
Нет описания правки
====Сбор и маркировка изображений====
У нас есть 6 типов объектов, а именно: красный свет, зеленый свет, знак остановки, ограничение скорости 40 миль в час, ограничение скорости 25 миль в час и несколько фигурок Lego в качестве пешеходов.[[Файл:Obj.jpg |400px|thumb| right| Рис. 4 obj5 Установленные объекты]] Таким образом, у нас будет около 50 подобных фотографий, с объектами размещенными случайным образом на каждом изображении. Затем пометим каждое изображение с помощью ограничительной рамки для каждого объекта на изображении. С помощью бесплатного инструмента, называемый [https://tzutalin.github.io/labelImg/ labelImg] ''(для Windows / Mac / Linux)'' это можно сделать довольно быстро и просто.
Этот шаг занимает 3-4 часа, в зависимости от количества шагов, которые вы тренируете ''(они же эпохи или num_steps)''. После того, как тренировка будет завершена, вы увидите кучу файлов в <tt>model_dir</tt>. Мы ищем самое последнее <tt>model.ckpt-xxxx.meta</tt> файл.Во время обучения мы можем отслеживать прогрессирование потерь и точности с помощью '''TensorBoard'''.
Тестируем обученную модель: [[Файл:Newobj.jpg |400px|thumb| right| Рис. 4 obj6 Опознанные объекты]]
После тренировки прогоняем несколько изображений из тестового набора данных через нашу новую модель. Как и ожидалось, практически все объекты на изображении были идентифицированы с относительно высокой достоверностью. Более отдаленные объекты становились больше и легче обнаружить, когда наша машина приближалась к ним.
====Планирование и управление движением====
Теперь, когда DeepPiCar может обнаружить и определить, какие объекты находятся перед ним, нам все еще нужно сказать ему, что с ними делать, т. е. управление движением. Существует два подхода к управлению движением, т. е. основанный на правилах и сквозной.<br/>#'''Подход, основанный на правилах''' значит, нам нужно точно сказать машине, что делать, когда она сталкивается с каждым объектом. Например, скажите автомобилю остановиться, если он видит красный свет или пешехода, или ехать медленнее, если он видит более низкий знак ограничения скорости и т. д. Это сродни тому, что мы сделали в части 4, где мы рассказали автомобилю, как перемещаться по полосе движения с помощью набора кодов/правил.#'''Сквозной подход''' просто кормит автомобиль большим количеством видеоматериалов хороших водителей, и автомобиль, через глубокое обучение, выясняет сам по себе, что он должен остановиться перед красными огнями и пешеходами или замедлиться, когда ограничение скорости падает.В статье рассматривается первый подход.
'''ПодходПравила довольно просты: если ни один объект не обнаружен, основанный то привод на правилах''' значит, нам нужно точно сказать машине, что делать, когда она сталкивается с каждым объектомпоследнем известном ограничении скорости. Например, скажите автомобилю остановиться, если он видит красный свет или пешеходаЕсли какой-то объект обнаружен, этот объект изменит скорость автомобиля или ехать медленнее, если он видит более низкий знак ограничения ограничение скорости и т. д. Это сродни тому, что мы сделали в части 4, где мы рассказали автомобилю, как перемещаться по полосе движения с помощью набора кодов/правил.
Во-первых, определяем базовый класс, <tt>TrafficObject</tt>, который представляет собой любые дорожные знаки или пешеходов, которые могут быть обнаружены на дороге. Он содержит метод, <tt>set_car_state(car_state)</tt>. <tt>car_stateСловарь</tt> содержит две переменные, а именно: <tt>speed, и speed_limit</tt>, который будет изменен этим методом. Он также имеет вспомогательный метод, <tt>is_close_by()</tt>, который проверяет, находится ли обнаруженный объект достаточно близко. (Ну, поскольку наша единственная камера не может определить расстояние, приближаем расстояние с высотой объекта. Чтобы точно определить расстояние, нам понадобится лидар или его маленький кузен, ультразвуковой датчик или система камер стереовидения, как в Тесле.)  class TrafficObject(object): def set_car_state( self, car_state): pass @staticmethod def is_close_by( obj, frame_height, min_height_pct= 0,05): # default: if a sign is 10% of the height of frame obj_height = obj.bounding_box[ 1] [1] - obj.bounding_box[0][1] return obj_height / frame_height >> min_height_pct Реализация для красного света и пешехода тривиальны, просто устанавливают скорость автомобиля 0.  class RedTrafficLight(TrafficObject): def set_car_state( self, car_state): logging.debug('red light: stopping car') car_state['speed'] = 0 class Pedestrian(TrafficObject): def set_car_state( self, car_state): logging.debug('Сквозной подходpedestrian: stopping car') car_state['speed' ] = 0 Как 25 миль в час, так и 40 миль в час ограничения скорости могут использовать только один класс SpeedLimit, который принимает <tt>speed_limit</tt> в качестве параметра инициализации. Когда знак обнаружен, просто кормит автомобиль большим количеством видеоматериалов хороших водителейустановливаем ограничение скорости автомобиля до соответствующего предела.   class SpeedLimit( TrafficObject): def __init__(self, speed_limit): self.speed_limit = speed_limit def set_car_state( self, car_state): logging.debug('speed limit: set limit to %d' % self.speed_limit) car_state['speed_limit'] = self.speed_limitРеализация зеленого света еще проще, так как он ничего не делает, но печать зеленого света обнаруживается (код не показан). После того, как мы определили поведение для каждого дорожного знака, нам нужен класс, чтобы связать их вместе, который является <tt>ObjectsOnRoadProcessor</tt> класс. Этот класс сначала загружает обученную модель для Edge TPU, затем обнаруживает объекты в живом видео с моделью и, наконец, вызывает каждый объект трафика для изменения скорости и автомобильограничения скорости автомобиля.  class ObjectsOnRoadProcessor(object): """ This class 1) detects what objects (namely traffic signs and people) are on the road and 2) controls the car navigation (speed/steering) accordingly """ def __init__(self, car= None, speed_limit=40, model= '/home/pi/DeepPiCar/models/object_detection/data/model_result/road_signs_quantized_edgetpu.tflite', label= '/home/pi/DeepPiCar/models/object_detection/data/model_result/road_sign_labels.txt', через глубокое обучение width= 640, height= 480): # model: This MUST be a tflite model that was specifically compiled for Edge TPU. # https://coral.withgoogle.com/web-compiler/ logging.info('Creating a ObjectsOnRoadProcessor...') self.width = width self.height = height # initialize car self.car = car self.speed_limit = speed_limit self.speed = speed_limit # initialize TensorFlow models with open(label, 'r') as f: pairs = (l.strip().split(maxsplit= 1) for l in f.readlines()) self.labels = dict((int(k), v) for k, v in ) # initial edge TPU engine logging.info('Initialize Edge TPU with model %s...' % model) self.engine = edgetpu.detection.engine.DetectionEngine(model) self.min_confidence = 0.30 self.num_of_objects = 3 logging.info('Initialize Edge TPU with model done.') self.traffic_objects = {0: GreenTrafficLight(), 1: Person(), 2: RedTrafficLight(), 3: SpeedLimit(25), 4: SpeedLimit(40), 5: StopSign()} def process_objects_on_road(self, frame): # Main entry point of the Road Object Handler objects, final_frame = self.detect_objects(frame) self.control_car(objects) return final_frame def control_car(self, objects): logging.debug('Control car...') car_state = {"speed": self.speed_limit, "speed_limit": self.speed_limit} if len(objects) == 0: logging.debug('No objects detected, drive at speed limit of %s.' % self.speed_limit) contain_stop_sign = False for obj in objects: obj_label = self.labels[obj.label_id] processor = self.traffic_objects[obj.label_id] if processor.is_close_by(obj, self.height): processor.set_car_state(car_state) else: logging.debug("[%s] object detected, but it is too far, ignoring. " % obj_label) if obj_label == 'Stop': contain_stop_sign = True if not contain_stop_sign: self.traffic_objects[5].clear() self.resume_driving(car_state) def resume_driving(self, car_state): old_speed = self.speed self.speed_limit = car_state['speed_limit'] self.speed = car_state['speed'] if self.speed == 0: self.set_speed(0) else: self.set_speed(self.speed_limit) logging.debug('Current Speed = %d, New Speed = %d' % (old_speed, self.speed)) if self.speed == 0: logging.debug('full stop for 1 seconds') time.sleep(1) def set_speed(self, speed): # Use this setter, выясняет сам по себеso we can test this class without a car attached self.speed = speed if self.car is not None: logging.debug("Actually setting car speed to %d" % speed) self.car.back_wheels.speed = speed Обратите внимание, что он должен остановиться перед красными огнями каждый объект <tt>TrafficObject</tt> просто изменяет <tt>speed и speed_limit</tt> в <tt>car_state</tt> объекте, но на самом деле не меняет скорость автомобиля. Это <tt>ObjectsOnRoadProcessor</tt> изменяет фактическую скорость автомобиля, после обнаружения и обработки всех дорожных знаков и пешеходов. Полный исходный код интереса находится на [https://github.com/dctian/DeepPiCar/blob/master/models/object_detection/code/tensorflow_traffic_sign_detection.ipynb Github DeepPiCar].==== Итоги =====В этой статье мы научили наш DeepPiCar распознавать дорожные знаки и пешеходов, а также реагировать на них соответствующим образом. Это не маленький подвиг, так как большинство автомобилей на дороге еще не могут этого сделать. Мы выбрали кратчайший путь и использовали предварительно обученную модель обнаружения объекта и пешеходами или замедлитьсяприменили обучение передачи на нем. Действительно, трансфертное обучение широко распространено в индустрии ИИ, когда ограничение скорости падаетне удается собрать достаточное количество обучающих данных для создания модели глубокого обучения с нуля или не хватает мощности GPU для обучения моделей в течение нескольких недель или месяцев.
=== Отслеживание направления взгляда пользователя в браузере ===
Решить подобную задачу не так уж и трудно благодаря JavaScript-библиотеке [https://www.tensorflow.org/js/ TensorFlow]. В браузере очень легко получить доступ к веб-камере. Если предположить, что в качестве входных данных для нейронной сети будет использоваться всё изображение с камеры, то можно сказать, что оно для этих целей слишком велико. Системе придётся проделать большую работу только для того, чтобы определить то место на изображении, где находятся глаза. Такой подход может хорошо показать себя в том случае, если речь идёт о модели, которую разработчик обучает самостоятельно и развёртывает на сервере, однако если мы говорим об обучении и использовании модели в браузере — это уже чересчур.
Для того чтобы облегчить задачу сети, мы можем предоставить ей лишь часть изображения — ту, которая содержит глаза пользователя [[Файл:Eyes.png |400px|thumb| right| Рис. 4 7 Процесс выделения глаз.]] и небольшую область вокруг них. Эту область, представляющую собой прямоугольник, окружающий глаза, можно выявить с помощью сторонней библиотеки.
Для обнаружения лица на изображении воспользуемся библиотекой, которая называется [https://github.com/auduno/clmtrackr clmtrackr].
</tt>
4. '''Выявление области изображения, содержащей глаза'''.
[[Файл:Face.png |250px|thumb|right| Рис. 5 8 Контрольные точки.]]Решим, что глаза — это прямоугольная часть изображения, границы которой касаются точек 23, 28, 24 и 26, расширенная на 5 пикселей в каждом направлении. Этот прямоугольник должен включать в себя всё, что для нас важно, если только пользователь не слишком сильно наклоняет голову.
Следующая функция вернёт координаты x и y, а также ширину и высоту прямоугольника, окружающего глаза. Она, в качестве входных данных, принимает массив positions, полученный от clmtrackr. Обратите внимание на то, что каждая координата, полученная от clmtrackr, имеет компоненты x и y.
* [https://github.com/cpury/lookie-lookie/tree/master/blogcode Проект по трекингу взгляда]
* [https://habr.com/ru/company/ruvds/blog/426055/ TensorFlow.js и clmtrackr.js: отслеживание направления взгляда]
* [https://towardsdatascience.com/deeppicar-part-6-963334b2abe0 DeepPiCar — Part 6: Traffic Sign and Pedestrian Detection and Handling]
{{В разработке}}
32
правки

Навигация