交通标志识别学习指南
立即解锁
发布时间: 2025-09-13 01:58:20 阅读量: 9 订阅数: 24 AIGC 

### 交通标志识别学习指南
#### 1. 理解GTSRB数据集
GTSRB数据集包含超过50,000张属于43个类别的交通标志图像。该数据集在2011年国际神经网络联合会议(IJCNN)的分类挑战中被专业人士使用。它非常适合用于我们的任务,因为它规模大、组织有序、开源且带有标注。
虽然实际的交通标志不一定是正方形,也不一定位于每张图像的中心,但数据集附带了一个标注文件,该文件指定了每个标志的边界框。
在进行任何机器学习任务之前,了解数据集的特性和挑战是个不错的主意。可以手动查看数据,了解其特征;如果页面上有数据描述,阅读它以确定哪种模型可能效果最佳。
以下是一段来自`data/gtsrb.py`的代码,它加载训练数据集的随机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个文件可供下载。我们选择使用原始数据,以获得更多的学习机会。我们下载官方训练数据(Images and annotations (GTSRB_Final_Training_Images.zip))用于训练,以及在2011年IJCNN竞赛中使用的官方训练数据集(Images and annotations (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数组。通常,这些样本中的对象没有被完美裁剪,而是嵌入在周围环境中。我们使用存档中提供的边界框信息裁剪图像,并将标志
0
0
复制全文
相关推荐









