貓咪如廁檢測與分類識別系統系列【三】融合yolov11目標檢測


? 前情提要


家里養了三只貓咪,其中一只布偶貓經常出入廁所。但因為平時忙于學業,沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關,頻繁如廁可能是泌尿問題,停留過久也可能是便秘或不適。為了更科學地了解牠的如廁習慣,我計劃搭建一個基于視頻監控和AI識別的系統,自動識別貓咪進出廁所的行為,記錄如廁時間和停留時長,并區分不同貓咪。這樣即使我不在家,也能掌握貓咪的健康狀態,更安心地照顧它們。

已完成工作:

?貓咪如廁檢測與分類識別系統系列【一】 功能需求分析及貓咪分類特征提取
?貓咪如廁檢測與分類識別系統系列【二】多圖上傳及貓咪分類特征提取更新

計劃工作:

? 貓咪管理功能:已完成貓咪照片上傳與名稱登記模塊。
? 多圖上傳與分類特征提取:已支持批量上傳貓咪圖像并自動更新個體特征庫。
🔄 目標檢測與事件識別集成(YOLOv11):功能開發中,正在實現貓咪行為自動識別。
? 檢測區域繪制功能:待開發,計劃支持用戶自定義如廁檢測區域。
? 事件行為記錄模塊:待完善,將實現如廁進出時間、停留時長等事件記錄功能。
? 檢測結果推流展示:待更新,計劃支持算法結果實時推流。
? 整體運行結果推流整合:待更新,計劃集成檢測圖像與系統狀態為統一視頻流輸出。

————————————————


本次將繼續制作 實時檢測模塊
使用 YOLOv11 檢測攝像頭畫面中的貓、判斷是否進入指定區域,并調用分類模塊識別是哪只貓 🐱📹


? 功能目標:

  1. 打開攝像頭實時讀取畫面
  2. 用 YOLOv11 檢測貓目標(設定類名為 'cat'
  3. 判斷貓是否進入你定義的“如廁區域”(矩形區域)
  4. 如果貓在區域內 → 裁剪貓圖 → 提特征 → 分類
  5. 在畫面中顯示識別結果,并記錄狀態變化(進入/離開)

🧱 YOLOv11 + 分類實時檢測代碼(main.py 簡版)

import cv2
import time
import numpy as np
from recognizer.embedder import CatEmbedder
from recognizer.database import CatDatabase
from recognizer.matcher import CatMatcher
from ultralytics import YOLO  # 假設你用的是YOLOv8/11格式# 初始化
model = YOLO("yolov11_cat.pt")  # 替換為你的模型路徑
embedder = CatEmbedder()
db = CatDatabase()
matcher = CatMatcher(db)# 區域設定(可以做成畫圖交互)
TOILET_REGION = (100, 100, 400, 400)  # (x1, y1, x2, y2)# 狀態跟蹤
cat_present = False
entry_time = None# 啟動攝像頭
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 畫如廁區域x1, y1, x2, y2 = TOILET_REGIONcv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 255), 2)# YOLOv11 推理results = model.predict(frame, verbose=False)boxes = results[0].boxesdetected = Falsecat_name = "Unknown"for box in boxes:cls = int(box.cls[0])conf = float(box.conf[0])if cls != 0:  # 類別為貓(根據你的模型調整)continuexmin, ymin, xmax, ymax = map(int, box.xyxy[0])cx, cy = (xmin + xmax) // 2, (ymin + ymax) // 2# 判斷貓是否在如廁區域if x1 < cx < x2 and y1 < cy < y2:detected = Truecat_crop = frame[ymin:ymax, xmin:xmax]# 保存臨時圖片 + 識別貓tmp_path = "tmp.jpg"cv2.imwrite(tmp_path, cat_crop)vec = embedder.extract(tmp_path)cat_name = matcher.match(vec)# 顯示識別名cv2.putText(frame, f"{cat_name}", (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 200, 0), 2)cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)# 狀態變化記錄if detected and not cat_present:entry_time = time.time()print(f"🐱 {cat_name} 進入區域")cv2.imwrite(f"records/{cat_name}_enter_{int(entry_time)}.jpg", frame)if not detected and cat_present:exit_time = time.time()duration = round(exit_time - entry_time, 2)print(f"🚪 {cat_name} 離開區域,用時 {duration} 秒")cv2.imwrite(f"records/{cat_name}_leave_{int(exit_time)}.jpg", frame)cat_present = detectedcv2.imshow("Cat Monitor", frame)if cv2.waitKey(1) == 27:  # ESC 退出breakcap.release()
cv2.destroyAllWindows()

