動手學深度學習13.6. 目標檢測數據集-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記,以及對課后練習的一些思考,自留回顧,也供同學之人交流參考。

本節課程地址:數據集_嗶哩嗶哩_bilibili

本節教材地址:13.6. 目標檢測數據集 — 動手學深度學習 2.0.0 documentation

本節開源代碼:…>d2l-zh>pytorch>chapter_optimization>object-detection-dataset.ipynb


目標檢測數據集

目標檢測領域沒有像MNIST和Fashion-MNIST那樣的小數據集。
為了快速測試目標檢測模型,[我們收集并標記了一個小型數據集]。
首先,我們拍攝了一組香蕉的照片,并生成了1000張不同角度和大小的香蕉圖像。
然后,我們在一些背景圖片的隨機位置上放一張香蕉的圖像。
最后,我們在圖片上為這些香蕉標記了邊界框。

[下載數據集]

包含所有圖像和CSV標簽文件的香蕉檢測數據集可以直接從互聯網下載。

%matplotlib inline
import os
import pandas as pd
import torch
import torchvision
from d2l import torch as d2l
#@save
d2l.DATA_HUB['banana-detection'] = (d2l.DATA_URL + 'banana-detection.zip','5de26c8fce5ccdea9f91267273464dc968d20d72')

讀取數據集

通過read_data_bananas函數,我們[讀取香蕉檢測數據集]。
該數據集包括一個的CSV文件,內含目標類別標簽和位于左上角和右下角的真實邊界框坐標。

#@save
def read_data_bananas(is_train=True):"""讀取香蕉檢測數據集中的圖像和標簽"""data_dir = d2l.download_extract('banana-detection')csv_fname = os.path.join(data_dir, 'bananas_train' if is_trainelse 'bananas_val', 'label.csv')csv_data = pd.read_csv(csv_fname)csv_data = csv_data.set_index('img_name')images, targets = [], []for img_name, target in csv_data.iterrows():images.append(torchvision.io.read_image(os.path.join(data_dir, 'bananas_train' if is_train else'bananas_val', 'images', f'{img_name}')))# 這里的target包含(類別,左上角x,左上角y,右下角x,右下角y),# 其中所有圖像都具有相同的香蕉類(索引為0)targets.append(list(target))# /256將像素坐標從[0,256]歸一化到[0,1]return images, torch.tensor(targets).unsqueeze(1) / 256

通過使用read_data_bananas函數讀取圖像和標簽,以下BananasDataset類別將允許我們[創建一個自定義Dataset實例]來加載香蕉檢測數據集。

#@save
class BananasDataset(torch.utils.data.Dataset):"""一個用于加載香蕉檢測數據集的自定義數據集"""def __init__(self, is_train):self.features, self.labels = read_data_bananas(is_train)print('read ' + str(len(self.features)) + (f' training examples' ifis_train else f' validation examples'))def __getitem__(self, idx):return (self.features[idx].float(), self.labels[idx])def __len__(self):return len(self.features)

最后,我們定義load_data_bananas函數,來[為訓練集和測試集返回兩個數據加載器實例]。對于測試集,無須按隨機順序讀取它。

#@save
def load_data_bananas(batch_size):"""加載香蕉檢測數據集"""train_iter = torch.utils.data.DataLoader(BananasDataset(is_train=True),batch_size, shuffle=True)val_iter = torch.utils.data.DataLoader(BananasDataset(is_train=False),batch_size)return train_iter, val_iter

讓我們[讀取一個小批量,并打印其中的圖像和標簽的形狀]。
圖像的小批量的形狀為(批量大小、通道數、高度、寬度),看起來很眼熟:它與我們之前圖像分類任務中的相同。
標簽的小批量的形狀為(批量大小,mmm,5),其中mmm是數據集的任何圖像中邊界框可能出現的最大數量。

小批量計算雖然高效,但它要求每張圖像含有相同數量的邊界框,以便放在同一個批量中。
通常來說,圖像可能擁有不同數量個邊界框;因此,在達到mmm之前,邊界框少于mmm的圖像將被非法邊界框填充。
這樣,每個邊界框的標簽將被長度為5的數組表示。
數組中的第一個元素是邊界框中對象的類別,其中-1表示用于填充的非法邊界框。
數組的其余四個元素是邊界框左上角和右下角的(xxxyyy)坐標值(值域在0~1之間)。
對于香蕉數據集而言,由于每張圖像上只有一個邊界框,因此m=1m=1m=1

