我有一个使用对象检测来解决验证码的YOLOV5模型。它返回的列表格式为:
<object-class> <x> <y> <width> <height> <confidence>
对于每个类别的检测都是如此。
示例:
输入:
输出:
[[['7l', 0.19, '0.443182', '0.104895', '0.431818', '0.972055'], ['4l', 0.33, '0.534091', '0.104895', '0.431818', '0.965045'], ['5l', 0.6, '0.238636', '0.118881', '0.431818', '0.974508'], ['9l', 0.92, '0.659091', '0.104895', '0.409091', '0.879532'], ['0l', 0.93, '0.659091', '0.0979021', '0.363636', '0.651053']]]
如你所见,类别9l和0l具有相同的值,这意味着模型对一个对象有两个答案。
我如何将这个列表拆分为两个可能的列表,如下所示:
7l 4l 5l 9l
和7l 4l 5l 0l
回答:
首先,你可以将数据转换为字典
{'0.443182': ['7l'], '0.534091': ['4l'], '0.238636': ['5l'], '0.659091': ['9l', '0l']}
接下来只获取值
[['7l'], ['4l'], ['5l'], ['9l', '0l']]
最后使用 itertools.product(['7l'], ['4l'], ['5l'], ['9l', '0l'])
来生成
('7l', '4l', '5l', '9l')('7l', '4l', '5l', '0l')
完整的工作代码。
因为标准字典不一定保持顺序,所以我使用 OrderedDict()
import collectionsimport itertoolsdata = [[['7l', 0.19, '0.443182', '0.104895', '0.431818', '0.972055'], ['4l', 0.33, '0.534091', '0.104895', '0.431818', '0.965045'], ['5l', 0.6, '0.238636', '0.118881', '0.431818', '0.974508'], ['9l', 0.92, '0.659091', '0.104895', '0.409091', '0.879532'], ['0l', 0.93, '0.659091', '0.0979021', '0.363636', '0.651053']]]#converted = {}converted = collections.OrderedDict()for item in data[0]: class_ = item[0] x = item[2] #if x not in converted: # converted[x] = [] #converted[x].append(class_) converted.setdefault(x, []).append(class_) print('converted:', converted)values = list(converted.values())print('values:', values)products = list(itertools.product(*values))print('products:', products)for item in products: print('item:', "".join(item))
结果:
converted: OrderedDict([('0.443182', ['7l']), ('0.534091', ['4l']), ('0.238636', ['5l']), ('0.659091', ['9l', '0l'])])values: [['7l'], ['4l'], ['5l'], ['9l', '0l']]products: [('7l', '4l', '5l', '9l'), ('7l', '4l', '5l', '0l')]item: 7l4l5l9litem: 7l4l5l0l