当前位置: 首页 > news >正文

图像识别与 OCR 应用实践

图像识别是一种让计算机具备“看”与“理解”图像能力的人工智能技术,其目标是从图像或视频中提取有意义的信息,如物体、人物、场景或文字。在现实生活中,这项技术被广泛应用于面部识别、自动驾驶、安防监控、医疗诊断、图像搜索等多个领域。

图像识别的发展离不开**计算机视觉(Computer Vision)深度学习(Deep Learning)**的持续演进。传统方法依赖人工设计特征(如边缘、角点、纹理等),而现在的主流方法是使用卷积神经网络(CNN)等深度模型,自动提取特征并进行分类或识别,大幅提升了准确率和泛化能力。

图像识别常见的任务包括:

  • 图像分类:判断图像属于哪一类(如猫、狗、飞机等)

  • 目标检测:定位图中出现的各类物体

  • 图像分割:为图像中的不同区域赋予语义标签

  • 面部识别:识别和匹配人脸信息

  • OCR(光学字符识别):从图像中提取文字内容


从手写数字识别到实用 OCR 工具

我最初通过一个 CNN 架构尝试识别手写数字,使用经典的 MNIST 数据集/自制的手写训练集进行训练。模型通过反向传播和梯度下降来降低预测误差,实现数字识别的功能。

代码开源地址:
👉 SimpleCNN - GitHub

不过,这个项目更适合教学与实验目的,在实际应用中无法直接应对复杂图像或模糊文字识别的需求。因此我转而使用一些成熟的图像识别 API 服务,比如阿里云的 OCR 识别服务,它对中文文字识别支持较好,使用方便,但在图像模糊或光线不佳时,识别准确率仍有限,需要配合图像预处理优化结果。


实用 OCR API 推荐(阿里云)

以下是我实际使用过,觉得比较实用的一些 API(整理备份,也方便其他人参考):

  • 🔍 [阿里官方] 通用 OCR 文字识别 API

  • 🔍 [阿里官方] 高精度 OCR 图像识别 API

  • 📚 API 专区 - 云市场

  • 🧠 阿里云通义千问 - DashScope(大语言模型接口)

  • 🧠 智谱 AI 模型服务(GLM-4 Flash 免费/付费)

  • 🎓 阿里云高校学生一年免费服务器计划(申请制)


阿里 OCR API 调用代码示例(Python)

这里是一个实际使用的调用代码,支持上传图片文件或图片链接:

# -*- coding: utf-8 -*-import json
import base64
import os
import ssltry:from urllib.error import HTTPErrorfrom urllib.request import Request, urlopen
except ImportError:from urllib2 import Request, urlopen, HTTPErrorcontext = ssl._create_unverified_context()def get_img(img_file):"""将本地图片转成base64编码的字符串,或者直接返回图片链接"""# 简单判断是否为图片链接if img_file.startswith("http"):return img_fileelse:with open(os.path.expanduser(img_file), 'rb') as f:  # 以二进制读取本地图片data = f.read()try:encodestr = str(base64.b64encode(data), 'utf-8')except TypeError:encodestr = base64.b64encode(data)return encodestrdef posturl(headers, body):"""发送请求,获取识别结果"""try:params = json.dumps(body).encode(encoding='UTF8')req = Request(REQUEST_URL, params, headers)r = urlopen(req, context=context)html = r.read()return html.decode("utf8")except HTTPError as e:print(e.code)print(e.read().decode("utf8"))def request(appcode, img_file, params):# 请求参数if params is None:params = {}img = get_img(img_file)params.update({'image': img})# 请求头headers = {'Authorization': 'APPCODE %s' % appcode,'Content-Type': 'application/json; charset=UTF-8'}response = posturl(headers, params)print(response)# 请求接口
REQUEST_URL = "https://tysbgpu.market.alicloudapi.com/api/predict/ocr_general"if __name__ == "__main__":# 配置信息appcode = "你的APPCODE"img_file = "图片链接/本地图片路径"params = {"configure": {"min_size": 16,  # 图片中文字的最小高度,单位像素(此参数目前已经废弃)"output_prob": True,  # 是否输出文字框的概率"output_keypoints": False,  # 是否输出文字框角点"skip_detection": False,  # 是否跳过文字检测步骤直接进行文字识别"without_predicting_direction": False,  # 是否关闭文字行方向预测}}request(appcode, img_file, params)

