Как создать простую систему распознавания объектов с помощью Python и ImageAI

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Создание практичной системы распознавания изображений и видеообъектов с помощью всего нескольких строк кода с использованием Python и ImageAI

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

Если вы посмотрите на распространенные модели распознавания объектов, такие как ResNet, YOLO, NASNet или RCNN, все они имеют глубокий стек слоев. Это требует технических знаний, а также огромного количества времени, чтобы заставить их работать. Все эти факторы могут стать проблемой для людей, которые просто хотят реализовать алгоритмы обнаружения объектов для решения своих проблем.

 

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

 

Ниже приведены шаги того, что мы собираемся сделать в этой статье:

 

- Введение

 

- Создание детектора объекта изображения

 

- Создание детектора видеообъекта

 

Итак, приступим прямо сейчас.

 

Введение

 

Как упоминалось ранее, мы собираемся создать изображение и систему обнаружения видеообъектов с помощью ImageAI. ImageAI - это библиотека Python, которая позволяет специалистам по машинному обучению создавать систему обнаружения объектов с помощью всего нескольких строк кода.

 

Прежде чем мы начнем, нам нужно установить некоторые зависимости, которые нам понадобятся для правильного запуска ImageAI. Эти зависимости:

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

После установки всех этих библиотек мы можем начать установку библиотеки ImageAI, введя следующую команду в командной строке:

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Далее мы готовы построить нашу систему обнаружения объектов для изображения и для видео.

 

Создание системы распознавания объектов

 

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

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Поскольку мы хотим реализовать распознавания объектов простым и быстрым способом, мы будем использовать предварительно обученную модель, специфичную для обнаружения объектов, которая была обучена на наборе данных COCO. С ImageAI можно выбрать три разные предварительно обученные модели: RetinaNet, YOLOv3 и tinyYOLOv3. Вы можете скачать понравившуюся модель здесь. После того, как вы скачали модель, поместите файл h5 в тот же каталог, что и ваш скрипт Python. Теперь ваш рабочий каталог должен иметь следующую структуру.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Вернемся к нашему скрипту Python, теперь мы можем создать экземпляр класса ObjectDetection, который мы импортировали ранее. В зависимости от модели, которую вы скачали ранее, нам нужно вызвать соответствующий метод из класса ObjectDetection. Ниже приведена реализация кода для этого.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Затем мы можем начать загрузку модели, указав сначала путь к нашей модели. Поскольку наша модель находится в том же каталоге, что и наш скрипт Python, здесь я покажу вам, как загрузить модель RetinaNet. Если вы используете YOLOv3 или tinyYOLOv3, вам необходимо соответственно изменить имя файла h5.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Наконец, мы можем приступить к созданию системы обнаружения объектов изображения. Для этого нам нужно указать две вещи: во-первых, каталог и имя файла нашего входного изображения, а во-вторых, каталог и имя файла выходного изображения. В следующей реализации кода входным изображением будет изображение с именем «traffic.jpg», которое находится в том же каталоге, что и сценарий Python. Между тем, результат обнаружения будет сохранен в файле с именем «traffic_detected.jpg» в том же каталоге.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

И это код, который нам нужен для создания экземпляра нашей системы обнаружения объектов изображения. Ниже приведена полная реализация кода шагов, которые мы рассмотрели выше:

 

from imageai.Detection import ObjectDetection
import os

current_directory = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()

