交通标志识别学习指南
立即解锁
发布时间: 2025-09-01 01:15:14 阅读量: 2 订阅数: 10 AIGC 

### 交通标志识别学习指南
#### 1. GTSRB 数据集介绍
GTSRB 数据集包含超过 50,000 张属于 43 个类别的交通标志图像。该数据集在 2011 年国际神经网络联合会议(IJCNN)的分类挑战中被专业人士使用。它规模大、组织有序、开源且有标注,非常适合用于交通标志识别的机器学习任务。
虽然实际的交通标志不一定是方形的,也不一定位于每张图像的中心,但数据集配有一个标注文件,用于指定每个标志的边界框。在进行机器学习之前,了解数据集的特性和挑战是个不错的主意,具体做法如下:
- 手动查看数据,了解其特征。
- 阅读数据描述(如果页面上有),以确定哪种模型可能最适用。
以下代码展示了如何加载并随机绘制训练数据集的 15 个样本,重复 100 次,以便分页查看数据:
```python
if __name__ == '__main__':
train_data, train_labels = load_training_data(labels=None)
np.random.seed(75)
for _ in range(100):
indices = np.arange(len(train_data))
np.random.shuffle(indices)
for r in range(3):
for c in range(5):
i = 5 * r + c
ax = plt.subplot(3, 5, 1 + i)
sample = train_data[indices[i]]
ax.imshow(cv2.resize(sample, (32, 32)), cmap=cm.Greys_r)
ax.axis('off')
plt.tight_layout()
plt.show()
np.random.seed(np.random.randint(len(indices)))
```
另一个策略是从 43 个类别中各绘制 15 个样本,观察同一类别图像的变化。从这个小数据样本中可以明显看出,该数据集对任何分类器来说都是一个挑战。标志的外观会因视角(方向)、观看距离(模糊度)和光照条件(阴影和亮点)而发生巨大变化。
#### 2. 数据集解析
GTSRB 数据集有 21 个可下载的文件。为了更具教育意义,我们选择使用原始数据,下载官方训练数据(GTSRB_Final_Training_Images.zip)用于训练,以及 2011 年 IJCNN 竞赛中使用的官方训练数据集(GTSRB-Training_fixed.zip)用于评分。
我们选择分别下载训练和测试数据,而不是从一个数据集中构建自己的训练/测试数据。因为经过探索发现,通常有 30 张来自不同距离的同一标志图像看起来非常相似。将这些图像放在不同的数据集中会使问题出现偏差,即使模型的泛化能力可能不佳,也会得到很好的结果。
以下是从哥本哈根大学数据存档下载数据的函数:
```python
ARCHIVE_PATH = 'https://sid.erda.dk/public/archives/daaeac0d7ce1152aea9b61d9f1e19370/'
def _download(filename, *, md5sum=None):
write_path = Path(__file__).parent / filename
if write_path.exists() and _md5sum_matches(write_path, md5sum):
return write_path
response = requests.get(f'{ARCHIVE_PATH}/{filename}')
response.raise_for_status()
with open(write_path, 'wb') as outfile:
outfile.write(response.content)
return write_path
```
该代码会检查文件是否已存在(并在提供 md5sum 时检查是否匹配),避免重复下载,节省带宽和时间。然后下载文件并存储在包含代码的文件所在的同一目录中。
标注格式可在 http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset#Annotationformat 查看。下载文件后,我们编写一个函数,使用数据提供的标注格式解压缩并提取数据,具体步骤如下:
1. 打开下载的 .zip 文件(可以是训练数据或测试数据),遍历所有文件,仅打开 .csv 文件,这些文件包含相应类别中每个图像的目标信息。
```python
def _load_data(filepath, labels):
data, targets = [], []
with ZipFile(filepath) as data_zip:
for path in data_zip.namelist():
if not path.endswith('.csv'):
continue
# Only iterate over annotations files
...
```
2. 检查图像的标签是否在我们感兴趣的标签数组中。然后创建一个 csv.reader 来遍历 .csv 文件的内容。
```python
# Only iterate over annotations files
*dir_path, csv_filename = path.split('/')
label_str = dir_path[-1]
if labels is not None and int(label_str) not in labels:
continue
with data_zip.open(path, 'r') as csvfile:
reader = csv.DictReader(TextIOWrapper(csvfile), delimiter=';')
for img_info in reader:
...
```
3. 每一行文件包含一个数据样本的标注。我们提取图像路径,读取数据并将其转换为 NumPy 数组。通常,这些样本中的对象并非完美裁剪,而是嵌入在周围环境中。我们使用存档中提供的边界框信息(每个标签对应一个 .csv 文件)裁剪图像,并将标志添加到 data 中,将标签添加到 targets 中。
```python
img_path = '/'.join([*dir_path, img_info['Filename']])
raw_data = data_zip.read(img_path)
img = c
```
0
0
复制全文
相关推荐










