python实现CRAFT

admin 103 0
Python实现CRAFT(Character-Region Awareness For Text Detection)主要基于深度学习框架,通过卷积神经网络提取图像特征,结合区域提议网络定位文本区域,该模型能高效识别自然场景中的文本,支持多尺度检测与方向自适应,对模糊、弯曲文本具有较强鲁棒性,实现过程中通常采用PyTorch加载预训练模型,结合OpenCV进行图像预处理与后处理(如NMS),最终输出文本边界框坐标,其核心优势在于端到端检测,无需复杂手工设计特征,广泛应用于文档分析、图像识别等领域的文本提取任务。

Python实现CRAFT文本检测模型:从原理到代码实践

在自然场景文本检测任务中,精准定位图像中的文本区域(尤其是弯曲、密集、多语言文本)始终是计算机视觉领域的核心挑战,传统方法如MSER、EAST等在复杂场景下易受背景干扰,而基于深度学习的模型凭借强大的特征提取能力逐渐成为主流解决方案。CRAFT(Character-Region Awareness For Text detection) 因其创新的“字符级区域感知”设计,在处理不规则文本时展现出卓越性能,且支持Python高效实现,成为工业界与学术界的热门选择,本文将深入解析CRAFT的核心原理,并基于Python实现从环境搭建到模型部署的全流程。

CRAFT模型核心原理

CRAFT由韩国学者于2019年提出,其核心思想颠覆了传统文本检测范式:“先检测字符单元,再连接成文本行”,这种分阶段策略使其对弯曲、断裂文本具有更强的鲁棒性,尤其适用于自然场景下的复杂文本检测任务。

1 核心设计:字符级区域感知与亲和度图

CRAFT模型通过输出两个关键图实现文本定位:

  • 字符区域图(Character Region Map):二值化输出图,前景(值为1)标识字符位置,背景(值为0)标识非文本区域。
  • 亲和度图(Affinity Map):双通道特征图,通道0表示字符间的“左连接”关系,通道1表示“右连接”关系,通过方向性亲和度将离散字符聚合为连续文本行。
2 网络架构解析

CRAFT采用双分支并行结构,基于VGG16(或ResNet)作为特征提取骨干:

  1. 骨干网络:VGG16的前13层卷积层(移除全连接层),提取多尺度语义特征。
  2. 字符区域分支:通过3×3卷积层与转置卷积上采样,将特征图恢复至输入图像尺寸,输出字符区域图。
  3. 亲和度分支:采用相同上采样策略,生成双通道亲和度图,捕捉字符间空间关系。
3 多任务损失函数设计

CRAFT采用加权多任务损失函数,联合优化两个输出分支:

  • 字符区域损失:采用二值交叉熵(BCE Loss),最小化预测区域与真实字符区域的差异。
  • 亲和度损失:基于字符区域图生成掩码,仅计算字符区域的亲和度损失,有效抑制背景噪声干扰。

Python实现CRAFT:环境准备与依赖

CRAFT的Python实现基于PyTorch框架,需安装以下核心库:

pip install torch torchvision opencv-python numpy matplotlib Pillow torchvision

预训练模型(如craft_mlt_25k.pth)及字符集文件(craft_char_list.txt)可从官方GitHub仓库下载,建议使用CUDA加速以提升推理速度。

Python实现CRAFT:代码详解

1 模型加载与初始化

定义CRAFT模型结构并加载预训练权重:

import torch
import torch.nn as nn
from craft import CRAFT  # 假设已实现CRAFT模型类

def load_craft_model(model_path, device='cuda'): """加载CRAFT预训练模型""" model = CRAFT() model.load_state_dict(torch.load(model_path, map_location=device)) model = model.to(device).eval() # 切换为评估模式 return model

示例:加载预训练模型

model_path = "craft_mlt_25k.pth" device = 'cuda' if torch.cuda.is_available() else 'cpu' craft_model = load_craft_model(model_path, device)

2 图像预处理流程

CRAFT对输入图像需进行标准化预处理:

import cv2
import numpy as np

def preprocess_image(image_path, max_side=800): """图像预处理:resize、归一化、通道转换"""

读取图像(BGR格式)

image = cv2.imread(image_path)
if image is None:
    raise ValueError(f"无法加载图像: {image_path}")
# 保持长宽比的智能缩放
height, width = image.shape[:2]
ratio = max_side / max(height, width)
new_size = (int(width * ratio), int(height * ratio))
image = cv2.resize(image, new_size, interpolation=cv2.INTER_LINEAR)
# 转换为RGB并归一化到[0,1]
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_normalized = image_rgb / 255.0
# 转换为Tensor (C, H, W)
image_tensor = torch.from_numpy(image_normalized).permute(2, 0, 1).float()
return image_tensor.unsqueeze(0)  # 添加batch维度

示例:预处理测试图像

input_tensor = preprocess_image("test.jpg").to(device)

3 模型推理与后处理

执行前向传播并解析模型输出:

def detect_text(model, image_tensor, text_threshold=0.7, link_threshold=0.4):
    """文本检测主函数"""
    with torch.no_grad():
        char_map, affinity_map = model(image_tensor)
# 应用阈值过滤
char_map = (char_map > text_threshold).float()
affinity_map = (affinity_map > link_threshold).float()
# 转换为numpy数组进行后处理
char_map_np = char_map.squeeze().cpu().numpy()
affinity_map_np = affinity_map.squeeze().cpu().numpy()
return char_map_np, affinity_map_np

执行检测

char_map, affinity_map = detect_text(craft_model, input_tensor)

4 可视化与结果输出

通过OpenCV绘制检测框:

import matplotlib.pyplot as plt

def visualize_detection(image, char_map, affinity_map): """可视化检测结果"""

创建彩色掩码

vis_image = image.copy()
char_contours, _ = cv2.findContours((char_map * 255).astype(np.uint8), 
                                  cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制字符区域
for contour in char_contours:
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(vis_image, (x, y), (x+w,

标签: #python CRAFT #文本检测 #深度学习