昨天已經初始化好使用的套件了,今天要來處理資料集的部分,由於標籤檔是XML的檔案,因此要對其做一些處理,這邊會提取標籤檔的資料並對每筆資料新增類別,建立成DataFrame。
資料集中共有兩個資料夾,圖片以及標籤檔,首先先創建一個資料夾並將資料解壓至裡面。
接著在Jupyter Notebook
中接續昨天初始化完的環境。
import re
dataset_path = 'r'C:\Users\使用者\Documents\projects\Car_License
def get_number_in_the_string(s):
return int(''.join(filter(str.isdigit, s)))
# 初始化一個字典用來儲存圖片以及標籤的內容
labels_dict = dict(
img_path=[],
xmin=[],
xmax=[],
ymin=[],
ymax=[],
img_width=[],
img_height=[]
)
# 提取所有的標籤檔
xml_files = glob(f'{dataset_path}\\annotations\\*.xml')
# 對XML檔案進行處理以及進行排序
for file in sorted(xml_files, key = get_number_in_the_string):
info = xet.parse(file)
root = info.getroot()
# 提取XML檔案中尋找object的元素並提取邊界框的資訊
member_object = root.find('object')
labels_info = member_object.find('bndbox')
xmin = int(labels_info.find('xmin').text)
xmax = int(labels_info.find('xmax').text)
ymin = int(labels_info.find('ymin').text)
ymax = int(labels_info.find('ymax').text)
# 取得圖片的完整路徑
img_name = root.find('filename').text
img_path = os.path.join(dataset_path, 'images', img_name)
# 確認圖片是否存在
if not os.path.exists(img_path):
print(f"Image not found: {img_path}")
continue
image = cv2.imread(img_path)
if image is None:
print(f"Failed to read image: {img_path}")
continue
# 將對應的資訊新增進字典中
height, width, _ = image.shape
labels_dict['img_path'].append(img_path)
labels_dict['xmin'].append(xmin)
labels_dict['xmax'].append(xmax)
labels_dict['ymin'].append(ymin)
labels_dict['ymax'].append(ymax)
labels_dict['img_width'].append(width)
labels_dict['img_height'].append(height)
#將字典轉為Pandas的Dataframe
alldata = pd.DataFrame(labels_dict)
#顯示Dataframe的前3行
alldata.head(3)
輸出的結果如下圖。
這樣就初步完成資料集的分類,接著會利用Scikit-learn將資料集拆分,那我們下篇見。