图1 测评表图片
图2 测评表图片识别效果
问题背景:
党务工作中进行民主测评时,往往需要在正式的场合分发纸质的民主测评表,让单位人员在相应的位置打√,表格的样式往往与如下图例相似(图片来源于互联网,数据纯属虚构,用“√”模拟手写的对钩)。由于民主测评程序的敏感性,单位往往要求用纸质版表格统计,当测评人数较多时,会给统计带来很大的难度,相应的繁琐重复的工作和公差就不可避免。
目的:
为了让单位人员不为繁务所累,以更多精力投入主责主业,本文旨在通过视觉识别技术提取纸质表格的数据,得到可编辑的excel表格数据,从而方便统计。
方案及取舍:
要从表格图像中提取可编辑的表格数据,可以考虑以下方案:
1. 专用工具和软件:
使用WPS等工具将PDF或图像转换为可编辑的格式。优点:大多数用户来说较易获取,且识别效果非常好,甚至可以识别出合并单元格;缺点:需要开通会员。
2. 在线服务:
使用在线转换工具,如白描或docsmall将表格图像转换为Excel格式。优点:方便快捷;缺点:1.有的需要开通会员,2.不能批量处理表格图像,3.不是本地处理图片,涉及图片信息安全。
3. 定制脚本和工具:
编写Python脚本结合OpenCV和Pandas库,自定义处理和解析表格图像。优点:可根据需要自定义算法,自动化得到想要的统计数据,2.可以实现本地处理图片;缺点:1.实现表格识别的过程很难,对编程要求高;2.识别效果不理想;3.如果去github上找,有翻墙风险且对汉语用户不友好。
4. 商业API:
使用如“百度智能云”或“腾讯云”或者“阿里云”等商业服务提供的API。优点:1.识别模型成熟,识别效果好,2.可以结合python实现自动化统计和表格批量处理;缺点:1.需要个人信息注册,从而领取免费额度。2.图片不是在本地处理,涉及信息安全,但是如果是选择百度、腾讯、阿里这些国内知名公司,隐私一般能得到保护。
综合以上方案,本文选择第四个方案,选取“百度智能云”的表格文字识别V2,如图所示,免费额度为500次/月,对于民主测评的周期来说完全足够了。
实现步骤:
1.登录“百度智能云https://console.bce.baidu.com/ai/#/ai/ocr/overview/resource/list”
2.创建应用
3.全选文字识别接口
4.获取API_KEY 和SECRET_KEY
5.将自己的API_KEY 和SECRET_KEY、图片和表格的地址,填入以下python代码相应位置后运行
代码:
import base64
import urllib
import requests
import pandas as pd
API_KEY = "你的api key"
SECRET_KEY = "你的secret key"
def main():
access_token = get_access_token()
url = "https://aip.baidubce.com/rest/2.0/ocr/v1/table?access_token=" + access_token
# 使用 get_file_content_as_base64 方法获取图像的 base64 编码
encoded_image = get_file_content_as_base64("你的图片地址", True)
payload = f'image={encoded_image}&cell_contents=false&return_excel=false'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
}
response = requests.post(url, headers=headers, data=payload)
if response.ok:
response_data = response.json()
extract_table_data(response_data)
else:
print("请求失败:", response.text)
def get_file_content_as_base64(path, urlencoded=False):
"""
获取文件 base64 编码
:param path: 文件路径
:param urlencoded: 是否对结果进行 URL 编码
:return: base64 编码信息
"""
with open(path, "rb") as f:
content = base64.b64encode(f.read()).decode("utf8")
if urlencoded:
content = urllib.parse.quote_plus(content)
return content
def get_access_token():
"""
使用 AK,SK 生成鉴权签名(Access Token)
:return: access_token,或是 None (如果错误)
"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return str(requests.post(url, params=params).json().get("access_token"))
def extract_table_data(response):
tables = response.get('tables_result', [])
if not tables:
print("没有找到表格数据")
return
for index, table in enumerate(tables):
body = table.get('body', [])
max_col = max(cell['col_end'] for cell in body) + 1
max_row = max(cell['row_end'] for cell in body) + 1
# 创建一个空的 DataFrame
df = pd.DataFrame(index=range(max_row), columns=range(max_col))
# 填充 DataFrame
for cell in body:
word = cell.get('words', '')
row_start = cell['row_start']
col_start = cell['col_start']
df.iloc[row_start, col_start] = word
# 将 DataFrame 保存到 Excel 文件
output_filename = f'D:/桌面/输出表格1_{index+1}.xlsx'
df.to_excel(output_filename, index=False)
print(f"表格数据已保存到 {output_filename}")
if __name__ == '__main__':
main()
以上代码目前仅实现了将图片信息转换成可编辑的表格信息,读者可以自己通过添加python代码自动化获取需要统计的信息。博主后续也会更新添加统计功能后的代码