YOLO v11 目標檢測+關鍵點檢測 實戰記錄

流水賬記錄一下yolo目標檢測
1.搭建pytorch 不做解釋 看以往博客或網上搜都行
2.下載yolo源碼 : https://github.com/ultralytics/ultralytics
3.樣本標注工具:labelme 自己下載
4.準備數據集
4.1 新建一個放置數據集的路徑
在這里插入圖片描述
在這里插入圖片描述

4.2 構建訓練集和測試集
運行以下腳本,將數據集劃分為訓練集和測試集,比例是7:3,看自己需求

import os
import shutilfrom tqdm import tqdm
import random""" 使用:只需要修改 1. Dataset_folde,    2. os.chdir(os.path.join(Dataset_folder, 'images'))里的 images, 3. val_scal = 0.2 4. os.chdir('../label_json')          label_json換成自己json標簽文件夾名稱   """# 圖片文件夾與json標簽文件夾的根目錄
Dataset_folder = r'D:\Software\Python\deeplearing\PytorchTest\ultralytics-main\datasets\PepperGrab'
# 把當前工作目錄改為指定路徑
os.chdir(os.path.join(Dataset_folder, 'images'))  # images : 圖片文件夾的名稱
folder = '.'  # 代表os.chdir(os.path.join(Dataset_folder, 'images'))這個路徑
imgs_list = os.listdir(folder)
random.seed(123)  # 固定隨機種子,防止運行時出現bug后再次運行導致imgs_list 里面的圖片名稱順序不一致
random.shuffle(imgs_list)  # 打亂
val_scal = 0.3  # 驗證集比列
val_number = int(len(imgs_list) * val_scal)
val_files = imgs_list[:val_number]
train_files = imgs_list[val_number:]
print('all_files:', len(imgs_list))
print('train_files:', len(train_files))
print('val_files:', len(val_files))
os.mkdir('train')
for each in tqdm(train_files):shutil.move(each, 'train')
os.mkdir('val')
for each in tqdm(val_files):shutil.move(each, 'val')
os.chdir('../label_json')
os.mkdir('train')
for each in tqdm(train_files):json_file = os.path.splitext(each)[0] + '.json'shutil.move(json_file, 'train')
os.mkdir('val')
for each in tqdm(val_files):json_file = os.path.splitext(each)[0] + '.json'shutil.move(json_file, 'val')
print('劃分完成')

在這里插入圖片描述
4.2 然后就開始標樣本了,用labelme標,本次測試出了目標檢測外,還需要檢測關鍵點,類似標成下面這種,我之前標過一次樣本,圖就不展示了,不安全.3 因為labelme標注完是json格式,要轉化為yolo格式,運行以下腳本

