用 PHP 與深度學習模型進行物體檢測

ttocr、com發表於2024-12-02

物體檢測是計算機視覺中的一個重要任務,涉及識別和定點陣圖像中的多個物體。在本篇文章中,我們將探討如何在 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 指令碼將執行物體檢測,並返回檢測結果。

相關文章