From de0afe7a4cb4adcae262f0674abc7b3c86427aca Mon Sep 17 00:00:00 2001 From: sml2h3 Date: Thu, 25 Jul 2024 10:25:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E4=BD=93=E9=A1=B9=E7=9B=AE=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 28 ++-- LICENSE | 201 ------------------------- README.md | 368 ++++++++++++++++++++++++++++++++++++++------- app/__init__.py | 0 app/main.py | 77 ++++++++++ app/models.py | 40 +++++ app/services.py | 24 +++ compare_bg.jpg | Bin 8535 -> 0 bytes compare_target.jpg | Bin 8157 -> 0 bytes docker-compose.yml | 12 ++ match_bg.png | Bin 96474 -> 0 bytes match_target.png | Bin 4172 -> 0 bytes ocr_server.py | 126 ---------------- requirements.txt | 6 +- test.jpg | Bin 2733 -> 0 bytes test_api.py | 111 -------------- test_calc.png | Bin 13311 -> 0 bytes tests/test_main.py | 0 18 files changed, 482 insertions(+), 511 deletions(-) delete mode 100644 LICENSE create mode 100644 app/__init__.py create mode 100644 app/main.py create mode 100644 app/models.py create mode 100644 app/services.py delete mode 100644 compare_bg.jpg delete mode 100644 compare_target.jpg create mode 100644 docker-compose.yml delete mode 100644 match_bg.png delete mode 100644 match_target.png delete mode 100644 ocr_server.py delete mode 100644 test.jpg delete mode 100644 test_api.py delete mode 100644 test_calc.png create mode 100644 tests/test_main.py diff --git a/Dockerfile b/Dockerfile index 37a7f72..6a42a95 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,17 @@ -FROM python:3.8-slim-buster - -RUN mkdir /app - -COPY ./*.txt ./*.py ./*.sh ./*.onnx /app/ - - -RUN cd /app \ - && python3 -m pip install --upgrade pip -i https://pypi.douban.com/simple/\ - && pip3 install --no-cache-dir -r requirements.txt --extra-index-url https://pypi.douban.com/simple/ \ - && rm -rf /tmp/* && rm -rf /root/.cache/* \ - && sed -i 's#http://deb.debian.org#http://mirrors.aliyun.com/#g' /etc/apt/sources.list\ - && apt-get --allow-releaseinfo-change update && apt install libgl1-mesa-glx libglib2.0-0 -y +# 使用官方 Python 运行时作为父镜像 +FROM python:3.9-slim +# 设置工作目录 WORKDIR /app -CMD ["python3", "ocr_server.py", "--port", "9898", "--ocr", "--det"] +# 将当前目录内容复制到容器的 /app 中 +COPY . /app + +# 安装项目依赖 +RUN pip install --no-cache-dir -r requirements.txt + +# 暴露端口 8000 +EXPOSE 8000 + +# 运行应用 +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index 461d17f..b3b2960 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,339 @@ -# ocr_api_server -使用ddddocr的最简api搭建项目,支持docker +# 🚀 DdddOcr API -**建议python版本3.7-3.9 64位** +![DdddOcr Logo](https://cdn.wenanzhe.com/img/logo.png!/crop/700x500a400a500) -再有不好好看文档的我就不管了啊!!! +> 基于 FastAPI 和 DdddOcr 的高性能 OCR API 服务,提供图像文字识别、滑动验证码匹配和目标检测功能。 +> +> [自营各类GPT聚合平台](https://juxiangyun.com) -# 运行方式 +## 📋 目录 -## 最简单运行方式 +- [系统要求](#-系统要求) +- [安装和启动](#-安装和启动) +- [API 端点](#-api-端点) +- [API 调用示例](#-api-调用示例) +- [注意事项](#-注意事项) +- [故障排除](#-故障排除) +- [许可证](#-许可证) -```shell -# 安装依赖 -pip install -r requirements.txt -i https://pypi.douban.com/simple +## 💻 系统要求 -# 运行 可选参数如下 -# --port 9898 指定端口,默认为9898 -# --ocr 开启ocr模块 默认开启 -# --old 只有ocr模块开启的情况下生效 默认不开启 -# --det 开启目标检测模式 +| 组件 | 版本 | +|------|------| +| 操作系统 | Linux(推荐 Ubuntu 20.04 LTS 或更高版本)| +| Docker | 20.10 或更高 | +| Docker Compose | 1.29 或更高 | -# 最简单运行方式,只开启ocr模块并以新模型计算 -python ocr_server.py --port 9898 --ocr +## 🚀 安装和启动 -# 开启ocr模块并使用旧模型计算 -python ocr_server.py --port 9898 --ocr --old +1. **克隆仓库** + ```bash + git clone https://github.com/your-repo/ddddocr-api.git + cd ddddocr-api + ``` -# 只开启目标检测模块 -python ocr_server.py --port 9898 --det +2. **构建 Docker 镜像 [一键docker环境服务器购买,可一元试用](https://app.rainyun.com/apps/rcs/buy) ** + ```bash + docker build -t ddddocr-api . + ``` -# 同时开启ocr模块以及目标检测模块 -python ocr_server.py --port 9898 --ocr --det +3. **启动服务** + ```bash + docker run -d -p 8000:8000 --name ddddocr-api-container ddddocr-api + ``` -# 同时开启ocr模块并使用旧模型计算以及目标检测模块 -python ocr_server.py --port 9898 --ocr --old --det +4. **验证服务** + ```bash + curl http://localhost:8000/docs + ``` + > 如果成功,您将看到 Swagger UI 文档页面。 + +5. **停止服务** -``` +- 如果使用 Docker: + ```bash + docker stop ddddocr-api-container + ``` -## docker运行方式(目测只能在Linux下部署) +- 如果使用 Docker Compose: + ```bash + docker-compose down + ``` + +6. **查看日志** -```shell -git clone https://github.com/sml2h3/ocr_api_server.git -# docker怎么安装?百度吧 +- 如果使用 Docker: + ```bash + docker logs ddddocr-api-container + ``` -cd ocr_api_server +- 如果使用 Docker Compose: + ```bash + docker-compose logs + ``` -# 修改entrypoint.sh中的参数,具体参数往上翻,默认9898端口,同时开启ocr模块以及目标检测模块 +## 🔌 API 端点 -# 编译镜像 -docker build -t ocr_server:v1 . +### 1. OCR 识别 -# 运行镜像 -docker run -p 9898:9898 -d ocr_server:v1 +🔗 **端点**:`POST /ocr` -``` +| 参数 | 类型 | 描述 | +|------|------|------| +| `file` | File | 图片文件(可选) | +| `image` | String | Base64 编码的图片字符串(可选) | +| `probability` | Boolean | 是否返回概率(默认:false) | +| `charsets` | String | 字符集(可选) | +| `png_fix` | Boolean | 是否进行 PNG 修复(默认:false) | -# 接口 +### 2. 滑动验证码匹配 -**具体请看test_api.py文件** +🔗 **端点**:`POST /slide_match` + +| 参数 | 类型 | 描述 | +|------|------|------| +| `target_file` | File | 目标图片文件(可选) | +| `background_file` | File | 背景图片文件(可选) | +| `target` | String | Base64 编码的目标图片字符串(可选) | +| `background` | String | Base64 编码的背景图片字符串(可选) | +| `simple_target` | Boolean | 是否使用简单目标(默认:false) | + +### 3. 目标检测 + +🔗 **端点**:`POST /detection` + +| 参数 | 类型 | 描述 | +|------|------|------| +| `file` | File | 图片文件(可选) | +| `image` | String | Base64 编码的图片字符串(可选) | + +## 📘 API 调用示例 + +
+Python ```python -# 1、测试是否启动成功,可以通过直接GET访问http://{host}:{port}/ping来测试,如果返回pong则启动成功 +import requests +import base64 -# 2、OCR/目标检测请求接口格式: +url = "http://localhost:8000/ocr" +image_path = "path/to/your/image.jpg" -# http://{host}:{port}/{opt}/{img_type}/{ret_type} -# opt:操作类型 ocr=OCR det=目标检测 slide=滑块(match和compare两种算法,默认为compare) -# img_type: 数据类型 file=文件上传方式 b64=base64(imgbyte)方式 默认为file方式 -# ret_type: 返回类型 json=返回json(识别出错会在msg里返回错误信息) text=返回文本格式(识别出错时回直接返回空文本) +with open(image_path, "rb") as image_file: + encoded_string = base64.b64encode(image_file.read()).decode('utf-8') -# 例子: +data = { + "image": encoded_string, + "probability": False, + "png_fix": False +} -# OCR请求 -# resp = requests.post("http://{host}:{port}/ocr/file", files={'image': image_bytes}) -# resp = requests.post("http://{host}:{port}/ocr/b64/text", data=base64.b64encode(file).decode()) - -# 目标检测请求 -# resp = requests.post("http://{host}:{port}/det/file", files={'image': image_bytes}) -# resp = requests.post("http://{host}:{port}/det/b64/json", data=base64.b64encode(file).decode()) - -# 滑块识别请求 -# resp = requests.post("http://{host}:{port}/slide/match/file", files={'target_img': target_bytes, 'bg_img': bg_bytes}) -# jsonstr = json.dumps({'target_img': target_b64str, 'bg_img': bg_b64str}) -# resp = requests.post("http://{host}:{port}/slide/compare/b64", files=base64.b64encode(jsonstr.encode()).decode()) +response = requests.post(url, data=data) +print(response.json()) ``` +
+
+Node.js + +```javascript +const axios = require('axios'); +const fs = require('fs'); + +const url = 'http://localhost:8000/ocr'; +const imagePath = 'path/to/your/image.jpg'; + +const imageBuffer = fs.readFileSync(imagePath); +const base64Image = imageBuffer.toString('base64'); + +const data = { + image: base64Image, + probability: false, + png_fix: false +}; + +axios.post(url, data) + .then(response => { + console.log(response.data); + }) + .catch(error => { + console.error('Error:', error); + }); +``` +
+ +
+C# + +```csharp +using System; +using System.Net.Http; +using System.IO; +using System.Threading.Tasks; + +class Program +{ + static async Task Main(string[] args) + { + var url = "http://localhost:8000/ocr"; + var imagePath = "path/to/your/image.jpg"; + + var imageBytes = File.ReadAllBytes(imagePath); + var base64Image = Convert.ToBase64String(imageBytes); + + var client = new HttpClient(); + var content = new MultipartFormDataContent(); + content.Add(new StringContent(base64Image), "image"); + content.Add(new StringContent("false"), "probability"); + content.Add(new StringContent("false"), "png_fix"); + + var response = await client.PostAsync(url, content); + var result = await response.Content.ReadAsStringAsync(); + Console.WriteLine(result); + } +} +``` +
+ +
+PHP + +```php + $imageData, + 'probability' => 'false', + 'png_fix' => 'false' +); + +$options = array( + 'http' => array( + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data) + ) +); + +$context = stream_context_create($options); +$result = file_get_contents($url, false, $context); + +echo $result; +?> +``` +
+ +
+Go + +```go +package main + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" +) + +func main() { + apiURL := "http://localhost:8000/ocr" + imagePath := "path/to/your/image.jpg" + + imageData, err := ioutil.ReadFile(imagePath) + if err != nil { + panic(err) + } + + base64Image := base64.StdEncoding.EncodeToString(imageData) + + data := url.Values{} + data.Set("image", base64Image) + data.Set("probability", "false") + data.Set("png_fix", "false") + + resp, err := http.PostForm(apiURL, data) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + panic(err) + } + + fmt.Println(string(body)) +} +``` +
+ +
+易语言 + +```易语言 +.版本 2 + +.程序集 调用OCR接口 + +.子程序 主函数, 整数型 +.局部变量 请求头, QQ.HttpHeaders +.局部变量 请求内容, QQ.HttpMultiData +.局部变量 图片路径, 文本型 +.局部变量 图片数据, 字节集 +.局部变量 HTTP, QQ.Http + +图片路径 = "path/to/your/image.jpg" +图片数据 = 读入文件 (图片路径) + +请求头.添加 ("Content-Type", "application/x-www-form-urlencoded") + +请求内容.添加文本 ("image", 到Base64 (图片数据)) +请求内容.添加文本 ("probability", "false") +请求内容.添加文本 ("png_fix", "false") + +HTTP.发送POST请求 ("http://localhost:8000/ocr", 请求内容, 请求头) + +调试输出 (HTTP.获取返回文本()) + +返回 (0) +``` +
+ +> **注意**:使用示例前,请确保安装了必要的依赖库,并根据实际环境修改服务器地址和图片路径。 + +## ⚠️ 注意事项 + +- 确保防火墙允许访问 8000 端口。 +- 生产环境建议配置 HTTPS 和适当的身份验证机制。 +- 定期更新 Docker 镜像以获取最新的安全补丁和功能更新。 + +## 🔧 故障排除 + +遇到问题?请检查以下几点: + +1. 确保 Docker 服务正在运行。 +2. 检查容器日志: + ```bash + docker logs ddddocr-api-container + ``` +3. 确保没有其他服务占用 8000 端口。 + +> 如果问题仍然存在,请提交 issue 到本项目的 GitHub 仓库。 + +## 📄 许可证 + +本项目采用 MIT 许可证。详情请参见 [LICENSE](LICENSE) 文件。 + +--- + +

+ Made with ❤️ by sml2h3 +

diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..abf6249 --- /dev/null +++ b/app/main.py @@ -0,0 +1,77 @@ +from fastapi import FastAPI, File, UploadFile, HTTPException, Form +from fastapi.responses import JSONResponse +from typing import Optional, Union +import base64 +from .models import OCRRequest, SlideMatchRequest, DetectionRequest, APIResponse +from .services import ocr_service + +app = FastAPI() + + +def decode_image(image: Union[UploadFile, str, None]) -> bytes: + if isinstance(image, UploadFile): + return image.file.read() + elif isinstance(image, str): + try: + return base64.b64decode(image) + except: + raise HTTPException(status_code=400, detail="Invalid base64 string") + elif image is None: + raise HTTPException(status_code=400, detail="No image provided") + else: + raise HTTPException(status_code=400, detail="Invalid image input") + + +@app.post("/ocr", response_model=APIResponse) +async def ocr_endpoint( + file: Optional[UploadFile] = File(None), + image: Optional[str] = Form(None), + probability: bool = Form(False), + charsets: Optional[str] = Form(None), + png_fix: bool = Form(False) +): + try: + if file is None and image is None: + return APIResponse(code=400, message="Either file or image must be provided") + + image_bytes = decode_image(file or image) + result = ocr_service.ocr_classification(image_bytes, probability, charsets, png_fix) + return APIResponse(code=200, message="Success", data=result) + except Exception as e: + return APIResponse(code=500, message=str(e)) + + +@app.post("/slide_match", response_model=APIResponse) +async def slide_match_endpoint( + target_file: Optional[UploadFile] = File(None), + background_file: Optional[UploadFile] = File(None), + target: Optional[str] = Form(None), + background: Optional[str] = Form(None), + simple_target: bool = Form(False) +): + try: + if (target_file is None and target is None) or (background_file is None and background is None): + return APIResponse(code=400, message="Both target and background must be provided") + + target_bytes = decode_image(target_file or target) + background_bytes = decode_image(background_file or background) + result = ocr_service.slide_match(target_bytes, background_bytes, simple_target) + return APIResponse(code=200, message="Success", data=result) + except Exception as e: + return APIResponse(code=500, message=str(e)) + + +@app.post("/detection", response_model=APIResponse) +async def detection_endpoint( + file: Optional[UploadFile] = File(None), + image: Optional[str] = Form(None) +): + try: + if file is None and image is None: + return APIResponse(code=400, message="Either file or image must be provided") + + image_bytes = decode_image(file or image) + bboxes = ocr_service.detection(image_bytes) + return APIResponse(code=200, message="Success", data=bboxes) + except Exception as e: + return APIResponse(code=500, message=str(e)) diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..b8e8464 --- /dev/null +++ b/app/models.py @@ -0,0 +1,40 @@ +from pydantic import BaseModel +from typing import Optional, List, Union, Any + + +class ImageInput(BaseModel): + image: Optional[str] = None # For base64 string + + +class OCRRequest(ImageInput): + probability: bool = False + charsets: Optional[str] = None + png_fix: bool = False + + +class OCRResponse(BaseModel): + result: Union[str, dict] + + +class SlideMatchRequest(BaseModel): + target: Optional[str] = None # For base64 string + background: Optional[str] = None # For base64 string + simple_target: bool = False + + +class SlideMatchResponse(BaseModel): + result: List[int] + + +class DetectionRequest(ImageInput): + pass + + +class DetectionResponse(BaseModel): + bboxes: List[List[int]] + + +class APIResponse(BaseModel): + code: int + message: str + data: Optional[Any] = None diff --git a/app/services.py b/app/services.py new file mode 100644 index 0000000..2a9683a --- /dev/null +++ b/app/services.py @@ -0,0 +1,24 @@ +import ddddocr +from typing import Union, List, Optional + +class OCRService: + def __init__(self): + self.ocr = ddddocr.DdddOcr() + self.det = ddddocr.DdddOcr(det=True) + self.slide = ddddocr.DdddOcr(det=False, ocr=False) + + def ocr_classification(self, image: bytes, probability: bool = False, charsets: Optional[str] = None, png_fix: bool = False) -> Union[str, dict]: + if charsets: + self.ocr.set_ranges(charsets) + result = self.ocr.classification(image, probability=probability, png_fix=png_fix) + return result + + def slide_match(self, target: bytes, background: bytes, simple_target: bool = False) -> List[int]: + result = self.slide.slide_match(target, background, simple_target=simple_target) + return result + + def detection(self, image: bytes) -> List[List[int]]: + bboxes = self.det.detection(image) + return bboxes + +ocr_service = OCRService() diff --git a/compare_bg.jpg b/compare_bg.jpg deleted file mode 100644 index 1a99db50ba864fe5881ca3773b70767e84628752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8535 zcmbVxbyOTd6X$Fe4;~=6yCwMI5CV(K0*eQChu|Sd0we@m2*E9|I3W<+0>RyNf#3vp z33}xF?%ln2f8AZp>w42w)%E(<{hOYi>HC@cC4f*_K}i7sfdByXZ~^xyKn}pdz`(>n z$HK(K#Ky+L!6m`Nef$`gg7^sm2@NG3Ee$0#H9a#g8$Ba86E!uv2nY9bK0!f2IyO;B z2)_icfFS?BBp_^TY~07VW+W94w|66>X%j(L-hd3y)B29I~h66qGEiZ0sDIfqnoxOwSYcFpfUqAnM@590)K75RfPxzepB`G;2^=ob(GQXg(sJQY+Rdr2m zU46r^_Kwc3?w;PhvGIw?sp*;7x#gABwe^k7KU>>J$0w&}=NFfMum0fz0pS0_deHv` z_J80adcgGv4GoNj`41Q9k?kYGInYKVjq#!6JEq$f;<5F0&l{gZ3X}|98Mb|G$v^FJS*0*BpQg20ct3m_+; zJNt2%t@#mzP(#_vr@eK~^oD^B^)~SL+}qCc=*DTAz4|WUO}c2!Lz9B=YE~0zop5_0 zihOgju{LjX%y@jU@NE2-+O4EpsVyPPG{PqumDkL_?VG`J<6mymTFi)^W?Az%*>j=lRUSUZ zBl92QPOTWsTqHzi5}P41)U8`8uz5pcLowt4@r&J@Nh?_1yWd$k--g@nC|W4P689ED zg+ApLj_~SB-Zp*L5v;gun>*?ubQvt)piUW%8uDtObT2I7Y)CSiw|Ai0di&Eum^B zZ6h>vg||D{QrINWhkVZ*<_|aDZ&Zo|&3V_1MaVGDgO^S+b7LlqdEGw2VybIb${0>> zwKj?5NlOo|6Jx;uC=*lNk;s39Uw%h}r1PNw>qQZ=TICLL-r1NuVsWsTDt%1YsLYNG z4u{N2q#?k;ry>s~995BjB+-G-d55reFWjD*swt$k4N6o2rF%|XgLU8y(x7{w=O90* z<@Xg>lc{;)M(e9|r1P$qB*xMl>`6jJrDvTB6d()p~F&g%>6Uo?JC*Wj`5dCv+l3I%MiMUG{G~$y6R--eWy&L zzt*gaOSDW>_@2Yl73I*wp$OJ@xu}_5{=QMa6l-!!Pn)Lcwy{e`)kq#o?Fp8cD{Knb zg2L`ivl~bf`+=fEKRfjdJ$9t%LUtF*t?ELu(6|xitcWXVx!L zx@$-&>Q+VZC?`-rc|5PNUf-K%t&fPo^uTl2)M+X_qwq55*Ri4R+d26!XUvL9UH^r%d6+Eb2QhI30W`f#+OEHH05G+F1@8xj$?$_vo zqZH%h8Mz71*sN7eit!@@OCTyxLG+u0E1|Jn%~fs0!{~6&RE;V8Ai8c9c-OPEhHFcL z8^d)E>}k-UOsx{rw4w^GTP(tEfwFtx$#(hI8->WfN;8Nq7Vu@<+Vh+Gs}Nm54Kzo$ z?K!Vixu*!~BUOFnf^}Sc=(6UG97B^4eGer3c@QTsdqi3O@ePq}Ib&?K(KpuCi@Ekg z7if*6>5C)D=(F|k4D*e@7A!I}!iWkwpV|v)X@`?rk&aq_n+PAI9PTsHQSnUGjGQF< z)*CLB)}UhngCLaaEuam4d!Rj9?y{C-n7O_=Ud|dr<;&!Bcn@&Q=Sl+mn50PS6>^@_ zSpIg^24~vw3m&F=;+W*Qh(1Vw4CqDC;xPxhr^hOUc3ht>+9%-^p=Qe}3;l3kK6+$z5BOfC)-EBx z9K2{wm6hB*8mtiv_(DMirC^Jx!u?Y^bv3z=r)IOpzxP;tZaJ`POtkQ8&4fh?P5yKq zPU~l%s<|0S{O4|g#Ue2`;^>Dbm7y}Od)!w36E$%rYOfLVe_~y+hqm4>n!3^kpA6GQ zKN1~;P3`)g|GIM23#HinXt~&<#1-rdb2Q%YfKRHG+@T`!eREG6|?} zxk4unFe=Ihy+4>gscZGVZUXh*aJ7t7E$FF>C2sui+<5vP*kj#ApVt`il!-Cw)KLj=bKSm@e z@fj)S2slF7jb;l|*=RMBGIjtfK6+00toKkfBmaebU{y_dpnc3^E@7>9$^mp`Z35TUWWRBO>P z3yeqg>dy&-e!rRkb@T@WNW3+^n1*#PFlVF$F*>jqFM$%qNw?wyTQ=?iwOW41xV-Nj z<;?z3miCe=ct82hn94lF&QHqAs`m?CS3oKG`@J{dpI$qxSwkh#-Pj++J2p%X3`%`iz&HjSA0MrhU5{it^C#@!w(qQBb2!Plr(x(Bdoe%u36L4Qf5yMj3$ zU!U>z7n&4#^PYD@*& zD+9bc^<9o@AXcoCNi3>2%rrUEjsI;GXgCRx{6mF{Pn5ZSZL-m7!VKZ!tTyjbY+x1Z z1IA>NN*-Qw%uYRue|XCrwvn)QD7*>bU6>kB1gk$_gd+uIyMS6z*eZpr({m#J^elK(L43v!_U!vrI3?(@86ja$)Kof%a4F9qyX0z zvJotHOQ0<>*O}Nc2am;tJ5yG5=_y1CNf1)1yT6;63i`O8Q#bKmOV*YykwkIK=!dZ4 zN09M8eHeX=r1%ush<~tsA3**nSjv%O++?V?-+G*8e>h$DV9>G z>`~PqCcubGU0IT#c|%QroMcJz4>?w@cHF1bsqdLW6#-N*rlv+$UIV1r2L!%%I9vVB zF5hD1mOElcCMH@4zWyf83ZPpSCxX@-7#3F==x=}VN2Z6Wn2YtE z2hMzv%p=aD8*QNM0lW(=Q-S$dy@sX~p53z2+`jgt44oh3tF!UOd;2r1kTQh{o`hFP zT8&dTJEm1FJQgf%F9u4wRn6+9X7+#8|)mT(vcB1eh z)V+kU5~)v5XJ39wm3#%#e_SBkT!cLRWu@fyl0Fn;G?;*PQ`+!j{}&Nnq7B3hs&BZU zgSkq)$A%YT-X(L|DegiZMHH$)pryw%rdtuSK*k(HtciOp3uZzg4s^<`GAEH4ablMA zoS7OGe>{zS{VUbS#CFC$MXyM%DO&Pw;^e04)I~KgKzt}jyP9t&Czt$uux3N%2*5Pb zWsdUREDi8^op8*AD?Q`9akyv>df)!*Pd&qB5;*0yjMeE*MiApC8rLRu(mQ%5CG{B} zTak|vl`BIF=*NTe8TeEp-AEekK*_nzN;OH&fP5sUT9qbdf_6wgct<5wMiEae7bBgZ z`8hLYOx2+Sy?yHlqm2C|x!~@@$3uaRMLHg!q>k|rg7=8_UuY&CLp;9yudkRSOP;E7 zTfb6t4-Qtwxvd&gOmbr>us{-V;;U1^yg0r>18mWPe=*>5CwG^ocbrJtXBGEAmgDgC za?oY59!ovi_H-ji01LE6?l0tHBStN|vUIXxNkYCY!r}({B%T!!=L@-|x=FGB9q7S=B}4 zhWAYk?#p7V4n_Zb16k<(gXyBwdr=l(q{Q+a6ILC{)v47aqo}qxf3kBqHQD^BM3I?X zmzq)3q)y^=XD(kjixXJ)lf zs=VzDaqEvOhz}5+8TejVPkj^wCUB)IDwq_%VkCIGxQ`94hBdaB5}34EG4rc%xgb2A z*Keg3S?og07NB++WOx!dR?jvVYbltjRZI}^@eL5`r%!D}Na_TuwsVM9BHyxS6HsFc z?oKcip^A9k_l6)bzT&B4B!84G0BeDj2?TMIDSd^o9(c=WW-nX#PCFzU+ebTOP(I7w zO%V4prJE3;tD$$`AEM`i)r1ai4kil9l$A|t!x7&i8iM{f8p=$Wek8b2Q4^5eH(9}$~*Ky5CrCWJi3E9w@x8!BqXll42C!2-+@^BK_Pxgn=ftlGXtwk`4A|?xFfM(h7=}Zb zfUER7-H|zmeqXqe!Ad5^uj1Oi4x;p<%ky&Spi8LNPg?sconymZS9|*n4Watm@jBJa zz~Ea4HQV+pc$$xod)`9RV`t)Dp&VGh-Q4)%0{Mf$#$N1H3QC#LlE11t&-vpq+yr6> zg8IHF#xEx>dzpv6=@gxl8It@l=$9rPDR^C2Iu3j4qc3Cbg{!{K9Nmr?j467@nL6Cf z@-^l{cN|$uAQE5MI!h3PKb{_&GZbjI7H^0V5#WVZbIinmue0lds)tCA6@RMbKc%-N zKhQmud`t6+JabCxd4l6#ZRrChicPi_#Z}1?1r=Dw5bUMX=DrKfEoZLQtFgxB}dZ3>L>w-E)_JTT|%#(KyH+UKg zGQ{BpV9oFXjBG1Z(Q?I9Hr{`o3!O5w>9iqF9z2C$?RT2|Zj&i1!VlXH^x;YAQ=yW! z5|IwI44l>NtSj<7Oi^UkLgWNSMb%V?MODY=FYVUB6FJ3%D@g++9jbU5js$ZD&U zo>E`3wdT&w^gA;)kFMK*HJe7eblxnpj-|&CCFw(uLF`I1zbNhtxGg5RR(dLPl2&I+ zMC?FiJJ+wRijn0Aq!QlVLKQ+npr`CHnG69=pv;z0(s>!n-u(VMenoxThq+~@U!%U( z<4RXA{G~?bB;iS?dYE?X1xQTSXidSc4uFFjK zfxweqNq6JxttDH$?wsOygJZtov4VN)fSz3*p%U?4N;`d{1@V&aL*3-dmU4e>8UkF& z91WEf5?&#@Da&T9dL}06M3YiH)R?|~7{*3nbf zs}J|U@3nhih5aGjff5hK%sYkAW-o&4o2(moh+PBUL1EB;{2X!*qy;NPNOaFyF zXhAocDh#rs7!r4^tAL@n@4lr`dH51ecJx~vtp0T1*)UbOjOZyCbH|WO%xIfv-k2P2 z6rhp*_hTZW`;agoASSVsj?Bct|DBw76ps(7qgw~>#41hDoOIl2xmdH3T8nl|7^G{y z%O;yja{_7C&aJFY>bDY)W!U*XvaC4}>UvDD{wh23>EQ;_9QQobC~(H&_Z!Qxs;UEQ zJ8Z&;9;5!?uztuUI3a9nv2G!dJAlyF-@Rq`*xM+>(3BOWj@IMWNRrTPx@nT1b=V+U zI;PTPx6buN$FkFB3ZB3c-8_h_qBC>;*`&}O#vK0F9R)rqi6_{-RTxw7*qHMU*S>)% z?8KpXo~3@<|o12`!vvGMqAeut=Nmkm`M%eOLoBpPNSY1*~f## z1!<4-@jc{LF>Cu{UpY=5R4eT>WjN{ei`a!M%A+cRH-U?*X=yKa7Z>!2ihfUqxnb^i z6cEw#)tH4HYtz{hHqW%#`t8XW4TZz?8-IVfg1?CV$KPh>&Al&Hn_p|%i(uzN@hiNj zV{7s46C6df72raA7{=7pU)q+gb>L$vf@2cJ`dwnRM{vqs2j?HpX6(Jc5SPzhpqrp% zrRwehoC%C#RQza3jR^Hd0Y-DGRuzG8X*q*+Qs2icif*R~x;eVj{(FEH*rUT(b&Q?^q5JX6} z2^LOU1u_$2cL)~ZJ@5xADbs07FbXg)^3dZ>mnMz8AVPd(az2Df0p^F{Umtld?qs!wZCQLM9k64WbG%)`e8PadQ!pu zv>=LdDP7W2sFm4Xk*!=!XuH~E*`nu@PLH29=J7Jxi17(f=KM80x-_3F?QxoKszF(; zkq>{p%6D_vU)u&mOjqJ{iD#> zDt*s*>Gci423JPYk#Lr)K=C{_jT_e4+1-oW%*FjXo(py5a&h;NETqlw@&u>x5?@;@ z^>~!!gmX*yP)1>=J4Z&|(2|tN{7P-vezxxf7rMoB(6*WzoRWFapWIp#7hOAYx5`=6 z`Kw+W@og>jN^KaekCnApdhzbUD-!(A%DdlxuxWBWKRuk>L0Vf5xa_ZEGyB9PNk4~l zBUv2=$8tVq+0Bbj5>9leHAKdGk$~11ZnxUn3PY7{r*4Y89~Msu)NwYp98M#0JIP-P ziIHQ;5wn6ZA0>@A!_1)#|55Yvg6bIgnC(GlL&sB}cBnmukF2!RHAaq^KWRD?_Xrc- z?=D|N^ASCVJp5#*yzE--oEtZ;`LnyyXY@j2-cZ zFW7x5qi({;^uY-G>w4RDQ%LmOL38np&_KHGcOviXKMkl-rqeCvpx7?xjs>mOsQ7wOQS*zSRN!w-v$vwsfhqq*H!o&seYbzF<7>d`E8lrrERm5*}Z&xi7M=ogK7a zyAE4P{Xv@5?Lc@t zA5(WaXd$~; z_zT?t`Jz#jUW%W`zac)5;A$~a9DP^(T2w diff --git a/compare_target.jpg b/compare_target.jpg deleted file mode 100644 index b2d83dc5ee0cf21b01407f9819a6b844ab126030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8157 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ːlL$ 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 AasU7T diff --git a/ocr_server.py b/ocr_server.py deleted file mode 100644 index b3fe8f0..0000000 --- a/ocr_server.py +++ /dev/null @@ -1,126 +0,0 @@ -# encoding=utf-8 -import argparse -import base64 -import json - -import ddddocr -from flask import Flask, request - -parser = argparse.ArgumentParser(description="使用ddddocr搭建的最简api服务") -parser.add_argument("-p", "--port", type=int, default=9898) -parser.add_argument("--ocr", action="store_true", help="开启ocr识别") -parser.add_argument("--old", action="store_true", help="OCR是否启动旧模型") -parser.add_argument("--det", action="store_true", help="开启目标检测") - -args = parser.parse_args() - -app = Flask(__name__) - - -class Server(object): - def __init__(self, ocr=True, det=False, old=False): - self.ocr_option = ocr - self.det_option = det - self.old_option = old - self.ocr = None - self.det = None - if self.ocr_option: - print("ocr模块开启") - if self.old_option: - print("使用OCR旧模型启动") - self.ocr = ddddocr.DdddOcr(old=True) - else: - print("使用OCR新模型启动,如需要使用旧模型,请额外添加参数 --old开启") - self.ocr = ddddocr.DdddOcr() - else: - print("ocr模块未开启,如需要使用,请使用参数 --ocr开启") - if self.det_option: - print("目标检测模块开启") - self.det = ddddocr.DdddOcr(det=True) - else: - print("目标检测模块未开启,如需要使用,请使用参数 --det开启") - - def classification(self, img: bytes): - if self.ocr_option: - return self.ocr.classification(img) - else: - raise Exception("ocr模块未开启") - - def detection(self, img: bytes): - if self.det_option: - return self.det.detection(img) - else: - raise Exception("目标检测模块模块未开启") - - def slide(self, target_img: bytes, bg_img: bytes, algo_type: str): - dddd = self.ocr or self.det or ddddocr.DdddOcr(ocr=False) - if algo_type == 'match': - return dddd.slide_match(target_img, bg_img) - elif algo_type == 'compare': - return dddd.slide_comparison(target_img, bg_img) - else: - raise Exception(f"不支持的滑块算法类型: {algo_type}") - -server = Server(ocr=args.ocr, det=args.det, old=args.old) - - -def get_img(request, img_type='file', img_name='image'): - if img_type == 'b64': - img = base64.b64decode(request.get_data()) # - try: # json str of multiple images - dic = json.loads(img) - img = base64.b64decode(dic.get(img_name).encode()) - except Exception as e: # just base64 of single image - pass - else: - img = request.files.get(img_name).read() - return img - - -def set_ret(result, ret_type='text'): - if ret_type == 'json': - if isinstance(result, Exception): - return json.dumps({"status": 200, "result": "", "msg": str(result)}) - else: - return json.dumps({"status": 200, "result": result, "msg": ""}) - # return json.dumps({"succ": isinstance(result, str), "result": str(result)}) - else: - if isinstance(result, Exception): - return '' - else: - return str(result).strip() - - -@app.route('//', methods=['POST']) -@app.route('///', methods=['POST']) -def ocr(opt, img_type='file', ret_type='text'): - try: - img = get_img(request, img_type) - if opt == 'ocr': - result = server.classification(img) - elif opt == 'det': - result = server.detection(img) - else: - raise f" is invalid" - return set_ret(result, ret_type) - except Exception as e: - return set_ret(e, ret_type) - -@app.route('/slide//', methods=['POST']) -@app.route('/slide///', methods=['POST']) -def slide(algo_type='compare', img_type='file', ret_type='text'): - try: - target_img = get_img(request, img_type, 'target_img') - bg_img = get_img(request, img_type, 'bg_img') - result = server.slide(target_img, bg_img, algo_type) - return set_ret(result, ret_type) - except Exception as e: - return set_ret(e, ret_type) - -@app.route('/ping', methods=['GET']) -def ping(): - return "pong" - - -if __name__ == '__main__': - app.run(host="0.0.0.0", port=args.port) diff --git a/requirements.txt b/requirements.txt index a8661fa..d9a7172 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ -ddddocr>=1.3.1 -flask \ No newline at end of file +fastapi==0.68.0 +uvicorn==0.15.0 +ddddocr==1.5.5 +python-multipart==0.0.5 \ No newline at end of file diff --git a/test.jpg b/test.jpg deleted file mode 100644 index d5894d2564b78304593c6cbdd1d58c44752d8c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2733 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 diff --git a/test_api.py b/test_api.py deleted file mode 100644 index ba77d7d..0000000 --- a/test_api.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/python3.6 -# -*- coding: utf-8 -*- -# -# Copyright (C) 2021 # -# @Time : 2022/1/6 23:28 -# @Author : sml2h3 -# @Email : sml2h3@gmail.com -# @File : test_api.py -# @Software: PyCharm -import base64 -import json -import requests - -print(' ') -# ******************OCR识别部分开始****************** -host = "http://127.0.0.1:9898" -# 目标检测就把ocr改成det,其他相同 -# 方式一 -file = open(r'test.jpg', 'rb').read() -# file = open(r'test_calc.png', 'rb').read() - - -api_url = f"{host}/ocr/file" -resp = requests.post(api_url, files={'image': file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/ocr/file/json" -resp = requests.post(api_url, files={'image': file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/ocr/b64" -resp = requests.post(api_url, data=base64.b64encode(file).decode()) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/ocr/b64/json" -resp = requests.post(api_url, data=base64.b64encode(file).decode()) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/det/file" -resp = requests.post(api_url, files={'image': file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/det/file/json" -resp = requests.post(api_url, files={'image': file}) -print(f"{api_url=}, {resp.text=}") - -# 滑块识别 - -target_file = open(r'match_target.png', 'rb').read() -bg_file = open(r'match_bg.png', 'rb').read() - -api_url = f"{host}/slide/match/file" -resp = requests.post(api_url, files={'target_img': target_file, 'bg_img': bg_file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/match/file/json" -resp = requests.post(api_url, files={'target_img': target_file, 'bg_img': bg_file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/match/b64" -target_b64str = base64.b64encode(target_file).decode() -bg_b64str = base64.b64encode(bg_file).decode() -jsonstr = json.dumps({'target_img': target_b64str, 'bg_img': bg_b64str}) -resp = requests.post(api_url, data=base64.b64encode(jsonstr.encode()).decode()) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/match/b64/json" -resp = requests.post(api_url, data=base64.b64encode(jsonstr.encode()).decode()) -print(f"{api_url=}, {resp.text=}") - -target_file = open(r'compare_target.jpg', 'rb').read() -bg_file = open(r'compare_bg.jpg', 'rb').read() - -api_url = f"{host}/slide/compare/file" -resp = requests.post(api_url, files={'target_img': target_file, 'bg_img': bg_file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/compare/file/json" -resp = requests.post(api_url, files={'target_img': target_file, 'bg_img': bg_file}) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/compare/b64" -target_b64str = base64.b64encode(target_file).decode() -bg_b64str = base64.b64encode(bg_file).decode() -jsonstr = json.dumps({'target_img': target_b64str, 'bg_img': bg_b64str}) -resp = requests.post(api_url, data=base64.b64encode(jsonstr.encode()).decode()) -print(f"{api_url=}, {resp.text=}") - -api_url = f"{host}/slide/compare/b64/json" -resp = requests.post(api_url, data=base64.b64encode(jsonstr.encode()).decode()) -print(f"{api_url=}, {resp.text=}") - -# 方式二 - -# 获取验证码图片 -# headers = { -# "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", -# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4195.1 Safari/537.36" -# } -# resp = requests.get('https://data.gdcic.net/Dop/CheckCode.aspx?codemark=408.15173910730016', headers=headers, verify=False) -# captcha_img = resp.content -# -# 识别 -# resp = requests.post(api_url, files={'image': captcha_img}) -# print('验证码结果', resp.text) -# -# # 保存验证码图片以供验证 -# with open('captcha.jpg', 'wb') as f: -# f.write(captcha_img) - -# ******************OCR识别部分开始****************** diff --git a/test_calc.png b/test_calc.png deleted file mode 100644 index 08b7e1c90c70488a30ac83014d27c3220afe4fff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13311 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 VAA5bF{IQ41==Qx^SOb^X{|CDm5}^P9 diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 0000000..e69de29