Alex

有的故事值得一直说下去.
Home » Latest Posts

一、软件和包安装

  1. PaddleOCR 介绍 & 下载

      PaddleOCR是一个基于百度飞桨开发的OCR系统。包括文字检测、文字识别、文本方向分类等模块。以下是其优点:
    

🕐 高精度:PaddleOCR采用深度学习算法进行训练,可以在不同场景下实现高精度的文字检测和文字识别。

🕑 多语种支持:PaddleOCR支持多种语言的文字识别,包括中文、英文、日语、韩语等。同时,它还支持多种不同文字类型的识别,如手写字、印刷体、表格等。

🕒 高效性:PaddleOCR的训练和推理过程都采用了高效的并行计算方法,可大幅提高处理速度。同时,其轻量化设计也使得PaddleOCR能够在移动设备上进行部署,适用于各种场景的应用。

🍀 易用性:PaddleOCR提供了丰富的API接口和文档说明,用户可以快速进行模型集成和部署,实现自定义的OCR功能。同时,其开源代码也为用户提供了更好的灵活性和可扩展性。

🈚 鲁棒性:PaddleOCR采用了多种数据增强技术和模型融合策略,能够有效地应对图像噪声、光照变化等干扰因素,并提高模型的鲁棒性和稳定性。

地址:PaddleOCR/doc/doc_ch/models_list.md at release/2.0 · PaddlePaddle/PaddleOCR · GitHub

  1. 下载包 :https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md

在PaddleOCR-realase-2.6根目录下新建文件夹,并下载推理模型

  1. 执行命令

进入到PaddleOCR-releas-2.6目录下

python tools/infer/predict_system.py --image_dir="C:\Users\User\Desktop\test.jpg" --det_model_dir="./inference_model/ch_PP-OCRv3_det_infer/" --rec_model_dir="./inference_model/ch_PP-OCRv3_rec_infer"

根据报错,安装各种库函数

  1. 结果

说明 PaddleOCR的环境已经成功搭建好了

二、制作数据集

  1. 制作自己的数据集

进入paddleOCR-release-2.6根目录下

打开打标软件:python PPOCRLabel.py --lang ch

开始给数据打标签

全部打标完成之后,点击文件选择导出标记结果,再点击文件选择导出识别结果,完成后再文件夹多出四个文件fileState,Label,rec_gt, crop_img。其中crop_img中的图片用来训练文字识别模型,fileState记录图片的打标完成与否,Label为训练文字检测模型的标签,rec_gt为训练文字识别模型的标签。

  1. 数据集的划分

打标签告一段落。下面进行数据集的制作。在PaddleOCR根目录下建立train_data文件夹,并且将打标签生成的文件和图片放在该文件夹下。

进入PPOCRLabel的文件夹下

python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../train_data/text_trafficSignImages/

数据集已经标注成功

三、文字检测模型

  1. 下载模型

下载训练模型,det是检测模型,rec是识别模型

  1. 设置模型配置文件

打开模型配置文件,可以使用ch_det_res18_db_v2.0.yml这个配置文件。

按照需要修改配置文件

  1. 开始训练

到PaddleOCR-releas-2.6根目录下

训练结果

  1. 测试训练模型

使用best_accuracy.pdparams进行模型测试,其中Global.pretrained_model是我们训练好并且需要测试的模型,Global.infer_img为所要检测的图片路径。=》这里训练次数少,用的是iter_epoch_100.pdparams

python tools/infer_det.py -c configs/det/ch_ppocr_v2.0/ch_det_res18_db_v2.0.yml -o Global.pretrained_model=./output/ch_db_res18/iter_epoch_100.pdparams Global.infer_img="./train_data/det/test/img3.png"

四、文字检测模型

  1. 下载模型

下载训练模型,det是检测模型,rec是识别模型

  1. 设置模型配置文件

文字识别可以使用ch_PP-OCRv3_rec.yml

  1. 开始训练

到PaddleOCR-releas-2.6根目录下

python tools/train.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml

毁灭吧,内存要爆了

  1. 测试训练模型

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xiaoxiao_00001/article/details/148119161

要在本地使用 Expo 打包 APK 文件,你需要使用 expo build:android 命令。以下是详细步骤:

准备工作 确保已安装:

Node.js (建议使用 LTS 版本)

Expo CLI (npm install -g expo-cli)

Java Development Kit (JDK 8 或更高版本)

Android Studio (用于设置 Android 开发环境)

在项目目录中运行 expo login 登录你的 Expo 账户

打包 APK 步骤 进入项目目录:

bash cd your-project-directory 构建 APK:

bash expo build:android 在提示中选择构建类型:

选择 APK (如果你想构建 app bundle 可以选择 Android App Bundle)

等待构建完成:

这可能需要几分钟时间

你可以在 Expo 构建仪表板 查看进度

下载 APK:

构建完成后,Expo 会提供下载链接

或者使用以下命令下载:

bash expo build:status 本地构建选项(自 Expo CLI 5.0+) 如果你想完全在本地构建(不依赖 Expo 云服务):

安装 Turtle CLI(用于本地构建):

bash npm install -g turtle-cli 设置环境变量:

bash export EXPO_ANDROID_KEYSTORE_PASSWORD="your-keystore-password" export EXPO_ANDROID_KEY_PASSWORD="your-key-password" 运行本地构建:

bash expo build:android --local 注意事项 首次构建需要你提供或创建 keystore 文件(用于签名 APK)

请妥善保管你的 keystore 文件,丢失后将无法更新应用

构建的 APK 文件默认是调试版本,发布到商店需要构建发布版本

构建发布版本 要构建发布版本的 APK:

bash expo build:android --release-channel production 问题排查 如果遇到问题,可以尝试:

更新 Expo CLI:npm install -g expo-cli

清除缓存:expo r -c

检查 app.json 中的 Android 配置是否正确

当你在Expo项目中遇到"未指定编译版本"的问题时,通常是指Android或iOS的构建配置中没有明确指定目标SDK版本。以下是解决方案:

Android解决方案 在app.json或app.config.js中明确指定Android配置:

json { "expo": { "android": { "compileSdkVersion": 34, "targetSdkVersion": 34, "buildToolsVersion": "34.0.0" } } } iOS解决方案 对于iOS,可以在同一配置文件中指定部署目标:

json { "expo": { "ios": { "deploymentTarget": "13.0" } } } 其他解决步骤 更新Expo SDK版本:

text expo upgrade 清除缓存并重新构建:

text expo start -c 如果使用EAS构建,确保eas.json中有正确的构建配置:

json { "build": { "android": { "gradleCommand": ":app:assembleRelease" }, "ios": { "simulator": true } } } 检查项目中是否有自定义的build.gradle文件,确保其中包含正确的编译版本设置。

如果问题仍然存在,可能需要检查完整的错误日志以获取更具体的解决方案。

  • Call *
    • Method to call the storefront API and return a response.
    • @Example
    • We create a hash from the data in a similar method to how amazon does things.
    • $call = 'order';
    • $username = 'API username';
    • $key = 'API Key';
    • $domain = 'www.yourdomain.com';
    • $path = '/';
    • $store_id = 0;
    • $language = 'en-gb';
    • $time = time();
    • // Build hash string
    • $string = $call . "\n";
    • $string .= $username . "\n";
    • $string .= $domain . "\n";
    • $string .= $path . "\n";
    • $string .= $store_id . "\n";
    • $string .= $language . "\n";
    • $string .= $currency . "\n";
    • $string .= json_encode($_POST) . "\n";
    • $string .= $time . "\n";
    • $signature = base64_encode(hash_hmac('sha1', $string, $key, true));
    • // Make remote call
    • $url = '&call=' . $call;
    • $url = '&username=' . urlencode($username);
    • $url .= '&store_id=' . $store_id;
    • $url .= '&language=' . $language;
    • $url .= '&currency=' . $currency;
    • $url .= '&time=' . $time;
    • $url .= '&signature=' . rawurlencode($signature);
    • $curl = curl_init();
    • curl_setopt($curl, CURLOPT_URL, 'https://' . $domain . $path . 'index.php?route=api/api' . $url);
    • curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    • curl_setopt($curl, CURLOPT_HEADER, false);
    • curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    • curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    • curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    • curl_setopt($curl, CURLOPT_POST, 1);
    • curl_setopt($curl, CURLOPT_POSTFIELDS, $_POST);
    • $response = curl_exec($curl);
    • $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    • curl_close($curl);
    • if ($status == 200) {
    •  $response_info = json_decode($response, true);
      
    • } else {
    •  $response_info = [];
      
    • }
    • @return void */```

Beego ORM 提供了模型钩子(Hooks)功能,允许你在执行数据库操作前后插入自定义逻辑。这些钩子方法会在特定的 ORM 操作前后自动调用。

可用的钩子方法 Beego ORM 支持以下钩子方法:

查询相关钩子 AfterLoad() - 在查询数据并映射到结构体后调用

BeforeRead() - 在查询操作前调用

AfterRead() - 在查询操作后调用

插入相关钩子 BeforeInsert() - 在插入操作前调用

AfterInsert() - 在插入操作后调用

更新相关钩子 BeforeUpdate() - 在更新操作前调用

AfterUpdate() - 在更新操作后调用

删除相关钩子 BeforeDelete() - 在删除操作前调用

AfterDelete() - 在删除操作后调用

使用示例 go 复制 type User struct { Id int Username string Password string Created time.Time orm:"auto_now_add" }

// 在插入前自动设置创建时间 func (u *User) BeforeInsert() error { u.Created = time.Now() return nil }

// 在更新前验证数据 func (u *User) BeforeUpdate() error { if len(u.Username) < 3 { return errors.New("username too short") } return nil }

// 在删除后执行清理操作 func (u User) AfterDelete() { fmt.Printf("User %d deleted\n", u.Id) } 钩子的返回值 对于 Before 钩子,如果返回 error 非 nil,则会中止当前操作

After* 钩子通常不需要返回值(除了 AfterLoad)

注册钩子 钩子方法会自动被 Beego ORM 识别,无需额外注册。只需在你的模型结构体上定义相应方法即可。

注意事项 钩子方法应该定义在你的模型结构体上

方法名必须严格匹配 Beego ORM 预期的钩子方法名

在钩子中修改模型数据会影响后续操作

避免在钩子中执行耗时的操作,以免影响性能

通过合理使用这些钩子,你可以实现诸如自动时间戳、数据验证、日志记录等常见功能,而无需在业务代码中重复这些逻辑。

Life is fantastic
🥕 More