基于Python實現(xiàn)一個AI物體識別
一. 前言
近期在研究 AI 方面的應(yīng)用 ,計算機視覺是其中的一大領(lǐng)域 ,應(yīng)用場景也比較多。
這一篇主要嘗試弄清楚 : 一個 AI 視覺識別的 功能點 ,涉及到哪些知識 ?
二. 處理流程
2.1 前置知識點
在實現(xiàn)這個功能之前 ,先要明白幾個前置知識點 :
Python 層面需要的工具 :
組件工具 | 功能描述 | 作用 |
---|---|---|
opencv-python | 一個開源計算機視覺庫,提供圖像和視頻處理功能。 | 用于加載、處理和顯示圖像,進行圖像預(yù)處理,如縮放、裁剪和繪制。 |
tensorflow | 一個開源機器學(xué)習(xí)框架,支持深度學(xué)習(xí)模型的構(gòu)建和訓(xùn)練。 | 用于構(gòu)建和訓(xùn)練物體識別模型,提供高層次的 API 和模型管理功能。 |
torch | 一個開源深度學(xué)習(xí)框架,以動態(tài)計算圖著稱,適合研究和生產(chǎn)。 | 提供強大的張量計算功能,支持深度學(xué)習(xí)模型的訓(xùn)練和推理。 |
torchvision | PyTorch 的視覺工具包,提供常用的數(shù)據(jù)集、模型和圖像變換。 | 用于加載標(biāo)準(zhǔn)數(shù)據(jù)集(如 COCO),并提供預(yù)訓(xùn)練模型和圖像預(yù)處理工具。 |
- OpenCV 在前幾篇就有介紹 ,它作為計算機視覺庫 ,提供了很多圖形處理的功能。
- 下面3個主要是 AI 領(lǐng)域的組件 ,用于使用 AI 的各項能力
模型和模型的選擇
我們在識別物體的過程中 ,圖片中的物體到底是什么,這是需要一個 知識庫 來幫助給出答案的。 而模型就是那個知識庫。
模型 是指一個數(shù)學(xué)表示或計算框架,旨在從輸入數(shù)據(jù)中學(xué)習(xí)模式和規(guī)律,并進行預(yù)測或分類
一個模型的生成包括 : 數(shù)據(jù)收集 , 數(shù)據(jù)預(yù)處理 ,數(shù)據(jù)建模 ,模型訓(xùn)練 ,模型評估 ,模型測試 及 最終使用
關(guān)于模型的生成 ,不在本篇的討論中 ,展示也不會這一塊。 這一篇主要專注于使用。
常用的物體識別模型 :
模型 | 作用說明 | 適合的場景 |
---|---|---|
YOLO | 實時物體檢測模型,通過全卷積網(wǎng)絡(luò)實現(xiàn)快速檢測,適合大規(guī)模應(yīng)用。 | 監(jiān)控、自動駕駛、機器人視覺 |
SSD | 單次檢測器,結(jié)合不同尺度的特征圖進行物體檢測,速度快且準(zhǔn)確。 | 移動設(shè)備、實時視頻分析 |
Faster R-CNN | 采用區(qū)域提議網(wǎng)絡(luò)(RPN)和深度卷積網(wǎng)絡(luò),實現(xiàn)高精度的物體檢測。 | 需要高精度的任務(wù),如醫(yī)學(xué)影像分析 |
Mask R-CNN | 在 Faster R-CNN 基礎(chǔ)上增加實例分割功能,能同時進行物體檢測和分割。 | 圖像編輯、自動標(biāo)注 |
RetinaNet | 使用焦點損失(Focal Loss)處理類別不平衡問題,適合小物體檢測。 | 復(fù)雜背景中的物體檢測 |
EfficientDet | 結(jié)合高效模型架構(gòu)與多尺度特征融合,資源有限的環(huán)境下表現(xiàn)出色。 | 嵌入式系統(tǒng)、移動設(shè)備 |
CenterNet | 基于中心點檢測的框架,簡單高效,適合實時檢測。 | 需要實時性的物體檢測應(yīng)用 |
而本片主要使用的是 YOLO。
模型的使用
模型的使用有兩種方式 :
- 一種是基于模型 + torch 的使用方式 , 也是最常規(guī)的用法
- 一種是基于封裝的工具 ,實現(xiàn)快速的調(diào)用
2.2 模型的使用方式一
S1 : 下載 YoLo 模型
官方地址 :yolov5
pip install ultralytics
S2 : 編寫使用模型邏輯
from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt # 加載 YOLOv5 或 YOLOv8 模型 model = YOLO('yolov5s.pt') # 或使用 'yolov8.pt' # 讀取圖像 image_path = 'C:\\Users\\Desktop\\test666.JPG' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 轉(zhuǎn)換為 RGB 格式 # 進行物體識別 results = model.predict(source=image) # 可視化結(jié)果 # 使用 cv2 繪制邊界框 for result in results: boxes = result.boxes.xyxy # 獲取邊界框信息 scores = result.boxes.conf # 獲取置信度 classes = result.boxes.cls # 獲取類別索引 for i in range(len(boxes)): box = boxes[i] score = scores[i] cls = classes[i] x1, y1, x2, y2 = box.numpy() # 轉(zhuǎn)換為 numpy 數(shù)組 label = f"{model.names[int(cls)]} {score:.2f}" # 繪制邊界框 cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2) cv2.putText(image, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2) # 使用 matplotlib 顯示圖像 plt.imshow(image) plt.axis('off') # 不顯示坐標(biāo)軸 plt.show()
S3 : 測試
2.2 模型的使用方式二
第二種方式更簡單 ,例如 Ultralytics 就提供了一整套組件可以開箱即用。
S1 : Python 安裝 ultralytics
pip install ultralytics
S2 : 對物體進行識別
from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt # 加載 YOLOv5 或 YOLOv8 模型 model = YOLO('yolov5s.pt') # 或使用 'yolov8.pt' # 讀取圖像 image_path = 'C:\\Users\\Desktop\\test666.JPG' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 轉(zhuǎn)換為 RGB 格式 # 進行物體識別 results = model.predict(source=image) # 可視化結(jié)果 # 使用 cv2 繪制邊界框 for result in results: boxes = result.boxes.xyxy # 獲取邊界框信息 scores = result.boxes.conf # 獲取置信度 classes = result.boxes.cls # 獲取類別索引 for i in range(len(boxes)): box = boxes[i] score = scores[i] cls = classes[i] x1, y1, x2, y2 = box.numpy() # 轉(zhuǎn)換為 numpy 數(shù)組 label = f"{model.names[int(cls)]} {score:.2f}" # 繪制邊界框 cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2) cv2.putText(image, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2) # 使用 matplotlib 顯示圖像 plt.imshow(image) plt.axis('off') # 不顯示坐標(biāo)軸 plt.show()
執(zhí)行 模型的時候 ,會自動從遠程下載模型
Downloading https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov5su.pt to 'yolov5su.pt'...
三. 擴展和發(fā)展
一般沒有特殊的要求 ,大部分情況下 ,我們會選擇框架直接使用。下面主要來介紹一下 ultralytics 的 API
加載模型 :
- YOLO(model): 用于加載 YOLO 模型,可以是本地路徑或在線模型名稱。
- predict(source): 對給定的圖像、視頻或文件夾進行物體檢測。
結(jié)果處理 :
- results.print(): 打印檢測結(jié)果,包括類別和置信度。
- results.xyxy: 返回檢測到的邊界框,格式為 (x1, y1, x2, y2, confidence, class)。
- results.show(): 顯示帶有檢測框的圖像。
- results.save(save_dir): 將帶有檢測框的圖像保存到指定目錄。
其他的更復(fù)雜的 :
針對初始模型 ,還可以通過數(shù)據(jù)集和訓(xùn)練來適配更復(fù)雜的場景 :
- train(): 訓(xùn)練模型,支持自定義數(shù)據(jù)集。
- val(): 驗證模型性能,通常在訓(xùn)練后進行。
- Dataset(): 用于處理數(shù)據(jù)集,支持常見的數(shù)據(jù)格式。
- create_dataloader(): 創(chuàng)建數(shù)據(jù)加載器,方便批量處理數(shù)據(jù)。
總結(jié)一下
基本上使用起來賊簡單 ,簡單照著文檔操作一下就能實現(xiàn)。
但是 : 生成級使用不會這么簡單 , 模型相當(dāng)于一個通用的數(shù)據(jù)集 ,它只能適配常見的需求。
以上就是基于Python實現(xiàn)一個AI物體識別的詳細內(nèi)容,更多關(guān)于Python AI物體識別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
聊聊pytorch中Optimizer與optimizer.step()的用法
這篇文章主要介紹了pytorch中Optimizer與optimizer.step()的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05