基于YOLOv10+YOLOP+PYQT的可視化系統,實現多類別目標檢測+可行駛區域分割+車道線分割【附代碼】

文章目錄

  • 前言
  • 視頻效果
  • 必要環境
  • 一、代碼結構
    • 1、 訓練參數解析
    • 2、 核心代碼解析
      • 1.初始化Detector類
      • 2. @torch.no_grad()
      • 3. 復制輸入圖像并初始化計數器
      • 4. 調用YOLOv10模型進行目標檢測
      • 5. 提取檢測結果信息
      • 6. 遍歷檢測結果并在圖像上繪制邊界框和標簽
      • 7. 準備輸入圖像以適應End-to-end模型
      • 8. 使用YOLOP模型進行推理
      • 9. 處理可行駛區域分割結果
      • 10. 處理車道線分割結果
  • 二、效果展示
  • 三、完整代碼獲取
  • 總結


前言

在往期博客中,我們詳細介紹了如何搭建YOLOv10和YOLOP的環境。本期將結合這兩個算法,實現多類別目標檢測、可行駛區域分割和車道線分割等多種任務,并將其部署到PYQT界面中進行展示。


視頻效果

b站鏈接:基于YOLOv10+YOLOP+PYQT的可視化系統,實現多類別目標檢測+可行駛區域分割+車道線分割多種任務


必要環境

  1. 配置yolov10環境 可參考往期博客
    地址:搭建YOLOv10環境 訓練+推理+模型評估
  2. 配置yolop環境 可參考往期博客
    地址:YOLOP 訓練+測試+模型評估

一、代碼結構

1、 訓練參數解析

首先,我們利用 argparse 模塊來設置命令行參數,以便靈活配置模型的權重路徑、使用設備(cpu、gpu)等信息

# 解析命令行參數
parser.add_argument('--v10weights', default=r"yolov10s.pt", type=str, help='weights path')
parser.add_argument('--weights', default=r"weights/End-to-end.pth", type=str, help='weights path')
parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--imgsz', type=int, default=640, help='image size')
parser.add_argument('--merge_nms', default=False, action='store_true', help='merge class')
parser.add_argument('--conf_thre', type=float, default=0.3, help='conf_thre')
parser.add_argument('--iou_thre', type=float, default=0.2, help='iou_thre')
parser.add_argument('--augment', action='store_true', help='augmented inference')
opt = parser.parse_args()

關鍵參數詳解:

  1. –v10weights: 指定YOLOv10模型的權重文件路徑。

  2. –weights: 指定YOLOP模型的權重文件路徑,這個模型包含了車道線分割和可行駛區域分割的任務

  3. –device: 指定運行模型的設備,可以是單個GPU(如 0),或者是CPU(cpu)

  4. –imgsz: 指定輸入圖像的尺寸,輸入圖像會被調整為這個尺寸,以適應模型的輸入要求

  5. –conf_thre: 設置初始置信度閾值,只有置信度高于這個閾值的檢測框才會被保留

  6. –iou_thre: 設置初始IOU閾值,在NMS過程中,只有IOU低于這個閾值的檢測框才會被保留

2、 核心代碼解析

此部分包含車道線分割、可行駛區域分割和目標檢測等關鍵部分的代碼

1.初始化Detector類

這段代碼定義了一個名為Detector的類,該類初始化了兩個模型:一個是用于End-to-end檢測的YOLOP模型,另一個是用于目標檢測的YOLOv10模型。通過加載權重文件、設置設備、調整圖像大小以及配置模型參數,實現了對這兩個模型的初始化和準備工作

class Detector:def __init__(self, v10weights, cfg, device, model_path=r'./best_dist_model.pt', imgsz=640, conf=0.5, iou=0.0625, merge_nms=False):self.device = deviceself.model = get_net(cfg)checkpoint = torch.load(model_path, map_location=device)self.model.load_state_dict(checkpoint['state_dict'])self.model = self.model.to(device)img_w = torch.zeros((1, 3, imgsz, imgsz), device=device)_ = self.model(img_w)self.model.eval()self.stride = int(self.model.stride.max())self.imgsz = check_img_size(imgsz, s=self.stride)self.merge_nms = merge_nmsself.model_v10 = YOLOv10(v10weights)self.names = self.model_v10.names

2. @torch.no_grad()

這是一個裝飾器,用于禁用梯度計算,可以減少內存消耗并加快推理速度,通常在推理時使用

@torch.no_grad()
def __call__(self, image: np.ndarray, conf, iou):

3. 復制輸入圖像并初始化計數器

復制輸入圖像以便在結果圖像上進行操作,并初始化一個默認字典來記錄每個類別的檢測次數

img_vis = image.copy()
class_counts = defaultdict(int)

4. 調用YOLOv10模型進行目標檢測

使用YOLOv10模型在輸入圖像上進行目標檢測,返回檢測結果

results = self.model_v10(image, verbose=True, conf=conf, iou=iou, device=self.device)

5. 提取檢測結果信息

提取檢測結果中的類別、置信度和邊界框坐標

