(4)機器學習小白入門YOLOv :圖片標注實操手冊

(1)機器學習小白入門YOLOv :從概念到實踐
(2)機器學習小白入門 YOLOv:從模塊優化到工程部署
(3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能
(4)機器學習小白入門YOLOv :圖片標注實操手冊
(5)機器學習小白入門 YOLOv:數據需求與圖像不足應對策略
(6)機器學習小白入門 YOLOv:圖片的數據預處理
(7)機器學習小白入門 YOLOv:模型訓練詳解

對于熟悉 Python 和 YOLOv 的資深程序員而言,圖片標注是模型訓練前至關重要的環節,其質量直接影響模型的檢測精度。以下是詳細的標注過程、步驟及相關實例代碼:

一、標注前的準備工作

(一)數據集整理

首先要對收集到的圖片進行篩選和整理。去除模糊、光照異常、目標不清晰的圖片,保證數據集的有效性。同時,按照一定的比例劃分訓練集、驗證集和測試集,一般可采用 8:1:1 的比例,也可根據實際需求調整。另外,為了讓模型更好地學習,需要確保數據集中包含各種場景、角度、尺寸的目標對象。

以下是使用 Python 劃分數據集的示例代碼:

import os
import shutil
import randomdef split_dataset(image_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1):# 創建訓練集、驗證集、測試集文件夾train_dir = os.path.join(image_dir, 'train')val_dir = os.path.join(image_dir, 'val')test_dir = os.path.join(image_dir, 'test')for dir in [train_dir, val_dir, test_dir]:if not os.path.exists(dir):os.makedirs(dir)# 獲取所有圖片路徑image_files = [f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]random.shuffle(image_files)# 計算各數據集數量total = len(image_files)train_num = int(total * train_ratio)val_num = int(total * val_ratio)# 復制圖片到對應文件夾for i, file in enumerate(image_files):src = os.path.join(image_dir, file)if i < train_num:dst = os.path.join(train_dir, file)elif i < train_num + val_num:dst = os.path.join(val_dir, file)else:dst = os.path.join(test_dir, file)shutil.copy(src, dst)# 使用示例
image_directory = 'path/to/your/images'
split_dataset(image_directory)

(二)確定標注目標和類別

明確需要標注的目標對象,比如在目標檢測任務中,可能需要標注行人、車輛、交通信號燈等。然后對這些目標進行類別定義,每個類別給予唯一的標識符,方便后續的標注和模型訓練。

(三)選擇合適的標注工具

根據實際需求選擇標注工具,常用的標注工具有 LabelImg、LabelMe、VGG Image Annotator(VIA)等。對于 YOLOv 模型,通常需要輸出特定格式的標注文件(如 txt 格式),部分工具可以直接生成該格式,能減少后續格式轉換的工作。比如 LabelImg 就支持 YOLO 格式的標注,使用起來較為便捷。

二、標注實施步驟(以 LabelImg 為例)

(一)導入圖片到標注工具

  1. 打開 LabelImg 軟件,點擊左上角的 “Open Dir” 按鈕,在彈出的窗口中選擇整理好的圖片文件夾,即可將該文件夾下的所有圖片導入到工具中。
    在這里插入圖片描述

  2. 若需要批量處理圖片,可點擊 “Change Save Dir” 設置標注文件的保存路徑,確保標注文件與圖片對應存放。

(二)進行目標框標注

  1. 在工具欄中選擇 “Create RectBox” 工具。
    在這里插入圖片描述

  2. 對于當前顯示的圖片,找到目標對象,按住鼠標左鍵拖動,繪制一個能夠準確包圍目標的矩形邊界框。例如,標注一輛汽車時,邊界框應從汽車的左上角邊緣到右下角邊緣,盡量不包含過多背景,也不遺漏汽車的任何部分。
    在這里插入圖片描述

  3. 繪制完成后,松開鼠標,會彈出一個類別選擇窗口。
    在這里插入圖片描述

(三)填寫類別信息

  1. 在彈出的類別選擇窗口中,從預設的類別列表中選擇該目標對應的類別,如 “dog”。
    在這里插入圖片描述

  2. 若該類別未在列表中,可直接輸入類別名稱并點擊 “OK”,該類別會被添加到列表中供后續使用。
    在這里插入圖片描述

  3. 完成一個目標的標注后,可點擊 “Next Image”(快捷鍵 “D”)切換到下一張圖片,重復上述標注操作。

實例過程:假設要標注一批包含行人、自行車和摩托車的圖片。導入圖片文件夾后,第一張圖片中有一位行人和一輛自行車。使用 “Create RectBox” 工具分別為行人和自行車繪制邊界框,在類別選擇窗口中分別選擇 “person” 和 “bicycle”,完成標注后切換到下一張圖片繼續標注。

三、標注后的檢查與處理

(一)標注質量檢查

對標注好的圖片進行逐一檢查,查看邊界框是否準確、類別標注是否正確。可以通過隨機抽查、交叉檢查等方式提高檢查的準確性。對于發現的錯誤標注,要及時進行修正。

import osdef check_annotations(image_dir, label_dir, class_names):class_ids = {name: i for i, name in enumerate(class_names)}error_log = []for image_file in os.listdir(image_dir):if not image_file.endswith(('.jpg', '.jpeg', '.png')):continueimage_name = os.path.splitext(image_file)[0]label_file = os.path.join(label_dir, f'{image_name}.txt')# 檢查標注文件是否存在if not os.path.exists(label_file):error_log.append(f'標注文件不存在:{label_file}')continue# 檢查標注內容with open(label_file, 'r') as f:lines = f.readlines()for line_num, line in enumerate(lines, 1):parts = line.strip().split()if len(parts) != 5:error_log.append(f'{label_file}{line_num}行格式錯誤,應為5個字段')continueclass_id, x_center, y_center, width, height = partstry:class_id = int(class_id)x_center = float(x_center)y_center = float(y_center)width = float(width)height = float(height)except ValueError:error_log.append(f'{label_file}{line_num}行字段類型錯誤')continueif class_id not in class_ids.values():error_log.append(f'{label_file}{line_num}行類別ID無效:{class_id}')if not (0 <= x_center <= 1 and 0 <= y_center <= 1 and 0 <= width <= 1 and 0 <= height <= 1):error_log.append(f'{label_file}{line_num}行坐標值超出范圍')return error_log# 使用示例
class_names = ['person', 'car', 'traffic_light']
image_dir = 'path/to/train/images'
label_dir = 'path/to/train/labels'
errors = check_annotations(image_dir, label_dir, class_names)
if errors:with open('annotation_errors.txt', 'w') as f:f.write('\n'.join(errors))print(f'發現{len(errors)}個錯誤,已保存到annotation_errors.txt')
else:print('標注檢查通過')

(二)格式轉換(如需要)

雖然部分標注工具可以直接生成 YOLOv 所需的 txt 格式標注文件,但如果使用的工具生成的是其他格式(如 XML 格式),則需要進行格式轉換。可以利用 Python 編寫腳本實現格式轉換,將標注信息轉換為 YOLOv 要求的格式,即每個圖片對應一個 txt 文件,文件中每行包含類別索引、目標中心 x 坐標、目標中心 y 坐標、目標寬度、目標高度(均為相對于圖片寬度和高度的歸一化值)。

以下是將 XML 格式標注文件轉換為 YOLOv 所需 txt 格式的示例代碼:

<annotation><folder>img</folder><filename>1-0002.png</filename><path>E:\BaiduNetdiskDownload\data\img\1-0002.png</path><source><database>Unknown</database></source><size><width>386</width><height>386</height><depth>3</depth></size><segmented>0</segmented><object><name>dog</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>2</xmin><ymin>2</ymin><xmax>383</xmax><ymax>385</ymax></bndbox></object>
</annotation>

(三)數據集打包與存儲

將檢查和處理好的圖片和對應的標注文件按照訓練集、驗證集、測試集的劃分進行打包存儲。可以建立相應的文件夾結構,如 “train/images”“train/labels”“val/images”“val/labels”“test/images”“test/labels”,分別存放對應數據集的圖片和標注文件,方便后續模型訓練時調用。

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

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

相關文章

【JMeter】調試方法

文章目錄取樣器&#xff1a;發送請求、接收響應>>察看結果樹斷言&#xff1a;驗證響應>>察看結果樹提取器&#xff1a;創建變量>>調試取樣器自定義斷言&#xff1a;代碼>>日志了解JMeter的內部細節&#xff0c;排查錯誤的原因。取樣器&#xff1a;發送…

Vue框架之鉤子函數詳解

Vue框架之生命周期主要鉤子函數詳解一、Vue生命周期的整體流程二、創建階段&#xff1a;初始化組件實例2.1 beforeCreate&#xff1a;實例創建前2.2 created&#xff1a;實例創建后三、掛載階段&#xff1a;組件與DOM結合3.1 beforeMount&#xff1a;掛載前3.2 mounted&#xf…

Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)