📦 依賴庫列表:

  • ultralytics (YOLOv8/11)

  • torch, opencv-python, Pillow

  • scikit-learn(用于相似度計算)



? 下一步工作:

  1. 用 Flask 做個記錄頁面,展示:

    • 每次進入/離開的貓咪、時間、如廁時長

    • 保存的截圖

  2. 加入狀態日志系統(寫入 SQLite)


? 讀取視頻流:
可以通過 OpenCV 直接讀取 RTSP 流的視頻畫面,替換掉 cv2.VideoCapture(0) 這一行。


? RTSP 攝像頭接入方式

假設你的攝像頭地址是:

rtsp://192.168.0.102:554/stream1

常見格式有以下幾種(具體看你的攝像頭廠商手冊):

格式類型示例 URL
無用戶名密碼rtsp://192.168.0.102:554/stream1
有用戶名密碼rtsp://admin:password@192.168.0.102:554/stream1

如果你不確定 RTSP 路徑,可以用 VLC 打開地址測試能否連接。


? 替換代碼中的攝像頭源

# 本地攝像頭寫法
# cap = cv2.VideoCapture(0)# 替換為 RTSP 攝像頭:
cap = cv2.VideoCapture("rtsp://192.168.0.102:554/stream1")

也可以設置超時時間(推薦):

cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

?? 注意事項:

  1. 防火墻:確保你的電腦和攝像頭在同一局域網,且攝像頭開放了 RTSP 服務。

  2. 穩定性:RTSP 會有卡頓或斷流情況,建議加重連邏輯(稍后我們可以加)。

  3. 幀率延遲:默認 RTSP 有延遲,可嘗試減少緩沖提高實時性。


? 示例(完整替換一行即可)

cap = cv2.VideoCapture("rtsp://192.168.0.102:554/stream1")

模型使用:

現在沒有收集足夠多的貓咪圖片,就先使用 YOLOv11 COCO 官方權重(基于 YOLOv8 推理架構),但是只想檢測 cat 類別(class id = 15)。我們有兩個解決方案:


? 方案一:在推理結果中篩選 cat 類別

這是最簡單的方法,無需重新訓練模型,只在代碼里過濾掉非貓類目標。

? 修改你的檢測代碼:

results = model.predict(frame, verbose=False)
boxes = results[0].boxesfor box in boxes:cls = int(box.cls[0])conf = float(box.conf[0])if cls != 15:  # COCO 中 cat 是類別15continue# 保留 cat 類的后續邏輯...

你也可以打印類別名驗證一下:

from ultralytics.utils import ops
print(ops.ANCHOR_ORDER)  # 也可以用 model.names[cls] 打印類別名

? 方案二:導出只含貓的 YOLOv11 模型(可選,后續更新)

如果你未來希望模型體積更小、推理更快:

  1. 用 COCO 數據集中只包含 cat 的部分訓練模型(或 fine-tune)。

  2. 自定義 data.yaml:

names: ['cat']
nc: 1
  1. 訓練模型:
yolo detect train data=cat.yaml model=yolov11.pt epochs=50 imgsz=640

然后就能得到一個“只識別貓”的輕量化模型了。


網絡攝像頭檢測推理錯誤

[h264 @ 00000218ddca2b00] error while decoding MB 94 41, bytestream -5

表示 OpenCV(底層用 ffmpeg)在解析 RTSP 攝像頭的視頻流時,遇到了 H.264 視頻幀解碼錯誤。這種問題在使用 RTSP 攝像頭時很常見,通常是由以下原因引起的:


? 常見原因分析:

1. 網絡不穩定 / 丟幀

  • RTSP 是實時流協議,稍有波動就可能導致數據不完整。

  • 解碼器(H.264)收到了不完整的數據,無法正確解碼宏塊(Macroblock)。

