修正docker镜像构建
This commit is contained in:
@@ -12,7 +12,7 @@ ENV PYTHONUNBUFFERED=1 \
|
||||
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
|
||||
# 安装依赖
|
||||
COPY ./services/paddle_services/requestments.txt /app/requirements.txt
|
||||
COPY requestments.txt /app/requirements.txt
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone \
|
||||
&& pip install --no-cache-dir -r requirements.txt \
|
||||
&& pip uninstall -y onnxruntime onnxruntime-gpu \
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
"""
|
||||
信息抽取关键词配置
|
||||
"""
|
||||
|
||||
# 患者姓名
|
||||
PATIENT_NAME = ['患者姓名']
|
||||
# 入院日期
|
||||
ADMISSION_DATE = ['入院日期']
|
||||
# 出院日期
|
||||
DISCHARGE_DATE = ['出院日期']
|
||||
# 发生医疗费
|
||||
MEDICAL_EXPENSES = ['费用总额']
|
||||
# 个人现金支付
|
||||
PERSONAL_CASH_PAYMENT = ['个人现金支付']
|
||||
# 个人账户支付
|
||||
PERSONAL_ACCOUNT_PAYMENT = ['个人账户支付']
|
||||
# 个人自费金额
|
||||
PERSONAL_FUNDED_AMOUNT = ['自费金额', '个人自费']
|
||||
# 医保类别
|
||||
MEDICAL_INSURANCE_TYPE = ['医保类型']
|
||||
# 就诊医院
|
||||
HOSPITAL = ['医院']
|
||||
# 就诊科室
|
||||
DEPARTMENT = ['科室']
|
||||
# 主治医生
|
||||
DOCTOR = ['主治医生']
|
||||
# 住院号
|
||||
ADMISSION_ID = ['住院号']
|
||||
# 医保结算单号码
|
||||
SETTLEMENT_ID = ['医保结算单号码']
|
||||
# 年龄
|
||||
AGE = ['年龄']
|
||||
# 大写总额
|
||||
UPPERCASE_MEDICAL_EXPENSES = ['大写总额']
|
||||
|
||||
26
services/paddle_services/clas_api.py
Normal file
26
services/paddle_services/clas_api.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from flask import Flask, request
|
||||
from paddleclas import PaddleClas
|
||||
|
||||
from utils import process_request
|
||||
|
||||
app = Flask(__name__)
|
||||
CLAS = PaddleClas(model_name='text_image_orientation')
|
||||
|
||||
|
||||
@app.route('/clas/orientation', methods=['POST'])
|
||||
@process_request
|
||||
def orientation():
|
||||
"""
|
||||
判断图片旋转角度,逆时针旋转该角度后为正。可能值['0', '90', '180', '270']
|
||||
:return: 最有可能的两个角度
|
||||
"""
|
||||
img_path = request.form.get('img_path')
|
||||
clas_result = CLAS.predict(input_data=img_path)
|
||||
clas_result = next(clas_result)[0]
|
||||
if clas_result['scores'][0] < 0.5:
|
||||
return ['0', '90']
|
||||
return clas_result['label_names']
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5005)
|
||||
24
services/paddle_services/cost_api.py
Normal file
24
services/paddle_services/cost_api.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import json
|
||||
|
||||
from flask import Flask, request
|
||||
from paddlenlp import Taskflow
|
||||
|
||||
from utils import process_request
|
||||
from . import PATIENT_NAME, ADMISSION_DATE, DISCHARGE_DATE, MEDICAL_EXPENSES
|
||||
|
||||
app = Flask(__name__)
|
||||
COST_LIST_SCHEMA = PATIENT_NAME + ADMISSION_DATE + DISCHARGE_DATE + MEDICAL_EXPENSES
|
||||
COST = Taskflow('information_extraction', schema=COST_LIST_SCHEMA, model='uie-x-base',
|
||||
task_path='../../model/cost_list_model', layout_analysis=False, precision='fp16')
|
||||
|
||||
|
||||
@app.route('/nlp/cost', methods=['POST'])
|
||||
@process_request
|
||||
def cost():
|
||||
img_path = request.form.get('img_path')
|
||||
layout = request.form.get('layout')
|
||||
return COST({'doc': img_path, 'layout': json.loads(layout)})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5004)
|
||||
28
services/paddle_services/det_api.py
Normal file
28
services/paddle_services/det_api.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import os.path
|
||||
|
||||
import cv2
|
||||
from flask import Flask, request
|
||||
|
||||
from paddle_detection import detector
|
||||
from utils import process_request, parse_img_path
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/det/books', methods=['POST'])
|
||||
@process_request
|
||||
def books():
|
||||
img_path = request.form.get('img_path')
|
||||
result = detector.get_book_areas(img_path)
|
||||
|
||||
dirname, img_name, ext = parse_img_path(img_path)
|
||||
books_path = []
|
||||
for i in range(len(result)):
|
||||
save_path = os.path.join(dirname, img_name + '_book_' + str(i) + '.' + ext)
|
||||
cv2.imwrite(save_path, result[i])
|
||||
books_path.append(save_path)
|
||||
return books_path
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5006)
|
||||
25
services/paddle_services/dewarp_api.py
Normal file
25
services/paddle_services/dewarp_api.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import os
|
||||
|
||||
import cv2
|
||||
from flask import Flask, request
|
||||
|
||||
from doc_dewarp import dewarper
|
||||
from utils import process_request, parse_img_path
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/dewarp', methods=['POST'])
|
||||
@process_request
|
||||
def dewarp():
|
||||
img_path = request.form.get('img_path')
|
||||
img = cv2.imread(img_path)
|
||||
dewarped_img = dewarper.dewarp_image(img)
|
||||
dirname, img_name, ext = parse_img_path(img_path)
|
||||
save_path = os.path.join(dirname, img_name + '_dewarped.' + ext)
|
||||
cv2.imwrite(save_path, dewarped_img)
|
||||
return save_path
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5007)
|
||||
26
services/paddle_services/discharge_api.py
Normal file
26
services/paddle_services/discharge_api.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import json
|
||||
|
||||
from flask import Flask, request
|
||||
from paddlenlp import Taskflow
|
||||
|
||||
from utils import process_request
|
||||
from . import HOSPITAL, DEPARTMENT, PATIENT_NAME, ADMISSION_DATE, DISCHARGE_DATE, DOCTOR, ADMISSION_ID, AGE
|
||||
|
||||
app = Flask(__name__)
|
||||
DISCHARGE_RECORD_SCHEMA = (
|
||||
HOSPITAL + DEPARTMENT + PATIENT_NAME + ADMISSION_DATE + DISCHARGE_DATE + DOCTOR + ADMISSION_ID + AGE
|
||||
)
|
||||
DISCHARGE = Taskflow('information_extraction', schema=DISCHARGE_RECORD_SCHEMA, model='uie-x-base',
|
||||
task_path='../../model/discharge_record_model', layout_analysis=False, precision='fp16')
|
||||
|
||||
|
||||
@app.route('/nlp/discharge', methods=['POST'])
|
||||
@process_request
|
||||
def discharge():
|
||||
img_path = request.form.get('img_path')
|
||||
layout = request.form.get('layout')
|
||||
return DISCHARGE({'doc': img_path, 'layout': json.loads(layout)})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5003)
|
||||
18
services/paddle_services/ocr_api.py
Normal file
18
services/paddle_services/ocr_api.py
Normal file
@@ -0,0 +1,18 @@
|
||||
from flask import Flask, request
|
||||
from paddleocr import PaddleOCR
|
||||
|
||||
from utils import process_request
|
||||
|
||||
app = Flask(__name__)
|
||||
OCR = PaddleOCR(use_angle_cls=False, show_log=False, gpu_id=0, det_db_box_thresh=0.3)
|
||||
|
||||
|
||||
@app.route('/ocr', methods=['POST'])
|
||||
@process_request
|
||||
def ocr():
|
||||
img_path = request.form.get('img_path')
|
||||
return OCR.ocr(img_path, cls=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5001)
|
||||
30
services/paddle_services/settlement_api.py
Normal file
30
services/paddle_services/settlement_api.py
Normal file
@@ -0,0 +1,30 @@
|
||||
import json
|
||||
|
||||
from flask import Flask, request
|
||||
from paddlenlp import Taskflow
|
||||
|
||||
from utils import process_request
|
||||
from . import PATIENT_NAME, ADMISSION_DATE, DISCHARGE_DATE, MEDICAL_EXPENSES, PERSONAL_CASH_PAYMENT, \
|
||||
PERSONAL_ACCOUNT_PAYMENT, PERSONAL_FUNDED_AMOUNT, MEDICAL_INSURANCE_TYPE, ADMISSION_ID, SETTLEMENT_ID, \
|
||||
UPPERCASE_MEDICAL_EXPENSES
|
||||
|
||||
app = Flask(__name__)
|
||||
SETTLEMENT_LIST_SCHEMA = (
|
||||
PATIENT_NAME + ADMISSION_DATE + DISCHARGE_DATE + MEDICAL_EXPENSES + PERSONAL_CASH_PAYMENT
|
||||
+ PERSONAL_ACCOUNT_PAYMENT + PERSONAL_FUNDED_AMOUNT + MEDICAL_INSURANCE_TYPE + ADMISSION_ID + SETTLEMENT_ID
|
||||
+ UPPERCASE_MEDICAL_EXPENSES
|
||||
)
|
||||
SETTLEMENT_IE = Taskflow('information_extraction', schema=SETTLEMENT_LIST_SCHEMA, model='uie-x-base',
|
||||
task_path='../../model/settlement_list_model', layout_analysis=False, precision='fp16')
|
||||
|
||||
|
||||
@app.route('/nlp/settlement', methods=['POST'])
|
||||
@process_request
|
||||
def settlement():
|
||||
img_path = request.form.get('img_path')
|
||||
layout = request.form.get('layout')
|
||||
return SETTLEMENT_IE({'doc': img_path, 'layout': json.loads(layout)})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', 5002)
|
||||
24
services/paddle_services/utils.py
Normal file
24
services/paddle_services/utils.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import os
|
||||
|
||||
from flask import jsonify
|
||||
|
||||
|
||||
def process_request(func):
|
||||
"""
|
||||
api通用处理函数
|
||||
"""
|
||||
|
||||
def wrapper(*args, **kwargs):
|
||||
try:
|
||||
result = func(*args, **kwargs)
|
||||
return jsonify(result), 200
|
||||
except Exception as e:
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def parse_img_path(img_path):
|
||||
dirname = os.path.dirname(img_path)
|
||||
img_name, ext = os.path.basename(img_path).rsplit('.', 1)
|
||||
return dirname, img_name, ext
|
||||
Reference in New Issue
Block a user