Stories

Detail Return Return

【深度學習】嘿馬深度學習目標檢測教程第5篇:數據集處理,2.2 目標數據集標記【附代碼文檔】 - Stories Detail

🏆🏆🏆教程全知識點簡介:涵蓋圖像識別背景、目標檢測定義和應用場景。核心算法原理包括R-CNN系列算法(R-CNN、SPPNet、Faster R-CNN、RPN原理)、YOLO算法(單次檢測、候選框機制、單元格概念)以及SSD算法(單次多框檢測器、多個Detector & classifier、訓練與測試流程)。數據處理模塊包含目標數據集標記、數據集格式轉換(TFRecords文件、VOC2007數據集)、slim庫和API使用。項目實現涉及項目結構設計、數據模塊接口、預處理和數據增強技術。模型訓練包括預訓練模型、SSD模型定義、default boxes、模型加載、變量初始化、交互式會話。模型推理涵蓋predictions篩選、bbox處理、scores排序、NMS算法。部署方案包括Web Server、TensorFlow Serving Client、環境安裝、DeploymentConfig配置。訓練主函數包含設備選擇、全局步長變量、網絡參數獲取、批處理數據隊列、多GPU/CPU平均損失計算。

<!-- start:bj1 -->

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047079328    中查看

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047234804    中查看

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

數據集處理

瞭解常用目標檢測數據集
瞭解數據集構成
瞭解數據集標記的需求
知道labelimg的標記使用
應用TensorFlow完成pascalvoc2007數據集的轉換
瞭解TensorFlow slim庫
瞭解TFRecords文件的作用
瞭解slim讀取數據流程
應用TF-slim的data模塊完成VOC2007TFRecord文件的讀取

2.2 目標數據集標記

學習目標

  • 目標

    • 瞭解數據集標記的需求
    • 知道labelimg的標記使用
  • 應用

    • 應用labelimg完成產品數據集的標記
為什麼要進行數據集標記呢?

1、提供給訓練的數據樣本,圖片和目標真是實結果

2、特定的場景都會缺少標記圖片

2.2.1 數據集標記工具介紹

2.2.1.1 介紹

LabelImg是一個圖形圖像註釋工具。它是用Python編寫的,並使用Qt作為其圖形界面。註釋以PASCAL VOC格式保存為XML文件,這是ImageNet使用的格式。

注:官網:https://github.com/tzutalin/labelImg

2.2.1.2 安裝

官網給出了不同平台的安裝教程,由於教程過於粗略。安裝細節參考安裝教程本地文件

  • 參考本地文件:

NumPy 文檔

2.2.2 產品數據集標記

在這裏 只是體驗標記的過程,那麼對於標記這個費時費力的工作,一般會有專門的數據標記團隊去做,也稱之為打標籤,標記師。特別是缺乏具體應用場景的訓練數據的時候。

2.2.2.1 需求介紹

首先在確定標記之前的需求,本項目以產品數據為例,需要明確的有

  • 1、產品圖片
  • 2、需要被標記物體有哪些

    確定了8種類別的產品(如需更細緻,可將類別產品擴大),如下圖

Python 開發者指南

2.2.2.2 標記

使用lableimg進行產品數據集標記

  • 運行labelimg
python labelImg.py

打開如下結果

  • 對圖片中的物體進行標記

PySimpleGUI 文檔

標記原則為圖片中所出現的物體與 確定的8個類別物體相匹配即可

email-validator 文檔

  • 按下ctrl+s鍵保存,軟件將會保存為默認XML文件格式(XML文件名與圖片文件名保持一致方便後續處理)

其中關於(xmin,ymin,xmax,ymax) 已經解釋過,可通過軟件標記的時候觀察是否一致

2.2.3 總結

  • 掌握labelimg的標註使用

LightGBM 文檔

2.2.4 問題

通過這樣標記數據,假設你想做一個潮流產品品牌(Nike、H&M等)或者其他具體某個子領域的大部分產品的識別模型,你的數據集怎麼準備?

