Распознавание дорожных знаков / Хабр
Компьютерное зрение — это область компьютерных наук, которая фокусируется на воспроизведении частей сложной системы зрения человека и позволяет компьютерам идентифицировать и обрабатывать объекты на изображениях и видео, а также людей. Ранние эксперименты в области компьютерного зрения начались в 1950-х годах и впервые были коммерчески использованы для различения печатного и рукописного текста в 1970-х годах. Сегодня приложения компьютерного зрения выросли в геометрической прогрессии. В этой статье показан пример как можно распознавать дорожные знаки с помощью компьютерного зрения.
Набор данных дорожных знаков
В рамках этой статьи используется общедоступный набор данных, доступный в Kaggle: GTSRB — это мультиклассовая задача классификации одного изображения, которая проводилась на Международной совместной конференции по нейронным сетям (IJCNN) 2011. Набор данных содержит более 50 000 изображений различных дорожных знаков и классифицируется на 43 различных класса. Он весьма разнообразен: некоторые классы содержат много изображений, а некоторые классы — несколько изображений.
Изучение набора данных
В начале импортируем все необходимые библиотеки.
import os import matplotlib import numpy as np from PIL import Image from tensorflow.keras.preprocessing.image import img_to_array from sklearn.model_selection import train_test_split from keras.utils import to_categorical from keras.models import Sequential, load_model from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout from tensorflow.keras import backend as K import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score
Для тренировки нейронной сети будем использовать изображения из папки «train», которая содержит 43 папки отдельных классов. Инициализируем два списка: data и labels. Эти списки будут нести ответственность за хранение наших изображений, которые мы загружаем, вместе с соответствующими метками классов.
data = [] labels = []
Далее, с помощью модуля os мы перебираем все классы и добавляем изображения и их соответствующие метки в список
for num in range(0, classes): path = os.path.join('train',str(num)) imagePaths = os.listdir(path) for img in imagePaths: image = Image.open(path + '/'+ img) image = image.resize((30,30)) image = img_to_array(image) data.append(image) labels.append(num)
Этот цикл просто загружает и изменяет размер каждого изображения до фиксированных 30×30 пикселей и сохраняет все изображения и их метки в списках data и labels.
Затем нужно преобразовать список в массивы numpy для подачи в модель.
data = np.array(data) labels = np.array(labels)
Форма данных — (39209, 30, 30, 3), означает, что имеется 39 209 изображений размером 30×30 пикселей, а последние 3 означают, что данные содержат цветные изображения (значение RGB).
print(data.shape, labels.shape) (39209, 30, 30, 3) (39209,)
Из пакета sklearn
мы используем метод train_test_split()
для разделения данных обучения и тестирования, используя 80% изображений для обучения и 20% для тестирования. Это типичное разделение для такого объема данных.
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) (31367, 30, 30, 3) (7842, 30, 30, 3) (31367,) (7842,)
Давайте проверим, сколько классов у нас есть и сколько изображений в обучающем наборе для каждого класса и построим диаграмму распределения классов.
def cnt_img_in_classes(labels): count = {} for i in labels: if i in count: count[i] += 1 else: count[i] = 1 return count samples_distribution = cnt_img_in_classes (y_train) def diagram(count_classes): plt.bar(range(len(dct)), sorted(list(count_classes.values())), align='center') plt.xticks(range(len(dct)), sorted(list(count_classes.keys())), rotation=90, fontsize=7) plt.show() diagram(samples_distribution)
Из графика видно, что обучающий набор данных не сбалансирован, но мы можем справиться с этим фактом, используя метод увеличения данных.
def aug_images(images, p): from imgaug import augmenters as iaa augs = iaa.SomeOf((2, 4), [ iaa.Crop(px=(0, 4)), iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}), iaa.Affine(translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}), iaa.Affine(rotate=(-45, 45)) iaa.Affine(shear=(-10, 10)) ]) seq = iaa.Sequential([iaa.Sometimes(p, augs)]) res = seq.augment_images(images) return res def augmentation(images, labels): min_imgs = 500 classes = cnt_img_in_classes(labels) for i in range(len(classes)): if (classes[i] < min_imgs): add_num = min_imgs - classes[i] imgs_for_augm = [] lbls_for_augm = [] for j in range(add_num): im_index = random.choice(np.where(labels == i)[0]) imgs_for_augm.append(images[im_index]) lbls_for_augm.append(labels[im_index]) augmented_class = augment_imgs(imgs_for_augm, 1) augmented_class_np = np. array(augmented_class) augmented_lbls_np = np.array(lbls_for_augm) imgs = np.concatenate((images, augmented_class_np), axis=0) lbls = np.concatenate((labels, augmented_lbls_np), axis=0) return (images, labels) X_train, y_train = augmentation(X_train, y_train)
После увеличения наш обучающий набор данных имеет следующую форму.
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) (36256, 30, 30, 3) (7842, 30, 30, 3) (36256,) (7842,)
Давайте еще раз проверим распределение данных.
augmented_samples_distribution = cnt_img_in_classes(y_train) diagram(augmented_samples_distribution)Диаграмма распределения после аугментации
На графика видно, что наш набор стал более сбалансирован. Далее из пакета keras.utils
мы используем метод to_categorical
для преобразования меток, присутствующих вy_train
иt_test
, в one-hot encoding.
y_train = to_categorical(y_train, 43) y_test = to_categorical(y_test, 43)
Построение нейронной сети
Для создания нейронной сети будет использоваться библиотека Keras].
Чтобы классифицировать изображения по соответствующим категориям, мы построим модель CNN (сверточная нейронная сеть). CNN лучше всего подходит для целей классификации изображений.Архитектура нашей модели:
2 Conv2D слоя (filter=32, kernel_size=(5,5), activation=”relu”)
MaxPool2D слой ( pool_size=(2,2))
Dropout слой (rate=0.25)
2 Conv2D слоя (filter=64, kernel_size=(3,3), activation=”relu”)
MaxPool2D слой ( pool_size=(2,2))
Dropout слой (rate=0.25)
Flatten слой, чтобы сжать слои в 1 измерение
Dense слой (500, activation=”relu”)
Dropout слой (rate=0.5)
Dense слой (43, activation=”softmax”)
class Net: @staticmethod def build(width, height, depth, classes): model = Sequential() inputShape = (height, width, depth) if K.image_data_format() == 'channels_first': inputShape = (depth, heigth, width) model = Sequential() model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=inputShape)) model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(rate=0.25)) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(rate=0.25)) model.add(Flatten()) model.add(Dense(500, activation='relu')) model.add(Dropout(rate=0.5)) model.add(Dense(classes, activation='softmax')) return model
Обучение и проверка модели
Мы строим нашу модель вместе с оптимизатором Adam
, а функция потерь — это categorical_crossentropy
, потому что у нас есть несколько классов для категоризации. Затем обучаем модель с помощью функции model.fit()
.
epochs = 25 model = Net.build(width=30, height=30, depth=3, classes=43) model. compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) history = model.fit(X_train, y_train, batch_size=64, validation_data=(X_test, y_test), epochs=epochs)
Как вы можете видеть, наша модель обучалась в течении 25 эпох и достигла 93% точности на тренировочном наборе данных. С помощью matplotlib
мы строим график для точности и потерь.
plt.style.use("plot") plt.figure() N = epochs plt.plot(np.arange(0, N), history.history["loss"], label="train_loss") plt.plot(np.arange(0, N), history.history["val_loss"], label="val_loss") plt.plot(np.arange(0, N), history.history["accuracy"], label="train_acc") plt.plot(np.arange(0, N), history.history["val_accuracy"], label="val_acc") plt.title("Training Loss and Accuracy") plt.xlabel("Epoch") plt.ylabel("Loss/Accuracy") plt.legend(loc="lower left") plt.show()
Тестирование модели на тестовом наборе
Набор данных содержит папку «Test», а в файле Test.csv
есть сведения, связанные с путем к изображению и метками классов. Мы извлекаем путь к изображению и метки из файла Test.csv
с помощью фреймворка Pandas
. Затем, мы изменяем размер изображения до 30×30 пикселей и делаем массив numpy
, содержащий все данные изображения. С помощью accuracy_score
из sklearn metrics
проверяем точность предсказаний нашей модели. Мы достигли 96% точности на этой модели.
y_test = pd.read_csv('Test.csv') labels = y_test["ClassId"].values imgs = y_test["Path"].values images=[] for img in imgs: image = Image.open(img) image = image.resize((30,30)) images.append(img_to_array(image)) X_test=np.array(images) pred = model.predict_classes(X_test) print(accuracy_score(labels, pred)) 0.958590657165479
Система распознавания дорожных знаков | Lexus Россия
LEXUS SAFETY SYSTEM +
Система распознавания и информирования о дорожных знаках (RSA) помогает водителям не пропустить важные знаки, передавая их прямо на дисплей в вашем автомобиле.
RSA использует переднюю камеру для получения информации о дорожных знаках и ее передачи на приборную панель автомобиля. Система совместима со всеми европейскими дорожными знаками и обеспечивает уверенность, где бы вы ни находились.
В условиях обилия информации или в тяжелых дорожных условиях некоторые дорожные знаки могут остаться незамеченными, что может привести к существенным задержкам в пути. RSA реагирует на каждый дорожный знак, поэтому вы всегда будете в курсе информации, которая может повлиять на вашу поездку.
Внимание: Ни при каких обстоятельствах не используйте систему безопасности Lexus в качестве замены обычному управлению автомобилем и, пожалуйста, ознакомьтесь с руководством перед началом эксплуатации системы. Водитель всегда несет ответственность за безопасное управление автомобилем.
МОДЕЛИ С ЭТОЙ ТЕХНОЛОГИЕЙ
ВСТРЕЧАЙ РАССВЕТ В ДВИЖЕНИИ
САМОВЫРАЖЕНИЕ КАК ИСКУССТВО
УЙДИТЕ С МАРШРУТА.
НАЧНИТЕ ПРИКЛЮЧЕНИЕ
УЙДИТЕ С МАРШРУТА. НАЧНИТЕ ПРИКЛЮЧЕНИЕ
ВАШЕ ПОЛОЖЕНИЕ ГОВОРИТ ОБ УСПЕХЕ
СОЗДАН НЕПОКОРНЫМ. ГОТОВ ПОКОРЯТЬ
УПРАВЛЯТЬ, А НЕ СЛЕДОВАТЬ
СМЕЛОСТЬ БЫТЬ ДРУГИМ
ПРОЯВЛЯЕТ СЕБЯ.
ЗАЯВЛЯЕТ О ВАС
Общие сведения о системе распознавания дорожных знаков
Общие сведения о системе распознавания дорожных знаковСледите за нашими обновлениями на @Ask_ICAR.
Ключевой частью диагностики проблемы с расширенными системами помощи водителю (ADAS) является понимание того, как работает система. Знание того, что происходит внутри системы, поможет вам правильно диагностировать, почему система может дать сбой. Это предотвратит замену деталей, которые не вызывают системную проблему. Давайте посмотрим на внутреннюю работу системы распознавания дорожных знаков.
Система распознавания дорожных знаков «видит» дорожные знаки и отображает их водителю транспортного средства. Обычно они отображаются на экране, расположенном в комбинации приборов. В этой системе обычно используется обращенная вперед камера, расположенная за лобовым стеклом, которая «ищет» дорожные знаки. Некоторые автомобили используют для этой системы специальную камеру, обращенную вперед, в то время как другие используют ту же камеру ADAS, которая используется для предупреждения о выходе из полосы движения и других систем.
Некоторые автомобили оснащены тактильным (вибрационным) или звуковым предупреждением, которое активируется, например, когда водитель не соблюдает установленное ограничение скорости или въезжает на проезжую часть с запретом. Система может сохранять распознанные знаки в «памяти» после их отображения, чтобы этот же знак было легче идентифицировать в следующий раз. Важно просмотреть информацию об обслуживании OEM для конкретного автомобиля, чтобы убедиться, что вы знаете, какие компоненты являются частью этой системы и что необходимо для правильного ремонта системы.
Понимание того, как работает система, может сократить время диагностики. Знание того, какую часть системы нужно тестировать, поможет предотвратить установку частей, которые на самом деле не решают проблему.
Дополнительные новости об устранении столкновений I-CAR, которые могут оказаться полезными:
Горячая точка статей ADAS, калибровки и сканирования
Понимание передовых систем помощи водителю
Связанные курсы I-CAR
- Самый популярный
- Самые последние
- Архив
Десять наиболее частых вопросов по транспортным средствам
Hyundai | Есть ли у Hyundai процедура разделения? |
Kia | Есть ли в Kia процедура разделения на секции? |
Chevrolet | Есть ли у Chevrolet предупреждение против разделения на секции, когда нет процедуры? |
BMW | Может ли I-CAR выслать мне процедуры ремонта BMW? |
Honda | Что Honda говорит о ремонте поврежденных жгутов проводов системы подушек безопасности? |
Hyundai | Есть ли у Hyundai процедуры замены деталей? |
Mercedes-Benz | Может ли I-CAR выслать мне процедуры ремонта Mercedes-Benz? |
Honda | Что Honda говорит о выпрямлении передних нижних направляющих? |
Subaru | Нужно ли заменять подушку безопасности переднего пассажира на Subaru, даже если подушка безопасности не сработала? Информация о ремонте, похоже, указывает на то, что так и должно быть. |
Nissan | Существует ли процедура ремонта проводки разъема подушки безопасности? |
Первая десятка конкретных вопросов I-CAR
Что говорит I-CAR об использовании переработанной боковой панели, которая включает внутреннюю, внешнюю и усиливающую части? | |
Что I-CAR говорит о выпрямлении перегиба? | |
Можно ли использовать Общие рекомендации I-CAR по секционированию? | |
Что I-CAR говорит о ремонте поврежденных противовзломных балок? | |
Что I-CAR говорит о решении использовать переработанные детали? | |
Что I-CAR говорит о парной замене деталей подвески? | |
Что I-CAR говорит о ремонте поврежденных усилителей бампера? | |
Что I-CAR говорит о допусках на ремонт? | |
Что I-CAR говорит об использовании переработанных подушек безопасности? | |
Что I-CAR говорит о ремонте поврежденных боксов? |
- О РТС
- Свяжитесь с нами
- Связанные отраслевые ссылки
- Подписаться на РТС
- Новостная рассылка
- Помощь/Часто задаваемые вопросы
- Политика отмены
- Политика в отношении рекламы и файлов cookie
- Обновленная Политика конфиденциальности
- Обновленные положения и условия
Твиты от @Ask_ICAR
Как работает распознавание дорожных знаков?
Безопасность — один из самых важных моментов, на который покупатели обращают внимание перед покупкой нового автомобиля, а в новейших автомобилях используется множество технологий безопасности. Многие из этих новых технологий называются интеллектуальными технологиями безопасности, и все они основаны на научных данных, чтобы обеспечить вашу безопасность. Одна из новейших интеллектуальных технологий безопасности — распознавание дорожных знаков, и вот ее краткий обзор.
Что такое распознавание дорожных знаков и как оно работает?
Распознавание дорожных знаков делает #AudiQ7 гораздо менее пассивно-агрессивным водителем на заднем сиденье. pic.twitter.com/xYkc4kBXkO
— Audi (@Audi) 5 января 2016 г.
В отличие от других более сложных интеллектуальных технологий безопасности, системы распознавания дорожных знаков — это именно то, о чем говорит их название. Как говорит Carwow, это просто система, которая будет смотреть и распознавать дорожные знаки. Затем он отобразит вам, обычно на сенсорном экране вашего автомобиля или информационном экране водителя, то, что сказал этот знак.
Принцип его работы также относительно прост. К вашему автомобилю прикреплена камера, направленная вперед, и с помощью передовой науки она может определить, есть ли впереди дорожный знак.
Наука сложная, но почти все в Интернете помогли с ней. Если веб-сайт когда-либо просил вас подтвердить, что вы человек, и поставить галочки в полях со знаком «Стоп», вы помогли сделать возможным распознавание дорожных знаков.
Чем полезна эта функция
Хотя распознавание дорожных знаков может показаться простой технологией безопасности, которая не всегда полезна, на самом деле она очень полезна. Как объяснил Carwow, распознавание дорожных знаков делает несколько вещей для безопасности водителя и его пассажиров.
Во-первых, это упрощает работу водителей. В современных автомобилях много чего происходит, и это может сильно отвлекать. К сожалению, эти отвлекающие факторы могут быть опасными или даже смертельными.
Таким образом, многие автопроизводители, уделяющие особое внимание безопасности, вносят свой вклад в сокращение количества отвлекающих факторов, которые могут отвлекать водителя во время вождения. Благодаря тому, что им не нужно смотреть и читать большое количество дорожных знаков, которые проезжают мимо, водители могут вместо этого сосредоточиться на дороге.
Во-вторых, дорожных знаков много, и некоторые из них полезнее других. Как сказал Carwow, если водитель пропустил знак, его система распознавания дорожных знаков прикроет его спину и может напомнить ему об этом.
Это может быть полезно по причинам, связанным с дорожным движением, например, при движении с превышением скорости, но также может быть полезно для предотвращения любых дорожных опасностей, которые встречаются на пути.
Какие автомобили имеют распознавание дорожных знаков
За зеркалом заднего вида новой #Mazda #CX5 находится камера, используемая для распознавания дорожных знаков и предупреждения о выходе из полосы движения. pic.twitter.com/DqPQsLllFB
— Mazda Motor Europe (@Mazda_Europe) 28 августа 2017 г.
Из-за того, насколько новой является эта интеллектуальная технология безопасности, не многие автомобили имеют ее в качестве опции. Но последние и самые передовые автомобили, безусловно, делают это. Кроме того, роскошные автомобили также часто имеют доступ к технологии распознавания дорожных знаков.
Например, Carwow сообщает, что некоторые из автомобилей, которые имеют доступ к технологии распознавания дорожных знаков, включают: Audi A8, Mercedes S-класса, Mercedes E-класса, BMW 1 серии, BMW 5 серии, BMW 7 серии и Форд Фокус. Помимо этих автомобилей, carwow упоминает, что Volvo предлагает технологию распознавания дорожных знаков на каждом из своих автомобилей.