用 PHP 与深度学习模型进行物体检测

物体检测是计算机视觉中的一个重要任务,涉及识别和定位图像中的多个物体。在本篇文章中,我们将探讨如何在 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 脚本加载模型并进行物体检测。

编写代码

  1. 使用 PHP 上传图片
    首先,我们使用 PHP 编写一个简单的文件上传表单,允许用户上传图片进行检测。
$output"; } else { echo "文件上传失败。"; } } ?>
选择图片上传:
2. 编写 Python 脚本进行物体检测 接下来,我们编写一个 Python 脚本 detect_objects.py 来加载 YOLO 模型,进行物体检测,并返回检测结果。此脚本会接收图像路径作为输入,并输出检测结果。

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 脚本将执行物体检测,并返回检测结果。

posted @   ttocr、com  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示