找到
39
篇与
admin
相关的结果
- 第 4 页
-
Qt Designer独立安装包Windows版下载指南 | 官方原版一键安装教程 本文为开发者提供Qt Designer官方独立安装包的Windows版直链下载资源,解决通过PyQt/PySide附带安装的繁琐流程。该exe安装包仅30MB,支持自定义安装路径,无需配置开发环境即可获得完整UI设计功能。包含详细的安装步骤、界面预览,帮助开发者快速获取轻量级Qt界面设计工具。 在网上找了很多,发现大家使用Qt Designer一般都是安装PyQt或者PySide时顺便安装的,然后通过命令行弹出来。实际上,Qt Designer有独立的安装包,而且不大,可以直接安装,这里我就分享一下。 下载地址 Qt Designer Setup.zip - 蓝奏云下载 exe文件非常小,只有三十几MB。 exe文件图片 下载后按照正常的软件下一步下一步安装即可,可以将其安装在D盘。安装后可以在菜单列表中看到: 菜单列表图片 界面预览 打开后就是下面这个界面。和使用pip安装的pyqt tools是一样的。本质上他就是一个UI设计界面工具。 界面预览图片 -
破除玩客云刷机超时难题!Armbian固件直刷包与Amlogic USB Burning工具版本完美搭配指南 本文针对玩客云刷Armbian系统时频繁出现的97%超时报错问题,深度解析固件校验机制导致卡顿的技术原理,提供适配的Armbian线刷包(桌面版/最小化版)和经过超时补丁优化的Amlogic USB Burning Tool v2.2.0工具。内含上海交大云盘高速下载资源、DLL文件替换指南及B站视频教程,助您彻底解决大文件校验超时痛点,完成从系统烧录到HDMI桌面配置的全流程操作。开源开发者必备的ARM设备刷机实战手册。 刷机超时问题 今天,小栈收到了宋哥邮寄过来的玩客云,里面一开始就是安装了系统的,但是宋哥忘了账号和密码,于是需要重新刷机: 玩客云硬件图片 小栈试了很多次,发现刷Armbian都会出现超时的问题。因为固件烧录后设备会计算sha1校验值,所以有时候大一点的固件就有可能校验超过150秒,尤其是在烧录完root或system分区,由于这部分占用空间很大,所以很容易校验超时而卡97%报错。 卡97%报错图片 Armbian的刷机包 Armbian的刷机包可以直接去Github上下载,有一点需要注意,要后缀带burn的才是线刷包。 hzyitc/armbian-onecloud - Github下载 Armbian的刷机包 - Github图片 这里小栈也分享了目前自己在用的安装包,用的是交大云盘分享的: 桌面版:Armbian-unofficial_25.05.0-trunk_Onecloud_bookworm_current_6.12.17_xfce_desktop.burn.img.xz 提取码: 9f85 最小版:Armbian-unofficial_25.05.0-trunk_Onecloud_bookworm_current_6.12.17_minimal.burn.img.xz 提取码: njh7 Amlogic USB Burning Tool不超时版本 下载地址:Amlogic USB Burning Tool v2.2.0 (含超时补丁).zip 提取码: ml9c 安装步骤:先安装exe文件,例如安装在D:\Program Files (x86)\Amlogic\USB_Burning_Tool目录下,然后将UsbRomDrv.dll放到这个文件夹下面。 Amlogic软件安装图片 刷机教程 刷机教程可以看B站视频,已经亲测有效: 唯一的区别就是导入的直刷包不同,其他流程完全一模一样,刷机完成后需要简单的配置,例如输入账号、密码、选择语言、地区等。 小栈用的是desktop版本,也就是桌面版,连接HDMI显示器之后,桌面如下: desktop版本桌面图片 -
纯静态前端图片压缩工具ImgUltraCompress:Vue+Three.js打造,近90%超高压缩率,支持本地化隐私安全处理(附在线演示+源码) 开源小站重磅推荐基于Vue 2.6+Three.js的纯静态前端图片压缩解决方案ImgUltraCompress。该工具采用浏览器本地处理技术,实现JPG/PNG/WebP格式86.7%压缩率突破,内置自适应算法平衡画质与体积,支持响应式跨设备操作和Web Worker多线程优化。项目集成Element UI组件库与自研压缩引擎,通过3D可视化交互界面提供0-100%滑杆精准控制,已部署可即用的在线演示系统并开放完整源码下载。特别包含隐私安全处理机制、批量压缩功能和黄金比例预设,满足开发者网站优化与论文复现双重需求。 下载地址 ImgUltraCompress_HTML.zip - 蓝奏云网盘下载 下载地址图片 本站部署效果 开源小站已经完成了对这个工具的部署,有需要的朋友可以免费使用: 在线图片压缩工具 - 大幅度高质量免费优化JPG/PNG/WebP图片大小 | 开源小站 网页部署图片 核心功能亮点 在保证画质的前提下减小图片体积,显著提升网页加载速度,节省存储空间与带宽成本。 采用自适应压缩算法(如lrz.bundle.js),在压缩率与清晰度间取得平衡 压缩的程度可以使用滑动条控制,0-100%自由滑动条控制压缩强度(默认推荐60%黄金比例) 浏览器本地处理技术,文件不上传服务器,可以确保隐私安全,放心使用即可。 完美兼容PC/手机/Pad设备,响应式设计自动适配屏幕 拖拽上传+点击选择双模式,3秒完成压缩流程,支持批量处理 Tips:本站提供的压缩包已经对资源进行了本地化处理! 技术架构 前端框架:Vue 2.6 + Element UI组件库 压缩引擎:lrz.bundle.js+自研优化算法 视觉效果:Three.js实现背景3D线条动效 性能优化:Web Worker多线程处理避免界面卡顿 压缩效果实验 小栈使用了两张截图来做实验,两张图片都是小栈的截图,其中png图片为745KB,jpg图片为590KB。 做实验的图片 把两个图片上传之后: 完成压缩下载即可图片 使用默认的压缩率压缩之后大小如上,关于效果个人觉得还是很不错的,对于网页图片来说完全够用。 都按99kb计算的话,可以简单计算一下压缩率: 对于PNG图片:(745 - 99)/ 745 = 86.7% 对于JPG图片:(590 - 99)/ 590 = 83% -
【Matlab深度学习实战】99.16%高精度交通标志识别系统开发:开源数据集优化+ResNet50迁移学习+App设计全解析(含工程源码) 本文详解基于Matlab R2024b的交通标志智能识别系统开发全流程。通过重构消除开源数据集污染与不均衡问题,采用ResNet50迁移学习技术实现50+类别99.16%超高识别准确率。内含完整数据清洗方案、分层抽样策略、Adam优化器参数配置,以及Matlab App Designer开发的交互式识别系统。提供经优化的开源数据集、带注释的工程源码及预训练模型,特别包含GPU加速训练技巧、混淆矩阵可视化方法、F1-score评估体系,助力开发者快速复现论文级实验结果,掌握工业级模型部署技巧。 效果视频 训练数据 前面小栈发布了一个开源数据集:【中国交通标志数据集TSRD下载】上海交大网盘高速下载+58类6164张标注图像 但是小栈发现开源的数据集存在一些问题,比如数据污染、数据不均衡的问题,会导致模型不稳定和动荡,因此,小栈对数据集进行了重新的编排。小栈润色后的数据集会和源码一起进行发布和下载。 软件环境 小栈使用的Matlab是R2024b,如果需要本套资料,建议与小栈保持一致哦,如果可能出现各种不兼容或者报错。 训练说明 下面对代码进行简单的说明,如果有需要,可以直接使用到您的报告中: 首先设定数据集路径及训练超参数,明确使用224×224像素的RGB输入格式。通过imageDatastore加载图像数据并自动继承文件夹名称作为类别标签,采用自定义预处理函数统一调整图像尺寸并确保三通道格式。为保证模型泛化能力,以分层抽样方式将数据集按8:2划分为训练集与测试集,并验证两者标签的一致性,避免测试集出现未知类别。最终统计显示共包含N个交通标志类别,训练集与测试集样本量分别为X和Y。 通过augmentedImageDatastore实现实时增强处理。网络架构方面,加载预训练的ResNet50模型后,移除原1000类分类层,替换为与当前任务类别数匹配的全连接层(设置较高10倍学习率因子加速训练),配合新的softmax和分类输出层完成结构调整。 采用分阶段训练机制:首先冻结所有卷积层的权重学习率因子(设为0),保持底层特征提取能力不变,仅训练新添加的分类层。通过layerGraph遍历替换所有卷积层的参数更新属性,确保特征提取部分权重冻结。网络分析确认结构调整正确后,配置Adam优化器(初始学习率0.001)、64批次大小及15轮次训练方案,每30批次验证一次测试集准确率,利用GPU加速训练过程。 训练显示损失曲线和准确率变化,动态保存最佳模型参数。完成训练后,模型在测试集上执行推理,计算总体分类准确率并生成混淆矩阵。评估指标扩展至类别级的精确度、召回率、F1分数及特异性,通过结构化报表展示各类别性能差异。最终模型以.mat文件格式保存,包含完整网络结构和训练元数据。 训练结果 本代码在训练的过程中输出了训练的效果: 轮迭代经过的时间 (hh:mm:ss)小批量准确度验证准确度小批量损失验证损失基础学习率1100:00:110.00%14.25%4.20927.68760.001013000:01:1385.94%74.69%0.74491.16080.001015000:01:5284.38% 0.7351 0.001016000:02:1887.50%87.85%0.45180.47320.001029000:03:1892.19%93.13%0.25470.23280.0010210000:03:3796.88% 0.1316 0.0010212000:04:1798.44%94.64%0.09220.18600.0010315000:05:1698.44%95.81%0.05470.14250.0010318000:06:1495.31%95.14%0.15650.16840.0010320000:06:5296.88% 0.1119 0.0010321000:07:1598.44%96.81%0.05270.11680.0010424000:08:1598.44%96.65%0.04430.13630.0010425000:08:3396.88% 0.0663 0.0010427000:09:1398.44%96.31%0.10220.16350.0010530000:10:13100.00%97.40%0.02430.11470.0010533000:11:1196.88%95.64%0.08880.19350.0010535000:11:47100.00% 0.0246 0.0010536000:12:1092.19%95.31%0.16060.18220.0010639000:13:0895.31%97.23%0.14050.15750.0010640000:13:2698.44% 0.0218 0.0010642000:14:0796.88%97.15%0.07800.10280.0010745000:15:07100.00%97.99%0.00310.09660.0010748000:16:0893.75%97.90%0.17250.10110.0010750000:16:43100.00% 0.0019 0.0010751000:17:0698.44%98.41%0.03910.08830.0010854000:18:04100.00%97.40%0.00090.09740.0010855000:18:22100.00% 0.0006 0.0010857000:19:0098.44%97.82%0.05370.08090.0010960000:19:5998.44%97.82%0.31310.12600.0010963000:20:57100.00%94.22%0.00190.19950.0010965000:21:33100.00% 0.0283 0.0010966000:21:5895.31%96.23%0.13730.17650.00101069000:22:56100.00%96.06%0.00040.16650.00101070000:23:1498.44% 0.0493 0.00101072000:23:5598.44%96.73%0.04940.13380.00101175000:24:5698.44%97.49%0.03780.14180.00101178000:25:5496.88%96.98%0.13190.10400.00101180000:26:29100.00% 0.0011 0.00101181000:26:5198.44%96.98%0.05850.21320.00101284000:27:4996.88%98.24%0.04860.07660.00101285000:28:0796.88% 0.1766 0.00101287000:28:4696.88%97.49%0.09580.09320.00101390000:29:4395.31%96.14%0.09570.17840.00101393000:30:51100.00%98.49%0.00030.05000.00101395000:31:2798.44% 0.1496 0.00101396000:31:50100.00%98.58%0.00650.06150.00101499000:32:48100.00%98.83%0.01100.05890.001014100000:33:06100.00% 0.0024 0.001014102000:33:46100.00%98.58%0.00390.06520.001015105000:34:46100.00%98.16%0.01130.06270.001015108000:35:48100.00%99.08%0.00050.04320.001015110000:36:25100.00% 0.0034 0.001015111000:36:48100.00%99.16%0.00750.04090.0010训练结束: 已完成最大轮数。 模型保存完成 评估模型性能... 测试集准确率: 99.08% 准确率: 准确率曲线图片 Loss值: Loss值图片 完整训练进度结果: 训练进度结果图片 Matlab App Designer使用 启动软件之后的界面是这个样子: 软件界面图片 完成识别后的界面: 完成识别后的界面图片 识别结果及日志记录: 识别结果及日志记录图片 下载地址: 包含的内容: 包含的内容图片 购买地址:【Matlab App Designer】基于Matlab卷积深度学习的交通标志识别|数据清洗+模型优化,准确率99% -
【中国交通标志数据集TSRD下载】上海交大网盘高速下载+58类6164张标注图像 本文详细解析中国交通标志识别基准数据集TSRD,提供官方下载与上海交通大学网盘高速下载双通道。该数据集包含58类共6164张高质量标注图像(4170训练集+1994测试集),每张图片均提供精准坐标标注文件,特别适合交通标志识别算法开发、自动驾驶模型训练及计算机视觉研究。内含数据目录结构解析、标注文件格式说明,助您快速开展深度学习实战。 数据集说明 TSRD包括6164幅交通标志图像,包含58个标志类别。图像分为训练数据库和测试数据库两个数据库分库。训练数据库包括4170幅图像,测试数据库包含1994幅图像。所有图像都标注了标志和类别的四个坐标。 数据集下载 (1)官网下载地址: TSRD-Train TSRD-Test TSRD-Train Annotation TSRD-Test Annotation (2)上海交通大学网盘地址: Chinese Traffic Sign Database - 上交网盘版 包含的内容图片 数据说明 我看了看下载的数据集,分类使用前面的000、001这样进行区分的,一共是58个标志类别,因此是000~057,一共58个。 数据集里的图片 关于标注文件(TSRD-Test Annotation.zip和TSRD-Train Annotation.zip)中内容的解释: 当前格式应为: 文件名; 图像宽度; 图像高度; 左上角x; 左上角y; 右下角x; 右下角x; 类别 标注的数据集图片 -
谷歌浏览器垃圾过多经常卡顿?试试Chrome清理大师插件,高度自定义实现浏览器缓存的自动清理 本文详细介绍了Chrome清理大师浏览器插件的功能与安装使用教程。该插件支持高度自定义的浏览器缓存自动清理功能,用户可根据需求灵活设置清理时间范围(如一小时内、一天内、一周内等),并支持关闭浏览器时自动清理。文章提供了从插件下载到安装配置的完整步骤,包括解压注意事项和常见安装问题的解决方案,帮助开发者快速上手这一提升浏览器效率的实用工具。通过该工具,用户可优化浏览器性能,避免缓存堆积导致的卡顿问题。 插件下载 Chrome清理大师-谷歌浏览器插件.zip - 上交大云盘 压缩包内容图片 安装步骤 打开Chrome浏览器 -> 点击右上角三个点 -> 扩展程序 -> 管理扩展程序 安装步骤图片 管理扩展程序页面的右上角开发者模式开关开启 开发者模式图片 下载完成得到的压缩包必须先解压缩再安装,不解压会出现拖动后变下载文件 拖动到chrome图片 解压缩得到的xxxx.crx文件就是安装包,拖动到chrome的管理扩展程序页面安装即可 安装插件图片 Chrome清理大师配置 可以自定义时间段,点击下拉列表,可以选择“一小时内”、“一天内”、“一周内”、“一个月内”、“全部”。 自动清理可以选择点击插件图标时自动清理以及“关闭浏览器自动清理” Chrome清理大师配置图片 注意事项 关于安装时出现“无法从该网站添加应用、扩展程序、和用户脚本”等问题,大概率是谷歌浏览器版本不是最新版,推荐在浏览器 - 帮助 - 关于 Google Chrome 中进行升级或者重新安装。 -
Python+蚁群算法实战:医院科室智能调度等待时间优化系统开发(附完整开源代码) 本文针对三甲医院多科室体检排队效率痛点,基于生物启发算法提出创新解决方案。通过将7大检查科室建模为动态TSP问题,利用Python构建多线程优先队列仿真系统,结合蚁群算法的信息素动态更新机制,实现科室访问路径智能优化。实验数据显示,该方案较传统随机排队模式减少患者总等待时长22.6%,科室间转移效率提升35%,算法在50次迭代内快速收敛。文中完整公开含多服务台调度、Matplotlib热力图可视化等核心模块的代码实现,为医疗资源优化、智能医院建设提供可直接复用的开源解决方案,特别适合AI医疗、运筹优化等领域的开发者参考学习。 在现代医院门诊流程中,患者往往需要在多个检查科室之间来回奔波,面临长时间的排队等待。以某医院为例,患者通常需要完成7项检查:抽血室(5分钟,2个服务台)、B超室(20分钟)、眼科(5分钟)、内科(10分钟)、外科(15分钟)、心电图(10分钟)和身高体重测量(5分钟)。每位患者平均每2分钟到达医院(即30人/小时),在科室间转移还需额外花费2分钟时间。 这种复杂的排队系统导致患者总等待时间过长,不仅影响就医体验,也降低了医院运营效率。传统的人工调度或随机排队方式难以实现最优的资源配置,因此需要一种智能化的解决方案来优化患者的科室访问顺序,从而显著减少总等待时间。 解决思路 针对这一复杂的排队优化问题,我们采用了受自然界蚂蚁觅食行为启发的蚁群算法。该算法的核心思想是通过模拟蚂蚁群体在寻找食物过程中释放信息素的行为,逐步发现最优的路径选择策略。 具体实施中,我们将每位患者视为一个需要完成所有检查的"旅行者",各科室则是必须访问的"城市"。算法通过以下机制实现优化: 信息素引导:记录历史优质解决方案中科室间的转移偏好 启发式信息:考虑各科室的平均检查时间(时间越短优先级越高) 概率选择:平衡已知最优路径探索与新路径开发 动态更新:根据解决方案质量调整信息素浓度 系统特别考虑了不同科室服务台数量的差异(如抽血室有2个服务台),使用优先队列(最小堆)精确模拟多服务台排队场景,确保等待时间计算的准确性。 验证方法 为验证算法的有效性,我们设计了科学的对比实验: 基准测试:采用完全随机的科室访问顺序作为对比基准 评价指标:计算所有患者的总等待时间,包括: 在各科室外的排队等待时间 科室间转移的固定时间(2分钟/次) 优化率计算:(随机方案耗时-优化方案耗时)/随机方案耗时×100% 实践代码 由于使用了一些外部库,需要使用下面的命令进行安装: pip install matplotlib seaborn numpy 当然在国内可以使用更快的清华镜像源: pip install matplotlib seaborn numpy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple以下是完整的代码: import random import heapq import matplotlib.pyplot as plt import seaborn as sns import numpy as np from matplotlib import font_manager # 设置中文字体 try: plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # Windows系统常用 plt.rcParams['axes.unicode_minus'] = False except: try: plt.rcParams['font.sans-serif'] = ['SimHei'] # 备选方案 plt.rcParams['axes.unicode_minus'] = False except: print("无法设置中文字体,将使用默认字体") # 科室信息 departments = [ {'name': '抽血室', 'time': 5, 'servers': 2}, {'name': 'B超室', 'time': 20, 'servers': 1}, {'name': '眼科', 'time': 5, 'servers': 1}, {'name': '内科', 'time': 10, 'servers': 1}, {'name': '外科', 'time': 15, 'servers': 1}, {'name': '心电图室', 'time': 10, 'servers': 1}, {'name': '身高体重', 'time': 5, 'servers': 1}, ] dept_names = [dept['name'] for dept in departments] num_departments = len(departments) dept_times = [dept['time'] for dept in departments] eta = [1.0 / dept['time'] for dept in departments] # 启发式信息 # 算法参数 alpha = 1 # 信息素权重 beta = 2 # 启发式信息权重 rho = 0.1 # 信息素蒸发率 Q = 1000.0 # 信息素增强系数 num_ants = 10 # 蚂蚁数量 iterations = 50 # 迭代次数 num_patients = 30 # 患者数量 # 生成到达时间(每2分钟一个患者) arrival_times = [i * 2 for i in range(num_patients)] # 初始化信息素矩阵 tau = [[1.0 for _ in range(num_departments)] for _ in range(num_departments)] def roulette_wheel_selection(probabilities): """轮盘赌选择算法""" r = random.uniform(0, sum(p for _, p in probabilities)) cumulative = 0 for j, p in probabilities: cumulative += p if cumulative >= r: return j return probabilities[-1][0] def generate_path(tau, eta): """生成单个患者的科室访问路径""" path = [] unvisited = set(range(num_departments)) # 随机选择起始科室 current = random.choice(list(unvisited)) path.append(current) unvisited.remove(current) while unvisited: probabilities = [] total = 0.0 for j in unvisited: pheromone = tau[current][j] heuristic = eta[j] prob = (pheromone ** alpha) * (heuristic ** beta) probabilities.append((j, prob)) total += prob if total == 0: # 处理零概率情况 j = random.choice(list(unvisited)) else: probabilities = [(j, p / total) for j, p in probabilities] j = roulette_wheel_selection(probabilities) path.append(j) unvisited.remove(j) current = j return path def evaluate_solution(patients_paths): """评估解决方案的总等待时间""" # 初始化科室服务台(使用最小堆) queues = [] for dept in departments: servers = [0] * dept['servers'] heapq.heapify(servers) queues.append(servers.copy()) total_wait = 0 for pid in range(num_patients): path = patients_paths[pid] arrival = arrival_times[pid] current_time = arrival for i, dept in enumerate(path): # 计算到达时间 if i == 0: dept_arrival = arrival else: dept_arrival = current_time + 2 # 转移时间 # 获取服务台 queue = queues[dept] available_time = heapq.heappop(queue) # 计算等待时间 wait_time = max(0, available_time - dept_arrival) total_wait += wait_time # 更新服务台时间 start_time = max(dept_arrival, available_time) end_time = start_time + departments[dept]['time'] heapq.heappush(queue, end_time) current_time = end_time # 添加转移时间 total_wait += 2 * (len(path) - 1) return total_wait # 运行蚁群算法 best_solution = None best_cost = float('inf') best_costs_history = [] # 记录每次迭代的最佳成本 for iteration in range(iterations): solutions = [] for _ in range(num_ants): # 生成蚂蚁解决方案 paths = [generate_path(tau, eta) for _ in range(num_patients)] cost = evaluate_solution(paths) solutions.append((cost, paths)) # 更新全局最优 if cost < best_cost: best_cost = cost best_solution = paths best_costs_history.append(best_cost) print(f"迭代次数 {iteration + 1}: 当前最优等待时间 {best_cost} 分钟") # 信息素蒸发 for i in range(num_departments): for j in range(num_departments): tau[i][j] *= (1 - rho) # 信息素增强 for cost, paths in solutions: if cost == best_cost: for path in paths: for k in range(len(path) - 1): i = path[k] j = path[k + 1] tau[i][j] += Q / cost # 随机解决方案对比 random_paths = [random.sample(range(num_departments), num_departments) for _ in range(num_patients)] random_cost = evaluate_solution(random_paths) improvement = (random_cost - best_cost) / random_cost * 100 # 1. 优化过程可视化 plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.plot(range(1, iterations + 1), best_costs_history, 'b-', linewidth=2) plt.title('蚁群算法优化过程') plt.xlabel('迭代次数') plt.ylabel('总等待时间(分钟)') plt.grid(True) # 标记最优解 optimal_iter = best_costs_history.index(min(best_costs_history)) + 1 optimal_cost = min(best_costs_history) plt.scatter(optimal_iter, optimal_cost, color='red', s=100, label=f'最优解: {optimal_cost} 分钟 (第{optimal_iter}次迭代)') # 添加随机方案参考线 plt.axhline(y=random_cost, color='g', linestyle='--', label=f'随机方案: {random_cost} 分钟') plt.legend() # 2. 科室访问热力图 plt.subplot(1, 2, 2) transfer_matrix = np.zeros((num_departments, num_departments)) for path in best_solution: for k in range(len(path) - 1): i = path[k] j = path[k + 1] transfer_matrix[i][j] += 1 sns.heatmap(transfer_matrix, annot=True, fmt='.0f', cmap='YlOrRd', xticklabels=dept_names, yticklabels=dept_names) plt.title('科室间转移频率热力图') plt.xlabel('目标科室') plt.ylabel('来源科室') plt.tight_layout() plt.show() # 打印最终结果 print("\n===== 最终优化结果 =====") print(f"随机排队总等待时间: {random_cost} 分钟") print(f"优化后总等待时间: {best_cost} 分钟") print(f"优化率: {improvement:.2f}%") if improvement >= 20: print("优化目标达成 (优化率≥20%)") else: print("优化目标未达成")关于代码的一些配置如下。首先是根据题意进行科室信息的配置: 科室信息的配置图片 然后就是算法的基本参数配置: 基本参数配置图片 代码一次运行效果如下: 运行效果图片 热力图图片 通过可视化,可以直观地展示: 算法收敛过程 最优解出现的位置 患者在不同科室间的流动模式 优化前后的对比效果 科室访问热力图的作用: 使用seaborn绘制科室间转移频率的热力图 横纵坐标标注科室名称 颜色深浅表示转移频率高低 -
(可API调用)无需联网即可使用基于深度学习识别的OCR工具Umi-OCR,内置高效率的离线OCR引擎 本文深入解析了Umi-OCR这一基于深度学习的离线OCR开源工具,重点突出其无需联网、支持API调用、兼容多平台的核心优势。工具内置Paddle/Rapid双引擎,提供截图OCR、批量文档处理、二维码生成解析等实用功能,并通过详细的Python代码示例演示了PDF整本转TXT的自动化流程。文章涵盖从软件下载安装、命令行操作到HTTP接口调用的完整教程,并针对常见硬件兼容性问题(如奔腾/赛扬CPU支持)、系统报错(OpenGL配置、DLL缺失等)提供专业解决方案,为开发者提供开箱即用的高效OCR技术方案。 特别注意:Paddle版性能好,但不兼容奔腾、赛扬、凌动CPU。Rapid兼容绝大部分硬件。下面我以Paddle版为例,进行一个简单的使用效果测试。 下载安装包 蓝奏云:https://hiroi-sora.lanzoul.com/s/umi-ocr GitHub:https://github.com/hiroi-sora/Umi-OCR/releases/latest 下载软件的代码图片 解压软件 双击exe之后就会让你选择一个解压目录,可以新建一个文件夹来存储解压后的。 解压软件图片 解压之后如图: 解压之后如图图片 主要功能 截图OCR: 截图OCR图片 批量OCR: 批量OCR图片 批量文档: 批量文档图片 二维码: 二维码图片 命令行API调用 如图,必须允许HTTP服务才能使用命令行(默认开启)。主机选择 仅本地 就行了。 允许HTTP服务图片 一些基本操作: 弹出主窗口:umi-ocr --show 隐藏主窗口:umi-ocr --hide 关闭软件:umi-ocr --quit 鼠标截屏 umi-ocr --screenshot 范围截屏 umi-ocr --screenshot screen=0 rect=x,y,w,h 范围截屏控制参数: screen: 要截图的显示器编号(多个显示器时有效),从0开始。缺省为0。 rect: 截图范围矩形框,x坐标,y坐标,w宽度,h高度。缺省为全屏。 注意: 这两个参数的前面无需加--。 这两个参数至少要填一个,才能触发范围截图。没有任一参数时,执行鼠标截屏。 示例1:截取第1个显示器的全屏 umi-ocr --screenshot screen=0示例2:截取第2个显示器,从左上角 (50,100) 开始,大小为 300x200 的矩形区域 umi-ocr --screenshot screen=1 rect=50,100,300,200粘贴图片 umi-ocr --clipboard 指定路径 指定路径:umi-ocr --path "D:/xxx.png" 可传入文件夹的路径。将搜索文件夹中所有图片(包括嵌套子文件夹),并输出所有识别结果。 可传入多个路径。请用双引号""包裹单个路径,不同路径间用空格 隔开。 指定多个路径 示例:umi-ocr --path "D:/img1.png" "D:/img2.png" "D:/image/test" 提示: 多图识别时,耗时较长;一次命令结束前不要输入下一个命令。 对于截屏、粘贴、路径指令,OCR参数(如识别语言,是否复制到剪贴板、是否弹出主窗口)采用截图OCR标签页的设定。如果不希望命令行任务弹出主窗口,请在截图OCR标签页中关闭该选项。 二维码指令 识别二维码:umi-ocr --qrcode_read "D:/xxx.png" 与OCR指令一致,二维码识别的指令也支持传入多个图片&文件夹路径。 生成二维码:umi-ocr --qrcode_create "文本内容" "D:/输出图片.jpeg" 默认的图片宽高为最小适配长度。也可以在指令后方加上数字,手动指定图片宽高: 例,同时指定宽高为128像素:umi-ocr --qrcode_create "文本内容" "D:/输出图片.jpeg" 128 例,宽128,高256像素:umi-ocr --qrcode_create "文本内容" "D:/输出图片.jpeg" 128 256 命令行结果输出 复制到剪贴板 --clip 输出到文件(覆盖) --output "file.txt" 输出到文件(追加) --output_append "file.txt" 也可以使用箭头符号: "-->" 等价于 --output "-->>" 等价于 --output_append 例: umi-ocr --screenshot --clip umi-ocr --screenshot --output test.txt umi-ocr --screenshot "-->" test.txtHTTP接口手册 HTTP接口手册 - Github 具体有点太多了,可以自行查看官方文档。 Python将整本pdf转为txt的示例 这里我写一个Python的代码,用来把pdf提取成txt。这是基于HTTP做的。 import os import json import time import requests class UmiOCRProcessor: """Umi-OCR HTTP接口处理器""" def __init__(self, base_url="http://127.0.0.1:1224", download_dir="./download"): """ 初始化OCR处理器 :param base_url: API基础地址 :param download_dir: 文件下载保存目录 """ self.base_url = base_url self.download_dir = download_dir self.headers = {"Content-Type": "application/json"} self.task_id = None # 当前任务ID def upload_file(self, file_path, options=None): """ 上传文件并启动OCR任务 :param file_path: 待识别文件路径 :param options: 任务参数(字典格式) :return: 任务ID """ print("=======================================") print("===== 1. 上传文件,获取任务ID =====") url = f"{self.base_url}/api/doc/upload" print("== 请求地址:", url) # 默认参数设置 if options is None: options = {"doc.extractionMode": "mixed"} options_json = json.dumps(options) # 第一次尝试上传 with open(file_path, "rb") as file: response = requests.post(url, files={"file": file}, data={"json": options_json}) # 处理上传失败的情况(非ASCII文件名问题) res_data = self._check_response(response) if res_data["code"] == 101: print("[警告] 检测到文件上传失败:错误码 == 101") file_name = os.path.basename(file_path) file_prefix, file_suffix = os.path.splitext(file_name) temp_name = f"temp{file_suffix}" print(f"尝试使用临时文件名 {temp_name} 替代原文件名 {file_name}") # 使用临时文件名重试上传 with open(file_path, "rb") as file: response = requests.post( url, files={"file": (temp_name, file)}, data={"json": options_json}, ) res_data = self._check_response(response) self.task_id = res_data["data"] print("任务ID:", self.task_id) return self.task_id def poll_task_status(self, interval=1): """ 轮询任务状态直到完成 :param interval: 轮询间隔(秒) """ if not self.task_id: raise ValueError("没有有效的任务ID") print("===================================================") print("===== 2. 轮询任务状态直到OCR任务完成 =====") url = f"{self.base_url}/api/doc/result" print("== 请求地址:", url) request_data = { "id": self.task_id, "is_data": True, "format": "text", "is_unread": True, } while True: time.sleep(interval) response = requests.post(url, data=json.dumps(request_data), headers=self.headers) res_data = self._check_response(response) # 打印处理进度 processed = res_data["processed_count"] total = res_data["pages_count"] print(f" 处理进度: {processed}/{total}") # 打印实时数据 if res_data["data"]: print(f"{res_data['data']}\n========================") # 检查任务是否完成 if res_data["is_done"]: if res_data["state"] != "success": raise RuntimeError(f"任务执行失败: {res_data['message']}") print("OCR任务处理完成") break def generate_download_link(self, file_types=None, ignore_blank=False): """ 生成结果文件下载链接 :param file_types: 需要生成的文件类型列表 :param ignore_blank: 是否忽略空白页 :return: (下载链接, 文件名) """ if not self.task_id: raise ValueError("没有有效的任务ID") print("======================================================") print("===== 3. 生成目标文件,获取下载链接 =====") url = f"{self.base_url}/api/doc/download" print("== 请求地址:", url) # 默认文件类型列表 if file_types is None: file_types = [ "txt", "txtPlain", "jsonl", "csv", "pdfLayered", "pdfOneLayer", ] request_data = { "id": self.task_id, "file_types": file_types, "ingore_blank": ignore_blank, # 注意:历史版本可能需要保留拼写错误 } response = requests.post(url, data=json.dumps(request_data), headers=self.headers) res_data = self._check_response(response) return res_data["data"], res_data["name"] def download_file(self, url, filename): """ 下载结果文件 :param url: 下载链接 :param filename: 保存文件名 """ print("===================================") print("===== 4. 下载目标文件 =====") print("== 请求地址:", url) # 创建下载目录 if not os.path.exists(self.download_dir): os.makedirs(self.download_dir) save_path = os.path.join(self.download_dir, filename) # 执行下载并显示进度 with requests.get(url, stream=True) as response: response.raise_for_status() total_size = int(response.headers.get("content-length", 0)) downloaded = 0 log_interval = 10_485_760 # 每10MB打印进度 with open(save_path, "wb") as f: for chunk in response.iter_content(chunk_size=8192): if chunk: f.write(chunk) downloaded += len(chunk) if downloaded >= log_interval: log_interval += 10_485_760 progress = (downloaded / total_size) * 100 print( f" 下载进度: {downloaded//1_048_576}MB | " f"总进度: {progress:.2f}%" ) print(f"文件下载完成,保存路径: {save_path}") def cleanup_task(self): """清理服务器上的任务数据""" if not self.task_id: raise ValueError("没有有效的任务ID") print("============================") print("===== 5. 清理任务 =====") url = f"{self.base_url}/api/doc/clear/{self.task_id}" print("== 请求地址:", url) response = requests.get(url) res_data = self._check_response(response) print("任务数据清理完成") @staticmethod def _check_response(response): """统一检查响应结果""" response.raise_for_status() res_data = json.loads(response.text) if res_data["code"] != 100: raise RuntimeError(f"API请求失败: {res_data}") return res_data # 使用示例 if __name__ == "__main__": # 初始化处理器 processor = UmiOCRProcessor(download_dir="./下载结果") try: # 步骤1:上传文件 task_id = processor.upload_file("XXXXX.pdf") # 步骤2:轮询任务状态 processor.poll_task_status() # 步骤3:生成下载链接 download_url, filename = processor.generate_download_link() # 步骤4:下载文件 processor.download_file(download_url, filename) # 步骤5:清理任务 processor.cleanup_task() print("\n======================\n处理流程完成") except Exception as e: print(f"\n发生错误: {str(e)}") 最终的识别结果: 识别结果图片 错误排查手册 详细内容请见: https://github.com/hiroi-sora/Umi-OCR/issues/447 ================================ 弹窗报错 Cannot find Py_Main() in …… 解决方法1: 下载安装VC运行库,重启系统,测试Umi-OCR能否正常运行。 https://aka.ms/vs/17/release/vc_redist.x64.exe 解决方法2: 使用这个bat文件代替 Umi-OCR.exe 来启动软件。双击它即可。 UmiOCR-data/RUN_GUI.bat 注意1:通过bat启动时,部分功能受限,将无法使用命令行指令和创建快捷方式(开始菜单、开机自启等)。如有需要,请参考后面【手动放置快捷方式】条目。 注意2:不要移动bat的位置。 ================================ 手动放置快捷方式 如果因为某些原因,软件自身无法创建快捷方式;请手动创建并将快捷方式放置到如下目录: 开始菜单目录: C:\ProgramData\Microsoft\Windows\Start Menu 开机自启目录: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup ================================ 弹窗报错 Failed to create OpenGL context …… 下载运行库: https://github.com/hiroi-sora/Umi-OCR_v2/files/13167436/opengl32sw_64.zip 解压,将其中的dll文件放置于: UmiOCR-data/site-packages/PySide2/ ================================ 弹窗报错 Umi-OCR.exe 已停止工作 此问题常见于:软件已经在win10使用过,然后原封不动复制到win7上,导致配置冲突。 删除下述配置文件即可: UmiOCR-data/.pre_settings ================================ 应用程序无法正常启动(0xc0000142) 或者:[Error] OCR init fail.l. Argd: {'enable_mkldnn': True... 此问题大概率是:CPU不支持AVX指令集。 请换用 PaddleOCR 之外的插件或软件版本。比如: 方法1:更换使用 Umi-OCR_Rapid 。 方法2:额外导入 RapleOCR插件 。 ================================ 弹出黑框控制台窗口,【错误】Umi-OCR Error 找不到指定的程序 OSError 可能的发生条件: win7早期版本,缺少系统补丁(尤其是KB2533623) 其他原因,导致 Python 3.8 无法在该系统中运行。 修复方法: 推荐方法:使用系统检查更新(控制面板 → 系统和安全 → Windows Update → 检查更新),安装所有更新。 另一种方法:单独下载安装 KB2533623补丁 ,重启系统即可。不过,微软官方渠道已经关闭了该补丁的下载链接,您可能只能从第三方网站下载补丁,请务必注意安全。 ================================ 保存PDF时 “已停止工作” 文档识别,能识别出文字,能保存为txt等文件。但如果选择保存为双层可搜索PDF,则最后导出文件时弹窗报错: Umi-OCR.exe 已停止工作 查看问题详细信息: 问题事件名称:BEX64 故障模块名称:ucrtbase.DLL 故障模块版本:10.0.10240.16390 异常偏移:00000000064399 异常代码:c0000417可能的发生条件:win7早期版本,缺少系统补丁(尤其是 KB4534310、KB3042058) 修复方法: 注意!由于 KB4534310 依赖前置补丁,因此 不能 单独下载安装该补丁。 您必须使用系统检查更新(控制面板 → 系统和安全 → Windows Update → 检查更新),安装所有缺失的更新,直到下面这个项目安装完毕: 2020-01 适用于基于 x64 的系统的 Windows 7 月度安全质量汇总 (KB4534310) ================================ 丢失api-ms-win-crt-runtime-l1-1-0.dll 打开软件时,弹出错误弹窗: Umi-OCR.exe-系统错误 无法启动此程序,因为计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 。尝试重新安装该程序以解决此问题。 可能的发生条件:缺少VC运行库。 修复方法:安装VC运行库: https://aka.ms/vs/17/release/vc_redist.x64.exe