bboxes_cls = results[0].boxes.cls
bboxes_conf = results[0].boxes.conf
bboxes_xyxy = results[0].boxes.xyxy.cpu().numpy().astype('uint32')

6. 遍歷檢測結果并在圖像上繪制邊界框和標簽

遍歷所有檢測到的目標,在圖像上繪制邊界框和標簽,并記錄每個類別的檢測次數

for idx in range(len(bboxes_cls)):box_cls = int(bboxes_cls[idx])bbox_xyxy = bboxes_xyxy[idx]bbox_label = self.names[box_cls]class_counts[bbox_label] += 1box_conf = f"{bboxes_conf[idx]:.2f}"xmax, ymax, xmin, ymin = bbox_xyxy[2], bbox_xyxy[3], bbox_xyxy[0], bbox_xyxy[1]img_vis = cv2.rectangle(img_vis, (xmin, ymin), (xmax, ymax), get_color(box_cls + 2), 3)cv2.putText(img_vis, f'{str(bbox_label)}/{str(box_conf)}', (xmin, ymin - 10),cv2.FONT_HERSHEY_SIMPLEX, 1.0, get_color(box_cls + 2), 3)

7. 準備輸入圖像以適應End-to-end模型

對輸入圖像進行調整和預處理,以適應End-to-end模型的輸入要求

img, ratio, pad = letterbox_for_img(image, new_shape=self.imgsz, auto=True)
pad_w, pad_h = pad
pad_w = int(pad_w)
pad_h = int(pad_h)
ratio = ratio[1]
img = np.ascontiguousarray(img)
img = transform(img).to(self.device)
im = img.float()
if im.ndimension() == 3:im = im.unsqueeze(0)

8. 使用YOLOP模型進行推理

在預處理后的圖像上運行End-to-end模型,輸出檢測結果、車道線分割結果和可行駛區域分割結果

det_out, da_seg_out, ll_seg_out = self.model(im)

9. 處理可行駛區域分割結果

這段代碼將對可行駛區域的分割結果進行后處理,首先從模型輸出中裁剪出實際的分割結果,通過雙線性插值恢復到原始圖像尺寸,然后提取每個像素的類別索引,最終生成可行駛區域的分割掩碼

_, _, height, width = im.shape
da_predict = da_seg_out[:, :, pad_h:(height - pad_h), pad_w:(width - pad_w)]
da_seg_mask = torch.nn.functional.interpolate(da_predict, scale_factor=int(1 / ratio), mode='bilinear')
_, da_seg_mask = torch.max(da_seg_mask, 1)
da_seg_mask = da_seg_mask.int().squeeze().cpu().numpy()

10. 處理車道線分割結果

這段代碼將對車道線分割結果進行后處理,和處理可行駛區域分割結果同理,首先從模型輸出中裁剪出實際的分割結果,并通過雙線性插值恢復到原始圖像尺寸,然后提取每個像素的類別索引,生成最終的分割掩碼

ll_predict = ll_seg_out[:, :, pad_h:(height - pad_h), pad_w:(width - pad_w)]
ll_seg_mask = torch.nn.functional.interpolate(ll_predict, scale_factor=int(1 / ratio), mode='bilinear')
_, ll_seg_mask = torch.max(ll_seg_mask, 1)
ll_seg_mask = ll_seg_mask.int().squeeze().cpu().numpy()

二、效果展示

在這里插入圖片描述
在這里插入圖片描述

三、完整代碼獲取

鏈接:基于YOLOv10+YOLOP+PYQT的可視化系統,實現多類別目標檢測+可行駛區域分割+車道線分割


總結

本期博客就到這里啦,喜歡的小伙伴們可以點點關注,感謝!

最近經常在b站上更新一些有關目標檢測的視頻,大家感興趣可以來看看 https://b23.tv/1upjbcG

學習交流群:995760755

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

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

相關文章

MySQL使用LIKE索引是否失效的驗證

1、簡單的示例展示 在MySQL中,LIKE查詢可以通過一些方法來使得LIKE查詢能夠使用索引。以下是一些可以使用的方法: 使用前導通配符(%),但確保它緊跟著一個固定的字符。 避免使用后置通配符(%)&…

【致知功夫 各隨分限】成長需要時間,助人須考慮對方的承受程度

幫助他人需考慮各人的分限所能及的,初學圣學需時間沉淀,存養心性 任何人都應該受到教育,不應受到貧富、貴賤的差異而排除在教育之外,對于不同材質的學生,需要因材施教; 每天都有新的認知,大我…

STL—容器—string類【對其結構和使用的了解】【對oj相關練習的訓練】

STL—容器—string類 其實string類準確來說并不是容器,因為他出現的時間比STL要早,但是也可以說是容器吧。 1.為什么要學習string類? 1.1C語言當中的字符串 C語言中,字符串是以’\0’結尾的一些字符的集合,為了操作…

CTFShow的RE題(三)

數學不及格 strtol 函數 long strtol(char str, char **endptr, int base); 將字符串轉換為長整型 就是解這個方程組了 主要就是 v4, v9的關系, 3v9-(v10v11v12)62d10d4673 v4 v12 v11 v10 0x13A31412F8C 得到 3*v9v419D024E75FF(1773860189695) 重點&…