你只需要填入你的 AppCode 和图片地址即可直接运行。

以及 动态爬虫+OCR识别自动登录人民邮电出版社

recognition.py

# -*- coding: utf-8 -*-
import json
import base64
import os
import ssltry:from urllib.error import HTTPErrorfrom urllib.request import Request, urlopen
except ImportError:from urllib2 import Request, urlopen, HTTPErrorcontext = ssl._create_unverified_context()def get_img(img_file):"""将本地图片转成base64编码的字符串,或者直接返回图片链接"""# 简单判断是否为图片链接if img_file.startswith("http"):return img_fileelse:with open(os.path.expanduser(img_file), 'rb') as f:  # 以二进制读取本地图片data = f.read()try:encodestr = str(base64.b64encode(data), 'utf-8')except TypeError:encodestr = base64.b64encode(data)return encodestr# 请求接口
REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"
def posturl(headers, body):"""发送请求,获取识别结果"""try:params = json.dumps(body).encode(encoding='UTF8')req = Request(REQUEST_URL, params, headers)r = urlopen(req, context=context)html = r.read()return html.decode("utf8")except HTTPError as e:print(e.code)print(e.read().decode("utf8"))def request(appcode, img_file, params):# 请求参数if params is None:params = {}img = get_img(img_file)if img.startswith('http'):  # img 表示图片链接params.update({'url': img})else:  # img 表示图片base64params.update({'img': img})# 请求头headers = {'Authorization': 'APPCODE %s' % appcode,'Content-Type': 'application/json; charset=UTF-8'}response = posturl(headers, params)return responsedef run():"""运行函数:return:返回识别结果"""return request(appcode, img_file, params)if __name__ == '__main__':# 请求接口REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"# 配置信息appcode = "95eaaede7e784cb0a87ab55c8445a766"img_file = "./captcha.png"params = {# 是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要"prob": False,# 是否需要单字识别功能,默认不需要。 true:需要 false:不需要"charInfo": False,# 是否需要自动旋转功能,默认不需要。 true:需要 false:不需要"rotate": False,# 是否需要表格识别功能,默认不需要。 true:需要 false:不需要"table": False,# 字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false"sortPage": False,# 是否需要去除印章功能,默认不需要。true:需要 false:不需要"noStamp": False,# 是否需要图案检测功能,默认不需要。true:需要 false:不需要"figure": False,# 是否需要成行返回功能,默认不需要。true:需要 false:不需要"row": False,# 是否需要分段功能,默认不需要。true:需要 false:不需要"paragraph": False,# 图片旋转后,是否需要返回原始坐标,默认不需要。true:需要  false:不需要"oricoord": True}message = request(appcode, img_file, params)print(message['content'])# import json# message = '{"sid":"95246a4ddeadba2492f40f4e4be26315d0abf8aae801ca51727b6c677632bd3ac000a754","prism_version":"1.0.9","prism_wnum":1,"prism_wordsInfo":[{"word":"me3xy","pos":[{"x":2,"y":8},{"x":63,"y":8},{"x":63,"y":30},{"x":2,"y":30}],"direction":0,"angle":-90,"x":21,"y":-11,"width":22,"height":61}],"height":34,"width":68,"orgHeight":34,"orgWidth":68,"content":"me3xy ","algo_version":""}'# # 怎么获取content中的信息# print(json.loads(message)['content'])

