From a0f1c011c0b6b621a8fe727484696557a5aba60c Mon Sep 17 00:00:00 2001 From: Tong Gao Date: Fri, 31 Dec 2021 11:26:38 +0800 Subject: [PATCH] [Docs] Add model summary (#693) * Add model summary * Update text recog jpg * update pictures and add kie --- docs/en/api.rst | 9 ++ docs/en/index.rst | 1 + docs/en/model_summary.md | 178 +++++++++++++++++++++++++++++++++++++++ docs/en/stats.py | 2 +- docs/zh_cn/api.rst | 9 ++ docs/zh_cn/index.rst | 1 + docs/zh_cn/stats.py | 2 +- resources/kie.jpg | Bin 0 -> 14624 bytes resources/textdet.jpg | Bin 0 -> 13721 bytes resources/textrecog.jpg | Bin 0 -> 14377 bytes 10 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 docs/en/model_summary.md create mode 100644 resources/kie.jpg create mode 100644 resources/textdet.jpg create mode 100644 resources/textrecog.jpg diff --git a/docs/en/api.rst b/docs/en/api.rst index 1454a5c4..63f3ec10 100644 --- a/docs/en/api.rst +++ b/docs/en/api.rst @@ -73,6 +73,10 @@ Text Recognition Heads .. automodule:: mmocr.models.textrecog.heads :members: +Text Recognition Preprocessors +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automodule:: mmocr.models.textrecog.preprocessor + :members: Text Recognition Backbones ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -99,6 +103,11 @@ Text Recognition Decoders .. automodule:: mmocr.models.textrecog.decoders :members: +Text Recognition Fusers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automodule:: mmocr.models.textrecog.fusers + :members: + Text Recognition Losses ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automodule:: mmocr.models.textrecog.losses diff --git a/docs/en/index.rst b/docs/en/index.rst index 6b29ad72..76eb2212 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -28,6 +28,7 @@ You can switch between English and Chinese in the lower-left corner of the layou :caption: Model Zoo modelzoo.md + model_summary.md textdet_models.md textrecog_models.md kie_models.md diff --git a/docs/en/model_summary.md b/docs/en/model_summary.md new file mode 100644 index 00000000..c3771f08 --- /dev/null +++ b/docs/en/model_summary.md @@ -0,0 +1,178 @@ +# Model Architecture Summary + +MMOCR has implemented many models that support various tasks. Depending on the type of tasks, these models have different architectural designs and, therefore, might be a bit confusing for beginners to master. We release a primary design doc to clearly illustrate the basic task-specific architectures and provide quick pointers to docstrings of model components to aid users' understanding. + +## Text Detection Models + +
+
+
+
+ +The design of text detectors is similar to [SingleStageDetector](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.detectors.SingleStageDetector) in MMDetection. The feature of an image was first extracted by `backbone` (e.g., ResNet), and `neck` further processes raw features into a head-ready format, where the models in MMOCR usually adapt the variants of FPN to extract finer-grained multi-level features. `bbox_head` is the core of text detectors, and its implementation varies in different models. + +When training, the output of `bbox_head` is directly fed into the `loss` module, which compares the output with the ground truth and generates a loss dictionary for optimizer's use. When testing, `Postprocessor` converts the outputs from `bbox_head` to bounding boxes, which will be used for evaluation metrics (e.g., hmean-iou) and visualization. + +### DBNet + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [FPNC](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.necks.FPNC) +- Bbox_head: [DBHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.DBHead) +- Loss: [DBLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.DBLoss) +- Postprocessor: [DBPostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.DBPostprocessor) + +### DRRG + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [FPN_UNet](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.necks.FPN_UNet) +- Bbox_head: [DRRGHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.DRRGHead) +- Loss: [DRRGLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.DRRGLoss) +- Postprocessor: [DRRGPostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.DRRGPostprocessor) + +### FCENet + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [mmdet.FPN](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.necks.FPN) +- Bbox_head: [FCEHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.FCEHead) +- Loss: [FCELoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.FCELoss) +- Postprocessor: [FCEPostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.FCEPostprocessor) + +### Mask R-CNN + +We use the same architecture as in MMDetection. See MMDetection's [config documentation](https://mmdetection.readthedocs.io/en/latest/tutorials/config.html#an-example-of-mask-r-cnn) for details. + +### PANet + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [FPEM_FFM](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.necks.FPEM_FFM) +- Bbox_head: [PANHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.PANHead) +- Loss: [PANLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.PANLoss) +- Postprocessor: [PANPostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.PANPostprocessor) + +### PSENet + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [FPNF](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.necks.FPNF) +- Bbox_head: [PSEHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.PSEHead) +- Loss: [PSELoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.PSELoss) +- Postprocessor: [PSEPostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.PSEPostprocessor) + +### Textsnake + +- Backbone: [mmdet.ResNet](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.backbones.ResNet) +- Neck: [FPN_UNet](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.necks.FPN_UNet) +- Bbox_head: [TextSnakeHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.dense_heads.TextSnakeHead) +- Loss: [TextSnakeLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.losses.TextSnakeLoss) +- Postprocessor: [TextSnakePostprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textdet.postprocess.TextSnakePostprocessor) + +## Text Recognition Models + +**Most of** the implemented recognizers use the following architecture: + +
+
+
+
+ +`preprocessor` refers to any network that processes images before they are fed to `backbone`. `encoder` encodes images features into a hidden vector, which is then transcribed into text tokens by `decoder`. + +The architecture diverges at training and test phases. The loss module returns a dictionary during training. In testing, `converter` is invoked to convert raw features into texts, which are wrapped into a dictionary together with confidence scores. Users can access the dictionary with the `text` and `score` keys to query the recognition result. + +### ABINet + +- Preprocessor: None +- Backbone: [ResNetABI](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ResNetABI) +- Encoder: [ABIVisionModel](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.encoders.ABIVisionModel) +- Decoder: [ABIVisionDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.ABIVisionDecoder) +- Fuser: [ABIFuser](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.fusers.ABIFuser) +- Loss: [ABILoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.ABILoss) +- Converter: [ABIConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.ABIConvertor) + +:::{note} +Fuser fuses the feature output from encoder and decoder before generating the final text outputs and computing the loss in full ABINet. +::: + +### CRNN + +- Preprocessor: None +- Backbone: [VeryDeepVgg](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.VeryDeepVgg) +- Encoder: None +- Decoder: [CRNNDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.CRNNDecoder) +- Loss: [CTCLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.CTCLoss) +- Converter: [CTCConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.CTCConvertor) + +### CRNN with TPS-based STN + +- Preprocessor: [TPSPreprocessor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.preprocessor.TPSPreprocessor) +- Backbone: [VeryDeepVgg](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.VeryDeepVgg) +- Encoder: None +- Decoder: [CRNNDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.CRNNDecoder) +- Loss: [CTCLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.CTCLoss) +- Converter: [CTCConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.CTCConvertor) + +### NRTR + +- Preprocessor: None +- Backbone: [ResNet31OCR](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ResNet31OCR) +- Encoder: [NRTREncoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.encoders.NRTREncoder) +- Decoder: [NRTRDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.NRTRDecoder) +- Loss: [TFLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.TFLoss) +- Converter: [AttnConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.AttnConvertor) + +### RobustScanner + +- Preprocessor: None +- Backbone: [ResNet31OCR](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ResNet31OCR) +- Encoder: [ChannelReductionEncoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.encoders.ChannelReductionEncoder) +- Decoder: [ChannelReductionEncoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.RobustScannerDecoder) +- Loss: [SARLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.SARLoss) +- Converter: [AttnConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.AttnConvertor) + +### SAR + +- Preprocessor: None +- Backbone: [ResNet31OCR](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ResNet31OCR) +- Encoder: [SAREncoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.encoders.SAREncoder) +- Decoder: [ParallelSARDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.ParallelSARDecoder) +- Loss: [SARLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.SARLoss) +- Converter: [AttnConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.AttnConvertor) + +### SATRN + +- Preprocessor: None +- Backbone: [ShallowCNN](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ShallowCNN) +- Encoder: [SatrnEncoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.encoders.SatrnEncoder) +- Decoder: [NRTRDecoder](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.decoders.NRTRDecoder) +- Loss: [TFLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.TFLoss) +- Converter: [AttnConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.AttnConvertor) + +### SegOCR + +- Backbone: [ResNet31OCR](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.backbones.ResNet31OCR) +- Neck: [FPNOCR](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.necks.FPNOCR) +- Head: [SegHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.heads.SegHead) +- Loss: [SegLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.losses.SegLoss) +- Converter: [SegConvertor](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.textrecog.convertors.SegConvertor) + +:::{note} +SegOCR's architecture is an exception - it is closer to text detection models. +::: + +## Key Information Extraction Models + +
+
+
+
+ +The architecture of key information extraction (KIE) models is similar to text detection models, except for the extra feature extractor. As a downstream task of OCR, KIE models are required to run with bounding box annotations indicating the locations of text instances, from which an ROI extractor extracts the cropped features for `bbox_head` to discover relations among them. + +The output containing edges and nodes information from `bbox_head` is sufficient for test and inference. Computation of loss also relies on such information. + +### SDMGR + +- Backbone: [UNet](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.common.backbones.UNet) +- Neck: None +- Extractor: [mmdet.SingleRoIExtractor](https://mmdetection.readthedocs.io/en/latest/api.html#mmdet.models.roi_heads.SingleRoIExtractor) +- Bbox_head: [SDMGRHead](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.kie.heads.SDMGRHead) +- Loss: [SDMGRLoss](https://mmocr.readthedocs.io/en/latest/api.html#mmocr.models.kie.losses.SDMGRLoss) diff --git a/docs/en/stats.py b/docs/en/stats.py index 9e3f2f38..922c2278 100755 --- a/docs/en/stats.py +++ b/docs/en/stats.py @@ -80,7 +80,7 @@ countstr = '\n'.join( [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) modelzoo = f""" -# Overview +# Statistics * Number of checkpoints: {len(allckpts)} * Number of configs: {len(allconfigs)} diff --git a/docs/zh_cn/api.rst b/docs/zh_cn/api.rst index 1454a5c4..63f3ec10 100644 --- a/docs/zh_cn/api.rst +++ b/docs/zh_cn/api.rst @@ -73,6 +73,10 @@ Text Recognition Heads .. automodule:: mmocr.models.textrecog.heads :members: +Text Recognition Preprocessors +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automodule:: mmocr.models.textrecog.preprocessor + :members: Text Recognition Backbones ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -99,6 +103,11 @@ Text Recognition Decoders .. automodule:: mmocr.models.textrecog.decoders :members: +Text Recognition Fusers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automodule:: mmocr.models.textrecog.fusers + :members: + Text Recognition Losses ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automodule:: mmocr.models.textrecog.losses diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index c0322c0d..787cc68b 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -28,6 +28,7 @@ :caption: 模型库 modelzoo.md + model_summary.md textdet_models.md textrecog_models.md kie_models.md diff --git a/docs/zh_cn/stats.py b/docs/zh_cn/stats.py index e5e2111d..8d9d188e 100755 --- a/docs/zh_cn/stats.py +++ b/docs/zh_cn/stats.py @@ -80,7 +80,7 @@ countstr = '\n'.join( [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) modelzoo = f""" -# 概览 +# 统计数据 * 模型权重文件数量: {len(allckpts)} * 配置文件数量: {len(allconfigs)} diff --git a/resources/kie.jpg b/resources/kie.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f89865b38f2bd0d1d282291de208720d362fbbcd GIT binary patch literal 14624 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 literal 0 HcmV?d00001 diff --git a/resources/textrecog.jpg b/resources/textrecog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24332f32bd0249c94c1c15f8b739c437d53044c9 GIT binary patch literal 14377 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 literal 0 HcmV?d00001