• [高校训练营] 银发智伴:基于华为云码道(CodeArts)代码智能体的智能体检报告应用
    一、概述1.1 案例介绍银发智伴(ElderlyCare AI) 是一款面向子女、老年家庭成员和应用后台管理员三类用户的智能体检报告管理应用。子女可在 PC 端上传父母的 PDF、JPG 或 PNG 体检报告,系统通过 OCR 识别、指标提取和大模型健康解读,将专业检验结果转换为通俗说明、健康建议和饮食计划;随后生成适老化 H5 分享链接与二维码,父母通过手机即可查看大字版报告并使用语音播报。后台管理员负责用户状态、角色、系统概览和审计信息管理,不参与用户报告内容的日常操作。本案例采用 FastAPI、Vue 3、SQLite、Redis、Nginx 和华为云 ECS 构建,集成华为云 OBS 与 OCR,并使用华为云码道(CodeArts)代码智能体完成需求分析、存量代码理解、任务拆解、增量开发和问题调试。应用还提供家庭成员管理、历年指标趋势、异常变化提醒、报告对比、分享密码、访问次数限制和后台治理,形成“报告上传、智能解析、健康解读、长期跟踪、适老分享、后台治理”的完整业务闭环。GitCode 源码与演示视频:https://gitcode.com/SDSXshlbz/elderlycare-ai本案例中的演示账号、家庭成员和体检指标均为合成数据,不对应任何真实个人。健康解读仅供参考,不构成医疗诊断建议。1.2 适用对象企业开发者个人开发者高校学生学习本案例前,建议具备 Python、JavaScript、Linux 常用命令和 HTTP API 的基础知识。1.3 案例时间本案例总时长预计90分钟,其中云资源准备约20分钟,项目配置与部署约40分钟,功能验证与资源清理约30分钟。1.4 案例流程[1. 准备云资源] | v [2. 配置项目与密钥] -> [3. 构建 PC/H5 前端和 FastAPI 后端] | v [5. H5适老分享] <- [4. OCR识别、指标提取与健康解读]说明:在华为云创建 ECS、VPC、安全组、EIP 和 OBS 桶,公网仅长期开放演示所需的 80 端口;准备华为云 AK/SK、OCR、OBS 和大模型配置,通过 .env 注入运行参数,不将密钥写入源码;将源码上传到 Ubuntu 22.04 ECS,执行 deploy_ecs.sh,自动安装依赖、构建两个前端并配置 Nginx、Redis 和 systemd;用户上传报告后,后端依次完成 OCR 降级识别、指标提取、风险判定、健康解读和饮食计划生成;子女在 PC 端查看趋势和对比结果,并生成带二维码、可选访问密码和语音播报的适老化 H5 分享页面。1.5 资源总览本案例使用按需计费资源,建议将完整体验控制在2小时内。不同区域和活动价格可能变化,实际费用以华为云控制台订单页为准。体验完成后请及时释放 ECS、EIP 和不再使用的 OBS 数据,避免产生多余费用。资源名称规格单价(元)弹性云服务器 ECS通用计算增强型 c7.large.2 | 2 vCPUs | 4 GiB | Ubuntu 22.04 Server | 40 GiB GPSSD以控制台实时价格为准弹性公网IP(Elastic IP,简称EIP)按流量计费 | 5Mbit/s按实际公网流量计费虚拟私有云 VPC 和安全组1个VPC、1个子网、1个安全组VPC和安全组本身免费对象存储服务 OBS标准存储,用于报告文件、二维码等对象按存储量与请求次数计费文字识别 OCR通用文字识别、通用表格识别按调用量计费或使用套餐包华为云码道(CodeArts)代码智能体通用体验版以开通页面为准阿里云百炼大模型 APIqwen-turbo、qwen-vl-ocr、qwen-vl-plus按模型调用量计费二、环境和资源准备2.1 购买华为云 ECS 弹性云服务器登录华为云控制台,依次进入 服务列表 > 计算 > 弹性云服务器 ECS,点击 购买弹性云服务器。计费模式选择 按需计费,区域选择 北京四 cn-north-4,规格选择 通用计算增强型 c7.large.2,2 vCPUs,4 GiB。镜像选择 Ubuntu Server 22.04 64bit,系统盘选择 40 GiB GPSSD。创建或选择 VPC 与子网,购买 5Mbit/s、按流量计费 的弹性公网 IP。创建安全组,长期入方向规则只放行 TCP/80。部署期间如需 SSH,可临时放行 TCP/22,并将源地址限制为管理员当前公网 IP,部署完成后立即删除 22 端口规则。点击 立即购买,确认按需资源并等待 ECS 状态变为“运行中”。记录 ECS 公网 IP,后文用 <ECS公网IP> 表示。关键节点说明:安全组只控制云侧入站流量,Nginx 仍需在实例内监听 80 端口。后端 Uvicorn 仅监听 127.0.0.1:8005,不能绕过 Nginx 直接从公网访问。2.2 准备华为云 OBS、OCR 和访问密钥进入 服务列表 > 存储 > 对象存储服务 OBS,创建私有桶,例如 elderlycare,区域需与 ECS 一致。进入 服务列表 > 人工智能 > 文字识别 OCR,开通通用文字识别和通用表格识别。点击控制台右上角用户名,进入 我的凭证 > 访问密钥,创建并妥善保存 AK/SK。在 我的凭证 > API凭证 中记录项目 ID,项目所属区域应为 cn-north-4。AK/SK 具有云资源访问权限,只能写入服务器上的 .env,不得提交到 Git、案例文档、截图或前端代码中。OBS 桶保持私有,文件由后端 SDK 访问。2.3 准备大模型与 OCR 降级服务登录阿里云百炼控制台,地址:https://dashscope.console.aliyun.com/,开通 DashScope 服务。在 API-KEY 管理 中创建 API Key,并确认账号可调用 qwen-turbo、qwen-vl-ocr 和 qwen-vl-plus。将 API Key 仅配置在 .env 中。项目首先调用华为云 OCR;若该调用失败,再依次尝试 qwen-vl-ocr 和 qwen-vl-plus,避免单一识别服务异常导致整条解析链路不可用。2.4 准备本地和云端环境本案例以 Windows 作为开发端、Ubuntu 作为运行端,建议环境如下:环境软件及版本用途Windows 10/11PowerShell 5.1+、OpenSSH Client、tar.exe源码检查、测试、打包和上传本地 PythonPython 3.10+,本案例测试环境为 Python 3.12后端测试本地 Node.jsNode.js 20、npm 10PC/H5 生产构建Ubuntu ECSUbuntu 22.04、Python 3.10、Node.js 20、Nginx、Redis演示环境运行执行以下命令复制配置模板:Copy-Item .env.example .env编辑 .env,将占位内容替换为实际配置。不要删除未使用的键,也不要在等号两侧添加多余引号:HUAWEI_CLOUD_AK=你的华为云AK HUAWEI_CLOUD_SK=你的华为云SK HUAWEI_CLOUD_REGION=cn-north-4 HUAWEI_CLOUD_PROJECT_ID=你的华为云项目ID OBS_BUCKET_NAME=elderlycare OBS_ENDPOINT=obs.cn-north-4.myhuaweicloud.com JWT_SECRET_KEY=至少32字节的随机字符串 REDIS_URL=redis://localhost:6379/0 DATABASE_URL=sqlite+aiosqlite:///./elderlycare.db MCP_SERVER_URL= LLM_API_KEY=你的千问APIKey LLM_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1 LLM_MODEL_NAME=qwen-turbo ALIYUN_OCR_API_KEY=你的阿里云OCR_APIKey ALIYUN_OCR_MODEL=qwen-vl-ocr SHARE_BASE_URL=http://<ECS公网IP>/h5在 Windows PowerShell 中生成随机 JWT 密钥:$bytes = New-Object byte[] 48 [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes) [Convert]::ToBase64String($bytes) 三、构建银发智伴应用3.1 使用 CodeArts 代码智能体创建项目登录华为云码道(CodeArts),创建 Python + Vue 3 项目。在 CodeArts IDE 中输入以下需求描述,让代码智能体先理解目标和约束,再结合本案例存量源码进行增量开发:创建“银发智伴”体检报告管理应用。后端使用 Python FastAPI 和 SQLAlchemy Async,PC 端与 H5 端使用 Vue 3。子女在 PC 端上传父母体检报告,后端通过 OCR 提取指标,生成健康解读、饮食计划、趋势分析和报告对比;H5 使用大字号、清晰风险标签和中文语音播报。项目部署到 Ubuntu ECS,由 Nginx 统一提供 PC、H5 和 API 入口。本项目工作区保留了代码智能体生成并持续修订的规格、设计和任务文件,使用过程如下:阶段代码智能体产物或操作人工确认的关键节点需求规格化.codeartsdoer/specs/elderlycare_ai/spec.md明确子女、父母、管理员三类角色,以及“仅提供健康参考、不替代医生诊断”的职责边界存量代码分析.codeartsdoer/specs/elderlycare_ai/design.md对照现有认证、报告和分享模块,判断哪些功能复用、哪些功能增量扩展,避免大幅改变原有结构任务拆解.codeartsdoer/specs/elderlycare_ai/tasks.md将工作拆分为认证、报告、OCR、健康解读、分享、管理员、测试和部署等可验证任务代码开发根据任务逐个生成或补全 FastAPI 服务、Vue 页面和部署配置审查接口权限、异步数据库事务、上传限制、异常映射和前后端字段契约调试验证结合错误日志定位登录、复制、H5 子路径和 Ubuntu 兼容问题每次修复后执行后端测试、两个前端生产构建和 ECS 健康检查本案例使用代码智能体辅助完成的典型调试过程如下:登录错误调试:根据后端日志和认证服务调用链,发现错误凭据触发的业务异常未正确映射。修正空用户判断和异常处理器后,错误账号由 HTTP 500 变为 HTTP 401,并返回“账号或密码错误”;分享链接复制调试:公网演示环境使用 HTTP,浏览器可能禁用安全上下文中的 Clipboard API。智能体协助定位兼容性原因,并在 navigator.clipboard.writeText() 失败时使用 document.execCommand('copy') 回退;Windows 到 Ubuntu 迁移调试:检查 CRLF/LF、文件名大小写、依赖锁文件和路径分隔符;前端使用 npm ci 复现依赖,部署脚本保持 LF,源码导入路径与真实文件名大小写一致;H5 子路径调试:统一 Vite base: '/h5/'、Vue Router 的 import.meta.env.BASE_URL 与 Nginx try_files,解决分享深层路由刷新 404;验证闭环:本地运行 python -m pytest tests -q,分别执行 PC/H5 的 npm run build,部署后访问 /health,并验证登录、趋势、对比、分享和管理员接口。代码智能体用于加速分析、编码和定位问题,不能替代人工评审。代码生成后必须逐项检查权限边界、异常处理、上传限制、密钥加载、医疗免责声明和敏感信息,并通过测试及生产构建后才能部署。3.2 部署项目代码1)解决方案总体设计银发智伴采用“多端访问、统一 API、智能服务可降级、云上统一接入”的解决方案。PC 端承载报告管理、趋势对比和后台治理,H5 端专注适老化查看与语音播报;Nginx 提供统一公网入口,FastAPI 编排认证、报告、分享和智能解析流程;OBS 保存私有报告对象,SQLite 保存结构化业务数据,Redis 保存令牌黑名单和运行期状态。OCR 与大模型均设置超时、错误处理和本地降级,避免第三方服务短暂不可用时整个应用失效。用户上传报告后,请求依次经过文件校验、私有存储、OCR 识别、指标提取、风险判定、大模型健康解读和合规过滤;处理状态通过状态机管理。子女可在 PC 端查看结果、趋势和对比,也可生成带随机状态 ID、有效期、可选密码和访问次数限制的分享链接。父母通过 H5 查看大字版内容;管理员通过角色鉴权后的接口查看系统概览和管理用户。2)系统架构设计用户层:PC 子女端 / H5 父母端 / PC 管理后台 | 接入层:EIP + Nginx(/、/h5/、/api/、/health) | 应用层:FastAPI API / JWT认证 / 报告 / 分享 / 趋势 / 对比 / 管理 | 智能层:华为云OCR -> 百炼OCR -> Qwen VL / MCP大模型 / 合规工具 / 本地规则 | 数据层:SQLite业务数据 / Redis状态与令牌 / OBS私有对象 | 运维层:systemd / 健康检查 / 审计日志 / 华为云安全组架构关键点:公网只暴露 Nginx 的 80 端口,FastAPI 仅监听 127.0.0.1:8005;PC、H5 与 API 共用同一主机,减少跨域配置;智能服务通过统一服务层调用,业务 API 不直接依赖某一家模型厂商;配置和密钥全部由 .env 注入,仓库只提供不含真实值的 .env.example。核心技术难点与解决思路核心难点解决思路验证方式OCR 服务超时、配额不足或结果为空依次调用华为云 OCR、百炼 OCR 和 Qwen VL,仅在获得有效文本时结束;全失败时明确标记报告失败Mock 各级返回值,检查降级顺序和失败状态大模型输出不稳定且健康内容有合规风险传入结构化指标,以系统提示词约束输出;执行合规过滤并固定展示免责声明;调用失败时使用本地规则生成基础解读断开模型服务后仍能生成可查看的基础结果报告解析耗时,用户难以判断进度使用 OCR_PROCESSING、EXTRACTING、INTERPRETING、COMPLETED、FAILED 状态机,并通过 SSE 推送进度检查页面进度变化及异常后最终状态Windows 开发代码迁移到 Ubuntu锁定 Python/Node 依赖,使用 npm ci;Shell 脚本使用 LF;检查源码路径大小写,不使用 Windows 专属路径本地测试、双前端生产构建和 ECS 健康检查均通过H5 部署在 /h5/ 后深层路由刷新 404Vite base、Router base 和 Nginx try_files 使用一致的 /h5/ 前缀直接访问 /h5/share/<state_id> 返回 HTTP 200HTTP 演示站点复制分享链接失败优先使用 Clipboard API,失败时回退到隐藏文本框和 document.execCommand('copy')本地 HTTPS/localhost 与 ECS HTTP 环境分别点击复制医疗报告、账号和后台权限安全bcrypt 保存密码,JWT 鉴权,失败次数锁定,角色依赖保护管理员接口,OBS 私有存储并记录审计日志错误登录返回 401,普通用户访问管理员接口返回 4033)通过 GitCode 下载源码并了解项目结构本案例源码公开托管于 GitCode:https://gitcode.com/SDSXshlbz/elderlycare-ai。在 Windows PowerShell 或 Ubuntu 终端执行:git clone https://gitcode.com/SDSXshlbz/elderlycare-ai.git cd elderlycare-ai仓库不包含 .env、数据库、用户上传文件或真实医疗图片。克隆后需根据 .env.example 创建本地 .env 并填写自己的服务配置。项目结构如下:├── app/ # FastAPI后端 │ ├── api/ # 登录、报告、分享、趋势、对比等API路由 │ ├── core/ # 配置、数据库、安全、OBS、OCR、异常处理 │ ├── mcp/ # 大模型调用和本地工具降级 │ ├── models/ # SQLAlchemy ORM模型 │ ├── schemas/ # 请求和响应数据模型 │ ├── services/ # 认证、报告、解析、解读、分享等业务服务 │ └── main.py # FastAPI入口、路由和健康检查 ├── frontend/ │ ├── pc/ # 子女使用的PC端Vue 3应用 │ │ └── src/views/ # 工作台、详情、趋势、对比、家庭成员等页面 │ └── h5/ # 父母使用的适老化H5应用 │ └── src/views/SharePage.vue # 大字版健康报告和语音播报 ├── mcp_server/ # 可独立运行的模型编排与工具服务 ├── migrations/ # Alembic数据库版本记录 ├── tests/ # 后端单元测试与集成测试 ├── deploy_ecs.sh # Ubuntu ECS一键部署脚本 ├── requirements.txt # 固定版本的Python依赖 └── .env.example # 环境变量模板,不包含真实密钥 项目采用前后端分离和 API、服务、模型分层结构。浏览器请求先到 app/api/ 路由层,Pydantic app/schemas/ 完成输入输出校验,app/services/ 编排业务规则,app/models/ 通过异步 SQLAlchemy 持久化数据;OCR、OBS、安全和异常处理集中在 app/core/,模型调用与合规、营养、参考范围工具位于 app/mcp/。PC 与 H5 分别构建为静态文件,Nginx 将 / 映射到 PC,将 /h5/ 映射到 H5,将 /api/ 和 /health 反向代理到 FastAPI。4)在 Windows 本地执行构建与测试在项目根目录执行后端测试:.\.venv\Scripts\python.exe -m pytest tests -q预期结果:54 passed分别构建 PC 和 H5 生产包:Set-Location frontend\pc npm ci npm run build Set-Location ..\h5 npm ci npm run build Set-Location ..\.. npm ci 会严格按照 package-lock.json 安装依赖,避免 Windows 和 Ubuntu 使用不同依赖版本。两个 npm run build 均应成功生成各自的 dist 目录。PC 端构建时可能提示 ECharts 相关分块超过 Vite 默认的 500 KB 建议阈值,该提示不影响产物生成,后续可通过 manualChunks 进一步拆包。依赖审计警告不会阻断构建,但应单独评估,不建议直接执行可能引入破坏性升级的 npm audit fix --force。5)关键代码讲解OCR 三级降级机制(app/core/ocr_client.py)OCR 是报告解析的入口。代码先调用华为云通用文字和表格识别;如果没有识别到有效文本,再调用百炼 OCR 模型;最后使用千问 VL 多模态模型兜底。每一级仅在返回非空文本时结束链路,所有方法失败时返回空结果并由解析状态机标记失败。async def recognize_medical_report(self, image_data: bytes, file_type: str = "image") -> dict: image_b64 = base64.b64encode(image_data).decode("utf-8") result = await self._try_huawei_ocr(image_b64) if result: return result result = await self._try_aliyun_ocr(image_b64, file_type) if result: return result result = await self._try_qwen_vl(image_b64, file_type) if result: return result logger.error("All OCR methods failed (huawei -> aliyun -> qwen-vl)") return {"text": "", "confidence": 0.0} 关键释义:base64.b64encode() 将图片转为云 OCR API 可接收的 Base64 内容;降级调用相互独立,单个云服务超时或配额不足不会立即终止处理;日志只记录调用结果和错误,不输出图片、AK/SK 或 API Key;最终空文本不是伪造成功结果,业务层会将报告标记为 FAILED,便于用户重新处理。报告解析状态机和指标风险判定(app/services/parse_service.py)报告处理依次进入 OCR_PROCESSING、EXTRACTING、INTERPRETING 和 COMPLETED。前端根据状态显示处理进度;任何未捕获异常都会进入 FAILED,避免报告长期停留在处理中。await self._update_status(report, ParseStatus.OCR_PROCESSING) ocr_text = await self._run_ocr(report) if not ocr_text or not ocr_text.strip(): report.status = ParseStatus.FAILED await self.db.flush() return await self._update_status(report, ParseStatus.EXTRACTING) indicators = self._extract_indicators(ocr_text) abnormal = [i for i in indicators if i.status != IndicatorStatus.NORMAL] if abnormal: names = [i.name for i in abnormal[:5]] report.abnormal_summary = f"发现{len(abnormal)}项异常指标: {', '.join(names)}" await self._update_status(report, ParseStatus.INTERPRETING) report.status = ParseStatus.COMPLETED指标提取阶段会校验名称长度、医学单位、数值与参考范围。高于上限标记为 HIGH,低于下限标记为 LOW;偏离比例达到 1.2 或 1.5 时,风险等级依次提升为中风险或高风险。大模型健康解读与本地降级(app/mcp/mcp_client.py)后端使用 OpenAI 兼容接口调用配置的大模型,系统提示词约束输出范围,用户提示词携带结构化指标。HTTP 状态异常通过 raise_for_status() 进入异常分支;大模型不可用时,generate_interpretation() 会调用本地规则生成基础解读,保证报告仍可查看。async def _call_llm(self, system_prompt: str, user_prompt: str, temperature: float = 0.7) -> str: if not self._can_call_llm(): raise AppException(40004, "LLM API 未配置") async with httpx.AsyncClient(timeout=settings.LLM_TIMEOUT, proxy=None) as client: response = await client.post( f"{self._llm_api_base}/chat/completions", json={ "model": self._llm_model, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], "temperature": temperature, }, headers={"Authorization": f"Bearer {self._llm_api_key}"}, ) response.raise_for_status() data = response.json() return data.get("choices", [{}])[0].get("message", {}).get("content", "") 登录失败返回业务错误而不是服务器内部错误(app/services/auth_service.py、app/core/exceptions.py)登录时先判断用户是否存在,再校验 bcrypt 密码。账号不存在或密码错误均抛出业务码 60003,统一异常处理器将其映射为 HTTP 401。这样错误凭据不会因为空用户访问、密码哈希异常或未处理业务异常而显示“服务器内部错误”。if user is None: raise AppException(60003, "账号或密码错误") if not verify_password(password, user.password_hash): user.login_fail_count += 1 if user.login_fail_count >= settings.LOGIN_MAX_FAILURES: user.status = AccountStatus.LOCKED user.locked_until = datetime.utcnow() + timedelta( minutes=settings.LOGIN_LOCK_MINUTES ) await self.db.flush() raise AppException( 60002, f"密码错误次数过多,账号已锁定{settings.LOGIN_LOCK_MINUTES}分钟", ) await self.db.flush() raise AppException( 60003, f"账号或密码错误,还剩{settings.LOGIN_MAX_FAILURES - user.login_fail_count}次机会", ) if exc.code in (60002, 50005): status_code = 429 elif exc.code in (60003, 60004): status_code = 401 连续失败达到阈值后账号临时锁定,可以降低暴力尝试风险;成功登录后失败次数会被清零,并签发访问令牌和刷新令牌。报告分享、二维码和访问限制(app/services/share_service.py)分享状态使用随机 UUID,默认30天有效。可选4位数字访问密码使用 bcrypt 哈希保存,数据库中不存储明文;同时支持访问次数上限、失败次数锁定和主动撤销。state_id = str(uuid.uuid4()) expire_time = datetime.utcnow() + timedelta( days=settings.SHARE_DEFAULT_EXPIRE_DAYS ) password_hash = None if access_password: if not access_password.isdigit() or len(access_password) != 4: raise AppException(10001, "访问密码需为4位数字") password_hash = _bcrypt.hashpw( access_password.encode("utf-8"), _bcrypt.gensalt() ).decode("utf-8") share_url = f"{settings.SHARE_BASE_URL}/share/{state_id}" qr = qrcode.QRCode(version=1, box_size=10, border=5) qr.add_data(share_url) qr.make(fit=True) H5 适老化语音播报(frontend/h5/src/views/SharePage.vue)H5 使用浏览器原生 Web Speech API,无需额外安装播放器。播报内容由健康解读、建议、注意事项和指标组成,语速设置为 0.8,优先选择中文语音;用户再次点击按钮时立即停止。function toggleSpeech() { if (!speechSupported.value) return const synth = window.speechSynthesis if (isSpeaking.value) { synth.cancel() isSpeaking.value = false return } speechUtterance = new SpeechSynthesisUtterance(getSpeechText()) speechUtterance.lang = 'zh-CN' speechUtterance.rate = 0.8 speechUtterance.pitch = 1.0 speechUtterance.volume = 1.0 synth.speak(speechUtterance) isSpeaking.value = true } H5 子路径适配(frontend/h5/vite.config.ts、frontend/h5/src/router/index.ts)生产环境将 H5 部署在 /h5/,构建资源路径和 Vue Router 必须使用同一个基础路径,否则在 Ubuntu Nginx 下刷新分享深层路由会出现资源 404 或空白页。export default defineConfig({ base: '/h5/', plugins: [vue()], }) const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/share/:stateId', name: 'SharePage', component: () => import('../views/SharePage.vue'), }, ], }) 6)打包并上传源码不要上传 .env 等本地敏感文件,也不要上传真实 elderlycare.db、测试数据库、医疗图片、.venv、node_modules 和 dist。在 Windows PowerShell 的项目根目录执行:tar.exe -czf elderlycare-deploy.tar.gz ` --exclude='.venv' ` --exclude='*/node_modules' ` --exclude='*/dist' ` --exclude='.env' ` --exclude='elderlycare.db' ` --exclude='test.db' ` --exclude='*.jpg' ` . scp .\elderlycare-deploy.tar.gz root@<ECS公网IP>:/tmp/ scp .\.env root@<ECS公网IP>:/tmp/elderlycare.env ssh root@<ECS公网IP> 如果使用 SSH 密钥,则在三个 SSH/SCP 命令中增加 -i <私钥路径>。上传完成后,在 ECS 中执行:sudo mkdir -p /opt/elderlycare sudo tar -xzf /tmp/elderlycare-deploy.tar.gz -C /opt/elderlycare sudo install -m 600 /tmp/elderlycare.env /opt/elderlycare/.env cd /opt/elderlycare sudo chmod +x deploy_ecs.sh sudo ./deploy_ecs.sh也可以先在 Windows PowerShell 中单独上传仅保存在本地的 .env:scp .\.env root@<ECS公网IP>:/tmp/elderlycare.env ssh root@<ECS公网IP> 登录 ECS 后,直接通过 GitCode 拉取公开源码并部署:/opt/elderlycare 是 Ubuntu ECS 上的绝对安装目录,不是 GitCode 仓库中的 opt 文件夹。git clone 命令的第二个参数会把仓库内容直接检出到该目录;后续部署脚本、Nginx 和 systemd 均统一使用此路径。sudo mkdir -p /opt/elderlycare sudo chown -R "$USER:$USER" /opt/elderlycare git clone https://gitcode.com/SDSXshlbz/elderlycare-ai.git /opt/elderlycare sudo install -m 600 /tmp/elderlycare.env /opt/elderlycare/.env cd /opt/elderlycare sudo chmod +x deploy_ecs.sh sudo ./deploy_ecs.sh关键节点说明:GitCode 只传输可公开的源码和合成演示截图,.env 必须沿独立安全通道上传。后续更新可在确认服务器无未提交修改后执行 git pull --ff-only,再重新运行 deploy_ecs.sh;数据库和用户上传文件应提前备份,不能用代码仓库代替业务数据备份。7)理解并执行一键部署脚本deploy_ecs.sh 使用 set -euo pipefail,任一关键命令失败都会终止部署。脚本执行七个阶段:安装系统依赖、准备运行用户、安装 Python 依赖、构建 PC/H5、配置 Nginx、注册 systemd 服务、执行健康检查。Nginx 的关键配置如下:location /h5/ { alias /opt/elderlycare/frontend/h5/dist/; index index.html; try_files $uri $uri/ /h5/index.html; } location /api/ { proxy_pass http://127.0.0.1:8005; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 120s; } location / { root /opt/elderlycare/frontend/pc/dist; index index.html; try_files $uri $uri/ /index.html; } try_files 是 PC 和 H5 深层路由刷新可用的关键。后端服务使用独立用户运行,并等待网络和 Redis:[Unit] After=network-online.target redis-server.service Wants=network-online.target redis-server.service [Service] User=elderlycare Group=elderlycare WorkingDirectory=/opt/elderlycare ExecStart=/opt/elderlycare/.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8005 Restart=always RestartSec=5 脚本结束前会轮询后端健康接口。成功时输出:Backend health check passed. ======================================== Deployment completed PC: http://<ECS_PUBLIC_IP>/ H5: http://<ECS_PUBLIC_IP>/h5/ Health: http://<ECS_PUBLIC_IP>/health ========================================8)记录数据库版本并检查服务项目启动时通过 SQLAlchemy create_all() 创建当前模型表。首次部署成功后,执行 alembic stamp head 记录当前迁移基线,不重复执行已由模型创建的历史表结构:cd /opt/elderlycare source .venv/bin/activate alembic stamp head deactivate sudo nginx -t sudo systemctl is-active nginx redis-server elderlycare curl --fail http://127.0.0.1:8005/health预期结果:nginx: configuration file /etc/nginx/nginx.conf test is successful active active active {"status":"ok","version":"1.0.0"}如健康检查失败,使用以下命令定位问题:sudo journalctl -u elderlycare -n 100 --no-pager sudo tail -n 100 /var/log/nginx/error.log常见问题与处理方法:现象原因处理方法deploy_ecs.sh: /bin/bash^MWindows CRLF 换行将脚本保存为 LF 后重新上传H5 分享链接刷新后 404Vite 基础路径或 Nginx 回退错误检查 base: '/h5/' 和 /h5/index.html登录显示服务器内部错误业务异常未映射或数据库字段不完整查看 journalctl,确认 60003 返回 401,数据库版本已记录上传后一直处理中OCR、OBS 或大模型配置错误检查 .env、OBS 区域、OCR权限及后端日志CSS/模块在 Ubuntu 找不到Windows 文件名大小写不敏感统一源码导入路径与真实文件名大小写9)安全收尾部署完成后删除包含密钥的临时文件和部署压缩包,并在安全组中删除临时 22 端口规则:rm -f /tmp/elderlycare.env /tmp/elderlycare-deploy.tar.gz服务器上的 /opt/elderlycare/.env 权限应为 600,所有者应为 elderlycare:sudo stat -c '%U:%G %a %n' /opt/elderlycare/.env预期输出:elderlycare:elderlycare 600 /opt/elderlycare/.env3.3 运行效果展示本案例已部署到华为云北京四 ECS。演示环境仅使用合成数据,环境信息如下:项目演示环境信息区域北京四 cn-north-4ECS实例elderlycare-demo,实例ID 5d96458e-5a74-47e7-8859-b78c14be13a8规格与系统c7.large.2,2 vCPU / 4 GiB,Ubuntu 22.04公网IP1.92.111.234PC端URLhttp://1.92.111.234/H5端URLhttp://1.92.111.234/h5/健康检查http://1.92.111.234/health,HTTP 200GitCode源码https://gitcode.com/SDSXshlbz/elderlycare-ai普通功能测试账号邮箱:demo@elderlycare.cn密码:Demo2026!应用后台管理员测试账号邮箱:admin20260726@elderlycare.cn密码:Sc9!Vt4#Lq7@Hm2普通账号用于演示报告上传、解读、趋势、对比和分享;管理员账号登录后进入后台管理页面,用于演示系统概览、用户列表、账号状态和角色权限。演示 ECS 当前为运行状态,公网安全组不保留 SSH 入站规则,只开放作品 Web 演示所需端口。当前地址使用 HTTP,仅用于作品演示,不要录入真实个人信息、医疗报告或其他敏感数据。正式上线应配置域名、HTTPS、数据库备份、日志脱敏和监控告警。核心功能1:报告上传与年度报告管理登录后进入工作台,选择家庭成员后拖拽或点击上传 PDF、JPG、PNG 文件。页面同步展示解析状态和历史报告。演示账号已准备 2024、2025、2026 三份年度报告,用于展示长期健康变化。关键节点说明:上传请求先校验文件数量、扩展名和大小,再将报告与家庭成员关联。后端完成 OCR、指标提取和解读后,状态变为“已完成”,点击报告名称进入详情。核心功能2:智能健康解读与饮食计划报告详情将异常指标转换为通俗说明,展示风险提示、健康建议、推荐食物、忌口食物、每日食谱和指标参考范围。每份解读固定展示医疗免责声明。执行后效果:2026年度合成报告识别出空腹血糖、总胆固醇、尿酸、收缩压和 BMI 偏高,并给出饮食控制、运动、定期监测等建议;血红蛋白显示为正常。核心功能3:历次指标趋势和异常变化提醒进入 趋势分析,可以按家庭成员和指标筛选。ECharts 折线图按报告时间排序,并使用参考范围背景区间辅助判断。执行后效果:演示数据包含6个指标,每个指标有3个年度数据点。系统可识别“正常转异常”“异常恢复”“状态变化”和“数值变化”,当前演示数据生成12条异常变化记录。核心功能4:两份报告逐项对比进入 报告对比,选择较早报告 A 与较近报告 B,点击 开始对比。后端按指标名称求交集,计算 报告B数值 - 报告A数值,并按变化绝对值排序。执行后效果:2024与2026两份报告共有6项指标。尿酸由 330 umol/L 变为 455 umol/L,收缩压由 128 mmHg 变为 148 mmHg,状态从正常变为偏高;页面同时展示 BMI、空腹血糖、总胆固醇和血红蛋白的变化。核心功能5:适老化 H5 分享与语音播报在报告详情中生成分享链接或二维码,父母通过手机打开 H5。页面采用大字号、高行距、明显风险标签和大尺寸圆形播报按钮;点击播放按钮后,图标切换为暂停,再次点击立即停止。执行后效果:在 390 × 844 移动视口下页面无横向溢出,分享接口返回6项指标;语音播报可以正常开始与暂停,H5 深层路由及生产资源均返回 HTTP 200。核心功能6:家庭成员管理进入 家庭成员,可维护父母等家庭成员的关系、性别、出生日期、身高、体重、慢性病、过敏史、用药和备注。报告关联成员后,趋势与对比功能可以按成员筛选,避免多人报告混合统计。核心功能7:应用后台管理与角色权限管理员登录后可查看系统用户、报告和分享数量,按角色或账号状态筛选用户,并执行受保护的管理操作。注册页面不提供管理员角色选择,普通用户不能通过修改前端参数自行获得管理员权限;管理员接口由后端角色依赖统一保护,并具有禁止管理员自降级和最后一名管理员保护逻辑。执行后效果:管理员账号可进入 /admin 页面,普通演示账号访问同一路由时会被前端守卫拦截,直接请求管理员 API 时后端返回 HTTP 403。角色变更记录写入审计日志,便于追溯操作者、目标用户和变更时间。功能验收结果验证项实际结果正确账号登录HTTP 200,进入工作台错误账号登录HTTP 401,返回“账号或密码错误”,无服务器内部错误报告列表3份合成年度报告趋势分析6项指标,每项3个年度数据点异常变化12条变化记录报告对比6项共有指标及数值、状态变化H5分享返回健康解读、饮食计划和6项指标二维码返回 image/png管理员权限管理员可访问后台,普通用户访问管理员接口返回 HTTP 403PC/H5控制台无错误或警告Ubuntu服务Nginx、Redis、FastAPI均为 active自动化测试54 passed演示视频已上传至gitcode四、释放资源4.1 删除ECS弹性云服务器登录华为云控制台,进入 服务列表 > 计算 > 弹性云服务器 ECS。在 ECS 列表勾选本案例创建的服务器,点击 更多 > 删除。在确认对话框中勾选 释放云服务器绑定的弹性公网IP地址;如创建了额外数据盘,同时勾选删除对应数据盘。核对实例名称和公网 IP,确认无需要保留的数据后点击 是。进入 网络 > 弹性公网IP和带宽,确认 EIP 已释放;进入 对象存储服务 OBS,删除不再需要的报告、二维码和桶;进入安全组确认不存在遗留的公网 22 端口规则。删除 ECS、EIP、系统盘或 OBS 数据属于不可逆操作。释放前请先备份需要保留的源码、数据库和日志。仅关机通常仍会产生系统盘、EIP等费用,应以控制台资源状态和账单为准。五、扩展资料说明华为云 ECS:cid:link_2华为云 OBS:cid:link_4华为云 OCR:cid:link_1华为云开发者空间:cid:link_6华为云码道 CodeArts:cid:link_7银发智伴 GitCode 源码:https://gitcode.com/SDSXshlbz/elderlycare-aiFastAPI:https://fastapi.tiangolo.com/Vue 3:https://vuejs.org/Nginx:https://nginx.org/en/docs/阿里云百炼 Model Studio:https://help.aliyun.com/zh/model-studio/
  • [技术干货] 人体姿势点识别-姿态识别-表情识别API接口介绍
    前言随着AI视觉技术快速普及,精准人体姿态感知成为各行业智能化升级的重要基础。传统人体检测仅能完成简单框选和人数统计,无法捕捉精细人体姿态与五官、肢体状态,难以适配复杂实景需求。本人体21关键点识别技术,可精准检测画面中多人目标,输出头顶、五官、脖颈、四肢等全部核心关键点坐标、人体位置及数量信息。方案适配多人重叠、人体遮挡、正反面、侧面、俯拍、大动作等复杂场景,无需穿戴设备,依托普通图像即可实现高精度、稳定的人体姿态解析,解决传统识别漏检、误检、场景局限性强的问题,可为多行业智能化应用提供可靠的底层视觉数据支撑。应用场景智慧体育与科学健身智能医疗与康复理疗人机交互与元宇宙互动智慧安防与行为分析数字内容与新媒体创作智慧教育与体态督导API介绍请求说明名称类型必须说明base64String否人体图像base64字符串urlString否人体图像url链接,url链接长度不超过1024字节,请注意关闭URL防盗链fileFile否人体图像文件,文件类型戳这里查看详情返回样例{ "code": 200,// 返回码,详见返回码说明 "msg": "成功",// 返回码对应描述 "taskNo": "082246897222505513537185",// 本次请求号 "charge": true,// 计费标志 "data": { "person_num": "1",//人体数目 "person_info": [ //人体姿态信息 { "body_parts": { //身体部位信息,包含21个关键点 "nose": { //头顶 "score": 0.8942159414291382, //概率分数 "x": 503.8671875, //x坐标 "y": 330.6640625 //y坐标 }, "right_knee": { //右膝 "score": 0.2961595356464386,//概率分数 "x": 445.7421875,//x坐标 "y": 890.1171875 //y坐标 }, "left_hip": { //左髋部 "score": 0.5250594019889832,//概率分数 "x": 561.9921875,//x坐标 "y": 781.1328125 //y坐标 }, "right_ankle": { //右脚踝 "score": 0.2590301632881165,//概率分数 "x": 431.2109375, //x坐标 "y": 853.7890625 //y坐标 }, "right_wrist": { //右手腕 "score": 0.9074253439903259,//概率分数 "x": 482.0703125,//x坐标 "y": 432.3828125 //y坐标 }, "left_eye": { //左眼 "score": 0.8951929211616516,//概率分数 "x": 532.9296875,//x坐标 "y": 301.6015625 //y坐标 }, "left_mouth_corner": { //左嘴角 "score": 0.8808014392852783,//概率分数 "x": 532.9296875,//x坐标 "y": 359.7265625 //y坐标 }, "right_elbow": { //右手肘 "score": 0.7785468697547913, //概率分数 "x": 409.4140625,//x坐标 "y": 592.2265625 //y坐标 }, "left_knee": { //左膝 "score": 0.3373354375362396,//概率分数 "x": 554.7265625,//x坐标 "y": 890.1171875 //y坐标 }, "neck": { //颈部 "score": 0.7848875522613525,//概率分数 "x": 532.9296875, //x坐标 "y": 388.7890625 //y坐标 }, "top_head": { //头顶 "score": 0.8500685095787048,//概率分数 "x": 518.3984375, //x坐标 "y": 207.1484375 //y坐标 }, "right_ear": { //右耳 "score": 0.8363958597183228, //概率分数 "x": 467.5390625,//x坐标 "y": 308.8671875 //y坐标 }, "left_ear": { //左耳 "score": 0.9147939682006836, //概率分数 "x": 576.5234375, //x坐标 "y": 301.6015625 //y坐标 }, "left_elbow": { 左手肘 "score": 0.8399760723114014, //概率分数 "x": 583.7890625, //x坐标 "y": 628.5546875 //y坐标 }, "right_shoulder": { //右肩 "score": 0.8697558045387268, //概率分数 "x": 438.4765625, //x坐标 "y": 410.5859375 //y坐标 }, "right_eye": { //右眼 "score": 0.881825864315033,//概率分数 "x": 482.0703125, //x坐标 "y": 301.6015625 //y坐标 }, "right_mouth_corner": { //右嘴角 "score": 0.904476523399353, //概率分数 "x": 496.6015625, //x坐标 "y": 352.4609375 //y坐标 }, "left_ankle": { //左脚踝 "score": 0.2503626644611359,//概率分数 "x": 583.7890625, //x坐标 "y": 861.0546875 //y坐标 }, "right_hip": { //右髋部 "score": 0.5060766935348511,//概率分数 "x": 453.0078125, //x坐标 "y": 781.1328125 //y坐标 }, "left_wrist": { //左手腕 "score": 0.7268951535224915,//概率分数 "x": 423.9453125,//x坐标 "y": 621.2890625 //y坐标 }, "left_shoulder": { //左肩 "score": 0.85484778881073,//概率分数 "x": 634.6484375,//x坐标 "y": 432.3828125 //y坐标 } }, "location": { "height": 670.80139160156,//人体区域的高度 "width": 524.25476074219,//人体区域的宽度 "top": 241.42504882812,//人体区域离上边界的距离 "score": 0.98725789785385,//人体框的概率分数,取值0-1,得分越接近1表示识别准确的概率越大 "left": 902.15216064453//人体区域离左边界的距离 } } ] } }
  • 发票OCR识别-增值税发票OCR识别-医疗发票OCR识别-财务票据OCR识别-机动车销售发票OCR识别
    发票识别通常结合光学字符识别(OCR)、自然语言处理(NLP)和机器学习技术,将电子图片格式的发票转化为结构化数据。发票识别的作用发票识别核心作用主要体现在以下几个方面:提升财务工作效率自动化录入:传统的人工录入发票信息(如发票代码、号码、日期、金额、税额、购买方/销售方信息等)耗时且容易出错。发票识别可以实现秒级自动提取,将财务人员从繁琐的打字工作中解放出来。批量处理:能够同时处理成百上千张发票,显著缩短月度结账和报销周期。降低错误率与合规风险减少人为失误:人工录入难免出现数字看错、小数点点错或名称输错的情况,机器识别的准确率通常远高于人工(尤其在清晰图像下可达99%以上)。优化业务流程与管理加速报销流程:员工只需拍照或上传电子发票,系统自动填单,审批流转更快,提升员工满意度。数据结构化与分析:将非结构化的图片数据转化为结构化数据(如Excel、数据库记录),便于企业进行多维度的财务分析(如按部门、项目、供应商统计支出),为预算控制和决策提供数据支持。档案电子化:配合电子会计档案政策,实现发票的自动归档、存储和检索,节省物理存储空间,方便审计调阅。支持发票种类增值税发票OCR识别支持对增值税普票、专票、全电发票(新版全国统一电子发票,专票/普票)、卷票、区块链发票的所有字段进行结构化识别,包括发票基本信息、销售方及购买方信息、商品信息、价税信息等字段信息的识别准确率超过 99.9%支持对增值税卷票的 21 个关键字段进行识别,包括发票类型、发票代码、发票号码、机打号码、机器编号、收款人、销售方名称、销售方纳税人识别号、开票日期、购买方名称、购买方纳税人识别号、项目、单价、数量、金额、税额、合计金额(小写)、合计金额(大写)、校验码、省、市 等字段信息的识别准确率可达95%。详见此处医疗发票OCR识别支持识别全国各地门诊/住院发票的业务流水号、发票号、住院号、门诊号、病例号、姓名、性别、社保卡号、金额大/小写、收款单位、省市、医保统筹支付、个人账户支付等关键字段,其中北京/广东/河北/河南/江苏/山东/上海/天津/浙江等地区票据识别效果较佳。支持识别收费项目明细,并可根据不同省市地区返回对应的识别参数。详见此处财务票据OCR识别支持财务场景中13种常见票据的识别,包括增值税发票、卷票、机打发票、定额发票、火车票(含铁路电子客票)、出租车票、网约车行程单、飞机行程单、汽车票、过路过桥费、船票、机动车/二手车销售发票支持多张不同种类票据在同一张图片上的混贴场景,可返回每张票据的种类及票面信息的识别结果详见此处机动车销售发票OCR识别支持对机动车销售发票的26个关键字段进行结构化识别,包括发票代码、发票号码、开票日期、机器编号、购买方名称、购买方身份证号码/组织机构代码、车辆类型、厂牌型号、产地、合格证号、发动机号码、车架号码、价税合计、价税合计小写、销货单位名称、电话、纳税人识别号、账号、地址、开户银行、税率、税额、主管税务机关及代码、不含税价格、限乘人数。详见此处
  • [技术干货] Tesseract.js 实现 OCR 文字识别
    Tesseract.js 在识别图片中的文字时,可以获取每个文字(或单词)的精确位置信息,主要通过以下两种方式实现:1. HOCR 输出(HTML 格式)Tesseract.js 支持生成 HOCR(HTML-based OCR) 格式的输出,其中包含每个识别元素的边界框坐标。关键字段:每个单词的 HTML 标签会包含 bbox 属性,格式为 bbox x1 y1 x2 y2,表示单词在图片中的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)。示例:<span class="ocrx_word" id="word_1" title="bbox 100 200 300 250">Hello</span> 这表示单词 “Hello” 的边界框从坐标 (100, 200) 到 (300, 250)。2. 通过 ResultIterator 遍历结果在 JavaScript 中,可以使用 ResultIterator 逐字遍历识别结果,并获取每个单词的坐标和置信度。代码示例:import { createWorker } from 'tesseract.js'; (async () => { const worker = await createWorker('eng'); // 加载英文模型 await worker.loadLanguage('eng'); await worker.initialize('eng'); const result = await worker.recognize('image.png'); const iterator = result.getIterator(); iterator.forEachWord((word) => { const text = word.getText(); const confidence = word.getConfidence(); const bbox = word.getBoundingBox(); // 获取边界框 {x0, y0, x1, y1} console.log(`文字: ${text}, 置信度: ${confidence}, 位置: ${bbox}`); }); await worker.terminate(); })(); 3. 关键参数配置设置识别模式:使用 setPageSegMode(tesseract.PSM_SINGLE_WORD) 将每个单词作为独立块处理,提高坐标精度。启用 HOCR 输出:通过 setTessVariable("tessedit_create_hocr", "1") 生成 HOCR 格式结果。4. 应用场景票据识别:自动提取发票、收据中的文字及其位置。内容分析:定位社交媒体图片中的关键文字(如广告文案)。文档数字化:重建扫描文档的版式,保留文字位置信息。5. 注意事项坐标原点:Tesseract 的坐标原点默认在图片左上角,y 轴向下延伸。图像预处理:对低质量图片(如模糊、倾斜)进行灰度化、二值化等预处理,可提升坐标精度。如果需要进一步处理坐标数据(如可视化或映射到原始图像),可以结合 Canvas 或 OpenCV 等工具实现。
  • [技术干货] ICDAR文档分析与识别会议发展介绍
    ICDAR(国际文档分析与识别会议)是文档分析与识别(Document Analysis and Recognition, DAR)领域最具影响力的学术会议,自1991年创办以来,已成为该领域研究和技术发展的风向标。会议每两年举办一次,期间举办的竞赛(ICDAR Competitions)聚焦于文本检测、识别、布局分析等核心任务,推动了技术的快速迭代。1. 早期阶段(1990s–2000s):奠定基础• 1991年:首届ICDAR在法国圣马洛举办,早期竞赛主要围绕OCR(光学字符识别)的准确性,数据集规模较小(如扫描文档中的字符识别)。• 1990年代:竞赛任务以手写文本识别和印刷体OCR为主,例如:• ICDAR 2003:首次引入**文本定位(Text Locating)**任务,标志着从纯识别向检测-识别联合任务的过渡。• 技术进展:传统方法(如投影分析、连通域分析)主导,但准确率较低(早期OCR的F1值约70%-80%)。2. 中期发展(2010s–2015):任务多样化与深度学习崛起2011年(ICDAR 2011):推出“Born Digital Images”竞赛,针对自然场景中的文本(如网页截图),推动技术向复杂场景扩展。2013年(ICDAR 2013):引入“Focused Scene Text”和“Incidental Scene Text”任务,区分定向文本和任意朝向文本,检测指标(如F1值)提升至80%+。2015年(ICDAR 2015):成为技术分水岭:• 任务创新:提出**“Challenge 4: Incidental Scene Text”**,使用大规模数据集(如1000张自然图像),要求检测和识别任意形状文本。• 成绩突破:深度学习(如CNN+RNN)开始主导,最佳团队的检测F1值达80%以上,识别准确率(Word Accuracy)约70%。3. 近期突破(2017–2023):复杂场景与端到端系统• 2017年(ICDAR 2017):• MLT(多语言文本)竞赛:支持9种语言,推动多语言OCR发展。• SROIE(票据理解)任务:针对结构化文档的信息提取(如发票关键字段识别),冠军团队F1值超90%。• 2019年(ICDAR 2019):• ArT(任意形状文本)竞赛:弯曲文本检测与识别成为焦点,最佳检测Hmean达85%。• 技术趋势:Transformer和注意力机制开始应用,端到端模型(如Mask TextSpotter)表现突出。• 2021–2023年:• 任务扩展:新增文档布局分析(Document Layout Analysis)和表格识别任务,反映工业需求。• 成绩新高:在弯曲文本检测(如Total-Text数据集)中,Hmean突破90%;端到端识别准确率(如ABCNet)达85%+。4. 关键成绩与技术演进时期代表性竞赛任务最佳成绩(示例)技术里程碑2000s印刷体OCR准确率~80%基于特征工程的传统方法2013–2015场景文本检测(Focused)F1: 80%+CNN+滑动窗口2017–2019任意形状文本(ArT)Hmean: 85%+实例分割(Mask R-CNN)2021–2023端到端识别端到端准确率: 85%+Transformer+多模态预训练5. 未来方向• 跨模态理解:结合文本、图像、表格的联合建模(如DocEnTR)。• 低资源语言:扩展小语种和手写文档的支持。• 鲁棒性:应对模糊、遮挡等极端场景的泛化能力。ICDAR竞赛通过不断升级任务难度和数据集多样性,推动了从传统OCR到智能文档理解的跨越,成绩的提升也反映了深度学习对领域的革命性影响。
  • [互动交流] 图像识别技术原理?
    图像识别技术原理是什么样的?
  • [其他] 2024 年顶级智能文档处理软件
    原文章:https://www.compdf.com/blog/best-intelligent-document-processing-software1. ComIDPComIDP 是由ComPDFKit开发的智能文档处理解决方案,旨在帮助企业实现数据自动化并提高文档处理效率。这款全面的工具涵盖了整个文档生命周期,包括预处理、识别、分类、数据提取和数据分析,为企业提供可靠的决策支持。它为企业提供标准模型和可定制的 AI 解决方案,以满足其在实现数字化转型方面的特定需求。好处ComIDP拥有专利的版式分析和表格识别功能,适用于各种复杂应用场景,提高文档处理效率。支持导入各种非结构化、半结构化文档并进行结构化处理。基于AI的OCR功能支持70+种语言文档识别,准确率高达95%。如何部署ComIDP解决方案?ComIDP 提供三种部署选项:私有部署、公有云部署和本地部署。无论您的企业需要严格的数据安全性和定制、适合中小型企业的经济高效的解决方案,还是需要无缝集成到大型企业的现有系统和应用程序中,ComIDP都能满足您的需求。通过利用 ComIDP,企业可以显著提高文档协作效率和整体生产力。应用ComIDP为大型模型训练提供高精度数据,从而提升AI性能,同时集成企业业务系统,减少冗余任务,支持工作流自动化。ComIDP可应用于各行各业,例如在金融领域,智能文档处理可以满足企业财务管理需求,在银行领域,ComIDP可以加速信贷审核流程,提高业务处理速度和用户满意度。2. AWSAWS(亚马逊网络服务)智能文档处理 解决方案是一套强大的工具和服务,旨在帮助企业和组织自动化和优化其文档处理流程。整个智能文档处理流程包括几个阶段,首先使用Amazon Textract进行文本和表单识别和提取,然后使用Amazon Comprehend进行智能分析和自动校对,最后将处理后的数据存储在Amazon S3中以供企业集成。3. Automation AnywhereAutomation Anywhere IDP 支持本地和云部署,提供 32 种语言模型,满足企业的文档自动化需求。它可以自动处理 80% 的文档数据,减少人为错误并在数据进入关键业务系统之前进行验证。此外,它还可以帮助企业主动避免与不合规相关的成本。4. Microsoft AzureMicrosoft Azur e Form Recognizer 是一款人工智能文档处理解决方案,可以自动从文档中提取和解析关键信息,实现智能数据处理和管理。从各种类型的文档、表格、收据、发票和卡片中准确提取文本、键值对和表格。具有预构建和自定义 AI 模型,可以从结构化、半结构化和非结构化文档中精确提取字段、复选标记和表格。5. ABBYYABBYY Vantage智能文档处理软件可帮助企业自动处理各种类型的文档,包括结构化、半结构化和非结构化文档。通过利用 ABBYY Vantage 预先训练的 AI 提取模型/技能,企业可以高效处理这些文档类型,同时确保高达 90% 的准确率。该软件可以与其他智能自动化系统无缝集成,例如 Microsoft Power Automate、Blue Prism、UiPath 和 Automation Anywhere。Vantage 还可以监控、衡量和分析所有部署技能的性能,以创建新的学习模型,实现持续改进和优化。6. AppainAppian的智能文档处理技术结合AI,帮助企业优化工作流程、统一数据、提高工作效率。通过将智能文档处理与企业系统集成,不仅可以节省时间,还可以将纸质流程数字化,缩短交易时间。该技术支持AI与RPA、业务规则等结合,实现端到端的全流程自动化,并通过自动化的任务调度和内容处理大幅提高工作吞吐量。......更多内容请查看原文章:https://www.compdf.com/blog/best-intelligent-document-processing-software
  • [技术干货] 实战案例!Python批量识别银行卡号码并且写入Excel,小白也可以轻松使用~【转】
    今天我们就来学习一下,如何用1行代码,自动识别银行卡信息并且自动生成Excel文件~ 第一步:识别一张银行卡识别银行卡的代码最简单,只需要1行腾讯云AI的第三方库potencent的代码,如下所示。左右滑动,查看全部。👇# pip install potencent import potencent # 可以填写本地图片的地址:img_path,也可以填写在线图片的地址:img_url # 如果2个都填,则只用在线图片 res = potencent.ocr.BankCardOCR( img_path=r'C:\Users\程序员晚枫的文件夹\银行卡图片', img_url='https://python-office-1300615378.cos.ap-chongqing.myqcloud.com/2-free-group.jpg', configPath=r'配置文件的信息,可以不填,默认是同级目录下的potencent-config.toml') print(res)识别后的返回结果,几乎涵盖所有银行卡上肉眼可见的内容。👇{ "CardNo": "621700888888888889", "BankInfo": "建设银行(01050000)", "ValidDate": "08/2026", "CardType": "借记卡", "CardName": "龙卡通", "RequestId": "86b70007-3ef5-4b7e-8685-556b0a7df1c9" }支持对中国大陆主流银行卡正反面关键字段的检测与识别,包括卡号、卡类型、卡名字、银行信息、有效期。支持竖排异形卡识别、多角度旋转图片识别。支持对复印件、翻拍件、边框遮挡的银行卡进行告警,可应用于各种银行卡信息有效性校验场景,如金融行业身份认证、第三方支付绑卡等场景。 以上代码中,关于potencent-config.toml的配置方法,可以参考昨天视频的讲解👇第二步:写入Excel想把上面这个代码用来识别大量银行卡信息,并且将识别后的返回数据,全部写入Excel文件。代码如下👇import os from os.path import join import pandas as pd # home_path = "你存放大量银行卡图片的位置" home_path = r"C:\Users\Lenovo\Desktop\temp\test\card" res_df = pd.DataFrame() for (root, dirs, files) in os.walk(home_path): for file in files: single_res = potencent.ocr.BankCardOCR(img_path=join(root, file)) single_res = json.loads(single_res.to_json_string()) line_df = pd.DataFrame(single_res, index=[0]) print(line_df) res_df = res_df.append(other=line_df) print(res_df) res_df.to_excel(r"./银行卡信息(程序员晚枫).xlsx")运行后的结果如下,会在同级目录下,生成一个Excel文件 第三步:优化思路以上代码还可以进一步优化,例如:路径处理改为Path方法,适配更多的平台变量名称更简洁index改为序号但优化的前提是程序能运行成功,赶紧去跑起来吧~转载自:cid:link_0
  • [互动交流] OCR发票识别参数错误
    在学习rpa高级课程时,尝试使用增值税发票识别时,使用学习材料中的user id和user key时提示参数错误,请问怎么解决User ID:com.huawei.gts.rparobotUser Key/Token:hC4Q2yZ8p11h186KcC8b6un6ZS2 tcAtegOn89HCJy6CurddgTkCzmm 7hXCH3mJJt
  • [技术干货] HttpClient最丰富和灵活的版本
    // Java 8 and earlier import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) throws IOException { URL url = new URL("https://www.example.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); int status = con.getResponseCode(); System.out.println(status); } } // 优点:简单易用。缺点:功能有限,不够灵活。 // Java 8 import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Main { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.example.com")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); } } // 优点:比Java 8和之前的版本具有更多的功能和灵活性。缺点:仍然缺少一些高级功能。 // Java 9 import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Main { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.example.com")) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); } } // 优点:添加了Java 8中缺少的一些功能。缺点:仍然不如Java 11功能丰富。 // Java 11 import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Main { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.example.com")) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); } } // 优点:HttpClient最丰富和灵活的版本。缺点:需要Java 11或更高版本。​
  • [互动交流] 验证码识别
    这种验证码用哪种方法识别率高一些呀,我目前直接用ext_aiverifyinput_1.0.1这种验证码识别还有ocr验证码识别  识别出来效果都很差
  • [互动交流] 设计器出错,请稍后重试
    weAutomate studio 右上叫报设计器出错请稍后重试
  • [互动交流] Manas引擎中验证码识别解密失败
    我用设计器运行时是正常的,但是用机器人助手运行时却报解密失败 机器人助手日志如下:[2023-02-17 14:42:38] 启动机器人 3.1.1[2023-02-17 14:42:38] 开始执行[脚本] [残疾证办理][2023-02-17 14:42:40] 开始执行[子脚本] [playbackScript.xml 第4行] 调用子脚本(共享上下文) (login.xml) [调用子脚本(共享上下文)][2023-02-17 14:42:43] 完成执行[原子命令] [login.xml 第4行] 打开网页 [打开网页] [OK][2023-02-17 14:42:44] 完成执行[原子命令] [login.xml 第12行] 在网页中输入文本 [在网页中输入文本] [OK][2023-02-17 14:42:44] 完成执行[原子命令] [login.xml 第24行] 在网页中输入文本 [在网页中输入文本] [OK][2023-02-17 14:42:45] 完成执行[原子命令] [login.xml 第36行] 截取元素图片 [截取元素图片] [OK][2023-02-17 14:42:45] 完成执行[原子命令] [login.xml 第48行] 验证码识别 [验证码识别] [NOK] [RobotDecryptError] [系统执行错误: 解密失败][2023-02-17 14:42:45] [调试日志] @{getVerificationCodeInfoOcr_ret}[2023-02-17 14:42:45] 完成执行[子脚本] [playbackScript.xml 第4行] 调用子脚本(共享上下文) (login.xml) [调用子脚本(共享上下文)] [NOK] [RobotDecryptError] [系统执行错误: 解密失败][2023-02-17 14:42:45] 完成执行[脚本] [残疾证办理] [NOK] [RobotDecryptError] [系统执行错误: 解密失败][2023-02-17 14:42:45] 成功向管理中心发送数据[2023-02-17 14:42:45] 结束机器人
  • [互动交流] 请问OCR-自定义模板使用JavaSDK的形式 目前是不支持嘛
    我看api调用的形式可以多传一个模板id的参数,但是sdk里面的源码里面的种类根本没有说自定义模板形式的类,没有地方传这个模板id参数呀
  • [互动交流] 华为云OCR服务支持视频中字幕进行识别么?
    华为云OCR服务支持视频中字幕进行识别么?
总条数:286 到第
上滑加载中