import os
import json
import shutil
import numpy as np
from tqdm import tqdm""""#使用:1.改 bbox_class = {'sjb_rect': 0},我的框的類別是sjb_rect,賦值它為0,如你是dog則改成:bbox_cls = {'dog': 0}2.改 keypoint_class = ['angle_30', 'angle_60', 'angle_90'],我的關鍵點類別是三個,分別是'angle_30', 'angle_60', 'angle_90'  3.改 Dataset_root 成你自己的圖片與json文件的路徑 4.改 os.chdir('json_label/train')與os.chdir('json_label/val') 成你的json文件夾下的train與val文件夾 """# 數據集根慕錄(即圖片文件夾與標簽文件夾的上一級目錄)
Dataset_root = r'D:\Software\Python\deeplearing\PytorchTest\ultralytics-main\datasets\PepperGrab'# 框的類別
bbox_class = {'pepper': 0
}# 關鍵點的類別
keypoint_class = ['head', 'end']  # 這里類別放的順序對應關鍵點類別的標簽 0,1,2os.chdir(Dataset_root)os.mkdir('labels')
os.mkdir('labels/train')
os.mkdir('labels/val')def process_single_json(labelme_path, save_folder='../../labels/train'):with open(labelme_path, 'r', encoding='utf-8') as f:labelme = json.load(f)img_width = labelme['imageWidth']  # 圖像寬度img_height = labelme['imageHeight']  # 圖像高度# 生成 YOLO 格式的 txt 文件suffix = labelme_path.split('.')[-2]yolo_txt_path = suffix + '.txt'with open(yolo_txt_path, 'w', encoding='utf-8') as f:for each_ann in labelme['shapes']:  # 遍歷每個標注if each_ann['shape_type'] == 'rectangle':  # 每個框,在 txt 里寫一行yolo_str = ''## 框的信息# 框的類別 IDbbox_class_id = bbox_class[each_ann['label']]yolo_str += '{} '.format(bbox_class_id)# 左上角和右下角的 XY 像素坐標bbox_top_left_x = int(min(each_ann['points'][0][0], each_ann['points'][1][0]))bbox_bottom_right_x = int(max(each_ann['points'][0][0], each_ann['points'][1][0]))bbox_top_left_y = int(min(each_ann['points'][0][1], each_ann['points'][1][1]))bbox_bottom_right_y = int(max(each_ann['points'][0][1], each_ann['points'][1][1]))# 框中心點的 XY 像素坐標bbox_center_x = int((bbox_top_left_x + bbox_bottom_right_x) / 2)bbox_center_y = int((bbox_top_left_y + bbox_bottom_right_y) / 2)# 框寬度bbox_width = bbox_bottom_right_x - bbox_top_left_x# 框高度bbox_height = bbox_bottom_right_y - bbox_top_left_y# 框中心點歸一化坐標bbox_center_x_norm = bbox_center_x / img_widthbbox_center_y_norm = bbox_center_y / img_height# 框歸一化寬度bbox_width_norm = bbox_width / img_width# 框歸一化高度bbox_height_norm = bbox_height / img_heightyolo_str += '{:.5f} {:.5f} {:.5f} {:.5f} '.format(bbox_center_x_norm, bbox_center_y_norm,bbox_width_norm, bbox_height_norm)## 找到該框中所有關鍵點,存在字典 bbox_keypoints_dict 中bbox_keypoints_dict = {}for each_ann in labelme['shapes']:  # 遍歷所有標注if each_ann['shape_type'] == 'point':  # 篩選出關鍵點標注# 關鍵點XY坐標、類別x = int(each_ann['points'][0][0])y = int(each_ann['points'][0][1])label = each_ann['label']if (x > bbox_top_left_x) & (x < bbox_bottom_right_x) & (y < bbox_bottom_right_y) & (y > bbox_top_left_y):  # 篩選出在該個體框中的關鍵點bbox_keypoints_dict[label] = [x, y]## 把關鍵點按順序排好for each_class in keypoint_class:  # 遍歷每一類關鍵點if each_class in bbox_keypoints_dict:keypoint_x_norm = bbox_keypoints_dict[each_class][0] / img_widthkeypoint_y_norm = bbox_keypoints_dict[each_class][1] / img_heightyolo_str += '{:.5f} {:.5f} {} '.format(keypoint_x_norm, keypoint_y_norm,2)  # 2-可見不遮擋 1-遮擋 0-沒有點else:  # 不存在的點,一律為0yolo_str += '0 0 0 '# 寫入 txt 文件中f.write(yolo_str + '\n')shutil.move(yolo_txt_path, save_folder)print('{} --> {} 轉換完成'.format(labelme_path, yolo_txt_path))os.chdir('label_json/train')save_folder = '../../labels/train'
for labelme_path in os.listdir():try:process_single_json(labelme_path, save_folder=save_folder)except:print('******有誤******', labelme_path)
print('YOLO格式的txt標注文件已保存至 ', save_folder)os.chdir('../../')os.chdir('label_json/val')save_folder = '../../labels/val'
for labelme_path in os.listdir():try:process_single_json(labelme_path, save_folder=save_folder)except:print('******有誤******', labelme_path)
print('YOLO格式的txt標注文件已保存至 ', save_folder)os.chdir('../../')os.chdir('../')

在這里插入圖片描述
4.3 構造yaml
直接拷貝…\ultralytics-main\ultralytics\cfg\models\11\yolo11-pose.yaml
修改內容如下:
在這里插入圖片描述
4.4 開始訓練模型
先下載預訓練模型 yolo11n.pt yolo11n-pose.pt
然后直接訓練,先不看詳細訓練參數,先能跑起來

