(imagename) (bounding_box_coordinates) (class_name)
有没有其他方法可以使COWC数据集的注释更容易?
先谢谢你:)
COWC数据集带有注释,每辆汽车都有一个点的标签。 一个PNG文件包含了这些注释。 下面是我如何找到PNG文件中的标注位置。
import numpy as np
from PIL import Image
annotation_path = 'cowc/datasets/ground_truth_sets/Toronto_ISPRS/03553_Annotated_Cars.png'
im = Image.open(annotation_path)
data = np.asarray(im)
这里的问题是,这两个值都会被索引为非零,但我们只需要其中一个。 COWC数据集用红点标记汽车,用蓝点标记负数,我们不需要alpha通道,所以需要对新数组进行分片,这样我们就不会计算alpha通道而得到重复的索引值。
data = data[:,:,0:3]
y_ind, x_ind, rgba_ind = data.nonzero()
现在你已经有了一个索引,指向注释文件中的所有点。y_ind
对应于高度维度。x_ind
的宽度。 这意味着在第一个x,y的位置,我们应该看到一个类似于这样的数组。[255, 0, 0]
. 当我从索引中查找第一个x,y位置时,得到的是这样的结果。
>>> data[y_ind[0], x_ind[0]]
array([255, 0, 0], dtype=uint8)
喏 笔者决定以数据集中提供的注释为中心,创建一个边长为20像素的边界框。要为这张图片中的第一个注释创建一个单独的边界框,你可以尝试这样做。
# define bbox given x, y and ensure bbox is within image bounds
def get_bbox(x, y, x_max, y_max):
x1 = max(0, x - 20) # returns zero if x-20 is negative
x2 = min(x_max, x + 20) # returns x_max if x+20 is greater than x_max
y1 = max(0, y - 20)
y2 = min(y_max, y + 20)
return x1, y1, x2, y2
x1, y1, x2, y2 = get_bbox(x_ind[0], y_ind[0], im.width, im.height)
你必须循环处理所有的x、y值,为图像制作所有的边界框。 这里有一个粗暴和肮脏的方法来创建一个单一图像的csv文件。
img_path = 'cowc/datasets/ground_truth_sets/Toronto_ISPRS/03553.png'
with open('anno.csv', 'w') as f:
for x, y in zip(x_ind, y_ind):
x1, y1, x2, y2 = get_bbox(x, y, im.width, im.height)
line = f'{img_path},{x1},{y1},{x2},{y2},car\n'
f.write(line)
我计划将一个巨大的图像分解成更小的图像,这将改变边界框的值。 我希望你觉得这对你有帮助,并喜欢一个好的地方开始。