美文网首页
CTPN 数据处理/dataloader

CTPN 数据处理/dataloader

作者: nikown | 来源:发表于2020-07-25 22:07 被阅读0次

深度学习模型训练的第一步就是准备数据,制作标签(gt, ground truth)。然后根据gt和预测的值之差通过梯度下降的方法优化模型参数。
CTPN中gt包括两部分,一是分类的gt,二是bbox(检测框)的gt。
下面这个函数是CTPN的数据处理主要函数。tensorflow1中读取数据可以使用多线程读取,因为读取数据是用cpu读取的,为了高效利用GPU,使用多线程读取效率比较高。这一部分比较简单,返回的是图片,bbox以及图片信息(高、宽、通道数)。bbox这里使用的是绝对坐标表示,[x_min, y_min, x_max, y_max, 1],最后一位1表示这个bbox是文字。有个地方需要注意,这里返回使用的是yield,它的作用和return一样,不同之处在于,yield返回结果之后并函数还会接着运行。

def generator(vis=False):
    image_list = np.array(get_training_data())
    print('{} training imas in {}'.format(image_list.shape[0], DATA_FOLDER))
    index = np.arange(0, image_list.shape[0])
    while True:
        np.random.shuffle(index)
        for i in index:
            print(i)
            try:
                im_fn = image_list[i]
                im = cv2.imread(im_fn)
                h, w, c = im.shape
                im_info = np.array([h, w, c]).reshape([1, 3])

                _, fn = os.path.split(im_fn)
                fn, _ = os.path.splitext(fn)
                txt_fn = os.path.join(DATA_FOLDER, "label", fn + '.txt')
                if not os.path.exists(txt_fn):
                    print("Ground truth for image {} not exist!".format(im_fn))
                    continue
                bbox = load_annoataion(txt_fn)
                if len(bbox) == 0:
                    print("Ground truth for image {} empty!".format(im_fn))
                    continue

                if vis:
                    for p in bbox:
                        cv2.rectangle(im, (p[0], p[1]), (p[2], p[3]), color=(0, 0, 255), thickness=1)
                    fig, axs = plt.subplots(1, 1, figsize=(30, 30))
                    axs.imshow(im[:, :, ::-1])
                    axs.set_xticks([])
                    axs.set_yticks([])
                    plt.tight_layout()
                    plt.show()
                    plt.close()
                yield [im], bbox, im_info

            except Exception as e:
                print(e)
                continue

def load_annoataion(p):
    bbox = []
    with open(p, "r") as f:
        lines = f.readlines()
    for line in lines:
        line = line.strip().split(",")
        x_min, y_min, x_max, y_max = map(int, line)
        bbox.append([x_min, y_min, x_max, y_max, 1])
    return bbox

def get_training_data():
    img_files = []
    exts = ['jpg', 'png', 'jpeg', 'JPG']
    for parent, dirnames, filenames in os.walk(os.path.join(DATA_FOLDER, "image")):
        for filename in filenames:
            for ext in exts:
                if filename.endswith(ext):
                    img_files.append(os.path.join(parent, filename))
                    break
    print('Find {} images'.format(len(img_files)))
    return img_files

相关文章

网友评论

      本文标题:CTPN 数据处理/dataloader

      本文链接:https://www.haomeiwen.com/subject/ljgmlktx.html