太简单了,我的数据集图像在images文件夹中,xml标签文件在annations文件夹中,根据这个写出代码
时间: 2024-02-22 19:00:03 浏览: 151
医学图像目标检测数据集:肺结节CT图像目标检测数据集(VOC标注格式的xml文件)
5星 · 资源好评率100%
好的,那我假设你的数据集中每张图片只对应一个标注文件,以下是可以实现分析样本大小分布、样本比例分布和样本 GT 与锚框的 IoU 分布的 Python 代码:
```python
import os
import cv2
import xml.etree.ElementTree as ET
import numpy as np
import matplotlib.pyplot as plt
# 图像和标注文件所在目录
image_dir = "images"
annotation_dir = "annotations"
# 获取所有图像和标注文件路径
image_paths = [os.path.join(image_dir, file) for file in os.listdir(image_dir)]
annotation_paths = [os.path.join(annotation_dir, file) for file in os.listdir(annotation_dir)]
# 样本数据列表,每个元素为一个样本(图像、标注文件路径、锚框等信息)
samples = []
# 遍历每个图像和标注文件,生成样本数据
for image_path, annotation_path in zip(image_paths, annotation_paths):
# 加载图像和标注文件
image = cv2.imread(image_path)
tree = ET.parse(annotation_path)
root = tree.getroot()
# 获取图像大小
image_h, image_w, _ = image.shape
# 获取所有边界框的信息
bboxes = []
for obj in root.findall("object"):
bbox = obj.find("bndbox")
xmin = int(bbox.find("xmin").text)
ymin = int(bbox.find("ymin").text)
xmax = int(bbox.find("xmax").text)
ymax = int(bbox.find("ymax").text)
bboxes.append([xmin, ymin, xmax, ymax])
# 生成样本数据
if len(bboxes) > 0:
samples.append({
"image_path": image_path,
"annotation_path": annotation_path,
"image_size": (image_w, image_h),
"bboxes": np.array(bboxes)
})
# 计算每个样本的大小和正负样本比例
sample_sizes = []
sample_ratios = []
for sample in samples:
image_w, image_h = sample["image_size"]
bbox_w = sample["bboxes"][:, 2] - sample["bboxes"][:, 0]
bbox_h = sample["bboxes"][:, 3] - sample["bboxes"][:, 1]
sample_sizes.append(image_w * image_h)
sample_ratios.append(len(bbox_w[bbox_w > 0]) / len(bbox_w[bbox_w == 0]))
# 绘制直方图
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].hist(sample_sizes, bins=20, color='steelblue', edgecolor='k')
axs[0].set_xlabel('Sample Size')
axs[0].set_ylabel('Frequency')
axs[0].set_title('Distribution of Sample Sizes')
axs[1].hist(sample_ratios, bins=20, color='steelblue', edgecolor='k')
axs[1].set_xlabel('Positive/Negative Ratio')
axs[1].set_ylabel('Frequency')
axs[1].set_title('Distribution of Sample Ratios')
ious = []
for sample in samples:
image = cv2.imread(sample["image_path"])
for bbox in sample["bboxes"]:
iou = calculate_iou(bbox, gt_bbox)
ious.append(iou)
axs[2].hist(ious, bins=20, color='steelblue', edgecolor='k')
axs[2].set_xlabel('IoU')
axs[2].set_ylabel('Frequency')
axs[2].set_title('Distribution of IoUs')
plt.show()
```
其中,`image_dir` 和 `annotation_dir` 分别指定了图像和标注文件所在的目录,`calculate_iou` 函数计算两个边界框的 IoU。可视化结果包括三个直方图,分别对应样本大小分布、样本比例分布和样本 GT 与锚框的 IoU 分布。注意,这里使用了 `subplots` 函数在一张图中绘制了三个直方图。
阅读全文