2. 攝像頭編碼質量太低 / 不兼容

  • 某些低端攝像頭輸出的 RTSP H.264 數據流存在兼容問題。

3. 緩沖區設置不當(OpenCV 默認大延遲)

  • OpenCV 默認有較大的緩沖,容易產生過時幀或卡頓,進而出錯。

? 解決方案


? 方法 1:設置 OpenCV 緩沖區為 1(強烈推薦及采用)

cap = cv2.VideoCapture("rtsp://192.168.0.102:554/stream1")
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

? 方法 2:改用 ffmpeg 直接拉流更穩定(通過 subprocessimageio

如果 OpenCV 解碼不穩定,可以嘗試用 ffmpeg 拉流 + pipe 給 Python 處理。


? 方法 3:嘗試切換 RTSP 子碼流(sub stream)

大多數攝像頭有主碼流(1080p)和子碼流(D1 / CIF):

  • 主碼流可能過大、丟幀嚴重

  • 可嘗試地址類似:

    rtsp://192.168.0.102:554/sub
    rtsp://192.168.0.102:554/live/ch0_1  ← 子碼流
    

? 方法 4:嘗試加參數或禁用 HW 加速(ffmpeg flags)

可通過設置更強容錯的方式讀取(但這需要更底層控制)。


🧪 調試策略

import cv2rtsp_url = "rtsp://192.168.0.102:554/stream1"
cap = cv2.VideoCapture(rtsp_url)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)if not cap.isOpened():print("? 無法連接攝像頭")exit()while True:ret, frame = cap.read()if not ret:print("? 幀讀取失敗,跳過")continuecv2.imshow("RTSP", frame)if cv2.waitKey(1) == 27:break

? 總結建議:

方式說明
set(CAP_PROP_BUFFERSIZE, 1)? 首選,緩解延遲和丟幀問題
檢查 RTSP 子碼流地址可大幅提升兼容性
嘗試更穩定解碼方式(如 GStreamer)高級穩定需求下可選

cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
可以先加上上述代碼試試是否緩解問題。如果問題仍然頻繁,我們可以換 ffmpegGStreamer 拉流方式,我也可以幫你整合好。

窗口尺寸調整:

好的,如果用 OpenCVcv2.imshow() 來顯示攝像頭窗口,可以通過 縮放幀的尺寸 來控制窗口大小。


? 方法:縮放圖像再顯示

在你顯示前加一行縮放代碼,比如縮放為 640x480:

# 假設 frame 是讀取的圖像
resized_frame = cv2.resize(frame, (640, 480))  # 你也可以用 (960, 720) 或其他分辨率
cv2.imshow("Cat Monitor", resized_frame)

? 推薦方式(根據原圖比例縮小)

如果你想“等比例縮放”,比如縮小為原來的 0.5 倍:

scale = 0.5
h, w = frame.shape[:2]
resized_frame = cv2.resize(frame, (int(w * scale), int(h * scale)))
cv2.imshow("Cat Monitor", resized_frame)

? 如果你想讓窗口是“可拉伸的”

還可以配合 cv2.namedWindow 控制窗口樣式:

