Эта статья состоит из двух частей:

  1. Классификация изображений с помощью MobileNet.
  2. Обнаружение лиц (в реальном времени и по изображению) с каскадом хаара с использованием 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 было создано с целью добиться максимальной точности с учетом ограниченных ресурсов, доступных для встроенных приложений или приложений на устройстве.

Спасибо, что прочитали. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.

Удачного обучения!!!

Удачного кодирования :)