目標檢測YOLOV2 Xml檔案解析(一)

2021-10-22 23:42:05 字數 3339 閱讀 2297

目錄

讀取標籤檔案

目標檢測的標籤檔案一般格式形式是xml格式,可使用labelimg標註工具進行標註。

將全部標籤檔案與源路徑讀取出來儲存到列表中,返回,以供後續處理使用。

讀取檔案**:

檔名:xml_parse.py

# -*- coding: utf-8 -*-

import os, glob

import numpy as np

import xml.etree.elementtree as et

def paras_annotation(img_dir, ann_dir, labels):

""":param img_dir: image path

:param ann_dir: annotation xml file path

:param labels: ("class1", "class2",...,), 背景預設為0

:function: paras annotation info from xml file

:return:

"""imgs_info = #儲存所有資訊的容器列表

max_boxes = 0 #計算所有中,目標在一張中所可能出現的最大數量

# for each annotation xml file

for ann in os.listdir(ann_dir): # 遍歷資料夾中所有的xml檔案, 返回值是xml的位址

tree = et.parse(os.path.join(ann_dir, ann)) #使用xml內建函式讀取xml檔案,並返回乙個可讀取節點的控制代碼

img_info = dict() # 為每乙個標籤xml檔案建立乙個內容存放容器字典

boxes_counter = 0 # 計算該標籤檔案中所含有的目標數量

# 由於每張標籤中,目標存在數量可能大於1, 所有將object內容格式設定為列表,以存放多個object

img_info['object'] =

for elem in tree.iter(): # 遍歷xml檔案中所有的節點

if 'filename' in elem.tag: # 讀取檔名,將檔案絕對路徑儲存在字典中

img_info['filename'] = os.path.join(img_dir, elem.text)

# 讀取標籤中目標的寬,高, 通道預設為3不進行讀取

if 'width' in elem.tag:

img_info['width'] = int(elem.text)

# assert img_info['width'] == 512 #用於斷言的寬高為512 512

if 'height' in elem.tag:

img_info['height'] = int(elem.text)

# assert img_info['height'] == 512

if 'object' in elem.tag or 'part' in elem.tag: # 讀取目標框的資訊

# 目標框資訊儲存方式:x1-y1-x2-y2-label

object_info = [0, 0, 0, 0, 0] # 建立儲存目標框資訊的容器列表

boxes_counter += 1

for attr in list(elem): # 迴圈讀取子節點

if 'name' in attr.tag: # 目標名

label = labels.index(attr.text) + 1 # 返回索引值 並加1, 因為背景為0

object_info[4] = label

if 'bndbox' in attr.tag: # bndbox的資訊

for pos in list(attr):

if 'xmin' in pos.tag:

object_info[0] = int(pos.text)

if 'ymin' in pos.tag:

object_info[1] = int(pos.text)

if 'xmax' in pos.tag:

object_info[2] = int(pos.text)

if 'ymax' in pos.tag:

object_info[3] = int(pos.text)

# object shape: [n, 5],是乙個列表,但包含n個子列表,每個子列表有5個內容

# (n,5)=(max_objects_num, 5)

if boxes_counter > max_boxes:

max_boxes = boxes_counter

# the maximum boxes number is max_boxes

# 將讀取的object資訊轉化為乙個矩陣形式:[b, max_objects_num, 5]

boxes = np.zeros([len(imgs_info), max_boxes, 5])

print(boxes.shape)

imgs = # filename list

for i, img_info in enumerate(imgs_info):

# [n,5]

img_boxes = np.array(img_info['object']) # img_boxes.shape[n, 5]

# overwrite the n boxes info

boxes[i, :img_boxes.shape[0]] = img_boxes

# print(img_info['filename'], boxes[i,:5])

# imgs: list of image path

# boxes: [b,40,5]

return imgs, boxes

測試**:

# 測試**

if __name__ == "__main__":

img_path = "data\\val\\image" #路徑

annotation_path = "data\\val\\annotation" # 標籤路徑

label = ("sugarbeet", "weed") # 自定義的標籤名字,背景不寫,預設為0

img, box = paras_annotation(img_path, annotation_path, label)

print(img[0])

print(box.shape)

print(box[0])

未完待續。。。。。

目標檢測 YOLOv2總結

以下為筆記相關鏈結 推薦使用鏈結閱讀 yolov2個人總結 01.yolo v2 題目 yolo 9000 better,faster,stronger 作者 joseph redmon yolo系列的主要作者 四個問題 要解決什麼問題?在yolov1的基礎上解決小目標檢測精度 定位資訊錯誤及綜合性...

目標檢測 YOLOv2 k means方法

計算公式 已知 box 1 w 1,h1 mathbf w 1,h 1 box1 w1 h1 box2 w2 h2 mathbf w 2,h 2 box2 w2 h2 b ox 1 mathbf box1 和 box 2 mathbf box2 的交並比 j b 1,b2 min w1 w2 min...

目標檢測之YOLOv1

you only look once unified,real time object detection yolo 一體化的,實時的物體檢測 翻譯 詳解 1 2 1 yolov1框架 步驟 1 resize成448 448,分割得到7 7網格 cell 2 cnn提取特徵和 卷積層負責提取特徵。全...