61 Commits
deploy ... dev

Author SHA1 Message Date
97903b2722 新增功能,获取案子全部原始图片 2025-11-27 08:44:56 +08:00
670172e79e 更新OCR版本,Bata版,还不能上线 2025-09-15 15:41:30 +08:00
d266c2828c 优化镜像构建 2025-09-12 14:42:51 +08:00
bc4c95c18c 添加判断截图方法 2025-09-12 14:40:52 +08:00
af08078380 关闭清晰度测试 2025-09-12 14:11:54 +08:00
8984948107 如果没有结算单号就填住院号 2025-09-12 14:09:46 +08:00
843511b6f3 添加测试环境更新脚本 2025-09-01 15:04:24 +08:00
a5d7da6536 调整测试镜像 2025-09-01 14:59:50 +08:00
99d555aba9 调整测试镜像 2025-09-01 14:54:13 +08:00
7ca5b9d908 更新测试环境镜像版本:0.0.8 2025-08-28 16:06:14 +08:00
5e5e35fd9f 调整测试镜像 2025-08-28 15:12:15 +08:00
d080b66ebf 新增OCR相关文档 2025-08-20 13:58:50 +08:00
1e8ef432df 修正ie表更新的修改人 2025-08-20 10:55:25 +08:00
a6515e971b 删除特殊调整的案子查询 2025-08-20 01:51:51 +00:00
e3fd3f618f 更新版本1.15.5 2025-08-20 01:51:51 +00:00
b6ae36a8ec 临时调整识别案子范围,尝试修正模型替换导致的识别率下降 2025-08-20 01:51:51 +00:00
a99a615e22 临时调整识别案子范围,尝试修正模型替换导致的识别率下降 2025-08-20 01:51:51 +00:00
5f645b5b4b dev分支添加开发环境配置文件 2025-08-19 10:19:34 +08:00
1625f0294f 从主分支删除开发环境相关内容 2025-08-19 10:11:12 +08:00
f19f8cbcae 复制项目内容 2025-08-18 16:38:53 +08:00
ba3e23d185 修正grep警告 2025-08-18 16:01:01 +08:00
0abf7abb5b 修正语言包警告 2025-08-18 15:15:29 +08:00
47ac6aadbe 修正语言包警告 2025-08-18 15:10:39 +08:00
09ede1af25 删除doc_dewarp扭曲矫正 2025-08-18 14:21:10 +08:00
e40d963bf5 调整开发环境镜像构建 2025-08-18 14:05:38 +08:00
34344edd29 调整开发环境镜像构建 2025-08-18 13:58:43 +08:00
b387db1e08 添加远程开发环境容器 2025-08-18 13:29:23 +08:00
88ca27928f 删除过期数据 2025-08-13 10:50:15 +08:00
109a5e9444 删除过期数据 2025-08-12 11:13:14 +08:00
ab5f78cc7b 测试图片清晰度模型效果 2025-07-30 15:11:01 +08:00
04358ee646 增加图片损坏的判断 2025-06-26 08:58:57 +08:00
a67c53f470 增加图片损坏的判断 2025-06-26 08:48:11 +08:00
cd604bc1eb 修正图片可能因为某些原因获取不到而无法继续的问题 2025-05-21 11:26:01 +08:00
0de9fc14b5 修正高清图片为空的判断 2025-04-01 15:24:32 +08:00
5287df4959 添加图片清晰度测试,保存结果对照 2025-04-01 15:11:40 +08:00
3e9c0c99b9 Revert "测试图片清晰度"
This reverts commit a740f16e6b.
2025-04-01 14:47:56 +08:00
a740f16e6b 测试图片清晰度 2025-04-01 14:27:54 +08:00
b9606771cf 判断图片清晰度 2025-04-01 14:24:19 +08:00
110bc57abc Revert "测试清晰度模型运行情况"
This reverts commit f965bc4289.
2025-03-20 16:15:33 +08:00
f965bc4289 测试清晰度模型运行情况 2025-03-20 15:26:54 +08:00
8b6bf03d76 二维码识别替换前备份 2025-03-20 10:23:04 +08:00
73536aea89 删除一个识别服务 2025-02-17 16:08:30 +08:00
12f6554d8c 修正全角数字存入数据库失败的问题 2025-02-17 13:00:52 +08:00
be94bc7f09 删除一个识别服务 2025-02-17 10:41:54 +08:00
8307fcd549 添加两个识别服务 2025-02-17 10:09:11 +08:00
ab2dbf7c15 删除两个涂抹服务 2025-02-08 10:59:18 +08:00
dac7a1b5ce 添加两个涂抹服务 2025-02-08 09:55:17 +08:00
935fa26067 修正无效方法调用 2025-01-22 16:25:04 +08:00
16ab4c78d5 调整各字段长度限制,与其他表长度保持一致 2025-01-22 16:19:52 +08:00
ed77b8ed82 调整医生姓名长度限制 2025-01-22 15:44:14 +08:00
f4ec3b1eb4 paddlelite2.10可成功转换 2025-01-15 16:47:21 +08:00
a93f68413c 批量下载图片 2025-01-15 16:44:32 +08:00
0a947274dc paddle模型转nb端侧部署模型 2025-01-08 16:04:57 +08:00
f7540c4574 修正计算误差导致分割产生无效图片 2025-01-02 13:05:10 +08:00
5e6a471954 增加ocr结果存表 2024-12-24 14:55:43 +08:00
96b8a06e6c 优化医生名字的处理,没有时填充无 2024-12-03 13:27:18 +08:00
be27f753ba 优化数据字段的处理,增加限制条件 2024-12-03 13:12:58 +08:00
8ea5420520 捕获到内存错误主动抛出中止程序,以释放显存 2024-11-28 10:27:44 +08:00
9749577c5a 优化docker服务,删除无效的det_api 2024-11-05 17:30:16 +08:00
e0f6b82dad 更新版本号 2024-11-05 17:21:37 +08:00
8223759fdf 调整自动识别的文字识别模型 2024-11-05 17:18:12 +08:00
2125 changed files with 2009 additions and 4263 deletions

View File