Date: 2025-07-12 19:21:24 author: lijianzhan使用npm run dev運行前端項目時報錯&#xff0c;具體報錯信息如下&#xff1a; ERROR Failed to compile with 1 error …

JAVA后端開發——類命名規范

引言良好的命名規范是軟件工程的基石。它不僅能提升代碼的可讀性&#xff0c;還能降低團隊協作的溝通成本&#xff0c;使項目在長期迭代中更易于維護。本規范結合了業界主流實踐&#xff08;如阿里巴巴Java開發手冊&#xff09;以及現代Web應用分層架構的特點&#xff0c;旨在提…

Ubuntu2404修改國內鏡像

文章目錄1 備份原文件2 修改文件內容Ubuntu2404修改國內鏡像 2404和2204修改鏡像的方式不一致 且鏡像保存的位置也不一致&#xff0c;位置在/etc/apt/source.list.d/ubuntu.sources 參考&#xff1a;https://blog.csdn.net/Kiffy_Yam/article/details/145876447 1 備份原文件…

Chrome拓展 Video Speed Controller 等內嵌惡意后門

【高危】Chrome拓展 Video Speed Controller 等內嵌惡意后門 漏洞描述 當用戶安裝受影響版本的 Video Speed Controller 等Chrome拓展會竊取用戶的瀏覽鏈接&#xff0c;并與攻擊者可控的C2地址建立持久化連接&#xff0c;攻擊者可將用戶瀏覽器重定向到惡意網站。 MPS編號MPS…

