本人曾有幸在一家大型地图公司任职数据挖掘工程师,几乎每日要处理PB级以上多复杂场景的交通数据,其中基于大数据的超量采集帧图片处理技术具有比较强的挑战性,也可以说C端产品很多优化细节以及用户体感好坏很大程度都取决于我们对于这些实时采集帧图片的处理和分析。
因此研究如何攻克基于大数据的超量图片技术处理和分析是我们一直以来探索和研究的目标,在探究的过程中我与团队尝试过相当多的解决方案最终都有不错的效果,那么如何不走弯,在短时间之内迅速研发出一套通用图片大数据处理挖掘方案,并有一定的可实现性与稳定性,就是本期我想开展的文章主题。
本文有较多行业术语和专业知识,博主尽量一一简化让读者易解,并通过真实案例Demo实践保证方案可行性。对本文技术有深层兴趣的读者欢迎与fanstuck一起探讨,再次感谢各位读者的多多支持!
首先我想说明一点,尽管需求中数据格式与效果不尽相同,但是技术方案是可复用可延展的,因此不必考虑过多需求不一致的问题。这里我来简略介绍一下技术需求。
地图数据的丰富性和准确性决定了用户体验(C端产品均如此),而传统的数据采集和分析制作,基本上都需要人工介入,再三确认上线,导致数据更新慢,加工成本高。因此我们需要通过对采集车高频的数据采集,运用图像算法能力,在PB集数目的采集图片中自动检测识别出各项地图要素的内容和位置,构建出实时更新的基础地图数据。(图来源高德地图)
这要求我们重点攻克场景文字识别技术在覆盖面、准确性和处理速度上的难题。在POI业务场景中,识别算法不仅需要尽可能全面地识别街边新开商铺的文字信息,还需确保识别结果的准确率达到99%以上,以支持POI名称的自动化生成;
在道路数据自动化处理场景中,识别算法需要精准捕捉道路标志牌上的细微变化,每天高效处理海量回传数据,以便及时更新道路限速、方向等关键信息。同时,由于采集设备和采集环境的多样性,高德场景文字识别算法常常需要应对极为复杂的图像条件,主要体现在以下几个方面:
除此之外,在网约车服务场景中也需要智能结构化OCR技术帮助平台和运营方高效处理大量与司机、车辆、行程相关的文档、票据和证件信息,以下都是需要处理的场景:
总的来说,智能结构化OCR在网约车场景中能够赋能平台实现从司机资质审核、车辆合规检查、保险理赔、费用报销到客服投诉处理的一系列流程自动化与智能化,大幅降低人工介入和出错率,为平台合规、风控、财务和客服等多层面运转提供高效率的数据基础。
首先先容许我介绍一下STR技术,场景文字识别(Scene Text Recognition,简称STR)技术是一种专注于从自然场景图像中提取和识别文字信息的人工智能技术。它是计算机视觉与自然语言处理结合的典型应用,广泛应用于地图标注、文档处理、无人驾驶、增强现实和智能客服等领域。
目前STR更多是强化端到端的STR模型,深度学习之前的STR我们暂且不提,最终效果期待通过一个模型同时完成文本行检测和文本识别的任务,这样可以快速实现一张图片的POI提取,但实际工作上面并没有这样轻松,二者之前还是存在很多策略去更精细化处理不同场景拍摄下的图片,End-to-End框架的实现需要大量高质量的文本行及其识别结果的标注数据,而这种标注数据的成本非常高昂。
同时,合成的虚拟数据难以完全替代真实数据的效果。因此,将文本的检测与识别任务分离,分别优化两个独立的模型成为更高效的选择。
文本行检测模块:负责定位文字区域,并生成文字的掩模,以纠正竖直、畸变、弯曲等失真问题。
序列识别模块:对检测到的文字区域进行识别,提取完整的文字信息。然而,对于艺术字体或特殊排列的文本,这种模块的表现可能存在不足。
单字检测识别模块:在序列识别效果欠佳的场景中,通过单字级别的检测与识别进行补充,提升整体识别精度和适应性。
通过这样的分模块设计,可以更好地应对复杂场景中的多样化文字问题,并优化各模块的性能。
目前主流有两种方法,一种是基于回归,第二种是分割:
这类方法通过回归模型直接预测文字区域的位置和形状,适用于复杂场景中的文本行定位。
代表算法:EAST(Efficient and Accurate Scene Text Detector)
该扩展过程较复杂,实时性较差,而且拍摄图片很容易受遮挡物影响,所以实验初期就否定了该方法。
分割方法将文本行检测视为语义分割问题,通过像素级分类来确定文字区域。
代表算法:PSENet(Progressive Scale Expansion Network)
同样是扩展过程较复杂,实时性较差,而且牌匾的文字间隔较大,因此也否定了该方法。
这类方法借鉴目标检测技术(如YOLO、Faster R-CNN),将文本行定位看作一个目标检测任务。
代表算法:Textboxes/Textboxes++
该方法算是比较理想的方法,速度快,易于集成。Mask R-CNN 是实例分割任务的里程碑Mask R-CNN继承了Faster R-CNN的目标检测框架,先通过Region Proposal Network(RPN)生成候选区域,再对每个候选区域精确回归边界框和掩模。这一机制非常适合文本行检测任务中复杂的文字布局(如交错排列、弯曲文字和密集文本行)。在场景文字中,尤其是广告牌或路边牌匾中,重叠的文本区域非常常见。实例分割能够准确区分这些重叠区域,而语义分割模型往往混淆这些区域。
值得一提的是Transformer的引入,其强大的全局建模能力也被应用于文本行定位。在一些老旧街区,街道密集地区,还是较难定位到关键的POI信息,Transformer的加入带来了一定的新思路思考。
在POI和道路数据的自动化生产过程中,文字识别的结果需要满足两方面的业务需求。一方面,要求尽可能完整地识别出文本行的内容;另一方面,算法需要能够区分出识别结果中准确率极高的部分。POI名称错误会导致用户体验受损,甚至影响地图服务的可靠性。且不同于通常以单字为维度进行评估的文字识别标准,应该更加关注整个文本行的识别结果:
文本行识别全对率:指文字内容和顺序完全正确的文本行在所有文本行中的占比,用于评估在POI名称、道路名称等整体文字识别任务中的表现。
文本行识别高置信占比:指识别结果中高置信度(准确率大于99%)文本行的占比,用于衡量算法拆分高准确率部分的能力。
在实际业务中,单字识别错误可能导致整个文本行无法满足使用需求。例如,将“建设银行”错误识别为“建设行”,即便单字识别率较高,也会严重影响文本行的正确率。因此,整体的文本行准确性(全对率)更符合业务场景的评估要求。
因此要达成此目标,单字检测识别和序列识别结果融合是提高文字识别系统整体性能的重要策略,尤其是在场景文字识别任务中,通过融合两种方法的优势,既可以保证高精度,又能处理特殊场景下的复杂问题。
单字检测识别和序列识别各有优缺点:
通过融合这两种方法,可以充分发挥它们的优势:
单字检测识别的主流算法是基于深度学习的字符级检测和识别方法,其中CRAFT(Character Region Awareness for Text Detection) 是最为经典且高效的单字检测算法之一。这种方法能够实现对复杂背景和不规则排列字符的精确检测,同时为字符级别识别提供高质量的输入数据。CRAFT通过检测字符区域和字符间链接区域,将字符级别的检测问题转化为像素级别的分割问题。能够直接检测单字区域,避免文字行检测中的误差传播。
当然还测试了相当一部分算法:
算法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
CRAFT | 像素级字符检测,高精度,适应复杂背景 | 后处理较复杂,对密集场景效果略逊 | 弯曲文字、复杂背景、多语言场景 |
PAN | 高效轻量化,实时性强,适应密集场景 | 对大字符区域检测效果一般 | 边缘设备、实时检测场景 |
DBNet | 可微分二值化,高质量分割,边界清晰 | 后处理依赖二值化分割图 | 小字符检测、文档扫描场景 |
TextSnake | 弯曲文字适应性强,生成高质量单字检测框 | 对直线文字场景效率较低 | 弯曲文字、艺术字体 |
EAST | 检测速度快,框架简单,扩展性强 | 单字检测效果有限 | 实时任务、文字行检测优化的单字检测场景 |
结合当前业务可以选择最优的算法计算。
文本序列识别是OCR任务中核心环节之一,目前最主流、最高效的文本序列识别算法主要基于深度学习的序列建模方法,包括Attention机制和Transformer结构的应用。CRNN经典算法就不提了,让我们聚焦于Transformer-BERT算法,Transformer 是目前文本序列识别领域的最新进展,凭借其强大的全局建模能力和并行计算优势,成为复杂场景文本识别的首选方法。将视觉特征转换为初步的文字序列,然后将文字序列输入到 BERT 模型。将 BERT 的语义特征与视觉特征融合,生成更精确的最终识别结果。
视觉特征提取: 使用 CNN、ResNet 或 Vision Transformer 提取文字图像的视觉特征。
文本序列建模: 将视觉特征转换为初步的文字序列,然后将文字序列输入到 BERT 模型。
融合模块: 将 BERT 的语义特征与视觉特征融合,生成更精确的最终识别结果。
可以说视觉 + BERT 融合模型这套文本识别框架可以算得上是目前最优的策略了。在实际应用中,由于被识别的目标主要以自然场景的短中文本为主,场景文本的几何畸变、扭曲、模糊程度极为严重。
将文本序列识别分解为四个子任务的优势在于各个环节的分工明确,互相配合,形成了端到端的高效识别流程:
智能结构化OCR(Intelligent Structured OCR)是指在传统光学字符识别(Optical Character Recognition, OCR)的基础上,结合自然语言处理(NLP)、计算机视觉(CV)、深度学习(DL)以及信息抽取(Information Extraction)等技术,将非结构化或半结构化的文档影像内容智能化地解析、提取并转换为可供机器直接理解和使用的结构化数据格式。相较于传统OCR仅能将图片中的文本转换为可编辑字符,智能结构化OCR不仅关注文字的提取准确度,更强调文本在文档中的逻辑层次、语义关系和字段信息的抽取。
结构化信息抽取:不仅仅是识别字符,更能识别字段之间的层次关系。例如在发票、保险表单、合同、身份证件、银行对账单等文档中,能够自动识别“姓名”、“日期”、“金额”等特定字段并将它们提取出来。
自然语言理解与上下文关联:利用自然语言处理技术对识别出的文本内容进行上下文理解。例如在表单中判断字段的类型与意义,或从长文本中检测关键词和相关实体。
版面理解(Layout Understanding):利用计算机视觉对文档版面结构进行分析与解析,包括段落、表格、列表、标题等特征的检测,从而更好地识别文档的逻辑组织形式。
多模态融合:同时利用图像信息和文本语义信息。例如结合文档图像中的空间布局(如表格的行列分布)和文本行顺序与语义关联来确定数据项之间的关系。
领域自适应与定制化:面向特定领域(如金融、医疗、保险)的文档进行模型微调,使模型在特定格式或特定语言风格下也能获得高精度的结构化提取。
智能结构化OCR是OCR技术的进化形态,它将图像文字识别从“读懂文字”扩展为“读懂文档”,是企业实现数字化转型、自动化处理业务流程和数据资产智能化管理的关键技术要素。下面我将通过腾讯云智能结构化OCR进行演示:
那么说了这么多实战是抽象乏味,如果此时再去一步一步实践整个积累好几年技术迭代的目标识别项目,那必然会状况百出,因此在这里还是推荐使用腾讯云智能结构化识别DEMO感受一下:商户门头照识别 Demo。
目前市面上成熟的OCR智能结构化识别产品还是稀少,因总体设计十分复杂,但腾讯技术在微信图片识别以及多场景OCR技术积累十分深厚,倘若我们非一定要自研OCR产品,是完全可以利用腾讯云智能结构化识别产品去完成快速迭代开发的。通过以上Demo也可以了解到API的快速使用,也有详细的产品文档查阅,可以说十分方便。
本次实验操作依托腾讯云OCR第三方接口进行实践操作,先将整体架构完成部署,算法部分完全可以作为一个黑盒进行使用,后续如有自研需求可逐步替代,否则我还是十分推荐用第三方接口开发,节省大量人力物力。
首先我们需要开通服务:文字识别提供通用、卡证、票据、行业文档等多场景下的印刷体、手写体识别,以及智能扫码、卡证票据核验服务。
开通自动发放免费次数1000次,而且是每月送1000次免费资源包:
如果是开发初学者话,有代码编写基础,对 HTTP 请求和 API 调用有一定的了解,可以通过此方式使用文字识别服务。 该方式能够实现在线调用、签名验证、SDK 代码生成和快速检索接口等能力:API Explorer
针对每个参数都有详细文档解释,此处我再详细解释一遍:
Region:HTTP 请求头:X-TC-Region。地域参数,用来标识希望操作哪个地域的数据。取值参考接口文档中输入参数章节关于公共参数 Region 的说明。注意:某些接口不需要传递该参数,接口文档中会对此特别说明,此时即使传递该参数也不会生效。
ImageBase64:图片的 Base64 值。
支持的图片格式:PNG、JPG、JPEG,暂不支持 GIF 格式。
支持的图片大小:所下载图片经Base64编码后不超过 7M。图片下载时间不超过 3 秒。
支持的图片像素:需介于20-10000px之间。
图片的 ImageUrl、ImageBase64 必须提供一个,如果都提供,只使用 ImageUrl。
示例值:/9j/4AAQSkZJRg…..s97n//2Q==
为方便大家使用,此处展示图片转换为 Base64 编码的实现:
import base64
# 定义图片路径
image_path = 'your_image.jpg'
# 将图片转换为Base64
with open(image_path, 'rb') as image_file:
# 读取图片内容并转换为Base64编码
base64_encoded = base64.b64encode(image_file.read()).decode('utf-8')
# 打印Base64字符串
print("Base64 编码结果:")
print(base64_encoded)
原始图片:
接口相应结果为:
{
"Response": {
"Angle": -5.7148051261901855,
"RequestId": "c3e51da5-80f5-480e-9749-518e2f130e26",
"StoreInfo": [
{
"Name": "商店名称",
"Rect": {
"Height": 137,
"Width": 280,
"X": 491,
"Y": 238
},
"Value": "蜜雪冰城"
},
{
"Name": "商店名称",
"Rect": {
"Height": 153,
"Width": 276,
"X": 1144,
"Y": 208
},
"Value": "蜜雪冰城"
}
],
"StoreLabel": [
"标准门头照"
]
}
}
参数名称 | 类型 | 描述 |
---|---|---|
StoreInfo | Array of StoreInfo | 门头照名称 示例值: { "Name": "商店名称", "Rect": { "Height": 263, "Width": 1132, "X": 232, "Y": 366 }, "Value": "城市生活超市" } |
Angle | Float | 图片旋转角度(角度制),文本的水平方向为0°,顺时针为正,逆时针为负 示例值:0.988696813583374 |
StoreLabel | Array of String | 门头照标签 示例值: "标准门头照" |
RequestId | String | 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 |
根据API Explorer可以快速找到自己想要的SDK信息,比如我们用Python去集成该API,首先先安装SDK包:
pip install tencentcloud-sdk-python-ocr -i https://pypi.tuna.tsinghua.edu.cn/simple
SecretId 和 SecretKey加入到application.yaml里面,登陆https://console.cloud.tencent.com/cam/capi 可获取。
import json
import types
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ocr.v20181119 import ocr_client, models
try:
# 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
# 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential(SecretId, SecretKey)
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = ocr_client.OcrClient(cred, "", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.RecognizeStoreNameRequest()
params = {
"ImageBase64": base64_encoded
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个RecognizeStoreNameResponse的实例,与请求对象对应
resp = client.RecognizeStoreName(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
调用返回结果:
开发十分快捷简单。这里再分析大数据集群图片OCR处理开发
下面给出一个参考的 Python 项目工程化搭建示例方案,以满足在所示架构(包括服务层、POI生产、司机注册与资料审核、车辆与保险信息管理、行程票据与报销管理、客服与投诉处理,以及下层的技术应用层如商户门头照识别、网约车行程单识别、通用票据识别、驾驶证/行驶证识别、机动车登记证书识别等)基础上,使用腾讯云智能结构化识别API构建完整系统的需求。该项目会同步上传GitHub开源,欢迎一起维护。
my_ocr_system/
├─ README.md
├─ requirements.txt
├─ setup.py
├─ config/
│ ├─ config.py # 配置文件,如API密钥、模型参数、服务端点等
├─ src/
│ ├─ main.py # 系统主入口,可提供CLI/HTTP接口启动
│ ├─ __init__.py
│ ├─ common/
│ │ ├─ __init__.py
│ │ ├─ utils.py # 工具函数,如图片base64编码、日志记录工具
│ │ ├─ ocr_client_factory.py # 封装OCR客户端实例化逻辑
│ ├─ services/ # 服务层逻辑(POI生产、司机审核、保险信息、行程报销、客服投诉处理)
│ │ ├─ __init__.py
│ │ ├─ poi_service.py # POI生产相关逻辑与对接
│ │ ├─ driver_service.py # 司机注册与资料审核相关服务逻辑
│ │ ├─ vehicle_service.py # 车辆与保险信息管理逻辑
│ │ ├─ itinerary_service.py # 行程票据与报销管理逻辑
│ │ ├─ customer_service.py # 客服与投诉处理逻辑
│ ├─ applications/ # 技术应用层逻辑(OCR实际应用)
│ │ ├─ __init__.py
│ │ ├─ merchant_photo_recognition.py # 商户门头照识别
│ │ ├─ ride_order_recognition.py # 网约车行程单识别
│ │ ├─ general_invoice_recognition.py # 通用票据识别
│ │ ├─ driver_license_recognition.py # 驾驶证和行驶证识别
│ │ ├─ vehicle_registration_certificate.py # 机动车登记证书识别
│ │ └─ templates/ # 若使用自定义模板存放识别结构化定义文件
│ ├─ interfaces/ # 对外接口层,如HTTP接口(RESTful API)或 gRPC 接口
│ │ ├─ __init__.py
│ │ ├─ api.py # Flask/FastAPI等Web框架对外提供API入口
│ │ ├─ router.py # 路由定义
│ ├─ db/ # 数据存储与访问层,可选,如使用数据库或缓存
│ │ ├─ __init__.py
│ │ ├─ models.py # 数据模型定义
│ │ ├─ dao.py # 数据访问对象
│ └─ workflow/ # 若需编排复杂OCR流程的工作流逻辑放在此处
│ ├─ __init__.py
│ ├─ workflows.py
│ ├─ tasks.py
└─ tests/
├─ __init__.py
├─ test_merchant_photo_recognition.py
├─ test_driver_service.py
├─ ... # 各类测试用例
config/:
config.py
中存放全局配置,如腾讯云API的密钥(通过更安全的方式加载,如环境变量或密钥管理服务)、OCR端点地址、日志级别、数据库连接信息、模板路径等。common/:
utils.py
:存放通用工具函数,比如图片文件转base64、日志工具、异常处理辅助函数。ocr_client_factory.py
:负责根据配置和密钥,初始化腾讯云OCR的客户端实例(如 OcrClient
),统一客户端初始化逻辑。services/:
该层为业务服务层逻辑,如图示架构中的POI生产、司机资料审核、车辆保险信息管理、行程票据报销、客服与投诉处理等,这些逻辑中会调用 applications 层的OCR功能进行识别,并将结果处理后写入数据库或进一步操作。
poi_service.py
:涉及POI点位生产的业务逻辑,可调用商户门头照识别模块获得POI必要信息。driver_service.py
:司机注册、资料审核等逻辑,可调用驾驶证识别模块来验证司机信息。vehicle_service.py
:车辆与保险信息管理逻辑,可调用行驶证识别或保险相关发票识别模块辅助信息录入。itinerary_service.py
:行程票据与报销管理逻辑,可调用通用票据识别或网约车行程单识别模块来提取报销所需的发票、单据信息。customer_service.py
:客服与投诉流程中需要OCR识别一些证据类图片或记录时,可调用对应的OCR模块协助分类和信息提取。applications/:
该层为技术应用层,与OCR核心功能直接交互。根据具体文档类型,调用腾讯云OCR SDK完成识别,并将结果以结构化数据格式返回给 services 层。
merchant_photo_recognition.py
:对商户门头照片进行OCR识别,提取店名、地址等信息。ride_order_recognition.py
:网约车行程单识别。general_invoice_recognition.py
:通用票据识别。driver_license_recognition.py
:驾驶证和行驶证OCR识别。vehicle_registration_certificate.py
:机动车登记证书识别。若对这些识别结果需要特定的键值映射或模板定义,可在 templates/
目录中维护JSON或YAML格式的模板文件,再在对应模块中加载模板并利用多模态模型做好键值对应。
interfaces/:
提供对外服务的统一接口层(API层)。
api.py
:例如使用FastAPI/Flask框架定义HTTP接口,通过RESTful方式对外提供识别请求入口。外部系统可以调用这些HTTP接口传入图片,返回JSON格式的结构化识别结果。router.py
:路由配置,将URL与对应的服务逻辑关联。db/:
如果需要对识别结果或后续业务数据进行持久化存储,可在此层实现数据模型定义与数据访问逻辑(DAO层)。
models.py
:定义ORM模型(如SQLAlchemy)。dao.py
:提供数据的CRUD接口函数,供services层调用。workflow/:
若系统内有更复杂的流程编排(例如先识别门头照,拿到POI信息,再去调用其他OCR接口补全数据,最终整合为一条POI数据记录),可以在此定义工作流与任务调度逻辑。
tests/:
测试用例目录,用于放置单元测试和集成测试代码。
applications/
和 services/
分别编写测试用例,以确保 OCR 识别逻辑和业务逻辑的正确性。因该项目会同步上传GitHub开源,故在本文中不作过多代码介绍,以 common/ocr_client_factory.py
为例:
# common/ocr_client_factory.py
import os
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from config.config import Config
def get_ocr_client():
secret_id = os.environ.get("TENCENT_SECRET_ID", Config.SECRET_ID)
secret_key = os.environ.get("TENCENT_SECRET_KEY", Config.SECRET_KEY)
endpoint = Config.OCR_ENDPOINT
cred = credential.Credential(secret_id, secret_key)
http_profile = HttpProfile()
http_profile.endpoint = endpoint
client_profile = ClientProfile(httpProfile=http_profile)
from tencentcloud.ocr.v20181119 import ocr_client
client = ocr_client.OcrClient(cred, "", client_profile)
return client
applications/merchant_photo_recognition.py
(商户门头照识别示例):
# applications/merchant_photo_recognition.py
import json
import base64
from common.ocr_client_factory import get_ocr_client
from tencentcloud.ocr.v20181119 import models
def recognize_merchant_store(photo_path):
with open(photo_path, "rb") as f:
image_data = f.read()
image_base64 = base64.b64encode(image_data).decode()
client = get_ocr_client()
req = models.RecognizeStoreNameRequest()
params = {
"ImageBase64": image_base64
}
req.from_json_string(json.dumps(params))
resp = client.RecognizeStoreName(req)
return json.loads(resp.to_json_string())
services/poi_service.py
(POI生产逻辑示例):
调用 merchant_photo_recognition.py
获取门头识别信息,再进行后续处理。
# services/poi_service.py
from applications.merchant_photo_recognition import recognize_merchant_store
def create_poi_from_store_photo(photo_path):
# 调用应用层的识别函数
result = recognize_merchant_store(photo_path)
store_name = result.get("StoreName", "")
address = result.get("Address", "")
# 根据需要将store_name, address等信息处理或存入数据库
# ...
return {"store_name": store_name, "address": address}
interfaces/api.py
(对外接口的简单示例,使用Flask):
# interfaces/api.py
from flask import Flask, request, jsonify
from services.poi_service import create_poi_from_store_photo
app = Flask(__name__)
@app.route('/recognize/merchant', methods=['POST'])
def recognize_merchant():
# 接收图片文件上传或URL
file = request.files['image']
file_path = "/tmp/upload.jpg"
file.save(file_path)
result = create_poi_from_store_photo(file_path)
return jsonify(result)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
每个公司大数据集群架构不一致,Hadoop集群推荐使用Pyspark会更好处理,具体原理一图展示:
主要的计算提交到Hadoop分布式执行而不是在PySpark客户端节点下载处理,这是正确使用PySpark的关键。
import pandas as pd
import numpy as np
from pyspark.sql import HiveContext
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
from pyspark import SparkContext
import json
import types
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ocr.v20181119 import ocr_client, models
def get_sparksession():
spark = SparkSession.builder \
.master("yarn")\
.appName("pyspark_TencentOCR") \
.enableHiveSupport()\
.getOrCreate()
return spark
def TencentOCR(base64_encoded):
cred = credential.Credential(SecretId, SecretKey)
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = ocr_client.OcrClient(cred, "", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.RecognizeStoreNameRequest()
params = {
"ImageBase64": base64_encoded
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个RecognizeStoreNameResponse的实例,与请求对象对应
resp = client.RecognizeStoreName(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
if __name__ == '__main__':
spark=get_sparksession()
sql_str="提取图片Base64"
df_dataframe=get_stable_link(sql_str)
df_test=TencentOCR(df_dataframe)
spark.stop()
除此之外,开发任务已经就此结束,可以说十分高效方便,结合腾讯云每月的免费额度,如果没有强制技术自研内需是完全可以依赖的。
结合最新大模型技术与OCR技术的融合,路况状态信息的准确性会影响到用户在出行过程中的体验。传统的路况状态,主要依靠驾车用户的轨迹信息、用户上传、公共信息等要素通过技术算法处理后提供给用户。但在用户少、驾驶行为异常的道路上,这种方法难以完全保证路况状态信息的准确性。
如果我们能通过视频图像识别的算法,由视频图片观察到的路面状况,包括机动车数量、道路宽度和空旷度等因素来判断道路通行状态(畅通、缓行、拥堵),这将提高道路路况状态判断的准确性,从而提升地图用户的出行体验。
展望未来,随着大模型技术与 OCR 技术的深度融合,交通场景下的智能识别将进一步扩展到路况状态分析、实时动态数据更新等应用场景。通过算法提升对道路通行状态的准确判断,地图服务将更加智能化,提升C端用户出行体验的精准性和便捷性。我是fanstuck,对本文技术有深层兴趣的读者欢迎一起探讨,再次感谢各位读者的多多支持!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。