Python教程-使用Python进行对象识别
 
            
            对象识别 是计算机视觉领域的一项技术,能够识别图像和视频中存在的物体并进行跟踪。对象识别,也称为目标检测,具有各种应用,如人脸识别、车辆识别、行人计数、自动驾驶车辆、安全系统等等。
对象识别的两个主要目标包括:
- 识别图像中存在的所有物体
- 过滤出引起注意的物体
在接下来的教程中,我们将了解如何在Python编程语言中使用ImageAI库执行对象识别。通过本教程,我们将在Python中使用ImageAI库创建一个基本的对象识别模型。
让我们开始吧。
用于对象识别的深度学习
深度学习技术已被证明在与对象识别相关的不同问题上处于最前沿。一些常用的深度学习方法包括:
- ImageAI
- 单次检测器 (Single Shot Detectors)
- YOLO (You Only Look Once)
- 基于区域的卷积神经网络 (Region-based Convolutional Neural Networks)
然而,在本教程中,我们将了解ImageAI是什么,以及如何在对象识别中使用它。
了解ImageAI库
Python提供了一个库,旨在通过简单的代码脚本的几行来赋予程序员和开发人员构建具有自包含深度学习和计算机视觉功能的应用程序和系统的能力。ImageAI包括几乎所有最先进的深度学习算法的Python实现,如RetinaNet,YOLOv3和TinyYOLOv3。
ImageAI使用多个离线工作的API,包括对象检测、视频检测和对象跟踪API,可以在不访问互联网的情况下调用。ImageAI使用预训练模型,并可以轻松自定义。
ImageAI库的ObjectDetection类包括执行对象检测的方法,使用预训练模型可以检测和识别八十种不同类型的常见物体。
环境设置
在本教程的这一部分,我们将考虑安装所需的库,包括ImageAI。
为了使用ImageAI,我们必须安装一些依赖项。初始步骤是在系统上安装Python。我们可以从Python的官方网站下载并安装Python 3:https://www.python.org/。
一旦我们成功在系统上安装了Python,我们必须使用pip安装以下依赖项:
- OpenCV
- TensorFlow
- Keras
- ImageAI
下面是相应的安装命令:
# installing OpenCV  
$ pip install opencv-python  
  
# installing TensorFlow  
$ pip install tensorflow  
  
# installing Keras  
$ pip install keras  
  
# installing ImageAI  
$ pip install imageAI  现在,我们需要下载包含我们将用于对象识别的分类方法的TinyYOLOv3模型文件。
链接如下:
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/yolo-tiny.h5
使用ImageAI执行对象识别
在本节中,我们将讨论如何在Python中使用ImageAI库。执行对象识别的过程分为几个步骤,以便更好地理解和清晰性。
步骤1
初始步骤是创建所需的文件夹。在本教程中,我们将需要以下文件夹:
- Object_Recognition: 这将是根文件夹。
- Models: 此文件夹将存储预训练模型。
- Input: 此文件夹将存储要执行对象检测的图像文件。
- Output: 此文件夹将存储带有检测到的对象的图像。
一旦创建了所需的文件夹,对象识别文件夹应该有以下子文件夹:
?   Input  
?   Models  
?   Output  
3 directories, 0 files  步骤2
第二步,我们将打开首选的文本编辑器,这里使用Visual Studio Code,编写一个Python脚本并创建一个名为 recognizer.py 的新文件。
步骤3
现在,让我们开始从ImageAI库中导入ObjectDetection类。相应的语法如下:
文件:recognizer.py
# importing the required library  
from imageai.Detection import ObjectDetection  步骤4
既然导入了所需的ImageAI库和ObjectDetection类,接下来要做的是创建ObjectDetection类的实例。我们可以考虑以下代码片段:
文件:recognizer.py
# instantiating the class  
recognizer = ObjectDetection()  步骤5
让我们使用以下代码片段指定模型、输入图像和输出图像的路径。
文件:recognizer.py
# defining the paths  
path_model = "./Models/yolo-tiny.h5"  
path_input = "./Input/images.jpg"  
path_output = "./Output/newimage.jpg"  步骤6
一旦我们实例化了ObjectDetection类,现在可以从该类调用不同的函数。该类包含以下函数,以调用预训练模型:
- setModelTypeAsRetinaNet()
- setModelTypeAsYOLOv3()
- setModelTypeAsTinyYOLOv3()
出于本教程的目的,我们将使用预训练的TinyYOLOv3模型,因此我们将使用setModelTypeAsTinyYOLOv3()函数来加载模型。
让我们考虑以下代码片段:
文件:recognizer.py
# using the setModelTypeAsTinyYOLOv3() function  
recognizer.setModelTypeAsTinyYOLOv3()  步骤7
现在,我们将调用setModelPath()函数。该函数将接受一个字符串,其中包含预训练模型的路径。
让我们考虑以下代码片段:
文件:recognizer.py
# setting the path to the pre-trained Model  
recognizer.setModelPath(path_model)  步骤8
在这一步,我们将从识别器实例调用loadModel()函数。该函数将使用setModelPath()类方法指定的路径加载模型。
让我们考虑以下代码片段:
文件:recognizer.py
# loading the model  
recognizer.loadModel()  步骤9
我们将使用之前创建的recognizer对象调用detectObjectsFromImage()函数。
这个函数接受两个参数:input_image和output_image_path。input_image参数是我们要识别的图像所在的路径,而output_image_path参数是存储带有检测到对象的图像的路径。该函数将返回一个包含图像中每个检测到的对象的名称和百分比概率的字典。
相应的语法如下:
文件:recognizer.py
# calling the detectObjectsFromImage() function  
recognition = recognizer.detectObjectsFromImage(  
    input_image = path_input,  
    output_image_path = path_output  
    )  步骤10
最后,我们可以通过迭代字典中的每个元素来访问字典元素。
相应的语法如下:
文件:recognizer.py
# iterating through the items found in the image  
for eachItem in recognition:  
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])  完整的Python对象识别模型脚本
让我们考虑以下用于对象识别模型的脚本。
文件:recognizer.py
# importing the required library  
from imageai.Detection import ObjectDetection  
  
# instantiating the class  
recognizer = ObjectDetection()  
  
# defining the paths  
path_model = "./Models/yolo-tiny.h5"  
path_input = "./Input/images.jpg"  
path_output = "./Output/newimage.jpg"  
  
# using the setModelTypeAsTinyYOLOv3() function  
recognizer.setModelTypeAsTinyYOLOv3()  
# setting the path of the Model  
recognizer.setModelPath(path_model)  
# loading the model  
recognizer.loadModel()  
# calling the detectObjectsFromImage() function  
recognition = recognizer.detectObjectsFromImage(  
    input_image = path_input,  
    output_image_path = path_output  
    )  
  
# iterating through the items found in the image  
for eachItem in recognition:  
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])  输出:
car  :  88.85036110877991
car  :  85.83406209945679
bus  :  70.04978060722351
car  :  80.88288903236389
car  :  55.334705114364624
person  :  61.084866523742676
car  :  68.46083402633667
person  :  56.165677309036255
person  :  71.58655524253845
car  :  59.49597954750061
person  :  55.276620388031006
person  :  69.08922791481018
person  :  59.92640256881714
car  :  82.73208141326904
person  :  54.69227433204651
person  :  67.25137233734131
car  :  68.9003050327301
person  :  77.32996344566345
person  :  53.02640199661255
person  :  81.33729696273804
person  :  83.60849618911743
person  :  50.34937262535095实际图像:

经过对象识别的图像:

最后,我们可以看到ImageAI成功识别了图像中的汽车和人物。
 
          
          
         