通过直方图统计训练集中正负样本的数量,查看正负样本分布是否平衡
时间: 2024-04-20 16:24:38 浏览: 188
非常抱歉,作为一个文本AI模型,我无法直接查看训练集的内容或执行直方图统计。我只是在CSDN开发的ChitGPT模型中提供对话和问答的能力。关于训练集中正负样本的数量和分布,您可以自行分析和处理您的训练数据,使用Python中的数据处理和可视化库,如pandas和matplotlib,以统计和绘制直方图来了解正负样本的分布情况。如果您需要关于数据处理和可视化方面的帮助,我可以提供一些建议和示例代码。
相关问题
用SVM hog进行行人检测,给出代码(用正负样本进行训练并进行注释)
以下是使用SVM hog进行行人检测的代码,其中包括训练和测试。
训练部分:
```python
import cv2
import numpy as np
# 加载正样本和负样本图像
pos_img = cv2.imread('pos_img.jpg')
neg_img = cv2.imread('neg_img.jpg')
# 设置 HOG 参数
win_size = (64, 128)
block_size = (16, 16)
block_stride = (8, 8)
cell_size = (8, 8)
nbins = 9
# 创建 HOG 描述符
hog = cv2.HOGDescriptor(win_size, block_size, block_stride, cell_size, nbins)
# 提取正样本和负样本的 HOG 特征
pos_hog = hog.compute(pos_img)
neg_hog = hog.compute(neg_img)
# 将正样本和负样本的 HOG 特征合并成一个训练集
train_data = np.vstack((pos_hog, neg_hog))
# 创建标签,正样本标签为 1,负样本标签为 -1
train_labels = np.hstack((np.ones(len(pos_hog)), -1*np.ones(len(neg_hog))))
# 训练 SVM 分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.trainAuto(train_data, cv2.ml.ROW_SAMPLE, train_labels)
```
测试部分:
```python
# 加载测试图像
test_img = cv2.imread('test_img.jpg')
# 设置滑动窗口参数
win_stride = (8, 8)
padding = (8, 8)
scale = 1.05
# 在测试图像上使用滑动窗口,提取 HOG 特征并进行行人检测
found, _ = hog.detectMultiScale(test_img, winStride=win_stride, padding=padding, scale=scale)
# 在检测到的行人上绘制矩形框,并显示结果
for (x, y, w, h) in found:
cv2.rectangle(test_img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Pedestrian Detection', test_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注释:
1. 首先加载正样本和负样本图像,这些图像应该是包含行人和不包含行人的图像。
2. 然后设置 HOG 参数,包括窗口大小、块大小、块步幅、单元格大小和直方图的数量。
3. 创建 HOG 描述符对象,用于提取图像的 HOG 特征。
4. 使用 `hog.compute()` 函数提取正样本和负样本的 HOG 特征,并将其合并成一个训练集。同时,为每个训练样本创建标签,正样本标签为 1,负样本标签为 -1。这些标签将用于训练 SVM 分类器。
5. 创建 SVM 分类器,并设置其类型和核函数。然后使用 `trainAuto()` 函数训练分类器。
6. 加载测试图像,并设置滑动窗口参数,包括步长、填充和缩放因子。
7. 使用 `hog.detectMultiScale()` 函数在测试图像上使用滑动窗口,提取 HOG 特征并进行行人检测。
8. 在检测到的行人上绘制矩形框,并显示结果。
查看样本大小分布,样本比例分布,样本GT与锚框的iou分布的python代码以及可视化
这里给出三个问题的 Python 代码以及可视化方法:
1. 查看样本大小分布:
```python
import matplotlib.pyplot as plt
# 计算每个样本的大小
sample_sizes = []
for sample in samples:
sample_sizes.append(len(sample))
# 绘制直方图
plt.hist(sample_sizes, bins=20, color='steelblue', edgecolor='k')
plt.xlabel('Sample Size')
plt.ylabel('Frequency')
plt.title('Distribution of Sample Sizes')
plt.show()
```
2. 查看样本比例分布:
```python
import matplotlib.pyplot as plt
# 计算每个样本的正负样本比例
sample_ratios = []
for sample in samples:
pos_num = len([bbox for bbox in sample if bbox[4] == 1])
neg_num = len(sample) - pos_num
sample_ratios.append(pos_num / neg_num)
# 绘制直方图
plt.hist(sample_ratios, bins=20, color='steelblue', edgecolor='k')
plt.xlabel('Positive/Negative Ratio')
plt.ylabel('Frequency')
plt.title('Distribution of Sample Ratios')
plt.show()
```
3. 查看样本 GT 与锚框的 IoU 分布:
```python
import matplotlib.pyplot as plt
# 计算每个样本中 GT 和锚框的 IoU
ious = []
for sample in samples:
for bbox in sample:
iou = calculate_iou(bbox[:4], gt_bbox)
ious.append(iou)
# 绘制直方图
plt.hist(ious, bins=20, color='steelblue', edgecolor='k')
plt.xlabel('IoU')
plt.ylabel('Frequency')
plt.title('Distribution of IoUs')
plt.show()
```
其中,`samples` 为样本数据,每个样本包含多个锚框(或其他检测框),`gt_bbox` 为对应的真实边界框。`calculate_iou` 为计算两个边界框 IoU 的函数。可视化结果包括直方图和标题,可以根据需要进行调整。
阅读全文