Spring Ai Alibaba Gateway 實現存量應用轉 MCP 工具

作者簡介&#xff1a;你好&#xff0c;我是影子&#xff0c;Spring Ai Alibaba開源社區 Committer&#xff0c;持續分享Spring Ai Alibaba最新進展 業界各類AI工程相關的方案 最近有斷時間沒更了&#xff0c;熟悉我的朋友知道我剛結束完畢業旅行&#xff0c;最近也因為入職&a…

HTTP和HTTPS部分知識點

HTTP基本概念 超文本-傳輸-協議 協議 HTTP是一個用在計算機世界里的協議。它使用計算機可以理解的語言確立了一種計算機之間交流通信的規范(兩個以上的參與者)&#xff0c;以及相關的各種控制和錯誤處理方式(行為約定和規范)。傳輸 HTTP協議是一個雙向協議。是一個在計算機世界…

第10講——一元函數積分學的幾何應用

文章目錄定積分計算平面圖形的面積直角坐標系下參數方程下極坐標系下定積分計算旋轉體的體積曲邊梯形繞x軸旋轉一周所得到的旋轉體的體積曲邊梯形繞y軸旋轉一周所得到的旋轉體的體積平面曲線繞定直線旋轉定積分計算函數的平均值定積分計算平面光滑曲線的弧長曲線L繞x軸旋轉一周…

Go從入門到精通(20)-一個簡單web項目-服務搭建

Go從入門到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09; Go從入門到精通&#xff08;9&#xff09;-函數 文章目錄Go從入門到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09;Go從入門到精通&#xff08;9&#xff09;-函數前言gogin…

Python爬蟲實戰:研究python-docx庫相關技術

