OpenCV目标识别的具体实现(附带实例)
在图像中找出检测对象的位置和大小是目标检测(object detection)的任务,是计算机视觉领域的核心问题之一,在自动驾驶、机器人和无人机等许多领域极具研究价值。
深度学习是指在多层神经网络上运用各种机器学习算法解决图像、文本等各种问题的算法集合。因此,基于深度学习的目标检测算法又被称为目标检测网络。
本文使用一种名为 MobileNet-SSD 的目标检测网络对图像进行目标检测。MobileNet-SSD 能够在图像中检测出飞机、自行车、船、瓶子、公交车、摩托车、火车、汽车、鸟、猫、狗、马、人、羊、奶牛、餐桌、椅子、沙发、盆栽、电视共 20 种物体和 1 种背景,平均准确率能达到 72.7%。
由于训练神经网络需要大量的数据和强大的运算力,在这里将使用一个已经训练好的目标检测网络模型。在 Python 中,可以通过 OpenCV 的 dnn 模块使用训练好的模型对图像进行目标检测,其步骤为:
下面代码实现目标检测:

图 1 目标检测效果
深度学习是指在多层神经网络上运用各种机器学习算法解决图像、文本等各种问题的算法集合。因此,基于深度学习的目标检测算法又被称为目标检测网络。
本文使用一种名为 MobileNet-SSD 的目标检测网络对图像进行目标检测。MobileNet-SSD 能够在图像中检测出飞机、自行车、船、瓶子、公交车、摩托车、火车、汽车、鸟、猫、狗、马、人、羊、奶牛、餐桌、椅子、沙发、盆栽、电视共 20 种物体和 1 种背景,平均准确率能达到 72.7%。
由于训练神经网络需要大量的数据和强大的运算力,在这里将使用一个已经训练好的目标检测网络模型。在 Python 中,可以通过 OpenCV 的 dnn 模块使用训练好的模型对图像进行目标检测,其步骤为:
- 加载 MobileNet-SSD 目标检测网络模型;
- 读入待检测图像,并将其转换为 blob 数据包;
- 将 blob 数据包传入目标检测网络,并进行前向传播;
- 根据返回结果标注图像中被检测出的对象。
下面代码实现目标检测:
# 导入cv2和numpy模块 import cv2 import numpy # 指定图像和模型文件路径 image_path = 'target.jpg' prototxt = './model/MobileNetSSD_deploy.prototxt' model = './model/MobileNetSSD_deploy.caffemodel' # 创建物体分类标签、颜色和字体等变量 CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor') COLORS = numpy.random.uniform(0, 255, size=(len(CLASSES), 3)) FONT = cv2.FONT_HERSHEY_SIMPLEX # 使用dnn模块从文件中加载神经网络模型 net = cv2.dnn.readNetFromCaffe(prototxt, model) # 从文件中加载待检测的图像,用来构造一个blob数据包 image = cv2.imread(image_path) (h, w) = image.shape[:2] input_img = cv2.resize(image, (300, 300)) # 返回一个blob数据包,它是经过减去均值、归一化和通道交换后的输入图像 blob = cv2.dnn.blobFromImage(input_img, 0.007843, (300, 300), 127.5) # 将blob数据包传入MobileNet-SSD目标检测网络,进行前向传播,并返回结果 net.setInput(blob) detections = net.forward() # 用循环结构读取检测结果中的检测区域,并标注矩形框、分类名称和可信度 for i in numpy.arange(0, detections.shape[2]): idx = int(detections[0, 0, i, 1]) confidence = detections[0, 0, i, 2] if confidence > 0.2: # 标注矩形框 box = detections[0, 0, i, 3:7] * numpy.array([w, h, w, h]) (x1, y1, x2, y2) = box.astype('int') cv2.rectangle(image, (x1, y1), (x2, y2), COLORS[idx], 2) # 标注可信度 label = '[INFO]{}:{:.2f}%'.format(CLASSES[idx], confidence * 100) print(label) cv2.putText(image, label, (x1, y1), FONT, 1, COLORS[idx], 1) # 将检测结果图像显示在窗口中 cv2.imshow('Image', image) cv2.waitKey(0) cv2.destroyAllWindows()运行程序,对图像进行检测的结果如下图所示:

图 1 目标检测效果