數據集處理

瞭解常用目標檢測數據集
瞭解數據集構成
瞭解數據集標記的需求
知道labelimg的標記使用
應用TensorFlow完成pascalvoc2007數據集的轉換
瞭解TensorFlow slim庫
瞭解TFRecords文件的作用
瞭解slim讀取數據流程
應用TF-slim的data模塊完成VOC2007TFRecord文件的讀取

2.3 數據集格式轉換

學習目標

  • 目標

    • 瞭解TFRecords文件的作用
  • 應用

    • 應用TensorFlow完成pascalvoc2007數據集的轉換

首先來看下轉換的效果:

為什麼要進行格式轉換?

數據集的圖片以及標記文件分佈在不同的文件當中,並且圖片與標籤沒有一一對應。在後續項目當中不方便處理,也不方便項目的解耦合,需要將數據集轉換成一個標準、統一使用、方便賦值移動到其他模塊當中。

2.3.2 TFRecords文件

cryptography 文檔

TensorFlow提供了TFRecord的格式來統一存儲數據,TFRecord格式是一種將圖像數據和各種標籤放在一起的二進制文件,在tensorflow中快速的複製、移動、讀取、存儲。特點:

  • 文件格式:.tfrecord or.tfrecords
  • 寫入文件內容:使用Example將數據封裝成protobuffer協議格式

    • 體積小:消息大小隻需要xml的1/10~1/3
    • 解析速度快:解析速度比xml快20~100倍
  • 每個example對應一張圖片,其中包括圖片的各種信息

2.3.3 案例:VOC2007數據集轉換

2.3.3.1 轉換效果顯示

2.3.3.2 TensorFlow API

gfile讀取模塊

  • tf.gfile.MakeDirs(dirname):

    • 以遞歸方式建立父目錄及其子目錄,如果目錄已存在且是可覆蓋則會創建成功,否則報錯,無返回
  • tf.gfile.Exists(filename):

    • 判斷目錄或文件是否存在,filename可為目錄路徑或帶文件名的路徑,有該目錄則返回True,否則False
  • tf.gfile.FastGFile(filename, mode):

    • 該函數與tf.gfile.GFile的差別僅僅在於“無阻塞”,即該函數會無阻賽以較快的方式獲取文本操作句柄

建立TFRecord存儲器

  • tf.python_io.TFRecordWriter(path)

    • 寫入tfrecords文件
    • path: TFRecords文件的路徑
    • return:寫文件
    • method

      • write(record):向文件中寫入一個example
      • close():關閉文件寫入器

        注:字符串為一個序列化的Example,Example.SerializeToString()

構造每個樣本的Example協議塊

  • tf.train.Example(features=None)

    • 寫入tfrecords文件
    • features:tf.train.Features類型的特徵實例
    • return:example格式協議塊
  • tf.train.Features(feature=None)

    • 構建每個樣本的信息鍵值對
    • feature:字典數據,key為要保存的名字,value為tf.train.Feature實例
    • return:Features類型
  • tf.train.Feature(**options)

    • **options:例如
    • bytes_list=tf.train. BytesList(value=[Bytes])
    • int64_list=tf.train. Int64List(value=[Value])

處理XML庫

  • import xml.etree.ElementTree as ET

    • tree = et.parse(filename):形成樹狀結構
    • tree.getroot():獲取樹結構的根部分
    • root.find與findall()進行查詢XML每個標籤的內容.text
2.3.3.2 轉換步驟
  • 1、存入多個tfrecord文件,每個文件固定N個樣本
  • 2、讀取每張圖片內容以及XML文件
  • 3、將每次讀取內容寫入tfrecord文件
2.3.3.3 代碼

首先導入需要用到的庫以及相關設置

import os
import tensorflow as tf
import xml.etree.ElementTree as ET