batch_size, edge_size = 32, 256
train_iter, _ = load_data_bananas(batch_size)
# 取出第一個batch
batch = next(iter(train_iter))
batch[0].shape, batch[1].shape
read 1000 training examples
read 100 validation examples(torch.Size([32, 3, 256, 256]), torch.Size([32, 1, 5]))

[演示]

讓我們展示10幅帶有真實邊界框的圖像。
我們可以看到在所有這些圖像中香蕉的旋轉角度、大小和位置都有所不同。
當然,這只是一個簡單的人工數據集,實踐中真實世界的數據集通常要復雜得多。

# 因為每個像素值的范圍是[0, 255],0是純黑,255是純白
# /255是將像素值從[0, 255]?歸一化??到[0, 1]
imgs = (batch[0][0:10].permute(0, 2, 3, 1)) / 255
axes = d2l.show_images(imgs, 2, 5, scale=2)
for ax, label in zip(axes, batch[1][0:10]):# * edge_size返回原尺寸d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])

在這里插入圖片描述

小結

  • 我們收集的香蕉檢測數據集可用于演示目標檢測模型。
  • 用于目標檢測的數據加載與圖像分類的數據加載類似。但是,在目標檢測中,標簽還包含真實邊界框的信息,它不出現在圖像分類中。

練習

  1. 在香蕉檢測數據集中演示其他帶有真實邊界框的圖像。它們在邊界框和目標方面有什么不同?

解:
不同圖像中的邊界框的縮放比scale、寬高比ratio、旋轉角度以及在圖像中的位置不同,與背景圖的色彩對比度也不同。

  1. 假設我們想要將數據增強(例如隨機裁剪)應用于目標檢測。它與圖像分類中的有什么不同?提示:如果裁剪的圖像只包含物體的一小部分會怎樣?

解:
對于圖像分類任務,僅需增強圖像,且保證圖像分類的主體可識別即可。
但對于目標檢測任務,需要同時增強圖像和邊界框,并且需要同步調整邊界框坐標,同時需要保證目標以及目標相關圖像的完整性,否則可能導致數據增強后圖像檢測無效。因此,目標檢測的數據增強要求更高。

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

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

相關文章

Unity3D游戲內存優化指南

前言 Unity3D 游戲的內存控制是保證游戲流暢運行(尤其在移動端和主機平臺)和避免崩潰的關鍵挑戰。以下是核心策略和常見問題的解決方案: 對惹,這里有一個游戲開發交流小組,希望大家可以點擊進來一起交流一下開發經驗…

git學習:首次創建倉庫

文章目錄前言:1、首次創建倉庫并上傳數據1.1 創建倉庫,1.2 命令上傳1.3 首次代碼上傳至倉庫的步驟:2、分支操作2.1 分支的刪除2.2 切換分支2.3 查看分支2.4 同步其他分支的修改3、查看電腦的配置文件4、遠程倉庫命令 git remote5、其他后語前…

C++并行計算:OpenMP與MPI全解析

