使用Python进行物体识别
物体识别 是计算机视觉的更广泛领域中的一项技术。该技术能够识别图像和视频中存在的物体并进行跟踪。物体识别也被称为 物体检测 ,在人脸识别、车辆识别、行人计数、自动驾驶车辆、安全系统等方面有各种应用。
物体识别的两个主要目标包括:
- 鉴定 图像中存在的所有物体
- 过滤 寻找关注物体
在接下来的教程中,我们将了解如何使用 ImageAI 库在Python编程语言中执行物体识别。通过本教程,我们将使用 ImageAI 库在Python中创建一个基本的物体识别模型。
那么,让我们开始吧。
物体识别的深度学习
深度学习技术已经在物体识别相关的不同问题中展示了最先进的技术。一些通常使用的深度学习方法包括:
- ImageAI
- 单次检测器
- YOLO(You Only Look Once)
- 基于区域的卷积神经网络
然而,在本教程中,我们将了解 ImageAI 是什么以及如何在物体识别中使用它。
理解ImageAI库
Python提供了一个库,用于通过几行简单的代码脚本实现包含自包含深度学习和计算机视觉能力的应用程序和系统。
ImageAI 包含几乎所有最先进的深度学习算法的Python实现,如 RetinaNet, YOLOv3 和 TinyYOLOv3 。
ImageAI 使用离线工作的多个API,包括对象检测、视频检测和对象跟踪API,可以在不访问互联网的情况下调用。 ImageAI 使用预训练模型,可以轻松定制。
ImageAI 库的 ObjectDetection 类包含了使用预训练模型在任何图像或一组图像上执行对象检测的方法。 ImageAI 可以检测和识别八十个不同类型的常见物体。
设置环境
在本教程的这一部分,我们将考虑安装所需的库,包括 ImageAI 。
为了使用 ImageAI ,我们需要安装一些依赖项。初始步骤是在系统上安装Python。我们可以从Python的官方网站下载和安装Python 3:https://www.python.org/。
安装成功后,我们必须使用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: 该文件夹将存储要进行目标检测的图像文件。
- 输出: 该文件夹将存储已检测到的目标的图像文件。
一旦我们创建了必要的文件夹,Object Recognition文件夹应该包含以下子文件夹:
? Input
? Models
? Output
3 directories, 0 files
步骤2
对于步骤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类的实例 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成功地在图像中识别出了汽车和人物。