#coding:utf-8 import copy import json import math import os import sys import time import numpy as np import h5py import tensorflow as tf # from flask import Flask sys.path.append(os.path.abspath(os.path.dirname(__file__))) from models.model import get_model from post_process import table_post_process, table_post_process_2 from pre_process import my_data_loader, table_pre_process, table_pre_process_2, my_data_loader_2, my_data_loader_predict # from BiddingKG.dl.interface.Preprocessing import tableToText, segment # init model model_id = 1 if model_id == 1: input_shape = (6, 20, 60) output_shape = (1,) else: input_shape = (None, None, 20, 60) output_shape = (None, None) keras_model_path = os.path.abspath(os.path.dirname(__file__)) + "/best_tiny.hdf5" # keras模型加载预测都使用同一个session、同一个graph,即可多进程推理 session_conf = tf.ConfigProto( intra_op_parallelism_threads=5, inter_op_parallelism_threads=5) sess = tf.Session(graph=tf.Graph(), config=session_conf) # graph = tf.get_default_graph() # tf_model_path = os.path.abspath(os.path.dirname(__file__)) + '/best_pb/1' # sess = tf.Session(graph=tf.Graph()) # inputs = [None] * 6 # outputs = None # with sess.as_default(): # with sess.graph.as_default(): # meta_graph_def = tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], tf_model_path) # sess.run(tf.global_variables_initializer()) # signature_key = 'model' # signature_def = meta_graph_def.signature_def # inputs = [sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_1"].name), # sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_2"].name), # sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_3"].name), # sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_4"].name), # sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_5"].name), # sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input_6"].name),] # outputs = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["output"].name) def predict(table_text_list, model_id=1): start_time = time.time() if globals().get("model") is None: print("="*15, "init table_head model", "="*15) with sess.as_default(): with sess.graph.as_default(): model = get_model(input_shape, output_shape, model_id=model_id) # load weights model.load_weights(keras_model_path) globals()["model"] = model else: model = globals().get("model") table_text_list_copy = copy.deepcopy(table_text_list) # 表格单元格数*2 即为单次预测batch_size if model_id == 1: data_list = table_pre_process(table_text_list_copy, [], 0, is_train=False) else: data_list = table_pre_process_2(table_text_list_copy, [], 0, is_train=False, padding=False) # 数据预处理 batch_size = len(data_list) if model_id == 1: predict_x = my_data_loader_predict(data_list, [], batch_size) else: predict_x = my_data_loader_2(data_list, [], 1, is_train=False) # 预测 # start_time = time.time() with sess.as_default(): with sess.graph.as_default(): # predict_result = model.predict_generator(predict_x, steps=1) # 设置batch size为1最快,默认为32很慢 predict_result = model.predict([predict_x[0], predict_x[1], predict_x[2], predict_x[3], predict_x[4], predict_x[5]], batch_size=256) # print("table head predict time", time.time()-start_time, predict_x.shape) # 数据后处理 if model_id == 1: table_label_list = table_post_process(table_text_list_copy, predict_result) else: table_label_list = table_post_process_2(table_text_list_copy, predict_result) # 打印保存结构 # save_print_result(table_text_list, table_label_list) # print("table_head predict cost", str(time.time()-start_time)) return table_label_list # def predict_pb(table_text_list, model_id=1): # start_time = time.time() # table_text_list_copy = copy.deepcopy(table_text_list) # # # 表格单元格数*2 即为单次预测batch_size # if model_id == 1: # data_list = table_pre_process(table_text_list_copy, [], 0, is_train=False) # else: # data_list = table_pre_process_2(table_text_list_copy, [], 0, is_train=False, padding=False) # batch_size = len(data_list) # # print("batch_size", batch_size) # # print("data_list", data_list) # # # 数据预处理 # if model_id == 1: # predict_x = my_data_loader(data_list, [], batch_size, is_train=False) # else: # predict_x = my_data_loader_2(data_list, [], 1, is_train=False) # # predict_x_list = list(predict_x) # # print("len(predict_x_list)", len(predict_x_list)) # # keys = ["input_1", "input_2", "input_3", "input_4", "input_5", "input_6"] # # input_list = [] # # for key in keys: # # batch_input = tf.concat([tf.expand_dims(x.get(key), 0) for x in predict_x_list], 0) # # input_list.append(batch_input) # print(time.time()-start_time) # # # 预测 # predict_result = None # for x in predict_x: # with sess.as_default(): # predict_result = sess.run(outputs, feed_dict={inputs[0]: x.get("input_1"), # inputs[1]: x.get("input_2"), # inputs[2]: x.get("input_3"), # inputs[3]: x.get("input_4"), # inputs[4]: x.get("input_5"), # inputs[5]: x.get("input_6"), # }) # print("predict_result", predict_result) # print(time.time()-start_time) # # # predict_result = model.predict_generator(predict_x, steps=1) # # print("predict_result", predict_result.shape) # # # 数据后处理 # if model_id == 1: # table_label_list = table_post_process(table_text_list_copy, predict_result, is_list=True) # else: # table_label_list = table_post_process_2(table_text_list_copy, predict_result) # # # 打印保存结构 # # save_print_result(table_text_list, table_label_list) # return table_label_list def save_print_result(table_text_list, table_label_list): print("table_head predict") file_path = "C:\\Users\\Administrator\\Desktop\\table_head_test.txt" write_list = [] for k in range(len(table_label_list)): print(k, table_text_list[k]) print(k, table_label_list[k]) write_list.append(str(k) + " " + str(table_text_list[k])) write_list.append("\n") write_list.append(str(k) + " " + str(table_label_list[k])) write_list.append("\n") write_list.append("\n") with open(file_path, "a+") as f: f.writelines(write_list) # def predict_html(_path): # def get_trs(tbody): # #获取所有的tr # trs = [] # objs = tbody.find_all(recursive=False) # for obj in objs: # if obj.name=="tr": # trs.append(obj) # if obj.name=="tbody": # for tr in obj.find_all("tr",recursive=False): # trs.append(tr) # return trs # # def get_table(tbody): # trs = get_trs(tbody) # inner_table = [] # for tr in trs: # tr_line = [] # tds = tr.findChildren(['td', 'th'], recursive=False) # if len(tds) == 0: # tr_line.append(re.sub('\xa0', '', segment(tr,final=False))) # 2021/12/21 修复部分表格没有td 造成数据丢失 # for td in tds: # tr_line.append(re.sub('\xa0', '', segment(td,final=False))) # inner_table.append(tr_line) # return inner_table # # def fix_table(inner_table, fix_value=""): # maxWidth = 0 # for item in inner_table: # if len(item)>maxWidth: # maxWidth = len(item) # for i in range(len(inner_table)): # if len(inner_table[i])": readGroup(gr[subkey],_name,data) else: data.append([_name,gr[subkey].value]) print(_name,gr[subkey].shape) layer_names = _load_attributes_from_hdf5_group(f["model_weights"], 'layer_names') list_name_value = [] readGroup(f["model_weights"], "", list_name_value) ''' for k, name in enumerate(layer_names): g = f["model_weights"][name] weight_names = _load_attributes_from_hdf5_group(g, 'weight_names') #weight_values = [np.asarray(g[weight_name]) for weight_name in weight_names] for weight_name in weight_names: list_name_value.append([weight_name,np.asarray(g[weight_name])]) ''' for name_value in list_name_value: name = name_value[0] ''' if re.search("dense",name) is not None: name = name[:7]+"_1"+name[7:] ''' value = name_value[1] print(name,graph.get_tensor_by_name(name),np.shape(value)) sess.run(tf.assign(graph.get_tensor_by_name(name),value)) # 接口配置 # app = Flask(__name__) # @app.route('/table_head', methods=['POST']) # def test_gunicorn(): # _str = [['4、发售招标文件时间:', '2017-02-03至2017-02-10', '2017-02-03至2017-02-10', '2017-02-03至2017-02-10'], ['5、发售招标文件地点:', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)'], ['6、联系人:', '郑小姐', '郑小姐', '郑小姐'], ['7、联系电话:', '0591-63037983', '传真:', '0591-63037992'], ['公司网址:', 'http://www.fjlqzb.com', 'E-mail:', 'fjlqzb888@126.com'], ['8、投标人资格:', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。'], ['9、投标截标时间:', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)'], ['10、开标时间:', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)'], ['11、开标地点:', '福建立勤招标代理有限公司报告厅(福州市鼓楼区工业路523号福大怡山文化创意园北区3号楼101一层)', '', ''], ['12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。'], ['13、开户银行:', '中国工商银行福州市鼓楼支行', '中国工商银行福州市鼓楼支行', '中国工商银行福州市鼓楼支行'], ['开户名称:', '福建立勤招标代理有限公司', '', ''], ['银行帐号:', '1402023209600058290', '', ''], ['福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)'], ['2017-2-3', '2017-2-3', '2017-2-3', '2017-2-3']] # data_list = _str # print("子进程", os.getpid(), predict(data_list, model_id=model_id)) # return json.dumps({1: "Success"}) if __name__ == '__main__': _str = [['4、发售招标文件时间:', '2017-02-03至2017-02-10', '2017-02-03至2017-02-10', '2017-02-03至2017-02-10'], ['5、发售招标文件地点:', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)', '福州市鼓楼区工业路523号福州大学(北区机械厂)福大怡山文化创意园3号楼101二层(具体购买要求详见中国政府采购网)'], ['6、联系人:', '郑小姐', '郑小姐', '郑小姐'], ['7、联系电话:', '0591-63037983', '传真:', '0591-63037992'], ['公司网址:', 'http://www.fjlqzb.com', 'E-mail:', 'fjlqzb888@126.com'], ['8、投标人资格:', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。', '1、凡有能力提供本招标文件所述服务的,具有法人资格的境内服务商均可能成为合格的投标人;且具有本项目服务经营范围的。提供投标人法人营业执照副本复印件、税务登记证有效复印件(或三证合一的营业执照复印件);, ,2、根据闽检发〔2014〕7号规定,投标人须提供其住所地或本项目业务发生地检察机关出具的近三年行贿犯罪档案查询结果告知函(原件附在技术商务投标文件正本中,副本可附复印件,该函在开标当日应保持有效;若开具该函所在地检察机关有特殊要求或规定可不出具原件的,应随付加盖投标人公章的相关有效证明材料,如官方网站公告等);3、投标人需书面提供参加政府采购活动前未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的书面声明。信用记录以“信用中国”网站、中国政府采购网的查询结果为准;须提供信息记录打印件或网络截图,且均须注明下载网址;4、投标人须提供参加政府采购活动前3年内在经营活动中没有《政府采购法实施条例》第十九条所规定的重大违法记录的书面声明;5、投标人应具备《中华人民共和国政府采购法》第二十二条规定的条件,并提供以下证明材料:5.1)投标人的财务状况报告,依法缴纳税收和社会保障资金的相关材料;5.2)投标人具备履行合同所必需的设备和专业技术能力的证明材料;6、投标人须具备由上级行政主管部门颁发的安全评价乙级资质证书。7、投标人须具备国家注册安全评价师且在投标人单位注册的项目负责人1名,并提供相关证明材料。8、具备法律、行政法规规定的其他条件的证明材料。9、本项目不接受联合体投标。其他具体要求和释义(投标人应提供的资格证明文件)详见投标人须知说明中“3.合格的投标人”及第五章-投标文件格式。'], ['9、投标截标时间:', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)'], ['10、开标时间:', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)', '2017-02-28, ,09:30:00(北京时间)'], ['11、开标地点:', '福建立勤招标代理有限公司报告厅(福州市鼓楼区工业路523号福大怡山文化创意园北区3号楼101一层)', '', ''], ['12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。', '12、标书售价及要求:招标文件(纸质版或电子版)售价为50元人民币;如需邮购,请另加50元,,人民币;招标文件售后不退。'], ['13、开户银行:', '中国工商银行福州市鼓楼支行', '中国工商银行福州市鼓楼支行', '中国工商银行福州市鼓楼支行'], ['开户名称:', '福建立勤招标代理有限公司', '', ''], ['银行帐号:', '1402023209600058290', '', ''], ['福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)', '福建立勤招标代理有限公司(代理机构)'], ['2017-2-3', '2017-2-3', '2017-2-3', '2017-2-3']] data_list = _str print(predict(data_list, model_id=model_id)) # print((predict_pb(data_list, model_id=model_id))) # save_as_pb("best_pb", 1) # save_as_pb() # path = "D:\\Project\\format_conversion_maxcompute\\result.html" # path = "C:\\Users\\Administrator\\Desktop\\2.html" # predict_html(path)