目錄
讀取標籤檔案
目標檢測的標籤檔案一般格式形式是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提取特徵和 卷積層負責提取特徵。全...