Beispiel #1
0
    def validate_detection(self, epoch, iteration):
        print('Start val')
        self.setModelState('test')
        val_loader = self.val_loader
        val_iter = iter(val_loader)
        input_json_path = self.res2json()
        gt_json_path = self.opt.ADDRESS.GT_JSON_DIR

        # loss
        losses = AverageMeter()
        for i in range(len(val_loader)):
            data = val_iter.next()
            pretreatmentData = self.pretreatment(data)
            img = self.get_img_data(pretreatmentData)
            modelResult = self.model(img)
            loss = self.posttreatment(modelResult, pretreatmentData, data, True)
            print("No.%d, loss:%f" % (i, loss))
            file_summary(self.opt.ADDRESS.LOGGER_DIR, self.opt.BASE.MODEL + "_result.txt",
                         "No.%d, loss:%f \n" % (i, loss))
            losses.update(loss.item(), img.size(0))
        tqdm.write('Validate Loss - Avg Loss {0}'.format(losses.avg))

        # Precision / Recall / F_score
        precision, recall, f_score = \
            eval_func(input_json_path, gt_json_path, self.opt)

        # Generate log
        total_index = epoch * (
                    len(self.train_loader) // self.opt.FREQ.VAL_FREQ + 1) + iteration // self.opt.FREQ.VAL_FREQ
        self.Logger.scalar_summary('Precision', precision, total_index)
        self.Logger.scalar_summary('Recall', recall, total_index)
        self.Logger.scalar_summary('F_score', f_score, total_index)
        self.Logger.scalar_summary('Avg Loss', losses.avg, total_index)
        self.setModelState('train')
        return precision
Beispiel #2
0
    def validate_recognition(self, epoch, iteration):
        '''
        在特定训练次数后执行验证模型能力操作
        '''

        print('Start val')
        self.setModelState('test')

        val_loader = self.val_loader
        val_iter = iter(val_loader)
        n_correct = 0
        n_total = 0
        distance = 0.0
        loss_avg = averager()

        self.val_times += 1

        cnt = 0
        for i in range(len(val_loader)):

            try:
                data = val_iter.next()
            except:
                print("数据读取错误")
                continue

            pretreatmentData = self.pretreatment(data, True)

            modelResult = self.model(*pretreatmentData)['result']

            try:
                alphas = self.model(*pretreatmentData)['alphas']
            except:
                alphas = None
            # print("输出",type(modelResult))

            cost, preds, targets = self.posttreatment(modelResult,
                                                      pretreatmentData,
                                                      originData=data,
                                                      test=True)

            loss_avg.add(cost)

            index = 0
            for image, pred, target in zip(data[0], preds, targets):

                if pred.lower() == target.lower():
                    n_correct += 1
                # else:
                #     wrong_gt_predict(target,pred,cnt,self.opt)
                '''可视化操作'''
                # if self.opt.FUNCTION.VAL_ONLY:
                #     saveByOrder(data[0], self.opt)
                # wrong_gt_predict(target, pred, cnt, self.opt)

                if self.opt.FUNCTION.VAL_ONLY:
                    if alphas != None:
                        visualize(image,
                                  target,
                                  pred,
                                  cnt,
                                  self.opt,
                                  alpha=alphas[index])
                    else:
                        visualize(image, target, pred, cnt, self.opt)
                # wrong_gt_predict(target, pred, cnt, self.opt)
                '''利用logger工具将结果记录于文件夹中'''
                file_summary(
                    self.opt.ADDRESS.LOGGER_DIR,
                    str(self.val_times) + '_' + self.opt.BASE.MODEL +
                    "_result" + ".txt", "预测 %s      目标 %s\n" % (pred, target))
                '''添加功能:对正确文本和错误文本进行分类'''
                if pred.lower() == target.lower():
                    file_summary(
                        self.opt.ADDRESS.LOGGER_DIR,
                        str(self.val_times) + '_' + self.opt.BASE.MODEL +
                        "_right" + ".txt",
                        "预测 %s      目标 %s\n" % (pred, target))
                else:
                    file_summary(
                        self.opt.ADDRESS.LOGGER_DIR,
                        str(self.val_times) + '_' + self.opt.BASE.MODEL +
                        "_wrong" + ".txt",
                        "预测 %s      目标 %s\n" % (pred, target))

                distance += Levenshtein.distance(pred.lower(),
                                                 target.lower()) / max(
                                                     len(pred), len(target))
                n_total += 1
                index += 1
                cnt += 1

        accuracy = n_correct / float(n_total)
        '''利用logger工具将结果进行可视化'''
        total_index = epoch * (len(self.train_loader) // self.opt.FREQ.VAL_FREQ
                               + 1) + iteration // self.opt.FREQ.VAL_FREQ
        self.Logger.scalar_summary('Levenshtein Distance', distance / n_total,
                                   total_index)
        self.Logger.scalar_summary('Accuracy', accuracy, total_index)
        self.Logger.scalar_summary('Avg Loss', loss_avg.val(), total_index)

        print("correct / total: %d / %d, " % (n_correct, n_total))
        print('levenshtein distance: %f' % (distance / n_total))
        print('Test loss: %f, accuray: %f' % (loss_avg.val(), accuracy))
        self.setModelState('train')
        '''结束可视化工作'''
        visualize(opt=self.opt, finish=True)

        return accuracy
Beispiel #3
0
    def train(self):
        '''
        训练函数
        Already Done:
        1.初始化一个可训练模型
        2.定义损失函数与优化器

        TODO:
        1.定义一个epoch循环,循环总数在配置文件中定义。每个epoch会把所有
        2.定义一个train_loader迭代器,在每一个iter里,使用next()获取下一个批次
            对于每一个iter,计算模数,在对应的迭代周期里执行保存/验证/记录 操作
        '''

        '''如果只需验证,只需要一次验证过程即可无需训练'''
        if self.opt.FUNCTION.VAL_ONLY == True:
            self.validate(1, self.opt.FREQ.VAL_FREQ)
            return

        loss_avg = averager()

        t0 = time.time()
        self.highestAcc = 0

        for epoch in range(self.opt.MODEL.EPOCH):

            iteration = 0
            train_iter = iter(self.train_loader)

            while iteration < len(self.train_loader):

                '''检查该迭代周期是否需要保存或验证'''
                self.checkSaveOrVal(epoch, iteration)

                data = train_iter.next()

                # print(data)

                pretreatmentData = self.pretreatment(data, False)

                modelResult = self.model(*pretreatmentData)['result']
                # print("402行类型为",type(modelResult))

                cost = self.posttreatment(modelResult, pretreatmentData, data)

                self.optimizer.zero_grad()
                # self.optimizer.zero_grad()
                cost.backward()
                self.optimizer.step()

                loss_avg.add(cost)

                '''
                展示阶段
                在训练的时候仅仅展示在相应阶段的loss
                '''
                if iteration % self.opt.FREQ.SHOW_FREQ == 0:
                    t1 = time.time()
                    print('Epoch: %d/%d; iter: %d/%d; Loss: %f; time: %.2f s;' %
                          (epoch, self.opt.MODEL.EPOCH, iteration, len(self.train_loader), loss_avg.val(), t1 - t0))
                    file_summary(self.opt.ADDRESS.LOGGER_DIR, "log.txt",
                                 'Epoch: %d/%d; iter: %d/%d; Loss: %f; time: %.2f s;' %
                          (epoch, self.opt.MODEL.EPOCH, iteration, len(self.train_loader), loss_avg.val(), t1 - t0))

                    loss_avg.reset()
                    t0 = time.time()

                iteration += 1

            '''动态调整学习率'''
            if self.scheduler != None:
                scheduler.step()
        self.Logger.close_summary()
Beispiel #4
0
    def validate_recognition(self, epoch, iteration):
        '''
        在特定训练次数后执行验证模型能力操作
        '''

        print('Start val')
        self.setModelState('test')

        val_loader = self.val_loader
        val_iter = iter(val_loader)
        n_correct = 0
        n_total = 0
        distance = 0.0
        loss_avg = averager()

        self.val_times += 1

        cnt = 0
        for i in range(len(val_loader)):
            data = val_iter.next()

            pretreatmentData = self.pretreatment(data, True)

            modelResult = self.model(*pretreatmentData)

            cost, preds, targets = self.posttreatment(modelResult,
                                                      pretreatmentData,
                                                      originData=data,
                                                      test=True)

            loss_avg.add(cost)

            for pred, target in zip(preds, targets):
                # print(pred,target)
                if pred.lower() == target.lower():
                    n_correct += 1
                else:
                    wrong_gt_predict(target, pred, cnt, self.opt)
                '''利用logger工具将结果记录于文件夹中'''
                file_summary(
                    self.opt.ADDRESS.LOGGER_DIR,
                    str(self.val_times) + '_' + self.opt.BASE.MODEL +
                    "_result" + ".txt", "预测 %s      目标 %s\n" % (pred, target))
                '''添加功能:对正确文本和错误文本进行分类'''
                if pred.lower() == target.lower():
                    file_summary(
                        self.opt.ADDRESS.LOGGER_DIR,
                        str(self.val_times) + '_' + self.opt.BASE.MODEL +
                        "_right" + ".txt",
                        "预测 %s      目标 %s\n" % (pred, target))
                else:
                    file_summary(
                        self.opt.ADDRESS.LOGGER_DIR,
                        str(self.val_times) + '_' + self.opt.BASE.MODEL +
                        "_wrong" + ".txt",
                        "预测 %s      目标 %s\n" % (pred, target))

                distance += Levenshtein.distance(pred.lower(),
                                                 target.lower()) / max(
                                                     len(pred), len(target))
                n_total += 1

                cnt += 1

        accuracy = n_correct / float(n_total)
        '''利用logger工具将结果进行可视化'''
        total_index = epoch * (len(self.train_loader) // self.opt.FREQ.VAL_FREQ
                               + 1) + iteration // self.opt.FREQ.VAL_FREQ
        self.Logger.scalar_summary('Levenshtein Distance', distance / n_total,
                                   total_index)
        self.Logger.scalar_summary('Accuracy', accuracy, total_index)
        self.Logger.scalar_summary('Avg Loss', loss_avg.val(), total_index)

        print("correct / total: %d / %d, " % (n_correct, n_total))
        print('levenshtein distance: %f' % (distance / n_total))
        print('Test loss: %f, accuray: %f' % (loss_avg.val(), accuracy))
        self.setModelState('train')

        return accuracy