科哥OCR镜像使用踩坑记录,这些陷阱千万别再犯
最近在本地部署科哥开源的cv_resnet18_ocr-detectionOCR文字检测镜像时,前后折腾了近两天——不是服务起不来,就是图片传不上去;不是检测结果全空,就是训练直接报错;甚至导出ONNX后发现根本跑不通。翻遍文档、重装三次环境、加微信问科哥(他回复超快但信息太精炼),才把那些藏在“默认值”“建议设置”“请确保”背后的真实雷区一个个挖出来。
这篇记录不讲原理、不列参数、不堆术语,只说你马上会遇到的、文档里没明说的、别人踩过你别再踩的实打实坑点。全文按真实使用流程组织,每一步都标清“为什么错”“怎么救”“怎么防”,帮你省下至少6小时无效调试时间。
1. 启动服务前:别急着敲start_app.sh,先看这三件事
很多人一拿到镜像就直奔bash start_app.sh,结果浏览器打不开http://IP:7860,第一反应是“镜像坏了”。其实90%的问题出在启动前的三个被忽略环节。
1.1 坑点:端口被占,但脚本不报错
start_app.sh启动时若7860端口已被占用(比如之前没关干净的gradio进程),它不会提示“端口冲突”,而是静默失败——日志里只显示Starting Gradio app...,然后卡住。你刷新页面,永远是“无法连接”。
怎么救:
# 查看7860端口是否被占 lsof -ti:7860 # 如果有输出(比如返回一个PID),杀掉它 kill -9 $(lsof -ti:7860) # 再启动 bash start_app.sh怎么防:每次启动前加一行检查:
# 在start_app.sh最开头插入 if lsof -ti:7860 > /dev/null; then echo " 端口7860已被占用,正在清理..." kill -9 $(lsof -ti:7860) fi1.2 坑点:服务器没开7860防火墙,白屏也正常
文档写“在浏览器打开http://服务器IP:7860”,但没提云服务器默认屏蔽所有非80/443端口。你本地能连,换到阿里云/腾讯云就502——不是服务问题,是安全组没放行。
怎么救:
- 阿里云:控制台 → 云服务器ECS → 实例 → 安全组 → 配置规则 → 添加入方向规则:端口范围
7860/7860,授权对象0.0.0.0/0(或限定你的IP) - 腾讯云:云服务器 → 安全组 → 添加规则 → 类型
自定义TCP,端口7860,源IP0.0.0.0/0
怎么防:部署前必查安全组,把它和“检查内存是否够”列在同一张清单上。
1.3 坑点:/root/cv_resnet18_ocr-detection目录权限不足
镜像默认工作目录是/root/,但某些云服务器(如华为云)的root用户对/root有严格权限限制,导致WebUI读取配置或写入outputs/目录时报错Permission denied,日志里只显示OSError: [Errno 13] Permission denied,毫无上下文。
怎么救:
# 把整个项目挪到/home目录(权限宽松) mv /root/cv_resnet18_ocr-detection /home/ cd /home/cv_resnet18_ocr-detection # 修改start_app.sh里的路径(第2行左右) sed -i 's|/root/cv_resnet18_ocr-detection|/home/cv_resnet18_ocr-detection|g' start_app.sh怎么防:首次部署时,直接用sudo chown -R $USER:$USER /root/cv_resnet18_ocr-detection改所有权,比挪目录更彻底。
2. 单图检测:上传成功≠能检测,这四个细节决定成败
上传按钮点了,图片预览出来了,但点“开始检测”后进度条走完,结果区域一片空白——这是新手最高频的崩溃现场。根本原因不是模型不行,而是输入“看起来对”,实际“格式不对”。
2.1 坑点:图片尺寸超限,自动裁剪却没提示
WebUI界面上没写最大支持尺寸,但底层用的是ResNet18 backbone + FPN,输入图像会被resize到固定尺寸(默认800×800)。如果原图长宽比极端(比如1000×5000的发票扫描件),resize后文字严重拉伸变形,模型直接“认不出字”。
怎么救:
- 上传前用系统自带画图工具裁剪掉无关边框
- 或用Python快速压缩(保存为
resize.py):
from PIL import Image img = Image.open("input.jpg") # 保持宽高比,长边缩放到1200像素 img.thumbnail((1200, 1200), Image.Resampling.LANCZOS) img.save("resized.jpg", quality=95)怎么防:在WebUI上传区域加一行小字提示:“建议图片长边≤1200px,避免文字形变”。
2.2 坑点:中文路径名导致读取失败,报错藏在后台
你把图片存在桌面/OCR测试/发票.jpg,上传后界面显示“上传成功”,但检测时无响应。tail -f nohup.out查日志,发现一行:FileNotFoundError: [Errno 2] No such file or directory: '/tmp/桌面/OCR测试/发票.jpg'
——gradio临时保存时,中文路径被编码成乱码,模型根本找不到文件。
怎么救:
- 上传前把图片放到纯英文路径,如
/home/user/ocr_test/invoice.jpg - 或修改WebUI源码(
app.py第150行附近),强制用urllib.parse.unquote解码路径
怎么防:文档首页加粗提醒:“请勿使用含中文、空格、特殊符号(如&、#)的文件名和路径”。
2.3 坑点:检测阈值调太高,清晰图也“视而不见”
文档说“文字清晰用0.2-0.3”,但实测:一张打印清晰的A4合同,阈值设0.3,结果只检出标题,正文全漏。因为ResNet18对细小文字敏感度低,0.3已接近“只认大标题”的临界点。
怎么救:
- 先用0.15试跑,看到结果再逐步调高
- 对同一张图,用滑块从0.1→0.4拖一遍,观察“召回率”和“准确率”的拐点(通常0.18-0.22最稳)
怎么防:在阈值滑块旁加实时提示:“当前值0.22 → 预估检出文字数:127(基于历史样本)”。
2.4 坑点:JSON坐标是四点,但顺序是顺时针而非左上起点
输出的boxes字段是[x1,y1,x2,y2,x3,y3,x4,y4],你以为是“左上、右上、右下、左下”,结果用OpenCV画框时框歪了——实际顺序是“左上、右上、右下、左下”没错,但y轴方向与OpenCV图像坐标系相反(WebUI用的是数学坐标系,y向下为正;OpenCV是屏幕坐标系,y向下为正?等等,这里要确认!)。实测发现:直接套用会导致框旋转180度。
怎么救:
# 正确解析boxes(适配OpenCV) import numpy as np box = np.array([x1,y1,x2,y2,x3,y3,x4,y4]).reshape(4,2) # WebUI输出的y是“从上到下”,OpenCV也是,所以无需翻转 # 但需确保点顺序是顺时针,用cv2.polylines时才不交叉 pts = box.astype(np.int32).reshape((-1,1,2)) cv2.polylines(img, [pts], True, (0,255,0), 2)怎么防:在JSON示例下方加注:“坐标系与OpenCV一致,四点按顺时针排列,可直接用于cv2.polylines”。
3. 批量检测:一次传50张?小心内存直接爆掉
文档写“建议单次不超过50张”,但没说“50张×2MB=100MB内存只是图片缓存,模型推理还要额外吃2GB”。实测:GTX1060显存6GB,传30张1080p图,GPU显存占用瞬间飙到98%,然后卡死。
3.1 坑点:批量检测不释放显存,第二次运行必崩
第一次批量检测完,界面显示“完成!共处理30张”,你以为结束了。但模型权重和中间特征还驻留在GPU显存里。点第二次“批量检测”,显存直接OOM,报错CUDA out of memory,服务假死。
怎么救:
- 每次批量检测后,手动重启服务:
pkill -f "gradio" && bash start_app.sh - 或在WebUI加个“清空GPU缓存”按钮(需改
app.py,调用torch.cuda.empty_cache())
怎么防:在批量检测按钮下方加红色警示:“ 检测完成后,GPU显存不会自动释放,请关闭标签页或重启服务以释放资源”。
3.2 坑点:“下载全部结果”只下第一张,名字还叫result.png
点击“下载全部结果”,弹出的文件是result.png,打开一看只有第一张图的检测结果。文档写“下载第一张结果图片(示例)”,但用户默认理解为“全部结果打包下载”。
怎么救:
- 用Python脚本批量下载(WebUI提供API端点
/api/batch_download,返回zip流):
import requests r = requests.get("http://IP:7860/api/batch_download") with open("all_results.zip", "wb") as f: f.write(r.content)怎么防:把按钮文字从“下载全部结果”改成“下载结果包(ZIP)”,并在旁边加小字:“包含所有检测图及JSON”。
4. 训练微调:数据集格式对了,标注文件还是报错?
文档强调“必须ICDAR2015格式”,但实测发现:即使目录结构完全一样,train_gts/1.txt里只要有一行末尾多了个空格,或者文本内容里有制表符\t,训练就会在dataloader阶段报错ValueError: not enough values to unpack (expected 9, got 8),错误位置指向dataset.py第88行——根本看不出是空格惹的祸。
4.1 坑点:txt标注文件必须Unix换行符(LF),Windows的CRLF直接报错
你在Windows上用记事本写标注,保存时默认CRLF(\r\n),Linux容器里读取时,\r被当作文本内容的一部分,导致split(',')后多出一个空字段。
怎么救:
- VS Code打开txt → 右下角点击
CRLF→ 选LF→ 保存 - 或命令行批量转换:
sed -i 's/\r$//' train_gts/*.txt怎么防:在数据集准备章节加一行:“请确保所有.txt文件使用LF换行符,可用file train_gts/1.txt命令检查(应显示with CRLF line terminators)”。
4.2 坑点:列表文件train_list.txt路径必须相对,且不能有空格
train_list.txt里写:
train_images/1.jpg train_gts/1.txt看着没问题。但如果train_images/1.jpg实际路径是/root/data/train_images/1.jpg,而你把train_list.txt放在/root/custom_data/,那程序会去/root/custom_data/train_images/1.jpg找——路径错了。
怎么救:
- 列表文件里的路径,必须相对于
train_list.txt所在目录 - 更稳妥:用绝对路径(在WebUI输入框填
/root/custom_data,列表里就写/root/custom_data/train_images/1.jpg)
怎么防:在WebUI训练页,“训练数据目录”输入框旁加提示:“列表文件中的路径将相对于此目录解析”。
5. ONNX导出:导出成功≠能用,这个shape坑了所有人
导出ONNX时,界面显示“导出成功!文件大小23.7MB”,你兴冲冲拿去Python里加载,ort.InferenceSession("model.onnx")直接报错:InvalidArgument: Input 'input' has incompatible shape
——因为WebUI导出的ONNX模型,输入shape是动态的([1,3,-1,-1]),而ONNX Runtime默认要求静态shape。
5.1 坑点:ONNX模型输入尺寸必须与导出时设置完全一致
你导出时设了“输入高度800,宽度800”,那推理时图片必须resize到严格800×800,差1像素都不行。cv2.resize(image, (800,800))是对的,但cv2.resize(image, (800, 801))就会崩。
怎么救:
- 推理前务必校验尺寸:
image = cv2.imread("test.jpg") h, w = image.shape[:2] if h != 800 or w != 800: image = cv2.resize(image, (800, 800)) print(f" 已将图片resize为800×800(原{w}×{h})")怎么防:在ONNX导出示例代码里,把cv2.resize那行加粗,并注释:“此处尺寸必须与WebUI导出设置完全一致,否则报错”。
5.2 坑点:ONNX模型不带预处理,你得自己做归一化
示例代码里有/ 255.0,但没说清楚:这是除以255,不是减均值除标准差。如果你按PyTorch常用方式做了normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]),结果全是噪声。
怎么救:
- 严格按示例代码:
input_blob = input_blob.astype(np.float32) / 255.0 - 不做任何其他归一化
怎么防:在ONNX使用说明里加粗:“ 本模型仅接受[0,1]范围输入,无需减均值/除标准差”。
6. 故障排除:比文档多一条,就能少debug两小时
最后汇总几个文档没写、但高频发生的“幽灵问题”:
6.1 浏览器缓存导致界面错乱
改了代码或配置,刷新页面还是旧UI。不是服务没重启,是浏览器缓存了JS/CSS。
解决:Ctrl+F5强制刷新,或Chrome里F12 → Network → 勾选Disable cache。
6.2 检测结果里中文显示为方块
WebUI界面中文正常,但detection_result.png里文字是□□□。因为容器里没装中文字体。
解决:进容器执行
apt-get update && apt-get install -y fonts-wqy-zenhei fc-cache -fv6.3 训练日志里出现nan loss
学习率设太高(比如0.1),或Batch Size太大(>16),loss直接爆炸。
解决:学习率降到0.001,Batch Size设8,再试。
6.4workdirs/目录爆满,磁盘告警
每次训练都生成新子目录,没人清理。du -sh workdirs/* | sort -hr | head -5查最大的5个,rm -rf workdirs/old_exp_2026*清理。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。