detector.setModelPath(os.path.join(current_directory , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

detections = detector.detectObjectsFromImage(input_image=os.path.join(current_directory, "traffic.jpg"),
output_image_path=os.path.join(current_directory , "traffic_detected.jpg"))

for eachObject in detections:
print(eachObject["name"] , " : ", eachObject["percentage_probability"], " : ", eachObject["box_points"] )
print("--------------------------------")

 

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

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

 

Настройка детектора объектов изображения

 

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

 

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

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Затем мы можем приступить к созданию системы обнаружения объектов с помощью метода detectCustomObjectsFromImage. Мы передаем нашу настраиваемую переменную, путь и имя нашего входного изображения, а также путь и имя нашего выходного изображения.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Более того, мы также можем дополнительно удалить беспорядок, игнорируя прогнозы, у которых значения вероятности ниже определенного порогового значения. Допустим, вы хотите игнорировать прогнозы со значением вероятности ниже 70%. Это можно сделать, добавив аргумент minimum_percentage_probability в метод detectCustomObjectsFromImage.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

from imageai.Detection import ObjectDetection
import os

current_directory = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()

detector.setModelPath(os.path.join(current_directory , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

custom = detector.CustomObjects(person=True, bicycle=True)

detections = detector.detectCustomObjectsFromImage(
custom_objects = custom,
input_image = os.path.join(current_directory, "traffic.jpg"),
output_image_path = os.path.join(current_directory , "traffic_detected.jpg"),
minimum_percentage_probability = 70
)

for eachObject in detections:
print(eachObject["name"] , " : ", eachObject["percentage_probability"], " : ", eachObject["box_points"] )
print("--------------------------------")

 

Если вы запустите приведенный выше код, вы получите примерно такой результат:

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Вот и все! Теперь, используя всего несколько строк кода, вы можете реализовать систему обнаружения объектов для своего собственного изображения. Однако что, если вы хотите обнаруживать объекты на видео или даже с веб-камеры вместо изображения? Давайте узнаем, как создать подобное обнаружение объектов для видео с помощью ImageAI, в следующем разделе.

 

Создание системы обнаружения видеообъектов

 

Вы не поверите, но код для создания системы обнаружения видеообъектов с ImageAI очень похож на систему обнаружения объектов изображения, которую мы создали ранее. Все, что нам нужно сделать, это изменить 3 строки кода. Первый - это библиотека, которую мы должны импортировать. Поэтому вместо ObjectDetection нам нужно импортировать VideoObjectDetection.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Второе изменение, которое мы должны применить, - это шаг, на котором мы создаем экземпляр класса обнаружения объекта. Вместо использования ObjectDetection () мы должны использовать VideoObjectDetection ().

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Далее, третье или последнее изменение, которое мы должны применить, - это когда мы создаем систему обнаружения объектов. В нашем предыдущем коде мы использовали метод detectObjectsFromImage. Если мы хотим обнаруживать объекты на видео, нам нужно вместо этого использовать detectObjectsFromVideo.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

Ниже представлена полная реализация кода для создания системы обнаружения видеообъектов.

 

from imageai.Detection import VideoObjectDetection
import os

current_directory = os.getcwd()

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()

detector.setModelPath(os.path.join(current_directory , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

detections = detector.detectObjectsFromVideo(input_file_path=os.path.join(current_directory, "footage.mp4"),
output_file_path=os.path.join(current_directory , "footage_detected")
, frames_per_second=20, log_progress=True)

 

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

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

 

Примечание.

 

Если вы каким-то образом не получаете тот же цветовой формат в выходном видео, т.е. вы получаете выходное видео в формате BGR вместо формата RGB, вы можете использовать приведенный ниже код для преобразования выходного видео обратно в формат RGB.

 

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

 

import cv2
import os

current_directory = os.getcwd()

# Change the path and filename of your input video with its extension
video_path = os.path.join(current_directory , 'footage_detected.avi' )
vs = cv2.VideoCapture(video_path)

output_video = None

while True:

(frame_exists, frame) = vs.read()

if not frame_exists:
break

else:
new_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

key = cv2.waitKey(1) & 0xFF

# Write the both outputs video to a local folders
if output_video is None:
fourcc1 = cv2.VideoWriter_fourcc(*"MJPG")

# Change the path and filename of your output video with .avi extension
output_video = cv2.VideoWriter(os.path.join(current_directory , 'footage_detected_corrected.avi' ), fourcc1, 25,(new_frame.shape[1], new_frame.shape[0]), True)

elif output_video is not None:
output_video.write(new_frame)

if key == ord("q"):
break

vs.release()
output_video.release()
cv2.destroyAllWindows()

 

Настройка обнаружения видеообъектов

 

Так же, как наша система обнаружения объектов изображения, мы также можем немного настроить нашу систему обнаружения видеообъектов. У нас есть возможность выбрать, какие объекты мы хотим обнаружить, и выбрать порог для значения вероятности, которое должно отображаться. Допустим, мы хотим обнаруживать только людей и велосипед для нашей системы обнаружения видеообъектов. Кроме того, мы хотим отображать только те обнаружения, которые имеют значение вероятности выше 70%. Мы можем сделать это, сначала создав экземпляр переменной для хранения объектов, которые мы хотим наблюдать.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

from imageai.Detection import VideoObjectDetection
import os

current_directory = os.getcwd()

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()

detector.setModelPath(os.path.join(current_directory , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

custom = detector.CustomObjects(person=True, bicycle=True)

detector = detector.detectCustomObjectsFromVideo(
custom_objects = custom,
input_file_path=os.path.join(current_directory, "footage.mp4"),
output_file_path=os.path.join(current_directory, "footage_detected"),
frames_per_second=20, log_progress=True,
minimum_percentage_probability = 70)

 

Создание обнаружения видеообъектов с веб-камеры

 

А что, если вы хотите создать систему обнаружения объектов, используя в качестве входных данных изображения с камеры? Создать эту систему с ImageAI также очень просто. Сам код очень похож на нашу систему обнаружения видеообъектов. Вам нужно всего лишь добавить одну строку кода, а также изменить одну строку кода для этого. Во-первых, нам нужно создать переменную для создания экземпляра библиотеки OpenCV для захвата кадра непосредственно с нашей веб-камеры.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

Наконец, нам нужно изменить аргумент в методе detectObjectsFromVideo. Вместо указания пути к входному файлу нам нужно указать вход камеры, который является переменной камеры, которую мы создали выше.

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

 

Ниже приведена полная реализация кода для создания системы распознавания объектов прямо с веб-камеры.

 

from imageai.Detection import VideoObjectDetection
import os
import cv2

current_directory = os.getcwd()

camera = cv2.VideoCapture(0)

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()

detector.setModelPath(os.path.join(current_directory , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

detections = detector.detectObjectsFromVideo(
camera_input = camera,
output_file_path = os.path.join(current_directory, "camera_detected_video"),
frames_per_second = 20, log_progress=True)

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

 

Заключительные замечания

 

Теперь вы уже знаете, как создать быструю и простую систему распознавания объектов с помощью ImageAI. Как вы видели, библиотека ImageAI позволяет нам создавать систему распознавания объектов, не сталкиваясь со сложностью модели распознавания объектов, такой как ResNet или YOLO.

 

Обратите внимание, что с предварительно обученной моделью, поддерживаемой ImageAI, детектор объектов может обнаруживать 80 различных объектов. Эти объекты:

 

Как создать простую систему распознавания объектов с помощью Python и ImageAI

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

 

Вы также можете создать собственное обнаружение настраиваемых объектов с помощью ImageAI.

 

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

 

Комментарии: