CTPN (Tian, Huang, He, He and Qiao, ECCV 2016) detects horizontal text lines as a chain of fine-scale vertical proposals joined by a recurrent layer. It was the first deep detector many people ever ran, and the idea that mattered most, treating text as a sequence inside a detector, survived into everything that followed. The trained model is distributed by the authors; the link and a checksum are below.
How CTPN works
- Features. A VGG-16 backbone produces a feature map at 1/16 of the input resolution.
- Fine-scale proposals. A 3 × 3 window slides over the map. At every position the network predicts a set of vertical anchors: proposals that are always 16 px wide but vary in height. Each anchor gets a text/non-text score and a vertical offset and height, so the detector only has to localise text in the direction that matters for a line: up and down.
- Sequence context. The window features along each row are fed through a bidirectional LSTM before prediction. A proposal therefore “knows” what sits to its left and right, which is why CTPN copes with tiny, blurred or partially occluded characters that a window-only classifier would miss.
- Side refinement. An extra regression output nudges the horizontal edges of the first and last proposal in a line.
- Line construction. Neighbouring proposals with high scores are linked into text lines by a simple graph-based rule.
Later work replaced the parts (segmentation heads instead of anchors, transformers instead of LSTMs) but kept the intuition.
What it can and cannot do
- Horizontal and near-horizontal lines in Latin and CJK scripts, at multiple scales, without post-processing tricks.
- No rotation handling: rotated or curved text gets fragmented or missed. EAST (2017) fixed rotation; CRAFT and DBNet (2019–2020) handled curves.
- Character-level output is not available; the unit is the line.
Results reported in the paper
| Dataset | F-measure | Where it is stated |
|---|---|---|
| ICDAR 2013 | 0.88 | abstract |
| ICDAR 2015 | 0.61 | abstract |
| Speed | 0.14 s per image (VGG-16) | abstract |
These are the authors’ own numbers on the protocols of the time; see the benchmarks page for why they are not comparable with 2020s detectors row for row.
Getting the trained model
The authors publish ctpn_trained_model.caffemodel (about 78 MB) through the Google Drive link in the CTPN README: drive.google.com/file/d/0B7c5Ix-XO7hqQWtKQ0lxTko4ZGs. This site does not host model files. The copy we downloaded from that link on 2026-09-05 was 78,875,022 bytes with SHA-256 b8c358ca481c7060b21a305521aff330c3a46c5d6752dfddd0307a40d07ddb3d, and its Caffe header names the network VGG_ILSVRC_16_layers; if your download matches, you have the original.
Running CTPN in 2026
The original stack (Caffe with custom Reverse/Transpose/LSTM layers, Python 2.7, CUDA 7.0, cuDNN 3.0) no longer builds on a modern machine without effort. Realistic options:
- The TensorFlow port by eragonruan targets TensorFlow 1.x and ships its own checkpoints. Use a Python 3.7 environment with TensorFlow 1.15.
- The Caffe original in a container. Build the repository’s bundled Caffe inside an Ubuntu 16.04 image with CUDA 8; the
--no-gpuflag works but is extremely slow. - For new work, do not use CTPN. The detector on this site runs a DBNet-family model in your browser and handles rotation and multiple languages. Compare the families on the models page.
Citation
@inproceedings{tian2016ctpn,
title = {Detecting Text in Natural Image with Connectionist Text Proposal Network},
author = {Tian, Zhi and Huang, Weilin and He, Tong and He, Pan and Qiao, Yu},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2016}
}