@@ -238,11 +238,8 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# 通过卷绑定挂载到容器中
/log
/services/paddle_services/log
/services/paddle_services/model
/tmp_img
# 模型通过卷绑定挂载到容器中
/model
# docker
Dockerfile
docker-compose*.yml

6
.gitignore vendored
View File

@@ -142,11 +142,7 @@ cython_debug/
.idea
### Model
services/paddle_services/model
model
### Log Backups
*.log.*-*-*
### Tmp Files
/tmp_img
/test_img

View File

@@ -1,5 +1,5 @@
# 使用官方的python镜像作为基础
FROM python:3.10.15-bookworm
# 使用官方的paddle镜像作为基础
FROM registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda12.0-cudnn8.9-trt8.6
# 设置工作目录
WORKDIR /app
@@ -13,10 +13,12 @@ ENV PYTHONUNBUFFERED=1 \
# 安装依赖
COPY requirements.txt /app/requirements.txt
COPY packages /app/packages
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone \
&& sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources \
&& apt-get update && apt-get install libgl1 -y \
&& pip install --no-cache-dir -r requirements.txt
&& python3 -m pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt \
&& pip uninstall -y onnxruntime onnxruntime-gpu \
&& pip install onnxruntime-gpu==1.18.0 --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
# 将当前目录内容复制到容器的/app内
COPY . /app

33
Dockerfile.dev Normal file
View File

@@ -0,0 +1,33 @@
# 使用官方的paddle镜像作为基础
FROM ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlex/paddlex:paddlex3.1.2-paddlepaddle3.0.0-gpu-cuda12.6-cudnn9.5-trt10.5
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1 \
# 设置时区
TZ=Asia/Shanghai \
# 设置pip镜像地址加快安装速度
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
# 安装language-pack-en和openssh-server
RUN apt update && \
apt install -y language-pack-en && \
apt install -y openssh-server
# 配置SSH服务
RUN mkdir /var/run/sshd && \
# 设置root密码可根据需要修改
echo 'root:fcb0102' | chpasswd && \
# 允许root登录SSH
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 将当前目录内容复制到容器的/app内
COPY . /app
# 暴露22端口
EXPOSE 22
# 启动SSH服务
CMD ["/usr/sbin/sshd", "-D"]

View File

