物体检测是计算机视觉中的一个重要任务,涉及识别和定位图像中的多个物体。在本篇文章中,我们将探讨如何在 PHP 环境中实现物体检测的简单功能,尽管 PHP 不是深度学习的主流编程语言,我们将通过调用外部 Python 脚本与深度学习框架(如 YOLO)进行集成,实现物体检测。
环境准备
PHP 7.4 或更高版本。
Python 3.x,以及已经训练好的 YOLO 模型。
OpenCV 和其他依赖库:用于处理图像数据。
Darknet 或其他深度学习框架:训练和执行 YOLO 模型。
安装 PHP
首先确保系统中安装了 PHP,可以使用以下命令检查:
bash
php -v
安装 Python 和 OpenCV
由于 PHP 本身不直接支持深度学习,我们可以通过 Python 脚本来加载和运行模型。安装 Python 和 OpenCV:
bash
pip install opencv-python opencv-python-headless numpy
训练 YOLO 模型
在本地或云端使用 YOLO 模型进行训练。假设您已经训练了一个 YOLO 模型,并保存了 .weights 和 .cfg 文件。我们将在 PHP 中调用 Python 脚本加载模型并进行物体检测。
编写代码
- 使用 PHP 上传图片
首先,我们使用 PHP 编写一个简单的文件上传表单,允许用户上传图片进行检测。
python
import cv2
import sys
import numpy as np
YOLO 配置文件路径和权重文件路径
cfg_file = "yolov3.cfg"
weights_file = "yolov3.weights"
labels_file = "coco.names"
加载标签
with open(labels_file, 'r') as f:
labels = f.read().strip().split('\n')
加载 YOLO 网络
net = cv2.dnn.readNet(weights_file, cfg_file)
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
读取输入图像
image_path = sys.argv[1]
image = cv2.imread(image_path)
height, width, channels = image.shape
创建 blob
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
进行前向推理
net.setInput(blob)
outs = net.forward(output_layers)
分析结果并画框
class_ids = []
confidences = []
boxes = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = center_x - w // 2
y = center_y - h // 2
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
使用 NMS 进行去除重复框
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
绘制框并标记物体名称
for i in indices.flatten():
x, y, w, h = boxes[i]
label = str(labels[class_ids[i]])
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
保存输出结果图像
output_path = "output/" + image_path.split("/")[-1]
cv2.imwrite(output_path, image)
print(f"物体检测结果已保存至: {output_path}")
3. 连接 PHP 和 Python
PHP 通过 shell_exec() 函数来调用 Python 脚本。我们已经在 PHP 代码中调用了 detect_objects.py 脚本,并将上传的图片路径作为参数传递给它。
更多内容访问ttocr.com或联系1436423940
php
$output = shell_exec("python3 detect_objects.py " . escapeshellarg($targetFile));
echo "
$output";
测试程序
将 YOLO 配置文件、权重文件和类标签文件放置到合适的目录下。
确保 Python 脚本 detect_objects.py 和 PHP 脚本在同一目录。
上传一张图片,通过 PHP 表单提交。
Python 脚本将执行物体检测,并返回检测结果。