Windows ipconfig命令詳解,Windows查看IP地址信息

「作者簡介」:冬奧會網絡安全中國代表隊,CSDN Top100,就職奇安信多年,以實戰工作為基礎著作 《網絡安全自學教程》,適合基礎薄弱的同學系統化的學習網絡安全,用最短的時間掌握最核心的技術。 ipconfig 1、基…

Android Studio Run窗口中文亂碼解決辦法

Android Studio Run窗口中文亂碼解決辦法 問題描述: AndroidStudio 編譯項目時Run窗口中文亂碼,如圖: 解決方法: 依次打開菜單:Help--Edit Custom VM Options,打開studio64.exe.vmoptions編輯框&#xf…

計算機專業怎么選擇電腦

現在高考錄取結果基本已經全部出來了,很多同學都如愿以償的進入到了計算機類專業,現在大部分同學都在為自己的大學生活做準備了,其中第一件事就是買電腦,那計算機類專業該怎么選擇電腦呢? 計算機專業是個一類學科&…

網絡中的網絡 NiN

一、全連接層問題 1、卷積層的參數:輸入的通道數乘以輸出的通道數再乘以窗口的高寬 2、全連接層的參數就是輸入的元素個數乘以輸出的元素個數,也就是輸入的通道數乘以輸入的高寬,再乘以輸出的通道數乘以輸出的高寬,賊大的量級 …

NLP簡介

自然語言處理( Natural Language Processing, NLP)是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學、計算機科學、數學于一體的科學。因此,這一領域的研究將涉及自…

【算法】(C語言):冒泡排序、選擇排序、插入排序

冒泡排序 從第一個數據開始到第n-1個數據,依次和后面一個數據兩兩比較,數值小的在前。最終,最后一個數據(第n個數據)為最大值。從第一個數據開始到第n-2個數據,依次和后面一個數據兩兩比較,數值…

關于用戶咨詢華為擎云L410筆記本安裝Windows系統的說明

同樣也是單位購買的華為擎云L410 KLVU-WDU0筆記本電腦,國產UOS系統某些軟件用著不是很方便,用戶咨詢是否能夠安裝Windows10或者Windows7? 帶著種種疑問也做了一些查詢,之前也給一些國產設備更改過操作系統,之前的國產設…

計算機網絡淺談—什么是 OSI 模型?

開放系統通信(OSI)模型是一個代表網絡通信工作方式的概念模型。 思維導圖 什么是 OSI 模型? 開放系統互連 (OSI) 模型是由國際標準化組織創建的概念模型,支持各種通信系統使用標準協議進行通信。簡單而言,OSI 為保證…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

論文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 論文代碼 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越來越多可用的城市數據和先進的學習技術使人們能夠提…

Laravel框架詳解及使用方法

Laravel是一款開源的PHP Web應用程序框架,它基于MVC(模型-視圖-控制器)架構,以其簡單易學、靈活性強、安全性高和強大的社區支持而廣受開發者喜愛。以下是對Laravel框架的詳細解析及使用方法: 一、Laravel框架簡介 1…

刷題——在二叉樹中找到最近公共祖先

在二叉樹中找到兩個節點的最近公共祖先_牛客題霸_牛客網 int lowestCommonAncestor(TreeNode* root, int o1, int o2) {if(root NULL) return -1;if((root->val o1) || (root->val o2)) return root->val;int left lowestCommonAncestor(root->left, o1, o2);i…

【pytorch19】交叉熵

分類問題的loss MSECross Entropy LossHinge Loss (SVN用的比較多) ∑ i m a x ( 0 , 1 ? y i ? h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) ∑i?max(0,1?yi??hθ?(xi?)) Entropy(熵) Uncertainty(…

ESP32——物聯網小項目匯總

商品級ESP32智能手表 [文章鏈接] 用ESP32,做了個siri?!開源了! [文章鏈接]

IPsec連接 和 SSL連接

Psec和SSL連接是兩種用于保障網絡通信安全的技術 IPsec 通常用于連通兩個局域網,主要是網對網的連接,如分支機構與總部之間,或者本地IDC與云端VPC的子網連接。適合站點間的穩定通訊需求以及對網絡層安全有嚴格要求的場合。要求兩端有固定的網…

UDP協議:獨特之處及其在網絡通信中的應用

在網絡通信領域,UDP(用戶數據報協議,User Datagram Protocol)是一種廣泛使用的傳輸層協議。與TCP(傳輸控制協議,Transmission Control Protocol)相比,UDP具有其獨特的特點和適用場景…

對數據采集、數據存儲和數據處理流程

對數據采集、數據存儲和數據處理流程 數據采集是指從各種來源收集原始數據的過程,這通常包括傳感器、網站、社交媒體、API等。它涉及設置抓取工具、爬蟲技術或直接從數據庫獲取數據。數據存儲則涉及到將采集到的數據安全、高效地保存起來,常見的有關系型…