From 080748fca57c081377578835586ddc32d904672d Mon Sep 17 00:00:00 2001 From: qingqing01 Date: Thu, 10 Sep 2020 06:06:16 +0000 Subject: [PATCH] Update OCR model --- examples/ocr/eval.py | 62 +++++++++++++++++------------------- examples/ocr/predict.py | 26 ++++++++------- examples/ocr/seq2seq_attn.py | 13 +++----- examples/ocr/train.py | 50 ++++++++++++++--------------- examples/ocr/utility.py | 13 ++++---- 5 files changed, 80 insertions(+), 84 deletions(-) diff --git a/examples/ocr/eval.py b/examples/ocr/eval.py index 6b5fd48..f1e0f2b 100644 --- a/examples/ocr/eval.py +++ b/examples/ocr/eval.py @@ -16,11 +16,11 @@ from __future__ import print_function import argparse import functools -import paddle.fluid.profiler as profiler +import paddle import paddle.fluid as fluid -from paddle.incubate.hapi.model import Input, set_device -from paddle.incubate.hapi.vision.transforms import BatchCompose +from paddle.static import InputSpec as Input +from paddle.vision.transforms import BatchCompose from utility import add_arguments, print_arguments from utility import SeqAccuracy, LoggerCallBack, SeqBeamAccuracy @@ -46,13 +46,8 @@ add_arg('dynamic', bool, False, "Whether to use dygraph. def main(FLAGS): - device = set_device("gpu" if FLAGS.use_gpu else "cpu") + device = paddle.set_device("gpu" if FLAGS.use_gpu else "cpu") fluid.enable_dygraph(device) if FLAGS.dynamic else None - model = Seq2SeqAttModel( - encoder_size=FLAGS.encoder_size, - decoder_size=FLAGS.decoder_size, - emb_dim=FLAGS.embedding_dim, - num_classes=FLAGS.num_classes) # yapf: disable inputs = [ @@ -64,13 +59,16 @@ def main(FLAGS): Input([None, None], "float32", name="mask") ] # yapf: enable - - model.prepare( - loss_function=WeightCrossEntropy(), - metrics=SeqAccuracy(), + model = paddle.Model( + Seq2SeqAttModel( + encoder_size=FLAGS.encoder_size, + decoder_size=FLAGS.decoder_size, + emb_dim=FLAGS.embedding_dim, + num_classes=FLAGS.num_classes), inputs=inputs, - labels=labels, - device=device) + labels=labels) + + model.prepare(loss=WeightCrossEntropy(), metrics=SeqAccuracy()) model.load(FLAGS.init_model) test_dataset = data.test() @@ -97,29 +95,29 @@ def main(FLAGS): def beam_search(FLAGS): device = set_device("gpu" if FLAGS.use_gpu else "cpu") fluid.enable_dygraph(device) if FLAGS.dynamic else None - model = Seq2SeqAttInferModel( - encoder_size=FLAGS.encoder_size, - decoder_size=FLAGS.decoder_size, - emb_dim=FLAGS.embedding_dim, - num_classes=FLAGS.num_classes, - beam_size=FLAGS.beam_size) + # yapf: disable inputs = [ - Input( - [None, 1, 48, 384], "float32", name="pixel"), Input( - [None, None], "int64", name="label_in") + Input([None, 1, 48, 384], "float32", name="pixel"), + Input([None, None], "int64", name="label_in") ] labels = [ - Input( - [None, None], "int64", name="label_out"), Input( - [None, None], "float32", name="mask") + Input([None, None], "int64", name="label_out"), + Input([None, None], "float32", name="mask") ] - model.prepare( - loss_function=None, - metrics=SeqBeamAccuracy(), + # yapf: enable + + model = paddle.Model( + Seq2SeqAttInferModel( + encoder_size=FLAGS.encoder_size, + decoder_size=FLAGS.decoder_size, + emb_dim=FLAGS.embedding_dim, + num_classes=FLAGS.num_classes, + beam_size=FLAGS.beam_size), inputs=inputs, - labels=labels, - device=device) + labels=labels) + + model.prepare(loss_function=None, metrics=SeqBeamAccuracy()) model.load(FLAGS.init_model) test_dataset = data.test() diff --git a/examples/ocr/predict.py b/examples/ocr/predict.py index f1eac38..c2d3fab 100644 --- a/examples/ocr/predict.py +++ b/examples/ocr/predict.py @@ -22,12 +22,12 @@ import argparse import functools from PIL import Image -import paddle.fluid.profiler as profiler +import paddle import paddle.fluid as fluid -from paddle.incubate.hapi.model import Input, set_device -from paddle.incubate.hapi.datasets.folder import ImageFolder -from paddle.incubate.hapi.vision.transforms import BatchCompose +from paddle.static import InputSpec as Input +from paddle.vision.datasets.folder import ImageFolder +from paddle.vision.transforms import BatchCompose from utility import add_arguments, print_arguments from utility import postprocess, index2word @@ -52,18 +52,20 @@ add_arg('dynamic', bool, False, "Whether to use dygraph.") def main(FLAGS): - device = set_device("gpu" if FLAGS.use_gpu else "cpu") + device = paddle.set_device("gpu" if FLAGS.use_gpu else "cpu") fluid.enable_dygraph(device) if FLAGS.dynamic else None - model = Seq2SeqAttInferModel( - encoder_size=FLAGS.encoder_size, - decoder_size=FLAGS.decoder_size, - emb_dim=FLAGS.embedding_dim, - num_classes=FLAGS.num_classes, - beam_size=FLAGS.beam_size) inputs = [Input([None, 1, 48, 384], "float32", name="pixel"), ] + model = paddle.Model( + Seq2SeqAttInferModel( + encoder_size=FLAGS.encoder_size, + decoder_size=FLAGS.decoder_size, + emb_dim=FLAGS.embedding_dim, + num_classes=FLAGS.num_classes, + beam_size=FLAGS.beam_size), + inputs) - model.prepare(inputs=inputs, device=device) + model.prepare() model.load(FLAGS.init_model) fn = lambda p: Image.open(p).convert('L') diff --git a/examples/ocr/seq2seq_attn.py b/examples/ocr/seq2seq_attn.py index 117749c..2315e98 100644 --- a/examples/ocr/seq2seq_attn.py +++ b/examples/ocr/seq2seq_attn.py @@ -19,9 +19,7 @@ import paddle.fluid as fluid import paddle.fluid.layers as layers from paddle.fluid.layers import BeamSearchDecoder -from paddle.incubate.hapi.text import RNNCell, RNN, DynamicDecode -from paddle.incubate.hapi.model import Model -from paddle.incubate.hapi.loss import Loss +from paddle.text import RNNCell, RNN, DynamicDecode class ConvBNPool(fluid.dygraph.Layer): @@ -249,7 +247,7 @@ class Decoder(fluid.dygraph.Layer): return pred -class Seq2SeqAttModel(Model): +class Seq2SeqAttModel(fluid.dygraph.Layer): def __init__( self, in_channle=1, @@ -322,12 +320,11 @@ class Seq2SeqAttInferModel(Seq2SeqAttModel): return rs -class WeightCrossEntropy(Loss): +class WeightCrossEntropy(fluid.dygraph.Layer): def __init__(self): - super(WeightCrossEntropy, self).__init__(average=False) + super(WeightCrossEntropy, self).__init__() - def forward(self, outputs, labels): - predict, (label, mask) = outputs[0], labels + def forward(self, predict, label, mask): loss = layers.cross_entropy(predict, label=label) loss = layers.elementwise_mul(loss, mask, axis=0) loss = layers.reduce_sum(loss) diff --git a/examples/ocr/train.py b/examples/ocr/train.py index b69c90e..364f39e 100644 --- a/examples/ocr/train.py +++ b/examples/ocr/train.py @@ -21,11 +21,11 @@ import numpy as np import argparse import functools -import paddle.fluid.profiler as profiler +import paddle import paddle.fluid as fluid -from paddle.incubate.hapi.model import Input, set_device -from paddle.incubate.hapi.vision.transforms import BatchCompose +from paddle.static import InputSpec as Input +from paddle.vision.transforms import BatchCompose from utility import add_arguments, print_arguments from utility import SeqAccuracy, LoggerCallBack @@ -58,14 +58,28 @@ add_arg('dynamic', bool, False, "Whether to use dygraph.") def main(FLAGS): - device = set_device("gpu" if FLAGS.use_gpu else "cpu") + device = paddle.set_device("gpu" if FLAGS.use_gpu else "cpu") fluid.enable_dygraph(device) if FLAGS.dynamic else None - model = Seq2SeqAttModel( - encoder_size=FLAGS.encoder_size, - decoder_size=FLAGS.decoder_size, - emb_dim=FLAGS.embedding_dim, - num_classes=FLAGS.num_classes) + # yapf: disable + inputs = [ + Input([None,1,48,384], "float32", name="pixel"), + Input([None, None], "int64", name="label_in"), + ] + labels = [ + Input([None, None], "int64", name="label_out"), + Input([None, None], "float32", name="mask"), + ] + # yapf: enable + + model = paddle.Model( + Seq2SeqAttModel( + encoder_size=FLAGS.encoder_size, + decoder_size=FLAGS.decoder_size, + emb_dim=FLAGS.embedding_dim, + num_classes=FLAGS.num_classes), + inputs, + labels) lr = FLAGS.lr if FLAGS.lr_decay_strategy == "piecewise_decay": @@ -79,23 +93,7 @@ def main(FLAGS): parameter_list=model.parameters(), grad_clip=grad_clip) - # yapf: disable - inputs = [ - Input([None,1,48,384], "float32", name="pixel"), - Input([None, None], "int64", name="label_in"), - ] - labels = [ - Input([None, None], "int64", name="label_out"), - Input([None, None], "float32", name="mask"), - ] - # yapf: enable - - model.prepare( - optimizer, - WeightCrossEntropy(), - SeqAccuracy(), - inputs=inputs, - labels=labels) + model.prepare(optimizer, WeightCrossEntropy(), SeqAccuracy()) train_dataset = data.train() train_collate_fn = BatchCompose( diff --git a/examples/ocr/utility.py b/examples/ocr/utility.py index 59b7f42..b3c6230 100644 --- a/examples/ocr/utility.py +++ b/examples/ocr/utility.py @@ -18,11 +18,12 @@ from __future__ import division from __future__ import print_function import distutils.util import numpy as np -import paddle.fluid as fluid import six -from paddle.incubate.hapi.metrics import Metric -from paddle.incubate.hapi.callbacks import ProgBarLogger +import paddle +import paddle.fluid as fluid + +from paddle.metric import Metric def print_arguments(args): @@ -72,7 +73,7 @@ class SeqAccuracy(Metric): self._name = 'seq_acc' self.reset() - def add_metric_op(self, output, label, mask, *args, **kwargs): + def compute(self, output, label, mask, *args, **kwargs): pred = fluid.layers.flatten(output, axis=2) score, topk = fluid.layers.topk(pred, 1) return topk, label, mask @@ -102,7 +103,7 @@ class SeqAccuracy(Metric): return self._name -class LoggerCallBack(ProgBarLogger): +class LoggerCallBack(paddle.callbacks.ProgBarLogger): def __init__(self, log_freq=1, verbose=2, train_bs=None, eval_bs=None): super(LoggerCallBack, self).__init__(log_freq, verbose) self.train_bs = train_bs @@ -153,7 +154,7 @@ class SeqBeamAccuracy(Metric): self._name = 'seq_acc' self.reset() - def add_metric_op(self, output, label, mask, *args, **kwargs): + def compute(self, output, label, mask, *args, **kwargs): return output, label, mask def update(self, preds, labels, masks, *args, **kwargs): -- GitLab