from ultralytics import YOLO
import cv2
# #訓練
model = YOLO("./yolo11n-pose.pt")
model.train(data = "...../ultralytics-main_0829/ultralytics-main/yolo11-pose.yaml",workers=0,epochs=640,batch=8)

跑起來了
在這里插入圖片描述
4.5 開始預測結果

yolo = YOLO("best.pt", task = "detect")
result = yolo(source=".../ultralytics-main_0829/ultralytics-main/datasets/PepperGrab/images/val",conf=0.4,vid_stride=1,iou=0.3,save = True)

圖已刪
效果一般般,起碼是把流程走通了,精度后面再看吧

4.6 移植到C++測試
后面再說吧

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

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

相關文章

uniApp 混合開發全指南:原生與跨端的協同方案

uniApp 作為跨端框架&#xff0c;雖能覆蓋多數場景&#xff0c;但在需要調用原生能力&#xff08;如藍牙、傳感器&#xff09;、集成第三方原生 SDK&#xff08;如支付、地圖&#xff09; 或在現有原生 App 中嵌入 uniApp 頁面時&#xff0c;需采用「混合開發」模式。本文將系統…

【大模型】使用MLC-LLM轉換和部署Qwen2.5 0.5B模型

目錄 ■準備工作 下載模型 安裝依賴 安裝基礎依賴 安裝mlc-llm ■權重轉換 ■生成配置文件 ■模型編譯 GPU版本編譯 CPU版本編譯 ■啟動服務 啟動GPU服務 啟動CPU服務 ■服務測試 ■擴展 優化量化版本(可選,節省內存) INT4量化版本 調整窗口大小以節省內存…

云計算學習100天-第43天-cobbler

目錄 Cobbler 基本概念 命令 搭建cobbler 網絡架構 Cobbler 基本概念 Cobbler是一款快速的網絡系統部署工具&#xff0c;比PXE配置簡單 集中管理所需服務&#xff08;DHCP、DNS、TFTP、WEB&#xff09; 內部集成了一個鏡像版本倉庫 內部集成了一個ks應答文件倉庫 提供…

接口測試:如何定位BUG的產生原因

1小時postman接口測試從入門到精通教程我們從在日常功能測試過程中對UI的每一次操作說白了就是對一個或者多個接口的一次調用&#xff0c;接口的返回的內容(移動端一般為json)經過前端代碼的處理最終展示在頁面上。http接口是離我們最近的一層接口&#xff0c;web端和移動端所展…

GPIO的8種工作方式

GPIO的8種工作方式&#xff1a;一、4 種輸入模式1.1 Floating Input 浮空輸入1.2 Pull-up Input 上拉輸入1.3 Pull-down Input 下拉輸入1.4 Analog Input 模擬輸入二、4種輸出模式2.1 General Push-Pull Output 推挽輸出2.2 General Open-Drain Output 開漏輸出2.3…

LeetCode算法日記 - Day 29: 重排鏈表、合并 K 個升序鏈表

目錄 1. 重排鏈表 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 合并 K 個升序鏈表 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 重排鏈表 143. 重排鏈表 - 力扣&#xff08;LeetCode&#xff09; 給定一個單鏈表 L 的頭節點 head &#xff0c;單鏈表 L 表示為&#xff1a; L…

算法模板(Java版)_前綴和與差分

ZZHow(ZZHow1024) &#x1f4a1; 差分是前綴和的逆運算。 前綴和 &#x1f4a1; 前綴和作用&#xff1a;快速求出 [l, r] 區間的和。 一維前綴和 例題&#xff1a;AcWing 795. 前綴和 import java.util.Scanner;public class Main {public static void main(String[] args)…

openssl使用SM2進行數據加密和數據解密

一、準備工作 1. 安裝依賴 sudo apt-get update sudo apt-get install libssl-dev2. 確認 OpenSSL 版本 openssl version如果是 1.1.1 或 3.0&#xff0c;就支持 SM2/SM3/SM4。二、C 語言示例代碼 這個程序會&#xff1a; 生成 SM2 密鑰對使用公鑰加密一段明文使用私鑰解密恢復…

用滑動窗口與線性回歸將音頻信號轉換為“Token”序列:一種簡單的音頻特征編碼方法

