cfgfile = './yolov3.cfg'
file = open(cfgfile, 'r')
lines = file.read().split('\n') # store the lines in a list等价于readlines
lines = [x for x in lines if len(x) > 0] # 去掉空行
lines = [x for x in lines if x[0] != '#'] # 去掉以#开头的注释行
lines = [x.rstrip().lstrip() for x in lines]
# 去掉左右两边的空格(rstricp是去掉右边的空格,lstrip是去掉左边的空格)
完整代码
def parse_cfg(cfgfile):
"""
输入: 配置文件路径
返回值: 列表对象,其中每一个元素为一个字典类型对应于一个要建立的神经网络模块(层)
"""
# 加载文件并过滤掉文本中多余内容
file = open(cfgfile, 'r')
lines = file.read().split('\n')
lines = [x for x in lines if len(x) > 0]
lines = [x for x in lines if x[0] != '#']
lines = [x.rstrip().lstrip() for x in lines]
block = {}
blocks = []
for line in lines:
if line[0] == "[": # 这是cfg文件中一个层(块)的开始
if len(block) != 0:
blocks.append(block)
block = {}
block["type"] = line[1:-1].rstrip() # 把cfg的[]中的块名作为键type的值
else:
key,value = line.split("=")
block[key.rstrip()] = value.lstrip()
blocks.append(block) # 退出循环,将最后一个未加入的block加进去
# print('\n\n'.join([repr(x) for x in blocks]))
return blocks
blocks部分输出
[
{'scales': '.1,.1', 'exposure': '1.5', 'steps': '400000,450000', 'angle': '0', 'channels': '3'},
{'filters': '32', 'activation': 'leaky', 'stride': '1', 'pad': '1', 'batch_normalize': '1', 'size': '3', 'type': 'convolutional'},
{'filters': '64', 'activation': 'leaky', 'stride': '2', 'pad': '1', 'batch_normalize': '1', 'size': '3', 'type': 'convolutional'},
{'filters': '32', 'activation': 'leaky', 'stride': '1', 'pad': '1', 'batch_normalize': '1', 'size': '1', 'type': 'convolutional'},
{'filters': '64', 'activation': 'leaky', 'stride': '1', 'pad': '1', 'batch_normalize': '1', 'size': '3', 'type': 'convolutional'}
]