from datasets.utils.dataset_utils import int64_feature, float_feature, bytes_feature
from datasets.dataset_config import DIRECTORY_ANNOTATIONS, SAMPLES_PER_FILES, DIRECTORY_IMAGES, VOC_LABELS

SQLAlchemy 文檔

代碼結構按照如下目錄結構

pytz 文檔

dataset_utils當中存放常用代碼,dataset_config存放一些配置,先看配置

  
  
# 原始圖片的XML和JPG的文件名
  
  

DIRECTORY_ANNOTATIONS = "Annotations/"


DIRECTORY_IMAGES = "JPEGImages/"

  
  
# 每個TFRecords文件的example個數
  
  
SAMPLES_PER_FILES = 200
  • 1、存入多個tfrecord文件,每個文件固定N個樣本

logging 文檔

def run(dataset_dir, output_dir, name="data"):
    """
    存入多個tfrecords文件,每個文件通常會固定樣本的數量
    :param dataset_dir: 數據集目錄
    :param output_dir: tfrecord輸出目錄
    :param name: 數據集名字
    :return:
    """
    # 1、判斷數據集的路徑是否存在,如果不存在新建一個文件夾
    if tf.gfile.Exists(dataset_dir):
        tf.gfile.MakeDirs(dataset_dir)

    # 2、去Annotations讀取所有的文件名字列表,與JPEGImages一樣的數據量
    # 構造文件的完整路徑
    path = os.path.join(dataset_dir, DIRECTORY_ANNOTATIONS)
    # 排序操作,因為會打亂文件名的前後順序
    filenames = sorted(os.listdir(path))

    # 3、循環列表中的每個文件
    # 建立一個tf.python_io.TFRecordWriter(path)存儲器
    # 標記每個TFRecords存儲200個圖片和相關XML信息
    # 所有的樣本標號
    i = 0
    # 記錄存儲的文件標號
    fidx = 0
    while i < len(filenames):
        # 新建一個tfrecords文件
        # 構造一個文件名字
        tf_filename = _get_output_filename(output_dir, name, fidx)

        with tf.python_io.TFRecordWriter(tf_filename) as tfrecord_writer:
            j = 0

            # 處理200個圖片文件和XML
            while i < len(filenames) and j < SAMPLES_PER_FILES:
                print("轉換圖片進度 %d/%d" % (i+1, len(filenames)))

                # 處理圖片,讀取的此操作
                # 處理每張圖片的邏輯
                # 1、讀取圖片內容以及圖片相對應的XML文件
                # 2、讀取的內容封裝成example, 寫入指定tfrecord文件
                filename = filenames[i]
                img_name = filename[:-4]

                _add_to_tfrecord(dataset_dir, img_name, tfrecord_writer)

                i += 1
                j += 1

            # 當前TFRecords處理結束
            fidx += 1

    print("完成數據集 %s 所有的樣本處理" % name)

存入的邏輯,給文件名字進行format

def _get_output_filename(output_dir, name, number):
    return "%s/%s_%03d.tfrecord" % (output_dir, name, number)
def _add_to_tfrecord(dataset_dir, img_name, tfrecord_writer):
    """
    # 1、讀取圖片內容以及圖片相對應的XML文件
    # 2、讀取的內容封裝成example, 寫入指定tfrecord文件
    :param dataset_dir: 數據集目錄
    :param img_name: 該圖片名字
    :param tfrecord_writer: tfrecord文件的符號
    :return:
    """
    # 1、讀取圖片內容以及圖片相對應的XML文件
    image_data, shape, bboxes, difficult, truncated, labels, labels_text = \
        _process_image(dataset_dir, img_name)
user avatar jingdongkeji Avatar longlong688 Avatar u_16640205 Avatar u_15714439 Avatar aijianshendexuegao Avatar mianlengxincidehongjiu Avatar kongsq Avatar Poetwithapistol Avatar kongxudexiaoxiongmao Avatar xiaohe0601 Avatar snowwolfarden Avatar defghy Avatar
Favorites 32 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.