1. 引言 1.1 研究背景與意義 隨著學術資源數字化程度的提高,科研工作者面臨海量文獻數據的篩選與分析挑戰。傳統人工調研方式效率低下,難以全面捕捉研究領域的動態趨勢。自動化文獻分析系統能夠通過爬蟲技術快速采集多源數據,并通過文本挖掘提取關鍵信息,為研究方向選擇、…

Django中序列化與反序列化

1&#xff1a;序列化&#xff1a;將數據結構或對象狀態轉換為可以存儲或傳輸的格式&#xff08;如JSON、XML&#xff09;的過程。在Web開發中&#xff0c;通常是將模型實例&#xff08;或查詢集&#xff09;轉換為JSON格式&#xff0c;以便通過HTTP響應發送給客戶端。序列化&am…

【離線數倉項目】——電商域DWD層開發實戰

摘要本文主要介紹了離線數倉項目中電商域DWD層的開發實戰。DWD層是數據倉庫架構中的明細數據層&#xff0c;對ODS層的原始數據進行清洗、規范、整合與業務建模。它具有數據清洗、標準化、業務建模、整合、維度掛載等作用&#xff0c;常見設計特征包括一致性、明細級建模、保留歷…

爬蟲-正則使用

1.模塊選擇用re模塊導入&#xff0c;&#xff0c;最前面加個r&#xff0c;就不用怕轉義了2.模塊使用re.findall使用結果是數組方式呈現re.finditer把結果變成迭代器&#xff0c;從迭代器類中間取數re.searchre.search 只能匹配到第一個識別到的內容re.match3.推薦寫法先預加載完…

python-range函數

文章目錄基本用法重要特性與列表轉換注意事項遍歷回去列表的元素索引range()是Python中用于生成數字序列的內置函數&#xff0c;常用于循環和序列生成。基本用法 range(stop) # 生成0到stop-1的整數序列 range(start, stop) # 生成start到stop-1的整數序列 r…

汽車功能安全-軟件集成和驗證(Software Integration Verification)【目的、驗證輸入、集成驗證要求】9

文章目錄1 目的2 驗證輸入3 軟件集成要求3.1 要求和建議3.2 汽車行業示例&#xff08;混合動力控制器軟件&#xff09;4 驗證要求1 目的 軟件集成和驗證階段的核心目標是證明集成后的軟件單元&#xff08;模塊、組件&#xff09;已經正確地開發出來&#xff0c;滿足了所有的功…

每天一個前端小知識 Day 27 - WebGL / WebGPU 數據可視化引擎設計與實踐

WebGL / WebGPU 數據可視化引擎設計與實踐&#x1f3af; 一、為什么前端需要 WebGL / WebGPU&#xff1f; 傳統的圖表庫如 ECharts、Highcharts 基于 Canvas 或 SVG&#xff0c;適合 2D 渲染&#xff0c;但&#xff1a; 當數據量 > 1 萬時&#xff0c;SVG 性能瓶頸明顯&…

JavaScript代碼段注入:動態抓取DOM元素的原理與實踐

1.F12打開網頁說明&#xff1a;以百度網站為例。通過插入代碼塊抓取當前網頁dom元素。2.新代碼段說明&#xff1a;點擊源代碼/來源菜單項下面的代碼段。點擊新代碼段新增代碼段。下面以腳本代碼段#6為例。3.編寫代碼塊說明&#xff1a;編寫javascript代碼&#xff0c;點擊下面的…

Spring Easy

Spring Easy 用途 通過自動配置&#xff0c;實現了一些國內 Spring Boot 開發時需要在 Spring Boot 框架基礎上完成的一些配置工作&#xff0c;可以提升基于 Spring Boot 開發 Web 應用的效率。 安裝 使用 Maven 進行包管理&#xff0c;可以從中央倉庫安裝依賴&#xff1a;…

【Node.js】文本與 pdf 的相互轉換

pdf 轉文本 主要使用 pdf-parse 這個庫&#xff0c;直接識別提取我們 pdf 文件中的文字。 const express require("express"); const fs require("fs"); const PDFParser require("pdf-parse"); const cors require("cors");const…