@@ -6,7 +6,7 @@
1. 从Git远程仓库克隆项目到本地。
2. 将深度学习模型复制到./services/paddle_services/model目录下具体请看[模型更新](#模型更新)部分。
2. 将深度学习模型复制到./model目录下具体请看[模型更新](#模型更新)部分。
3. 安装docker和docker-compose。
@@ -126,5 +126,7 @@ bash update.sh
2. 新增扭曲矫正功能
21. 版本号1.14.0
1. 新增二维码识别替换高清图片功能
22. 版本号:2.0.0
1. 项目架构调整,模型全部采用接口调用
22. 版本号:1.15.0
1. 新增图片清晰度测试
23. 版本号1.16.0
1. 更新paddle框架至3.0

View File

@@ -1,4 +0,0 @@
import time
if __name__ == '__main__':
time.sleep(3600)

View File

@@ -8,13 +8,15 @@ MAX_WAIT_TIME = 3
# 程序异常短信配置
ERROR_EMAIL_CONFIG = {
# SMTP服务器地址
'smtp_server': 'smtp.163.com',
"smtp_server": "smtp.163.com",
# 连接SMTP的端口
'port': 994,
"port": 994,
# 发件人邮箱地址请确保开启了SMTP邮件服务
'sender': 'EchoLiu618@163.com',
"sender": "EchoLiu618@163.com",
# 授权码--用于登录第三方邮件客户端的专用密码,不是邮箱密码
'authorization_code': 'OKPQLIIVLVGRZYVH',
"authorization_code": "OKPQLIIVLVGRZYVH",
# 收件人邮箱地址
'receivers': ['1515783401@qq.com'],
"receivers": ["1515783401@qq.com"],
# 尝试次数
"retry_times": 3,
}

View File

@@ -5,18 +5,18 @@ from email.mime.text import MIMEText
from tenacity import retry, stop_after_attempt, wait_random
from auto_email import ERROR_EMAIL_CONFIG, TRY_TIMES, MIN_WAIT_TIME, MAX_WAIT_TIME
from log import HOSTNAME
from my_email import ERROR_EMAIL_CONFIG, TRY_TIMES, MIN_WAIT_TIME, MAX_WAIT_TIME
@retry(stop=stop_after_attempt(TRY_TIMES), wait=wait_random(MIN_WAIT_TIME, MAX_WAIT_TIME), reraise=True,
after=lambda x: logging.warning('发送邮件失败!'))
after=lambda x: logging.warning("发送邮件失败!"))
def send_email(email_config, massage):
smtp_server = email_config['smtp_server']
port = email_config['port']
sender = email_config['sender']
authorization_code = email_config['authorization_code']
receivers = email_config['receivers']
smtp_server = email_config["smtp_server"]
port = email_config["port"]
sender = email_config["sender"]
authorization_code = email_config["authorization_code"]
receivers = email_config["receivers"]
mail = smtplib.SMTP_SSL(smtp_server, port) # 连接SMTP服务
mail.login(sender, authorization_code) # 登录到SMTP服务
mail.sendmail(sender, receivers, massage.as_string()) # 发送邮件
@@ -34,13 +34,13 @@ def send_error_email(program_name, error_name, error_detail):
"""
# SMTP 服务器配置
sender = ERROR_EMAIL_CONFIG['sender']
receivers = ERROR_EMAIL_CONFIG['receivers']
sender = ERROR_EMAIL_CONFIG["sender"]
receivers = ERROR_EMAIL_CONFIG["receivers"]
# 获取程序出错的时间
error_time = datetime.datetime.strftime(datetime.datetime.today(), '%Y-%m-%d %H:%M:%S:%f')
error_time = datetime.datetime.strftime(datetime.datetime.today(), "%Y-%m-%d %H:%M:%S:%f")
# 邮件内容
subject = f'【程序异常提醒】{program_name}({HOSTNAME}) {error_time}' # 邮件的标题
subject = f"【程序异常提醒】{program_name}({HOSTNAME}) {error_time}" # 邮件的标题
content = f'''<div class="emailcontent" style="width:100%;max-width:720px;text-align:left;margin:0 auto;padding-top:80px;padding-bottom:20px">
<div class="emailtitle">
<h1 style="color:#fff;background:#51a0e3;line-height:70px;font-size:24px;font-weight:400;padding-left:40px;margin:0">程序运行异常通知</h1>

15
auto_generator.py Normal file
View File

@@ -0,0 +1,15 @@
# 自动生成数据库表和sqlalchemy对应的Model
import subprocess
from db import DB_URL
if __name__ == '__main__':
table = input("请输入表名:")
out_file = f"db/{table}.py"
command = f"sqlacodegen {DB_URL} --outfile={out_file} --tables={table}"
try:
subprocess.run(command, shell=True, check=True)
print(f"{table}.py文件生成成功请检查并复制到合适的文件中")
except Exception as e:
print(f"生成{table}.py文件时发生错误: {e}")

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,108 @@
import datetime
import json
import os
from decimal import Decimal
from io import BytesIO
from itertools import groupby
import requests
from PIL import ImageDraw, Image, ImageFont
from db import MysqlSession
from db.mysql import ZxIeCost, ZxIeDischarge, ZxIeSettlement, ZxPhhd, ZxIeResult, ZxPhrec
from ucloud import ufile
from util import image_util
def check_ie_result(pk_phhd, need_to_annotation=True):
os.makedirs(f"./check_result/{pk_phhd}", exist_ok=True)
json_result = {"pk_phhd": pk_phhd}
session = MysqlSession()
phhd = session.query(ZxPhhd.cXm).filter(ZxPhhd.pk_phhd == pk_phhd).one()
json_result["cXm"] = phhd.cXm
settlement = (session.query(ZxIeSettlement.pk_ie_settlement, ZxIeSettlement.name, ZxIeSettlement.admission_date,
ZxIeSettlement.discharge_date, ZxIeSettlement.medical_expenses,
ZxIeSettlement.personal_cash_payment, ZxIeSettlement.personal_account_payment,
ZxIeSettlement.personal_funded_amount, ZxIeSettlement.medical_insurance_type,
ZxIeSettlement.admission_id, ZxIeSettlement.settlement_id)
.filter(ZxIeSettlement.pk_phhd == pk_phhd).one())
settlement_result = settlement._asdict()
json_result["settlement"] = settlement_result
discharge = (session.query(ZxIeDischarge.pk_ie_discharge, ZxIeDischarge.hospital, ZxIeDischarge.pk_yljg,
ZxIeDischarge.department, ZxIeDischarge.pk_ylks, ZxIeDischarge.name, ZxIeDischarge.age,
ZxIeDischarge.admission_date, ZxIeDischarge.discharge_date, ZxIeDischarge.doctor,
ZxIeDischarge.admission_id)
.filter(ZxIeDischarge.pk_phhd == pk_phhd).one())
discharge_result = discharge._asdict()
json_result["discharge"] = discharge_result
cost = session.query(ZxIeCost.pk_ie_cost, ZxIeCost.name, ZxIeCost.admission_date, ZxIeCost.discharge_date,
ZxIeCost.medical_expenses).filter(ZxIeCost.pk_phhd == pk_phhd).one()
cost_result = cost._asdict()
json_result["cost"] = cost_result
phrecs = session.query(ZxPhrec.pk_phrec, ZxPhrec.pk_phhd, ZxPhrec.cRectype, ZxPhrec.cfjaddress).filter(
ZxPhrec.pk_phhd == pk_phhd).all()
for phrec in phrecs:
img_name = phrec.cfjaddress
img_path = ufile.get_private_url(img_name, "drg2015")
if not img_path:
img_path = ufile.get_private_url(img_name)
response = requests.get(img_path)
image = Image.open(BytesIO(response.content)).convert("RGB")
if need_to_annotation:
font_size = image.width * image.height / 200000
font = ImageFont.truetype("./font/simfang.ttf", size=font_size)
ocr = session.query(ZxIeResult.id, ZxIeResult.content, ZxIeResult.rotation_angle, ZxIeResult.x_offset,
ZxIeResult.y_offset).filter(ZxIeResult.pk_phrec == phrec.pk_phrec).all()
if not ocr:
os.makedirs(f"./check_result/{pk_phhd}/0", exist_ok=True)
image.save(f"./check_result/{pk_phhd}/0/{img_name}")
for _, group_results in groupby(ocr, key=lambda x: x.id):
draw = ImageDraw.Draw(image)
for ocr_item in group_results:
result = json.loads(ocr_item.content)
rotation_angle = ocr_item.rotation_angle
x_offset = ocr_item.x_offset
y_offset = ocr_item.y_offset
for key in result:
for value in result[key]:
box = value["bbox"][0]
if rotation_angle:
box = image_util.invert_rotate_rectangle(box, (image.width / 2, image.height / 2),
rotation_angle)
if x_offset:
box[0] += x_offset
box[2] += x_offset
if y_offset:
box[1] += y_offset
box[3] += y_offset
draw.rectangle(box, outline="red", width=2) # 绘制矩形
draw.text((box[0], box[1] - font_size), key, fill="blue", font=font) # 在矩形上方绘制文本
draw.text((box[0], box[3]), value["text"], fill="blue", font=font) # 在矩形下方绘制文本
os.makedirs(f"./check_result/{pk_phhd}/{ocr_item.id}", exist_ok=True)
image.save(f"./check_result/{pk_phhd}/{ocr_item.id}/{img_name}")
else:
os.makedirs(f"./check_result/{pk_phhd}/0", exist_ok=True)
image.save(f"./check_result/{pk_phhd}/0/{img_name}")
session.close()
# 自定义JSON处理器
def default(obj):
if isinstance(obj, Decimal):
return float(obj)
if isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
with open(f"./check_result/{pk_phhd}/result.json", "w", encoding="utf-8") as json_file:
json.dump(json_result, json_file, indent=4, ensure_ascii=False, default=default)
if __name__ == '__main__':
check_ie_result(5640504)

View File

@@ -19,5 +19,5 @@ DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'
SHOW_SQL = False
Engine = create_engine(DB_URL, echo=SHOW_SQL)
Base = declarative_base(Engine)
Base = declarative_base()
MysqlSession = sessionmaker(bind=Engine)

View File

@@ -1,5 +1,5 @@
# coding: utf-8
from sqlalchemy import Column, DECIMAL, Date, DateTime, Index, String, text, LargeBinary
from sqlalchemy import Column, DECIMAL, Date, DateTime, Index, String, text, LargeBinary, Text
from sqlalchemy.dialects.mysql import BIT, CHAR, INTEGER, TINYINT, VARCHAR
from db import Base
@@ -56,7 +56,8 @@ class ZxIeCost(Base):
pk_ie_cost = Column(INTEGER(11), primary_key=True, comment='费用明细信息抽取主键')
pk_phhd = Column(INTEGER(11), nullable=False, unique=True, comment='报销案子主键')
name = Column(String(30), comment='患者姓名')
content = Column(Text, comment='详细内容')
name = Column(String(20), comment='患者姓名')
admission_date_str = Column(String(255), comment='入院日期字符串')
admission_date = Column(Date, comment='入院日期')
discharge_date_str = Column(String(255), comment='出院日期字符串')
@@ -96,19 +97,19 @@ class ZxIeDischarge(Base):
pk_ie_discharge = Column(INTEGER(11), primary_key=True, comment='出院记录信息抽取主键')
pk_phhd = Column(INTEGER(11), nullable=False, unique=True, comment='报销案子主键')
content = Column(String(5000), comment='详细内容')
hospital = Column(String(255), comment='医院')
content = Column(Text, comment='详细内容')
hospital = Column(String(200), comment='医院')
pk_yljg = Column(INTEGER(11), comment='医院主键')
department = Column(String(255), comment='科室')
department = Column(String(200), comment='科室')
pk_ylks = Column(INTEGER(11), comment='科室主键')
name = Column(String(30), comment='患者姓名')
name = Column(String(20), comment='患者姓名')
age = Column(INTEGER(3), comment='年龄')
admission_date_str = Column(String(255), comment='入院日期字符串')
admission_date = Column(Date, comment='入院日期')
discharge_date_str = Column(String(255), comment='出院日期字符串')
discharge_date = Column(Date, comment='出院日期')
doctor = Column(String(30), comment='主治医生')
admission_id = Column(String(50), comment='住院号')
doctor = Column(String(20), comment='主治医生')
admission_id = Column(String(20), comment='住院号')
create_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"), comment='创建时间')
creator = Column(String(255), comment='创建人')
update_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"),
@@ -122,7 +123,7 @@ class ZxIeResult(Base):
pk_ocr = Column(INTEGER(11), primary_key=True, comment='图片OCR识别主键')
pk_phhd = Column(INTEGER(11), nullable=False, comment='报销单主键')
pk_phrec = Column(INTEGER(11), nullable=False, comment='图片主键')
id = Column(CHAR(32), nullable=False, comment='识别批次')
id = Column(INTEGER(11), nullable=False, comment='识别批次')
cfjaddress = Column(String(200), nullable=False, comment='云存储文件名')
content = Column(String(5000), comment='OCR识别内容')
rotation_angle = Column(INTEGER(11), comment='旋转角度')
@@ -140,7 +141,7 @@ class ZxIeSettlement(Base):
pk_ie_settlement = Column(INTEGER(11), primary_key=True, comment='结算清单信息抽取主键')
pk_phhd = Column(INTEGER(11), nullable=False, unique=True, comment='报销案子主键')
name = Column(String(30), comment='患者姓名')
name = Column(String(20), comment='患者姓名')
admission_date_str = Column(String(255), comment='入院日期字符串')
admission_date = Column(Date, comment='入院日期')
discharge_date_str = Column(String(255), comment='出院日期字符串')
@@ -154,9 +155,9 @@ class ZxIeSettlement(Base):
personal_funded_amount_str = Column(String(255), comment='自费金额字符串')
personal_funded_amount = Column(DECIMAL(18, 2), comment='自费金额')
medical_insurance_type_str = Column(String(255), comment='医保类型字符串')
medical_insurance_type = Column(String(40), comment='医保类型')
admission_id = Column(String(50), comment='住院号')
settlement_id = Column(String(50), comment='医保结算单号码')
medical_insurance_type = Column(String(10), comment='医保类型')
admission_id = Column(String(20), comment='住院号')
settlement_id = Column(String(30), comment='医保结算单号码')
create_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"), comment='创建时间')
creator = Column(String(255), comment='创建人')
update_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"),
@@ -414,19 +415,17 @@ class ZxIeReview(Base):
pk_ie_review = Column(INTEGER(11), primary_key=True, comment='自动审核主键')
pk_phhd = Column(INTEGER(11), nullable=False, comment='报销案子主键')
success = Column(BIT(1))
integrity = Column(BIT(1))
has_settlement = Column(BIT(1))
has_discharge = Column(BIT(1))
has_cost = Column(BIT(1))
full_page = Column(BIT(1))
page_description = Column(String(255), comment='具体缺页描述')
consistency = Column(BIT(1), comment='三项资料一致性。0不一致1一致')
name_match = Column(CHAR(1), server_default=text("'0'"),
comment='三项资料姓名是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致5与报销申请对象不一致')
comment='三项资料姓名是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致5与报销申请对象不一致')
admission_date_match = Column(CHAR(1), server_default=text("'0'"),
comment='三项资料入院日期是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致')
comment='三项资料入院日期是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致')
discharge_date_match = Column(CHAR(1), server_default=text("'0'"),
comment='三项资料出院日期是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致')
comment='三项资料出院日期是否一致。0不一致1一致2结算单不一致3出院记录不一致4费用清单不一致')
create_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"), comment='创建时间')
creator = Column(String(255), comment='创建人')
update_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"),

74
delete_deprecated_data.py Normal file
View File

@@ -0,0 +1,74 @@
# 删除本地数据库中的过期数据
import logging.config
from datetime import datetime, timedelta
from db import MysqlSession
from db.mysql import ZxPhhd, ZxIeCost, ZxIeDischarge, ZxIeResult, ZxIeSettlement, ZxPhrec
from log import LOGGING_CONFIG
# 过期时间(不建议小于1个月)
EXPIRATION_DAYS = 183
# 批量删除数量(最好在1000~10000之间)
BATCH_SIZE = 5000
# 数据库会话对象
session = None
def batch_delete_by_pk_phhd(model, pk_phhds):
"""
批量删除指定模型中主键在指定列表中的数据
参数:
modelSQLAlchemy模型类对应数据库表
pk_phhds待删除的主键值列表
返回:
删除的记录数量
"""
delete_count = (
session.query(model)
.filter(model.pk_phhd.in_(pk_phhds))
.delete(synchronize_session=False)
)
session.commit()
logging.getLogger("sql").info(f"{model.__tablename__}成功删除{delete_count}条数据")
return delete_count
if __name__ == '__main__':
logging.config.dictConfig(LOGGING_CONFIG)
deadline = datetime.now() - timedelta(days=EXPIRATION_DAYS)
double_deadline = deadline - timedelta(days=EXPIRATION_DAYS)
session = MysqlSession()
try:
while 1:
# 已经走完所有流程的案子,超过过期时间后删除
phhds = (session.query(ZxPhhd.pk_phhd)
.filter(ZxPhhd.paint_flag == "9")
.filter(ZxPhhd.billdate < deadline)
.limit(BATCH_SIZE)
.all())
if not phhds or len(phhds) <= 0:
# 没有通过审核,可能会重拍补拍上传的案子,超过两倍过期时间后删除
phhds = (session.query(ZxPhhd.pk_phhd)
.filter(ZxPhhd.exsuccess_flag == "9")
.filter(ZxPhhd.paint_flag == "0")
.filter(ZxPhhd.billdate < double_deadline)
.limit(BATCH_SIZE)
.all())
if not phhds or len(phhds) <= 0:
# 没有符合条件的数据,退出循环
break
pk_phhd_values = [phhd.pk_phhd for phhd in phhds]
logging.getLogger("sql").info(f"过期的pk_phhd有{','.join(map(str, pk_phhd_values))}")
batch_delete_by_pk_phhd(ZxPhrec, pk_phhd_values)
batch_delete_by_pk_phhd(ZxIeResult, pk_phhd_values)
batch_delete_by_pk_phhd(ZxIeSettlement, pk_phhd_values)
batch_delete_by_pk_phhd(ZxIeDischarge, pk_phhd_values)
batch_delete_by_pk_phhd(ZxIeCost, pk_phhd_values)
batch_delete_by_pk_phhd(ZxPhhd, pk_phhd_values)
except Exception as e:
session.rollback()
logging.getLogger('error').error('过期数据删除失败!', exc_info=e)
finally:
session.close()

32
det_api.py Normal file
View File

@@ -0,0 +1,32 @@
import base64
import cv2
import numpy as np
from flask import Flask, request, jsonify
from paddle_detection import detector
app = Flask(__name__)
@app.route("/det/detect_books", methods=['POST'])
def detect_books():
try:
file = request.files['image']
image_data = file.read()
nparr = np.frombuffer(image_data, np.uint8)
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
result = detector.get_book_areas(image)
encoded_images = []
for i in result:
_, encoded_image = cv2.imencode('.jpg', i)
byte_stream = encoded_image.tobytes()
img_str = base64.b64encode(byte_stream).decode('utf-8')
encoded_images.append(img_str)
return jsonify(encoded_images), 200
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run("0.0.0.0")

26
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,26 @@
services:
fcb_ai_dev:
image: fcb_ai_dev:0.0.10
build:
context: .
dockerfile: Dockerfile.dev
# 容器名称,可自定义
container_name: fcb_ai_dev
hostname: fcb_ai_dev
# 始终重启容器
restart: always
# 端口映射,根据需要修改主机端口
ports:
- "8022:22"
# 数据卷映射,根据实际路径修改
volumes:
- ./log:/app/log
- ./model:/app/model
# 启用GPU支持
deploy:
resources:
reservations:
devices:
- device_ids: [ '0', '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'

View File

@@ -1,150 +1,46 @@
x-base:
&base_template
x-env:
&template
image: fcb_photo_review:1.15.7
restart: always
x-project:
&project_template
<<: *base_template
image: fcb_photo_review:2.0.0
x-review:
&review_template
<<: *template
volumes:
- ./log:/app/log
- ./tmp_img:/app/tmp_img
- ./model:/app/model
deploy:
resources:
reservations:
devices:
- device_ids: [ '0', '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
x-paddle:
&paddle_template
<<: *base_template
image: fcb_paddle:0.0.1
x-mask:
&mask_template
<<: *template
volumes:
- ./services/paddle_services/log:/app/log
- ./services/paddle_services/model:/app/model
- ./tmp_img:/app/tmp_img
- ./log:/app/log
deploy:
resources:
reservations:
devices:
- device_ids: [ '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
services:
ocr:
<<: *paddle_template
build:
context: ./services/paddle_services
container_name: ocr
hostname: ocr
command: [ '-w', '4', 'ocr:app', '--bind', '0.0.0.0:5001' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '0' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
ie_settlement:
<<: *paddle_template
container_name: ie_settlement
hostname: ie_settlement
command: [ '-w', '5', 'ie_settlement:app', '--bind', '0.0.0.0:5002' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '0' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
ie_discharge:
<<: *paddle_template
container_name: ie_discharge
hostname: ie_discharge
command: [ '-w', '5', 'ie_discharge:app', '--bind', '0.0.0.0:5003' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
ie_cost:
<<: *paddle_template
container_name: ie_cost
hostname: ie_cost
command: [ '-w', '5', 'ie_cost:app', '--bind', '0.0.0.0:5004' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
clas_orientation:
<<: *paddle_template
container_name: clas_orientation
hostname: clas_orientation
command: [ '-w', '3', 'clas_orientation:app', '--bind', '0.0.0.0:5005' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '0' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
det_book:
<<: *paddle_template
container_name: det_book
hostname: det_book
command: [ '-w', '4', 'det_book:app', '--bind', '0.0.0.0:5006' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '1' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
dewarp:
<<: *paddle_template
container_name: dewarp
hostname: dewarp
command: [ '-w', '4', 'dewarp:app', '--bind', '0.0.0.0:5007' ]
deploy:
resources:
reservations:
devices:
- device_ids: [ '0' ]
capabilities: [ 'gpu' ]
driver: 'nvidia'
# clas_text:
# <<: *paddle_template
# container_name: clas_text
# hostname: clas_text
# command: [ '-w', '3', 'clas_text:app', '--bind', '0.0.0.0:5008' ]
# deploy:
# resources:
# reservations:
# devices:
# - device_ids: [ '1' ]
# capabilities: [ 'gpu' ]
# driver: 'nvidia'
photo_review_1:
<<: *project_template
<<: *review_template
build:
context: .
container_name: photo_review_1
hostname: photo_review_1
depends_on:
- ocr
- ie_settlement
- ie_discharge
- ie_cost
- clas_orientation
- det_book
- dewarp
# - clas_text
command: [ 'photo_review.py', '--clean', 'True' ]
photo_review_2:
<<: *project_template
<<: *review_template
container_name: photo_review_2
hostname: photo_review_2
depends_on:
@@ -152,41 +48,57 @@ services:
command: [ 'photo_review.py' ]
photo_review_3:
<<: *project_template
<<: *review_template
container_name: photo_review_3
hostname: photo_review_3
depends_on:
- photo_review_1
- photo_review_2
command: [ 'photo_review.py' ]
photo_review_4:
<<: *project_template
<<: *review_template
container_name: photo_review_4
hostname: photo_review_4
depends_on:
- photo_review_1
- photo_review_3
command: [ 'photo_review.py' ]
photo_review_5:
<<: *project_template
<<: *review_template
container_name: photo_review_5
hostname: photo_review_5
depends_on:
- photo_review_1
- photo_review_4
command: [ 'photo_review.py' ]
photo_mask_1:
<<: *project_template
<<: *mask_template
container_name: photo_mask_1
hostname: photo_mask_1
depends_on:
- photo_review_1
- photo_review_5
command: [ 'photo_mask.py', '--clean', 'True' ]
photo_mask_2:
<<: *project_template
<<: *mask_template
container_name: photo_mask_2
hostname: photo_mask_2
depends_on:
- photo_mask_1
command: [ 'photo_mask.py' ]
#
# photo_review_6:
# <<: *review_template
# container_name: photo_review_6
# hostname: photo_review_6
# depends_on:
# - photo_mask_2
# command: [ 'photo_review.py' ]
#
# photo_review_7:
# <<: *review_template
# container_name: photo_review_7
# hostname: photo_review_7
# depends_on:
# - photo_review_6
# command: [ 'photo_review.py' ]

Binary file not shown.

153
document/PaddleOCR命令.md Normal file
View File

@@ -0,0 +1,153 @@
# PaddleOCR
------
## 数据集
该部分内容均在PPOCRLabel目录下进行
```bash
# 进入PPOCRLabel目录
cd .\PPOCRLabel\
```
### 打标
可以对PPOCRLabel.py直接使用PyCharm中的Run但是默认是英文的
```bash
# 以中文运行打标应用
python PPOCRLabel.py --lang ch
# 含有关键词提取的打标
python PPOCRLabel.py --lang ch --kie True
```
### 划分数据集
```bash
python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../train_data/drivingData
```
------
## 检测模型
先回到项目根目录
### 训练
```bash
python tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml
```
### 测试
```bash
python tools/infer_det.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml -o Global.pretrained_model=output/det_v4_bankcard/best_accuracy.pdparams Global.infer_img=train_data/drivingData/1.jpg
```
### 恢复训练
```bash
python tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml -o Global.checkpoints=./output/det_v4_bankcard/latest
```
------
## 识别模型
### 训练
```bash
python tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_ampO2_ultra.yml
```
### 测试
```bash
python tools/infer_rec.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_ampO2_ultra.yml -o Global.pretrained_model=output/rec_v4_bankcard/best_accuracy.pdparams Global.infer_img=train_data/drivingData/crop_img/1_crop_0.jpg
```
------
## 推理模型
### 检测模型转换
```bash
python tools/export_model.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml -o Global.pretrained_model=output/det_v4_bankcard/best_accuracy.pdparams
```
### 识别模型转换
```bash
python tools/export_model.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_ampO2_ultra.yml -o Global.pretrained_model=output/rec_v4_bankcard/best_accuracy.pdparams
```
### 检测识别测试
```bash
python tools/infer/predict_system.py --det_model_dir=inference_model/det_v4_bankcard --rec_model_dir=inference_model/rec_v4_bankcard --rec_char_dict_path=ppocr/utils/num_dict.txt --image_dir=train_data/drivingData/1.jpg
```
------
## 移动端模型
### 检测模型转换
```bash
paddle_lite_opt --model_file=inference_model/det_v4_bankcard/inference.pdmodel --param_file=inference_model/det_v4_bankcard/inference.pdiparams --optimize_out=inference_model/det_v4_nb_bankcard --valid_targets=arm --optimize_out_type=naive_buffer
```
### 识别模型转换
```bash
paddle_lite_opt --model_file=inference_model/rec_v4_bankcard/inference.pdmodel --param_file=inference_model/rec_v4_bankcard/inference.pdiparams --optimize_out=inference_model/rec_v4_nb_bankcard --valid_targets=arm --optimize_out_type=naive_buffer
```
------
------
# PaddleNLP
## 数据集
使用Label Studio进行数据标注安装过程省略
```bash
# 打开Anaconda Prompt
# 激活安装Label Studio的环境
conda activate label-studio
# 启动Label Studio
label-studio start
```
[打标流程](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/applications/information_extraction/label_studio_doc.md)
### 数据转换
```bash
# 进入PaddleNLP\applications\information_extraction后执行
python label_studio.py --label_studio_file ./document/data/label_studio.json --save_dir ./document/data --splits 0.8 0.1 0.1 --task_type ext
```
------
## 训练模型
```bash
# 进入PaddleNLP\applications\information_extraction\document后执行(双卡训练)
python -u -m paddle.distributed.launch --gpus "0,1" finetune.py --device gpu --logging_steps 5 --save_steps 25 --eval_steps 25 --seed 42 --model_name_or_path uie-x-base --output_dir ./checkpoint/model_best --train_path data/train.txt --dev_path data/dev.txt --max_seq_len 512 --per_device_train_batch_size 8 --per_device_eval_batch_size 8 --num_train_epochs 10 --learning_rate 1e-5 --do_train --do_eval --do_export --export_model_dir ./checkpoint/model_best --overwrite_output_dir --disable_tqdm False --metric_for_best_model eval_f1 --load_best_model_at_end True --save_total_limit 1
```
------
参考:
[PaddleOCR训练属于自己的模型详细教程](https://blog.csdn.net/qq_52852432/article/details/131817619?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-131817619-blog-124628731.235^v40^pc_relevant_3m_sort_dl_base1&amp;spm=1001.2101.3001.4242.1&amp;utm_relevant_index=3)
[端侧部署](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/deploy/lite/readme_ch.md)
[PaddleNLP关键信息抽取](https://blog.csdn.net/z5z5z5z56/article/details/130346646)

View File

@@ -0,0 +1,329 @@
anyio 4.0.0
astor 0.8.1
certifi 2019.11.28
chardet 3.0.4
dbus-python 1.2.16
decorator 5.1.1
distro-info 0.23+ubuntu1.1
exceptiongroup 1.1.3
h11 0.14.0
httpcore 1.0.2
httpx 0.25.1
idna 2.8
numpy 1.26.2
opt-einsum 3.3.0
paddlepaddle-gpu 2.6.1.post120
Pillow 10.1.0
pip 24.0
protobuf 4.25.0
PyGObject 3.36.0
python-apt 2.0.1+ubuntu0.20.4.1
requests 2.22.0
requests-unixsocket 0.2.0
setuptools 68.2.2
six 1.14.0
sniffio 1.3.0
unattended-upgrades 0.1
urllib3 1.25.8
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.1.0-gpu-cuda12.9-cudnn9.9:
python:3.10.12
Package Version
------------------------ ----------
anyio 4.9.0
certifi 2025.6.15
decorator 5.2.1
exceptiongroup 1.3.0
h11 0.16.0
httpcore 1.0.9
httpx 0.28.1
idna 3.10
networkx 3.4.2
numpy 2.2.6
nvidia-cublas-cu12 12.9.0.13
nvidia-cuda-cccl-cu12 12.9.27
nvidia-cuda-cupti-cu12 12.9.19
nvidia-cuda-nvrtc-cu12 12.9.41
nvidia-cuda-runtime-cu12 12.9.37
nvidia-cudnn-cu12 9.9.0.52
nvidia-cufft-cu12 11.4.0.6
nvidia-cufile-cu12 1.14.0.30
nvidia-curand-cu12 10.3.10.19
nvidia-cusolver-cu12 11.7.4.40
nvidia-cusparse-cu12 12.5.9.5
nvidia-cusparselt-cu12 0.7.1
nvidia-nccl-cu12 2.26.5
nvidia-nvjitlink-cu12 12.9.41
nvidia-nvtx-cu12 12.9.19
opt-einsum 3.3.0
paddlepaddle-gpu 3.1.0
pillow 11.2.1
pip 25.1.1
protobuf 6.31.1
setuptools 59.6.0
sniffio 1.3.1
typing_extensions 4.14.0
wheel 0.37.1
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlex/paddlex:paddlex3.1.2-paddlepaddle3.0.0-gpu-cuda12.6-cudnn9.5-trt10.5
python:3.10.18
Package Version Editable project location
------------------------- -------------------- -------------------------
aiohappyeyeballs 2.6.1
aiohttp 3.12.13
aiosignal 1.4.0
aistudio_sdk 0.3.5
albucore 0.0.13+pdx
albumentations 1.4.10+pdx
alembic 1.16.2
annotated-types 0.7.0
anyio 4.9.0
astor 0.8.1
asttokens 3.0.0
async-timeout 4.0.3
attrdict3 2.0.2
attrs 25.3.0
babel 2.17.0
bce-python-sdk 0.9.35
beautifulsoup4 4.13.4
blinker 1.9.0
cachetools 6.1.0
certifi 2019.11.28
cffi 1.17.1
chardet 3.0.4
charset-normalizer 3.4.2
chinese-calendar 1.8.0
click 8.2.1
cloudpickle 3.1.1
colorama 0.4.6
colorlog 6.9.0
ConfigSpace 1.2.1
contourpy 1.3.2
cssselect 1.3.0
cssutils 2.11.1
cycler 0.12.1
Cython 3.1.2
dataclasses-json 0.6.7
datasets 3.6.0
dbus-python 1.2.16
decorator 5.2.1
decord 0.6.0
descartes 1.1.0
dill 0.3.4
distro 1.9.0
distro-info 0.23+ubuntu1.1
easydict 1.13
einops 0.8.1
et_xmlfile 2.0.0
exceptiongroup 1.2.2
executing 2.2.0
faiss-cpu 1.8.0.post1
fastapi 0.116.0
filelock 3.18.0
fire 0.7.0
FLAML 2.3.5
Flask 3.1.1
flask-babel 4.0.0
fonttools 4.58.5
frozenlist 1.7.0
fsspec 2025.3.0
ftfy 6.3.1
future 1.0.0
gast 0.3.3
GPUtil 1.4.0
greenlet 3.2.3
h11 0.14.0
h5py 3.14.0
hf-xet 1.1.5
hpbandster 0.7.4
httpcore 1.0.7
httpx 0.28.1
httpx-sse 0.4.1
huggingface-hub 0.33.2
idna 2.8
imageio 2.37.0
imagesize 1.4.1
imgaug 0.4.0+pdx
ipython 8.37.0
itsdangerous 2.2.0
jedi 0.19.2
jieba 0.42.1
Jinja2 3.1.6
jiter 0.10.0
joblib 1.5.1
jsonpatch 1.33
jsonpointer 3.0.0
jsonschema 4.24.0
jsonschema-specifications 2025.4.1
kiwisolver 1.4.8
langchain 0.3.26
langchain-community 0.3.27
langchain-core 0.3.68
langchain-openai 0.3.27
langchain-text-splitters 0.3.8
langsmith 0.4.4
lapx 0.5.11.post1
lazy_loader 0.4
llvmlite 0.44.0
lmdb 1.6.2
lxml 6.0.0
Mako 1.3.10
markdown-it-py 3.0.0
MarkupSafe 3.0.2
marshmallow 3.26.1
matplotlib 3.5.3
matplotlib-inline 0.1.7
mdurl 0.1.2
more-itertools 10.7.0
motmetrics 1.4.0
msgpack 1.1.1
multidict 6.6.3
multiprocess 0.70.12.2
mypy_extensions 1.1.0
netifaces 0.11.0
networkx 3.4.2
numba 0.61.2
numpy 1.24.4
nuscenes-devkit 1.1.11+pdx
onnx 1.17.0
onnxoptimizer 0.3.13
openai 1.93.1
opencv-contrib-python 4.10.0.84
openpyxl 3.1.5
opt-einsum 3.3.0
optuna 4.4.0
orjson 3.10.18
packaging 24.2
paddle2onnx 2.0.2rc3
paddle3d 0.0.0
paddleclas 2.6.0
paddledet 0.0.0
paddlefsl 1.1.0
paddlenlp 2.8.0.post0
paddlepaddle-gpu 3.0.0
paddleseg 0.0.0.dev0
paddlets 1.1.0
paddlex 3.1.2 /root/PaddleX
pandas 1.3.5
parso 0.8.4
patsy 1.0.1
pexpect 4.9.0
pillow 11.1.0
pip 25.1.1
polygraphy 0.49.24
ppvideo 2.3.0
premailer 3.10.0
prettytable 3.16.0
prompt_toolkit 3.0.51
propcache 0.3.2
protobuf 6.30.1
psutil 7.0.0
ptyprocess 0.7.0
pure_eval 0.2.3
py-cpuinfo 9.0.0
pyarrow 20.0.0
pybind11 2.13.6
pybind11-stubgen 2.5.1
pyclipper 1.3.0.post6
pycocotools 2.0.8
pycparser 2.22
pycryptodome 3.23.0
pydantic 2.11.7
pydantic_core 2.33.2
pydantic-settings 2.10.1
Pygments 2.19.2
PyGObject 3.36.0
PyMatting 1.1.14
pyod 2.0.5
pypandoc 1.15
pyparsing 3.2.3
pypdfium2 4.30.1
pyquaternion 0.9.9
Pyro4 4.82
python-apt 2.0.1+ubuntu0.20.4.1
python-dateutil 2.9.0.post0
python-docx 1.2.0
python-dotenv 1.1.1
pytz 2025.2
PyWavelets 1.3.0
PyYAML 6.0.2
RapidFuzz 3.13.0
rarfile 4.2
ray 2.47.1
referencing 0.36.2
regex 2024.11.6
requests 2.32.4
requests-toolbelt 1.0.0
requests-unixsocket 0.2.0
rich 14.0.0
rpds-py 0.26.0
ruamel.yaml 0.18.14
ruamel.yaml.clib 0.2.12
safetensors 0.5.3
scikit-image 0.25.2
scikit-learn 1.3.2
scipy 1.15.3
seaborn 0.13.2
sentencepiece 0.2.0
seqeval 1.2.2
serpent 1.41
setuptools 68.2.2
shap 0.48.0
Shapely 1.8.5.post1
shellingham 1.5.4
six 1.14.0
sklearn 0.0
slicer 0.0.8
sniffio 1.3.1
soundfile 0.13.1
soupsieve 2.7
SQLAlchemy 2.0.41
stack-data 0.6.3
starlette 0.46.2
statsmodels 0.14.1
tenacity 9.1.2
tensorboardX 2.6.4
tensorrt 10.5.0
termcolor 3.1.0
terminaltables 3.1.10
threadpoolctl 3.6.0
tifffile 2025.5.10
tiktoken 0.9.0
tokenizers 0.19.1
tomli 2.2.1
tool_helpers 0.1.2
tqdm 4.67.1
traitlets 5.14.3
typeguard 4.4.4
typer 0.16.0
typing_extensions 4.14.1
typing-inspect 0.9.0
typing-inspection 0.4.1
tzdata 2025.2
ujson 5.10.0
unattended-upgrades 0.1
urllib3 1.25.8
uvicorn 0.35.0
visualdl 2.5.3
Wand 0.6.13
wcwidth 0.2.13
Werkzeug 3.1.3
xmltodict 0.14.2
xxhash 3.5.0
yacs 0.1.8
yarl 1.20.1
zstandard 0.23.0

Binary file not shown.

View File

@@ -1,15 +1,14 @@
import os
import socket
# 项目根目录
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 获取主机名,方便区分容器
HOSTNAME = socket.gethostname()
# 检测日志文件的路径是否存在,不存在则创建
LOG_PATHS = [
os.path.join(PROJECT_ROOT, 'log', HOSTNAME, 'ucloud'),
os.path.join(PROJECT_ROOT, 'log', HOSTNAME, 'error'),
os.path.join(PROJECT_ROOT, 'log', HOSTNAME, 'qr'),
f"log/{HOSTNAME}/ucloud",
f"log/{HOSTNAME}/error",
f"log/{HOSTNAME}/qr",
f"log/{HOSTNAME}/sql",
]
for path in LOG_PATHS:
if not os.path.exists(path):
@@ -76,6 +75,16 @@ LOGGING_CONFIG = {
'backupCount': 14,
'encoding': 'utf-8',
},
'sql': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'level': 'INFO',
'formatter': 'standard',
'filename': f'log/{HOSTNAME}/sql/fcb_photo_review_sql.log',
'when': 'midnight',
'interval': 1,
'backupCount': 14,
'encoding': 'utf-8',
},
},
# loggers定义了日志记录器
@@ -100,5 +109,10 @@ LOGGING_CONFIG = {
'level': 'DEBUG',
'propagate': False,
},
'sql': {
'handlers': ['console', 'sql'],
'level': 'DEBUG',
'propagate': False,
},
},
}

1
paddle_detection/README.md Symbolic link
View File

@@ -0,0 +1 @@
README_cn.md

View File

@@ -0,0 +1,4 @@
from onnxruntime import InferenceSession
PADDLE_DET = InferenceSession("model/object_det_model/ppyoloe_plus_crn_l_80e_coco_w_nms.onnx",
providers=["CPUExecutionProvider"], provider_options=[{"device_id": 0}])

Some files were not shown because too many files have changed in this diff Show More