cv2.namedWindow("Cat Monitor", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Cat Monitor", 640, 480)

這允許你手動調整窗口大小。


? 已完成模塊回顧

模塊狀態說明
貓咪錄入?支持多張貓臉圖批量上傳、特征提取和保存
貓咪識別?最近鄰相似度匹配分類
YOLOv11 + 攝像頭?實時檢測貓是否進入區域并識別是哪只貓
區域判斷?判斷貓是否進入指定如廁區域
RTSP 支持?已支持 RTSP 攝像頭接入(192.168.0.102)
窗口縮放?圖像縮放顯示已支持

? 運行說明

cd cat_monitor/web
python app.py
  1. 瀏覽器訪問:
http://127.0.0.1:5000/

? 已完成模塊回顧

模塊狀態說明
貓咪錄入?支持多張貓臉圖批量上傳、特征提取和保存
貓咪識別?最近鄰相似度匹配分類
YOLOv11 + 攝像頭?實時檢測貓是否進入區域并識別是哪只貓
區域判斷?判斷貓是否進入指定如廁區域
RTSP 支持?已支持 RTSP 攝像頭接入(192.168.0.102)
窗口縮放?圖像縮放顯示已支持

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76894.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年燃氣證書:傳承與發展的行業紐帶

回溯歷史長河&#xff0c;能源的利用與人類文明的發展息息相關。從遠古時期的鉆木取火&#xff0c;到如今廣泛應用的燃氣能源&#xff0c;每一次能源的變革都推動著社會的巨大進步。而在現代燃氣行業蓬勃發展的背后&#xff0c;燃氣從業人員資格證書正扮演著傳承與發展的重要紐…

在Ubuntu下進行單片機開發是否需要關閉Secure Boot

1. Secure Boot的作用 功能&#xff1a;Secure Boot是UEFI的安全功能&#xff0c;旨在阻止未經驗證的驅動或操作系統啟動&#xff0c;防止惡意軟件篡改引導過程。 影響范圍&#xff1a;它主要限制的是操作系統啟動階段加載的內核級驅動&#xff08;如顯卡驅動、虛擬化模塊&…

國達陶瓷重磅推出陶瓷羅馬柱外墻整裝尖端新產品“冠巖臻石”

近日&#xff0c;記者在佛山國達建材有限公司&#xff08;以下簡稱國達陶瓷&#xff09;董事長楊建平處了解到&#xff0c;該公司重磅推出的“冠巖臻石”新產品&#xff0c;是屬于陶瓷羅馬柱外墻整裝產品中的尖端產品。新產品自面市之后&#xff0c;深受高端用戶的青睞與認可。…

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持

【分享】Ftrans文件擺渡系統&#xff1a;既保障傳輸安全&#xff0c;又提供強集成支持&#xff01; 在數字化浪潮中&#xff0c;企業對數據安全愈發重視&#xff0c;網絡隔離成為保護核心數據的關鍵防線&#xff0c;比如隔離成研發網-辦公網、生產網-測試網、內網-外網等。網絡…

實驗一 字符串匹配實驗

一、實驗目的 1&#xff0e;熟悉匯編語言編程環境和DEBUG調試程序的使用。 2&#xff0e;掌握鍵盤輸入字符串的方法和分支程序的設計。 二、實驗內容 編程實現&#xff1a;從鍵盤分別輸入兩個字符串&#xff0c;然后進行比較&#xff0c;若兩個字符串的長度…

添加登錄和注冊功能

先寫前端再寫后端 前提&#xff1a;ideavue3mybatisspringBoot3前后端分離實現對一張表的增刪改查&#xff08;完整代碼版&#xff09;-CSDN博客 項目地址 1.添加一個Login.vue視圖 <template><div class"login_container"><div class"login…

【Windows】系統安全移除移動存儲設備指南:告別「設備被占用」彈窗

Windows系統安全移除移動存儲設備指南&#xff1a;告別「設備被占用」彈窗 解決移動硬盤和U盤正在被占用無法彈出 一、問題背景 使用Windows系統時&#xff0c;經常遇到移動硬盤/U盤彈出失敗提示「設備正在使用中」&#xff0c;即使已關閉所有可見程序。本文將系統梳理已驗證…

Springboot下載文件, 文件名中文是亂碼, 空格變加號

默認把文件名放上去, 中文會亂碼, 文件名種有空格, 就會被截斷 public void download(HttpServletResponse response){// 文件名先進行url編碼, 避免亂碼問題// 把用%20進行替換fileName URLEncoder.encode(fileName, "UTF-8").replace("", "%20&qu…

MySQL 超詳細安裝教程與常見問題解決方案

一、MySQL 安裝教程 1. Windows 系統安裝&#xff08;以 MySQL 8.0 為例&#xff09; 步驟 1&#xff1a;下載 MySQL Installer 訪問 MySQL 官網下載頁面。 選擇 Windows (x86, 64-bit), MSI Installer&#xff08;推薦使用完整版 mysql-installer-web-community-8.0.xx.xx.…

【cuda學習日記】5.2.1 共享內存額外篇

共享內存(Shared Memory) 1.是一種低延遲、高帶寬的片上內存 2.由同一個Block內的所有線程共享 3.生命周期與Block相同 4.訪問速度比全局內存快約100倍 Block(線程塊) 1.GPU執行的基本單位&#xff0c;包含一組線程 2.多個Block組成Grid(網格) 3.Block內的線程可以通過共享內存…

[250411] Meta 發布 Llama 4 系列 AI 模型 | Rust 1.86 引入重大語言特性

目錄 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元Rust 1.86.0 版本發布亮點主要新特性與改進其他重要信息 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元 Meta AI 近日發布了其最新、最先進的 Llama 4 系列人工智能模型&#xff0c;標志著 AI 技術…

ArrayList 和 數組 的區別

定義與本質 數組&#xff1a;是 Java 語言內置的數據結構&#xff0c;是存儲相同類型元素的連續內存空間。它是一個基本的語言特性&#xff0c;在內存中是一塊連續的區域。ArrayList&#xff1a;是 Java 集合框架中的一個類&#xff0c;屬于動態數組。它是基于數組實現的&#…

??FireCrawl?爬蟲工具?, Craw4ai

?FireCrawl?是一款開源的AI爬蟲工具&#xff0c;專門用于Web數據提取&#xff0c;并將其轉換為Markdown格式或其他結構化數據。FireCrawl特別適合處理使用JavaScript動態生成的網站&#xff0c;能夠自動抓取網站及其所有可訪問的子頁面內容&#xff0c;并將其轉換為適合大語言…

通信原理-非線性調制

今天給大家帶來的是關于通信原理中非線性調制的內容,一起來看看吧&#xff01;&#xff01;&#xff01; 1.角度調制 2.FM與PM的區別 3.單音調制FM 4.窄帶調頻 5.寬帶調頻 5.1FM信號的頻譜 5.2FM信號的帶寬 5.3FM信號的功率分配 6.FM信號的產生與解調 6.1FM信號的產生 6.2FM…

文心一言開發指南03——千帆大模型平臺產品優勢

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 千帆大模型平臺作為百度智能云推出的企業級大模型一站式平臺&#xff0c;具有顯著的產品優勢。千帆大模型平臺以其基礎強大、流程完善、運行穩定和安全可靠的產品優勢成為企…

mysql DQL

一.基本查詢 1.查詢多個字段 2.查看所有字段 3.設置別名 4.去除重復記錄 二.條件查詢 1.大于小于等于 2.查詢 身份證為空的 沒有所以沒有記錄 3.在15到20這個區間范圍內 4.or/in 或者 4.like 匹配 &#xff08;_匹配單個字符 %匹配多個字符&#xff09; 查詢員工信…

關于 軟件開發模型 的分類、核心特點及詳細對比分析,涵蓋傳統模型、迭代模型、敏捷模型等主流類型

以下是關于 軟件開發模型 的分類、核心特點及詳細對比分析&#xff0c;涵蓋傳統模型、迭代模型、敏捷模型等主流類型&#xff1a; 一、軟件開發模型分類及核心特點 1. 瀑布模型&#xff08;Waterfall Model&#xff09; 核心特點&#xff1a; 線性階段劃分&#xff1a;需求分…

2025年第十六屆藍橋杯省賽C++ A組真題

2025年第十六屆藍橋杯省賽C A組真題 1.說明2.題目A&#xff1a;尋找質數&#xff08;5分&#xff09;3.題目B&#xff1a;黑白棋&#xff08;5分&#xff09;4. 題目C&#xff1a;抽獎&#xff08;10分&#xff09;5. 題目D&#xff1a;紅黑樹&#xff08;10分&#xff09;6. 題…

JVM初探——走進類加載機制|三大特性 | 打破雙親委派SPI機制詳解

目錄 JVM是什么&#xff1f; 類加載機制 Class裝載到JVM的過程 裝載&#xff08;load&#xff09;——查找和導入class文件 鏈接&#xff08;link&#xff09;——驗證、準備、解析 驗證&#xff08;verify&#xff09;——保證加載類的正確性 準備&#xff08;Prepare&…