Эта статья состоит из двух частей:
- Классификация изображений с помощью MobileNet.
- Обнаружение лиц (в реальном времени и по изображению) с каскадом хаара с использованием OpenCV в python.
Введение:
Классификация изображений: что это такое?
Цифровые фотографии стали обычным явлением в нашем обществе, и на протяжении многих лет они производили огромные объемы данных. Дисциплина компьютерного зрения ИИ широко использует данные, в основном для обнаружения, распознавания и классификации изображений. Методы машинного обучения используются при классификации изображений для проверки наличия объектов на изображении и их классификации.
Эта конкретная проблема лежит в основе компьютерного зрения и распознавания изображений. Машины не исследуют изображение целиком. Они просто изучают шаблоны пикселей или векторы при анализе изображения. Впоследствии элементы будут классифицированы и им будут присвоены метки в соответствии с различными правилами, установленными при настройке алгоритма.
Распознавание лиц:
Обнаружение лиц, также известное как обнаружение лиц, представляет собой компьютерную технологию, использующую искусственный интеллект (ИИ) для поиска и распознавания человеческих лиц на цифровых фотографиях. Технологию распознавания лиц можно использовать для наблюдения и отслеживания людей в режиме реального времени в различных отраслях, таких как безопасность, биометрия, правоохранительные органы, развлечения и личная безопасность.
От базовых методов компьютерного зрения до разработок в области машинного обучения (МО) и все более сложных искусственных нейронных сетей (ИНС) и связанных с ними технологий распознавание лиц совершенствовалось, что привело к постоянному повышению производительности. Теперь он служит основой для ряда важных приложений, таких как отслеживание лиц, анализ лиц и распознавание лиц. Способность приложения выполнять последовательные задачи оказывает существенное влияние на распознавание лиц.
Итак, давайте начнем с описания модели распознавания лиц (по изображению).
1.Библиотеки:
Использованы самые известные библиотеки для операций распознавания лиц (cv2). Код импорта представлен ниже:
import cv2
2. Использование OpenCV для реализации каскадов Хаара:
Вам нужно только загрузить предварительно обученный XML-файл, если вы используете какое-либо предварительно обученное обнаружение объектов, доступное в репозитории, предоставленном OpenCV.
· Python-установка OpenCV:
Используя управление пакетами pip в Python, можно настроить OpenCV.
!pip install opencv-python
# — -OR — -
!pip install opencv-contrib-python
3. Каскадная загрузка Хаара в OpenCV:
Используя функцию cv2.CascadeClassifier, мы можем загрузить xml-файлы haar-cascade.
# Load the cascade face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml-path')
4. Как только файл XML загрузится, мы можем вызвать функцию детектора.
# Read the input image img = cv2.imread(r'image_path') # Convert into grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Detect faces faces = face_cascade.detectMultiScale(gray, 1.1, 4)
Компоненты detectMultiScale:
scaleFactor — указывает, насколько объект уменьшился по сравнению с его первоначальным размером.
minNeighbors — Этот параметр указывает минимальное количество соседей, которые должны участвовать в ограничивающей рамке.
Наименьший возможный размер объекта показан строкой «minSize» на нашем рисунке. Наш элемент будет проигнорирован, если он меньше минимального размера.
Важно: мы должны использовать серое изображение для обнаружения объектов. Другие настройки minNeighbors и scaleFactor не требуются.
5. Распознавание лиц людей:
Давайте посмотрим на первый случай обнаружения объектов с использованием обученного каскада хаара, где мы будем использовать Python для идентификации людей на фотографии.
import cv2 # Load the cascade face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml-path') # Read the input image img = cv2.imread(r'image_path') # Convert into grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Detect faces faces = face_cascade.detectMultiScale(gray, 1.1, 4) # Draw rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) # Display the output cv2.imshow('Face Detector(image)', img) cv2.waitKey()
Вывод:
Теперь давайте опишем модель обнаружения лиц (в реальном времени).
Нам просто нужно прочитать видео или камеру в OpenCV для обнаружения объектов с помощью каскада Хаара; остальная часть процесса будет такой же.
Видеопоток представляет собой серию кадров, каждый из которых имеет тот же код, что и отдельный кадр. Алгоритм Haar Cascade работает с хорошей скоростью в секунду из-за минимальных вычислительных требований.
Захват изображения в реальном времени будет осуществляться путем чтения входного потока видеокамеры OpenCV.
import cv2 # Load the cascade face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml-path') # To capture video from webcam. cap = cv2.VideoCapture(0) # To use a video file as input # cap = cv2.VideoCapture('filename.mp4') while True: # Read the frame _, img = cap.read() # Convert to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Detect the faces faces = face_cascade.detectMultiScale(gray, 1.1, 4) # Draw the rectangle around each face for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # Display cv2.imshow('Face Detector(webcam)', img) # Stop if escape key is pressed k = cv2.waitKey(30) & 0xff if k==27: break # Release the VideoCapture object cap.release()
Ограничительные рамки для лиц будут отображаться в реальном времени и меняться для каждого кадра.
Теперь давайте начнем с модели классификации изображений.
1.Библиотеки:
Во-первых, мы импортируем все ресурсы, которые будем использовать.
import tensorflow as tf
2. Загрузите модель MobileNet:
Мы собираемся загрузить модель MobileNet и протестировать ее на небольшой выборке случайно выбранных фотографий, чтобы увидеть, насколько хорошо она может классифицировать их с помощью классов ImageNet.
Чтобы получить копию одного предварительно обученного MobileNet с весами, которые были сохранены после обучения на изображениях ImageNet, мы сначала вызываем tf.keras.applications.mobilenet.MobileNet(). Эта модель добавляется к переменной модели.
# Load the MobileNet model model = tf.keras.applications.MobileNet()
3. Загрузка и предварительная обработка изображения, а также изменение размера и увеличение размеров:
Затем вызывается функция tf.keras.preprocessing.image.load_img. Функция tf.keras.preprocessing.image.load_img() получает файл изображения и целевой размер, который мы устанавливаем на (224 224). (это размер по умолчанию для MobileNet). Экземпляр изображения PIL возвращается функцией load img().
Затем мы используем метод Keras img_to_array(), чтобы превратить изображение PIL в массив, и функцию numpy expand_dims(), чтобы увеличить размеры массива.
Чтобы предварительно обработать данные изображения, чтобы они были в том же формате, что и фотографии, на которых была впервые обучена MobileNet, мы вызываем preprocess input() из tf.keras.applications.mobilenet. Эта функция вернет данные предварительно обработанного изображения в виде массива numpy, в частности, масштабируя значения пикселей изображения от -1 до 1.
# Load an image and resize it to the appropriate size for the model image = tf.keras.preprocessing.image.load_img(r"image_path", target_size=(224, 224)) # Convert the image to a numpy array and expand the dimensions to match the model's input shape image = tf.keras.preprocessing.image.img_to_array(image) image = tf.expand_dims(image, axis=0) # Preprocess the image for the model image = tf.keras.applications.mobilenet.preprocess_input(image)
4.Прогнозируйте метку с максимальной достоверностью:
Чтобы получить метку с максимальной степенью достоверности, мы затем прогнозируем, используя функцию model.predict() и функцию tf.argmax(prediction[0]).
# Use the model to predict the label of the image prediction = model.predict(image) # Get the label with the highest confidence label = tf.argmax(prediction[0]) # Print the label print(f'Predicted label: {label}')
5. Найдите соответствующее имя класса ярлыка:
Поэтому мы загружаем список имен классов из ImageNet, на котором обучается MobileNet, чтобы получить имя класса найденной метки.
# Load a list of class names with open('imagenet_class_names.txt', 'r') as file: class_names = file.read().splitlines() # Get the class name corresponding to label value 667 class_name = class_names[label] # Print the class name print(f'Class name for label {label}: {class_name}')
Теперь нужно создать список имен классов в ImageNet.
· Это можно сделать вручную, создав файл имен классов вместе с их метками из исходника.
· Или, как вариант, это можно сделать с помощью приведенного ниже кода:
import requests # Download the list of class names from the ImageNet website response = requests.get('https://deeplearning.cms.waikato.ac.nz/user-guide/class-maps/IMAGENET/') # Save the class names to a text file with open('imagenet_class_names.txt', 'w') as file: file.write(response.text)
Вывод:
WARNING:tensorflow:5 out of the last 5 calls to <function Model.make_predict_function.<locals>.predict_function at 0x0000023F528F0160> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details. 1/1 [==============================] - 0s 281ms/step Predicted label: 587 Class name for label 587: 587 hammer
Вывод:
В этом посте мы обсудили, как работает каскад Хаара, а также как использовать OpenCV в Python для построения каскада Хаара для идентификации объектов. Для обнаружения лиц мы сначала использовали предварительно обученный каскадный файл хаара, а затем выполнили тот же процесс в реальном времени.
А, так же как и классификация объектов. Мы видим, что сразу после установки MobileNet отлично справляется с классификацией фотографий. Семейство моделей компьютерного зрения TensorFlow под названием MobileNets было создано с целью добиться максимальной точности с учетом ограниченных ресурсов, доступных для встроенных приложений или приложений на устройстве.
Спасибо, что прочитали. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.
Удачного обучения!!!
Удачного кодирования :)