在高性能計算領域,充分利用硬件資源的并行計算技術已成為剛需。從單節點多核到跨節點集群,開發者需要掌握不同的并行編程模型。本文將系統講解兩種主流并行技術:OpenMP(共享內存多核并行)與MPI(分布式內存集…

TCP 動態選路協議全面研究:OSPF、BGP 與 IS-IS 的比較與應用分析

一、引言:動態選路協議概述 在現代計算機網絡中,路由選擇是數據傳輸的核心功能,它決定了數據包從源到目的地的路徑選擇。隨著網絡規模的不斷擴大和復雜性的增加,靜態路由已經無法滿足網絡動態變化的需求,動態路由協議…

OpenCV 圖像哈希類cv::img_hash::AverageHash

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::img_hash::AverageHash是OpenCV中用于圖像哈希(Image Hashing)的一個類,屬于opencv_img_hash模塊。它實現了…

【Python-網絡爬蟲】爬蟲的基礎概念介紹

目錄 一、爬蟲的介紹 1.1 爬蟲的概念 1.2 爬蟲的作用 1. 搜索引擎數據索引 2. 商業數據采集與分析 3. 輿情監控與社交分析 4. 學術研究與數據挖掘 5. 信息聚合與服務優化 二、爬蟲的分類 三、爬蟲的基本流程 3.1 基本流程 3.2 Robots協議 一、爬蟲的介紹 1.1 爬蟲的…

力扣-31.下一個排列

題目鏈接 31.下一個排列 class Solution {public void nextPermutation(int[] nums) {//1.從右往左找第一個非逆序的數aint left nums.length - 2; //這里是為了找不到順序對的時候正好停在-1while (left > 0 && nums[left] > nums[left 1]) { //一定要取等號…

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

1. 引言 在當今數字化時代,姓名作為個人身份的重要標識,在許多領域都有著廣泛的應用需求。例如,在客戶關系管理系統中,準確解析姓名可以幫助企業更好地了解客戶背景;在學術研究中,分析作者姓名分布有助于發現研究團隊的地域特征;在社交網絡分析中,姓名信息可以輔助進行…

Android中MVI架構詳解

博主前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住也分享一下給大家 ??點擊跳轉到教程 什么是 MVI 架構? MVI (Model-View-Intent) 是一種單向數據流的架構模式,它源于響應式編程思想。在 MVI 中: 架構圖: 1、Model: 代表的是UI 狀態,它包含了…

AutoGen-AgentChat-3-人機交互

import os from dotenv import load_dotenvload_dotenv()True人機交互 在上一節“團隊”中,我們了解了如何創建、觀察和控制代理團隊。本節將重點介紹如何在應用程序中與團隊進行交互,并向團隊提供人工反饋。 您可以通過兩種主要方式從您的應用程序與團隊…

Flink Db2 CDC 環境配置與驗證

一、DB2 數據庫核心配置 1. 啟用數據庫日志記錄與CDC支持 -- 以DB2管理員身份連接數據庫 CONNECT TO mydb USER db2inst1 USING password;-- 啟用數據庫歸檔日志模式(CDC依賴) UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 DISK:/db2log/archive…

初識單例模式

文章目錄場景通點定義實現思路六種 Java 實現餓漢式懶漢式synchronized 方法雙重檢查鎖 Double Check Lock Volatile靜態內部類 Singleton Holder枚舉單例單例運用場景破解單例模式參考場景通點 資源昂貴:數據庫連接池、線程池、日志組件,只需要一份全…

音樂搶單源碼(連單卡單/疊加組規則/打針/多語言)

簡介: 測試環境:Nginx、PHP7.2、MySQL5.6,運行目錄設置為public,偽靜態thinkphp,建議開啟SSL 測試語言:11種 不知道誰給我的一套,說是買來的,我看了一下功能感覺也一般&#…

分類樹查詢性能優化:從 2 秒到 0.1 秒的技術蛻變之路

在電商系統中,分類樹查詢是一個基礎且高頻的功能,然而這個看似簡單的功能背后卻隱藏著不小的性能挑戰。本文將分享我們在實際項目中對分類樹查詢功能進行五次優化的全過程,看如何將查詢耗時從 2 秒縮短至 0.1 秒,為用戶提供更流暢…

Ansible 介紹及安裝

簡介 Ansible 是一款開源的自動化工具,廣泛應用于配置管理、應用部署、任務自動化以及多節點管理等領域。它由 Michael DeHaan 于 2012 年創建,ansible 目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,并且上手…

超光譜相機的原理和應用場景

超光譜相機是光譜成像技術的尖端形態,具備亞納米級光譜分辨率與超千波段連續覆蓋能力,通過“圖譜合一”的三維數據立方體實現物質的精準識別與分析。其核心技術架構、應用場景及發展趨勢如下:一、核心技術原理1、?分光機制??干涉分光?&am…

掌握MySQL函數:高效數據處理指南

? 在 MySQL 數據庫管理系統中,函數扮演著極為重要的角色。它們就像是數據庫操作的得力助手,能夠幫助開發者高效地完成各種數據處理任務。本文將深入探討 MySQL 函數的方方面面,從其基本概念到實際應用,幫助讀者全面掌握這一強大的…

10.SpringBoot的統一異常處理詳解

文章目錄1. 異常處理基礎概念1.1 什么是異常處理1.2 為什么需要統一異常處理1.3 Spring異常處理機制2. SpringBoot默認異常處理2.1 默認錯誤頁面2.2 自定義錯誤頁面3. 全局異常處理器3.1 基礎全局異常處理器3.2 統一響應格式3.3 使用統一響應格式的異常處理器4. 自定義異常4.1 …

No Hack No CTF 2025Web部分個人WP

No Hack No CTF 2025 Next Song is 春日影 hint:NextJS Vulnerability at /adminCVE-2025-29927Next.js 中間件權限繞過漏洞 訪問admin路由發現跳轉利用CVE: curl -i \-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:m…