main.py

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
from PIL import Imageurl = 'https://www.ptpress.com.cn/login'# 无头浏览器配置
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无头模式
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')driver = webdriver.Chrome(options=options) # options:  无头模式
driver.get(url=url)time.sleep(2)# 找到验证码图片元素
captcha_img = driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[3]/div[2]/div/img')# 保存验证码图片(可选)
captcha_img.screenshot('captcha.png')im = Image.open('./captcha.png')
im.show()# ----------------------------------------------------
# 图像识别
import recognition# 请求接口
REQUEST_URL = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced"# 配置信息
appcode = "95eaaede7e784cb0a87ab55c8445a766"
img_file = "./captcha.png"
params = {# 是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要"prob": False,# 是否需要单字识别功能,默认不需要。 true:需要 false:不需要"charInfo": False,# 是否需要自动旋转功能,默认不需要。 true:需要 false:不需要"rotate": False,# 是否需要表格识别功能,默认不需要。 true:需要 false:不需要"table": False,# 字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false"sortPage": False,# 是否需要去除印章功能,默认不需要。true:需要 false:不需要"noStamp": False,# 是否需要图案检测功能,默认不需要。true:需要 false:不需要"figure": False,# 是否需要成行返回功能,默认不需要。true:需要 false:不需要"row": False,# 是否需要分段功能,默认不需要。true:需要 false:不需要"paragraph": False,# 图片旋转后,是否需要返回原始坐标,默认不需要。true:需要  false:不需要"oricoord": True
}data = recognition.request(appcode, img_file, params)import json
data = json.loads(data)['content']
print(data)# -----------------------------------------------------# 输入用户名、密码和验证码(这里验证码需要手动输入或者使用第三方验证码识别服务)
username = ''
password = ''
# verify_code = input('请输入验证码:') # 手动输入验证码driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[1]/input').send_keys(username)
driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[2]/input').send_keys(password)
driver.find_element(By.XPATH, '//*[@id="loginForm"]/div[3]/div[1]/div/input').send_keys(data)# 点击登录按钮
driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()time.sleep(3)  # 等待登录结果page_source = driver.page_source
print(page_source)driver.quit()

小结与感想

图像识别技术是一个非常实用又持续进化的领域。虽然自己动手训练 CNN 模型很有成就感,但面对实际应用场景,使用成熟的云服务往往更高效也更稳定。当然,这也让我意识到:图像识别不仅是“训练模型”,更是一个包括图像采集、预处理、模型调用、结果处理的完整链条。

相关文章:

  • 学术论文的科研流程概述 视频会议记录
  • GpuGeek全栈AI开发实战:从零构建企业级大模型生产管线(附完整案例)
  • stm32 ADC单通道转换
  • day20-线性表(链表II)
  • C++(2)
  • 牛顿迭代公式
  • MySQL中的索引下推技术(ICP)
  • 通用软件项目技术报告 - 导读IV(终)
  • MATLAB实现振幅调制(AM调制信号)
  • 构建现代化WPF应用:数据驱动开发与高级特性解析
  • Jenkins里构建一个简单流水线
  • 【常用算法:排序篇】6.归并排序双刃剑:逆序数秒算与搜索引擎海量数据排序
  • Virtualized Table 虚拟化表格 el-table-v2 表头分组 多级表头的简单示例
  • 机器学习基础课程-5-课程实验
  • 使用Docker部署MongoDB
  • AI时代的弯道超车之第七章:如何用AI赋能创业?
  • springboot项目启动报错:找不到或无法加载主类
  • SVNAdmin管理使用教程
  • ECharts:数据可视化的强大引擎
  • springboot + mysql8降低版本到 mysql5.7
  • 伊朗最高领袖顾问:伊朗愿承诺永不制造核武,换取美解除制裁
  • 透视社会组织创新实践中的花开岭现象:与乡村发展的融合共进
  • 盛和资源海外找稀土矿提速:拟超7亿元收购匹克,加快推动坦桑尼亚项目
  • 重庆市委原常委、政法委原书记陆克华被决定逮捕
  • 安徽省委常委、合肥市委书记费高云卸任副省长职务
  • 德国将不再公布对乌克兰军事支持的细节