diff --git a/check_in.png b/check_in.png deleted file mode 100644 index 0543a38..0000000 Binary files a/check_in.png and /dev/null differ diff --git a/demo_onnx.py b/demo_onnx.py index 505f53e..1de811a 100644 --- a/demo_onnx.py +++ b/demo_onnx.py @@ -5,14 +5,15 @@ from rapid_table_det.inference import TableDetector from rapid_table_det.utils import visuallize, extract_table_img, img_loader -img_path = f"images/WechatIMG148.jpeg" +img_path = f"images/web1.png" file_name_with_ext = os.path.basename(img_path) file_name, file_ext = os.path.splitext(file_name_with_ext) out_dir = "rapid_table_det/outputs" if not os.path.exists(out_dir): os.makedirs(out_dir) table_det = TableDetector( - obj_model_path="rapid_table_det/models/obj_det.onnx", + obj_model_path="rapid_table_det/models/modified_obj_det.onnx", + # obj_model_path="rapid_table_det/models/obj_det.onnx", edge_model_path="rapid_table_det/models/edge_det.onnx", cls_model_path="rapid_table_det/models/cls_det.onnx", use_obj_det=True, @@ -26,12 +27,13 @@ ) # 一张图片中可能有多个表格 img = img_loader(img_path) +extract_img = img.copy() for i, res in enumerate(result): box = res["box"] lt, rt, rb, lb = res["lt"], res["rt"], res["rb"], res["lb"] # 带识别框和左上角方向位置 img = visuallize(img, box, lt, rt, rb, lb) # 透视变换提取表格图片 - extract_img = extract_table_img(img.copy(), lt, rt, rb, lb) + extract_img = extract_table_img(extract_img.copy(), lt, rt, rb, lb) cv2.imwrite(f"{out_dir}/{file_name}-extract-{i}.jpg", extract_img) cv2.imwrite(f"{out_dir}/{file_name}-visualize.jpg", img) diff --git a/demo_paddle.py b/demo_paddle.py index 3292843..32e3a77 100644 --- a/demo_paddle.py +++ b/demo_paddle.py @@ -5,16 +5,16 @@ from rapid_table_det_paddle.inference import TableDetector from rapid_table_det_paddle.utils import visuallize, extract_table_img, img_loader -img_path = f"images/car-invoice-img02282.jpg" +img_path = f"images/wtw_poc-00013.jpg" file_name_with_ext = os.path.basename(img_path) file_name, file_ext = os.path.splitext(file_name_with_ext) out_dir = "rapid_table_det_paddle/outputs" if not os.path.exists(out_dir): os.makedirs(out_dir) table_det = TableDetector( - obj_model_path="models/obj_det/model", - edge_model_path="models/db_net/model", - cls_model_path="models/pplcnet/model", + obj_model_path="rapid_table_det_paddle/models/obj_det/model", + edge_model_path="rapid_table_det_paddle/models/db_net/model", + cls_model_path="rapid_table_det_paddle/models/pplcnet/model", use_obj_det=True, use_edge_det=True, use_rotate_det=True, @@ -26,12 +26,13 @@ ) # 一张图片中可能有多个表格 img = img_loader(img_path) +extract_img = img.copy() for i, res in enumerate(result): box = res["box"] lt, rt, rb, lb = res["lt"], res["rt"], res["rb"], res["lb"] # 带识别框和左上角方向位置 img = visuallize(img, box, lt, rt, rb, lb) # 透视变换提取表格图片 - extract_img = extract_table_img(img.copy(), lt, rt, rb, lb) + extract_img = extract_table_img(extract_img.copy(), lt, rt, rb, lb) cv2.imwrite(f"{out_dir}/{file_name}-extract-{i}.jpg", extract_img) cv2.imwrite(f"{out_dir}/{file_name}-visualize.jpg", img) diff --git a/doc_res.png b/doc_res.png deleted file mode 100644 index 58a95b7..0000000 Binary files a/doc_res.png and /dev/null differ diff --git a/fapiao.png b/fapiao.png deleted file mode 100644 index c258f4f..0000000 Binary files a/fapiao.png and /dev/null differ diff --git a/item.png b/item.png deleted file mode 100644 index 65f2200..0000000 Binary files a/item.png and /dev/null differ diff --git a/rapid_table_det/utils.py b/rapid_table_det/utils.py index 2bbdb5e..abeb088 100644 --- a/rapid_table_det/utils.py +++ b/rapid_table_det/utils.py @@ -419,8 +419,6 @@ def get_max_adjacent_bbox(mask): def visuallize(img, box, lt, rt, rb, lb): - # img = cv2.imread(img_path) - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) xmin, ymin, xmax, ymax = box draw_box = np.array([lt, rt, rb, lb]).reshape([-1, 2]) cv2.circle(img, (int(lt[0]), int(lt[1])), 50, (255, 0, 0), 10) @@ -449,7 +447,6 @@ def extract_table_img(img, lt, rt, rb, lb): 返回: numpy.ndarray: 提取出的角点区域图片 """ - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 源点坐标 src_points = np.float32([lt, rt, lb, rb]) diff --git a/rapid_table_det_paddle/predictor.py b/rapid_table_det_paddle/predictor.py index e25c2c0..e4432ff 100644 --- a/rapid_table_det_paddle/predictor.py +++ b/rapid_table_det_paddle/predictor.py @@ -39,7 +39,7 @@ def __call__(self, img, **kwargs): return result, time.time() - start def img_preprocess(self, img, resize_shape=[928, 928]): - # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im_info = { 'scale_factor': np.array( [1., 1.], dtype=np.float32), @@ -147,7 +147,7 @@ def sort_and_clip_coordinates(self, box): return lt, lb, rt, rb def img_preprocess(self, img, resize_shape=[800, 800]): - # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im, new_w, new_h, left, top = ResizePad(img, resize_shape[0]) im = im / 255.0 im = im.transpose((2, 0, 1)).copy() @@ -165,7 +165,7 @@ def __init__(self, model_path=pplcnet_model_path, **kwargs): def __call__(self, img, **kwargs): start = time.time() img = self.img_loader(img) - # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = self.img_preprocess(img, self.resize_shape) with paddle.no_grad(): # print(cls_img.shape) diff --git a/rapid_table_det_paddle/utils.py b/rapid_table_det_paddle/utils.py index ec826a8..2aff817 100644 --- a/rapid_table_det_paddle/utils.py +++ b/rapid_table_det_paddle/utils.py @@ -347,8 +347,6 @@ def get_max_adjacent_bbox(mask): def visuallize(img, box, lt, rt, rb, lb): - # img = cv2.imread(img_path) - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) xmin, ymin, xmax, ymax = box draw_box = np.array([lt, rt, rb, lb]).reshape([-1, 2]) cv2.circle(img, (int(lt[0]), int(lt[1])), 50, (255, 0, 0), 10) @@ -377,7 +375,6 @@ def extract_table_img(img, lt, rt, rb, lb): 返回: numpy.ndarray: 提取出的角点区域图片 """ - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 源点坐标 src_points = np.float32([lt, rt, lb, rb]) @@ -404,5 +401,4 @@ def extract_table_img(img, lt, rt, rb, lb): # 应用透视变换 warped = cv2.warpPerspective(img, M, (max_width, max_height)) - return warped diff --git a/sell_package.png b/sell_package.png deleted file mode 100644 index dd94c4c..0000000 Binary files a/sell_package.png and /dev/null differ diff --git a/tools/onnx_transform.ipynb b/tools/onnx_transform.ipynb index 1eb899f..add57e2 100644 --- a/tools/onnx_transform.ipynb +++ b/tools/onnx_transform.ipynb @@ -33,54 +33,103 @@ } ], "source": [ - "!pip install paddle2onnx onnxruntime onnxslim onnxruntime-tools onnx -i https://pypi.tuna.tsinghua.edu.cn/simple" + "!pip install paddle2onnx onnxruntime onnxslim onnxruntime-tools onnx pickleshare -i https://pypi.tuna.tsinghua.edu.cn/simple" ] }, { "cell_type": "code", + "execution_count": 8, "metadata": { + "ExecuteTime": { + "end_time": "2024-10-15T13:59:53.119660Z", + "start_time": "2024-10-15T13:59:48.936691Z" + }, "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" - }, - "ExecuteTime": { - "end_time": "2024-10-15T13:59:53.119660Z", - "start_time": "2024-10-15T13:59:48.936691Z" } }, - "source": [ - "# !paddle2onnx --model_dir rapid_table_det_paddle/models/obj_det --model_filename model.pdmodel --params_filename model.pdiparams --save_file rapid_table_det/models/obj_det.onnx --opset_version 16 --enable_onnx_checker True\n", - "!paddle2onnx --model_dir rapid_table_det_paddle/models/db_net --model_filename model.pdmodel --params_filename model.pdiparams --save_file rapid_table_det/models/edge_det.onnx --opset_version 16 --enable_onnx_checker True\n", - "!paddle2onnx --model_dir rapid_table_det_paddle/models/pplcnet --model_filename model.pdmodel --params_filename model.pdiparams --save_file rapid_table_det/models/cls_det.onnx --opset_version 16 --enable_onnx_checker True\n", - "\n", - "# !onnxslim rapid_table_det/models/obj_det.onnx rapid_table_det/models/obj_det.onnx\n", - "!onnxslim rapid_table_det/models/edge_det.onnx rapid_table_det/models/edge_det.onnx\n", - "!onnxslim rapid_table_det/models/cls_det.onnx rapid_table_det/models/cls_det.onnx" - ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Paddle2ONNX] Start to parse PaddlePaddle model...\n", - "[Paddle2ONNX] Model file path: rapid_table_det_paddle/models/db_net\\model.pdmodel\n", - "[Paddle2ONNX] Paramters file path: rapid_table_det_paddle/models/db_net\\model.pdiparams\n", + "[Paddle2ONNX] Model file path: ../rapid_table_det_paddle/models/obj_det/model.pdmodel\n", + "[Paddle2ONNX] Paramters file path: ../rapid_table_det_paddle/models/obj_det/model.pdiparams\n", + "[Paddle2ONNX] Start to parsing Paddle model...\n", + "[Paddle2ONNX] Use opset_version = 16 for ONNX export.\n", + "[WARN][Paddle2ONNX] [multiclass_nms3: multiclass_nms3_0.tmp_1] [WARNING] Due to the operator multiclass_nms3, the exported ONNX model will only supports inference with input batch_size == 1.\n", + "[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.\n", + "2024-10-16 09:05:13 [INFO]\t===============Make PaddlePaddle Better!================\n", + "2024-10-16 09:05:13 [INFO]\tA little survey: https://iwenjuan.baidu.com/?code=r8hu2s\n", + "[Paddle2ONNX] Start to parse PaddlePaddle model...\n", + "[Paddle2ONNX] Model file path: ../rapid_table_det_paddle/models/db_net/model.pdmodel\n", + "[Paddle2ONNX] Paramters file path: ../rapid_table_det_paddle/models/db_net/model.pdiparams\n", "[Paddle2ONNX] Start to parsing Paddle model...\n", "[Paddle2ONNX] Use opset_version = 16 for ONNX export.\n", "[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.\n", - "2024-10-15 21:59:49 [INFO]\t===============Make PaddlePaddle Better!================\n", - "2024-10-15 21:59:49 [INFO]\tA little survey: https://iwenjuan.baidu.com/?code=r8hu2s\n", + "2024-10-16 09:05:13 [INFO]\t===============Make PaddlePaddle Better!================\n", + "2024-10-16 09:05:13 [INFO]\tA little survey: https://iwenjuan.baidu.com/?code=r8hu2s\n", "[Paddle2ONNX] Start to parse PaddlePaddle model...\n", - "[Paddle2ONNX] Model file path: rapid_table_det_paddle/models/pplcnet\\model.pdmodel\n", - "[Paddle2ONNX] Paramters file path: rapid_table_det_paddle/models/pplcnet\\model.pdiparams\n", + "[Paddle2ONNX] Model file path: ../rapid_table_det_paddle/models/pplcnet/model.pdmodel\n", + "[Paddle2ONNX] Paramters file path: ../rapid_table_det_paddle/models/pplcnet/model.pdiparams\n", "[Paddle2ONNX] Start to parsing Paddle model...\n", "[Paddle2ONNX] Use opset_version = 16 for ONNX export.\n", "[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.\n", - "2024-10-15 21:59:49 [INFO]\t===============Make PaddlePaddle Better!================\n", - "2024-10-15 21:59:49 [INFO]\tA little survey: https://iwenjuan.baidu.com/?code=r8hu2s\n", + "2024-10-16 09:05:14 [INFO]\t===============Make PaddlePaddle Better!================\n", + "2024-10-16 09:05:14 [INFO]\tA little survey: https://iwenjuan.baidu.com/?code=r8hu2s\n", + "Onnx Runtime version 1.19 has no specified compatible ONNX version.\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| Model Name | obj_det.onnx | Op Set: 16 |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| Model Info | Original Model | Slimmed Model |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| IN: image | float32: ('p2o.DynamicDimension.0', 3, | float32: (1, 3, 928, 928) |\n", + "| | 928, 928) | |\n", + "| IN: scale_factor | float32: ('p2o.DynamicDimension.1', 2) | float32: (1, 2) |\n", + "| IN: image | float32: ('p2o.DynamicDimension.0', 3, | float32: (1, 3, 928, 928) |\n", + "| | 928, 928) | |\n", + "| IN: scale_factor | float32: ('p2o.DynamicDimension.1', 2) | float32: (1, 2) |\n", + "| OUT: multiclass_nms3_0.tmp_0 | float32: ('p2o.DynamicDimension.2', 6) | float32: ('TopK_535_o0__d0', 6) |\n", + "| OUT: multiclass_nms3_0.tmp_2 | int32: ('p2o.DynamicDimension.3',) | int32: (1,) |\n", + "| OUT: multiclass_nms3_0.tmp_0 | float32: ('p2o.DynamicDimension.2', 6) | float32: ('TopK_535_o0__d0', 6) |\n", + "| OUT: multiclass_nms3_0.tmp_2 | int32: ('p2o.DynamicDimension.3',) | int32: (1,) |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| Add | 30 | 30 |\n", + "| BatchNormalization | 89 | \u001B[32m0\u001B[37m\u001B[0m |\n", + "| Cast | 2 | 2 |\n", + "| Concat | 20 | 20 |\n", + "| Constant | 735 | \u001B[32m0\u001B[37m\u001B[0m |\n", + "| Conv | 152 | 152 |\n", + "| Div | 1 | 1 |\n", + "| Gather | 7 | 7 |\n", + "| GlobalAveragePool | 3 | 3 |\n", + "| HardSigmoid | 4 | 4 |\n", + "| MaxPool | 3 | 3 |\n", + "| Mul | 279 | \u001B[32m146\u001B[37m\u001B[0m |\n", + "| NonMaxSuppression | 1 | 1 |\n", + "| ReduceMean | 4 | 4 |\n", + "| ReduceMin | 1 | 1 |\n", + "| Reshape | 12 | \u001B[32m11\u001B[37m\u001B[0m |\n", + "| Resize | 2 | 2 |\n", + "| Shape | 2 | 2 |\n", + "| Sigmoid | 142 | 142 |\n", + "| Slice | 2 | 2 |\n", + "| Softmax | 3 | 3 |\n", + "| Split | 2 | 2 |\n", + "| Squeeze | 6 | 6 |\n", + "| TopK | 1 | 1 |\n", + "| Transpose | 3 | 3 |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| Model Size | 371.46 MB | 371.08 MB |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "| Elapsed Time | 3.84 s |\n", + "+------------------------------+----------------------------------------+---------------------------------+\n", + "Onnx Runtime version 1.19 has no specified compatible ONNX version.\n", "+-------------------------+----------------------------------------+----------------------------------------+\n", "| Model Name | edge_det.onnx | Op Set: 16 |\n", "+-------------------------+----------------------------------------+----------------------------------------+\n", @@ -113,21 +162,9 @@ "+-------------------------+----------------------------------------+----------------------------------------+\n", "| Model Size | 97.26 MB | 96.94 MB |\n", "+-------------------------+----------------------------------------+----------------------------------------+\n", - "| Elapsed Time | 1.63 s |\n", - "+-------------------------+----------------------------------------+----------------------------------------+\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Onnx Runtime version 1.19 has no specified compatible ONNX version.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "| Elapsed Time | 0.80 s |\n", + "+-------------------------+----------------------------------------+----------------------------------------+\n", + "Onnx Runtime version 1.19 has no specified compatible ONNX version.\n", "+---------------------+----------------------------------------+----------------------------------------+\n", "| Model Name | cls_det.onnx | Op Set: 16 |\n", "+---------------------+----------------------------------------+----------------------------------------+\n", @@ -157,23 +194,24 @@ "+---------------------+----------------------------------------+----------------------------------------+\n", "| Model Size | 6.46 MB | 6.39 MB |\n", "+---------------------+----------------------------------------+----------------------------------------+\n", - "| Elapsed Time | 0.22 s |\n", + "| Elapsed Time | 0.12 s |\n", "+---------------------+----------------------------------------+----------------------------------------+\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Onnx Runtime version 1.19 has no specified compatible ONNX version.\n" - ] } ], - "execution_count": 2 + "source": [ + "!paddle2onnx --model_dir ../rapid_table_det_paddle/models/obj_det --model_filename model.pdmodel --params_filename model.pdiparams --save_file ../rapid_table_det/models/obj_det.onnx --opset_version 16 --enable_onnx_checker True\n", + "!paddle2onnx --model_dir ../rapid_table_det_paddle/models/db_net --model_filename model.pdmodel --params_filename model.pdiparams --save_file ../rapid_table_det/models/edge_det.onnx --opset_version 16 --enable_onnx_checker True\n", + "!paddle2onnx --model_dir ../rapid_table_det_paddle/models/pplcnet --model_filename model.pdmodel --params_filename model.pdiparams --save_file ../rapid_table_det/models/cls_det.onnx --opset_version 16 --enable_onnx_checker True\n", + "\n", + "!onnxslim ../rapid_table_det/models/obj_det.onnx ../rapid_table_det/models/obj_det.onnx\n", + "!onnxslim ../rapid_table_det/models/edge_det.onnx ../rapid_table_det/models/edge_det.onnx\n", + "!onnxslim ../rapid_table_det/models/cls_det.onnx ../rapid_table_det/models/cls_det.onnx" + ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2024-10-15T12:12:35.265576Z", @@ -215,36 +253,55 @@ }, { "cell_type": "code", + "execution_count": 6, "metadata": { + "ExecuteTime": { + "end_time": "2024-10-15T14:02:23.904231Z", + "start_time": "2024-10-15T14:02:20.842278Z" + }, "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" - }, - "ExecuteTime": { - "end_time": "2024-10-15T14:02:23.904231Z", - "start_time": "2024-10-15T14:02:20.842278Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantized model is valid.\n" + ] + } + ], "source": [ - "root_dir_str = \".\"\n", + "root_dir_str = \"..\"\n", "model_dir = f\"rapid_table_det/models\"\n", "# quantize_model(root_dir_str, model_dir, \"obj_det\")\n", - "quantize_model(root_dir_str, model_dir, \"edge_det\")\n", + "# quantize_model(root_dir_str, model_dir, \"edge_det\")\n", "# quantize_model(root_dir_str, model_dir, \"cls_det\")" - ], + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Quantized model is valid.\n" + "Invalid model: Nodes in a graph must be topologically sorted, however input 'p2o.Gather.9_squeezed' of node: \n", + "name: p2o.Cast.0 OpType: Cast\n", + " is not output of any previous nodes.\n" ] } ], - "execution_count": 3 + "source": [ + "!python fix_onnx2.py" + ] }, { "cell_type": "code", @@ -270,9 +327,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.15" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file