在深度學習和語音處理領域&#xff0c;如何將原始音頻信號有效地表示為離散的“Token”序列&#xff0c;是語音識別、音頻生成等任務中的關鍵問題。常見的方法如Mel頻譜圖向量量化&#xff08;VQ&#xff09;、wav2vec等已經非常成熟&#xff0c;但這些模型通常依賴復雜的神經網…

Vue開發準備

vs code VSCode的下載地址https://code.visualstudio.com/Download Node.js node.js的下載地址 https://nodejs.org/zh-cn/download 注意&#xff1a;nodejs安裝路徑不要和vscode安裝到同一個文件夾&#xff0c;兩個應用分別裝到兩個不同的文件夾 npm config set cache &q…

QT6(QFileSystemModel和QTreeView)

QT6QFileSystemModel和QTreeView QFileSystemModel為本機的文件系統提供一個模型&#xff0c;QFileSystemModelt和QTreeView結合使用&#xff0c;可以用目錄樹的形式顯示本機的文件系統&#xff0c;如同Windows的資源管理器一樣使用QFileSystemModel提供的接口函數&#xff0c;…

【開題答辯全過程】以 基于Spring Boot的房屋租賃系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

構建下一代智能金融基礎設施

1. 行業背景&#xff1a;從數字支付到可編程金融的范式躍遷全球數字支付市場正以萬億美元的規模持續擴張&#xff0c;但其底層系統仍受限于傳統金融的清算、結算延遲和高昂的中間成本。盡管互聯網技術提升了支付的便捷性&#xff0c;但其核心仍是中心化賬戶體系的延伸。Web3 技…

【C++】深入解析C++嵌套依賴類型與typename關鍵字

什么是嵌套依賴類型&#xff1f;嵌套依賴類型&#xff08;Nested Dependent Type&#xff09;是指在一個模板中&#xff0c;一個類型名稱依賴于模板參數&#xff0c;并且是該模板參數內部的嵌套類型。具體來說&#xff0c;當一個類型滿足以下兩個條件時&#xff0c;它就是嵌套依…

管網信息化監測主要的內容

管網信息化監測是指通過現代信息技術手段對管網系統進行實時監控和數據采集的管理方式。其背景源于城市化進程加快以及基礎設施建設規模不斷擴大&#xff0c;傳統的管網管理模式已無法滿足現代化需求。管網信息化監測主要內容包括以下幾個方面&#xff1a;█管網運行狀態監測&a…

數據泄露代價千萬,PII 保護你真的做對了嗎?

一、PII—數據隱私的核心概念解析 在大多數數據隱私法律中,可識別個人信息(PII, Personally Identifiable Information)是指任何可以用來識別個人身份的信息。然而,PII 的定義并非由單一法律統一規定,不同國家和地區的法律對其定義略有差異: 各國對 PII 的定義 美國 20…

【數據結構】八大排序之快速排序:分而治之的藝術

文章目錄快速排序1.hoare版本算法優化三數取中法小區間優化完整代碼如下算法分析時間復雜度空間復雜度2.前后指針法排序過程3.非遞歸&#xff08;棧模擬&#xff09;實現思路總結快速排序 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c;其基本思想為…

在ROS中獲取并發布UBS式傳感器的溫濕度

哈嘍大家好&#xff0c;我是鋼板獸&#xff01; 今天更新一篇和ROS相關的文章&#xff0c;有個項目需求是在ROS中獲取并發布UBS式傳感器的溫濕度&#xff0c;我使用的溫濕度傳感器簡介如下&#xff1a;DL11- MC-S1 溫濕度傳感器通過USB 接口采用標準MODBUS RTU 協議通信&#x…

【圖論】 Graph.jl 操作匯總

文章目錄圖論的集合類操作Base.getindexBase.intersectBase.joinBase.reverseBase.reverse!Base.sizeBase.sumBase.sumBase.union圖生成與轉換Graphs.cartesian_productGraphs.complementGraphs.compute_shiftsGraphs.crosspathGraphs.differenceGraphs.egonetGraphs.induced_s…

【鏈表 - LeetCode】146. LRU 緩存

146. LRU 緩存 題解&#xff1a; class LRUCache {list<pair<int,int>>v;unordered_map<int,list<pair<int,int>>::iterator>idx;int capacity; public:LRUCache(int capacity):capacity(capacity){}int get(int key) {if(idx.count(key) 0) …