yolo+ocr集装箱字符识别(pytorch版本)

2023-05-16

前言

这个是我 的大创项目。当我们拿到一份数据集,首先就是要对整个项目有个较为清晰的认识,整体的思路是什么,难点在哪,怎么部署和实现。
1.整体的思路
①先通过目标检测网络(比如:yolov5等)识别项目中图像中需要识别的字符区域
②其次再使用ocr相关的技术对于字符区域进行识别
③相应的后处理操作,数据库操作以及部署方式
在这里插入图片描述

2.首先我想先介绍一下我们需要是别的区域及其字符的意义
在这里插入图片描述
3.遇到的难点
①严重曝光过度
在这里插入图片描述
当然也有出现根本无法挽回的曝光(全屏白色)!!!‘

解决办法:
OpenCV使用直方图均衡,修正曝光过度

②集装箱平面不平整带来的字符弯曲
解决办法:提高ocr字符识别的泛化能力

③出于落地性的考量,模型一定要尽可能轻量化
解决办法:
使用较为轻量化的backbone
剪枝操作
蒸馏操作

1.目标检测网络

目标识别网络我用了当时(v6,v7还没出)还比较流行性和实用性比较高的Yolov5

(1)数据清洗和标注

我们数据集的数量是16000多张,而且整体的标注上不和我心意,所以我就重新搞了一下
16000多张一张一张标注显然不现实,我的想法就是半自动标注感兴趣的可以看一下这个

(2)模型改进

因为16000张,不做任何改进训练都要两天,所以我取了4500张左右作为训练集,500张左右val 做了个demo
下面写一下实际上能使用的:
(1)替换 backbone(MobileNet V3…)
(2)更换激活函数
(3)更换iou
(4)加入注意集中机制

2.ocr

这个部分我一开始是通过yolov5识别到的图像的坐标点直接输入ocr识别网络进行识别。但是我发现现在的ocr架构基本上都是“检测+识别”,因此我就面临三个方向:
①改代码

②使用非端对端的架构
个人不喜欢非端对端,部署上有困难
③推倒重来

2.1 面临的的问题就是:

2.1.1如何识别坐标点给出的roi区域?

a)首先要先把yolov5返回识别框的位置信息(对角两点 or 左上点+矩形长宽)

不知道怎么找到左上角右下角的可以看看这篇找到绘制识别框的左上右下点

b)使用ocr识别字体

一个比较直观的想法就是直接在box_label里面使用ocr,但是在检测的代码中需要多假加入一个参数

法一:EASYOCR

在这里插入图片描述

我这里使用的是easyocr

 def box_label(self, box, label='', color=(128, 128, 128), txt_color=(255, 255, 255)):
        # Add one xyxy box to image with label
        if self.pil or not is_ascii(label):
            self.draw.rectangle(box, width=self.lw, outline=color)  # box
            if label:
                w, h = self.font.getsize(label)  # text width, height
                outside = box[1] - h >= 0  # label fits outside box
                self.draw.rectangle((box[0],
                                     box[1] - h if outside else box[1],
                                     box[0] + w + 1,
                                     box[1] + 1 if outside else box[1] + h + 1), fill=color)
                # self.draw.text((box[0], box[1]), label, fill=txt_color, font=self.font, anchor='ls')  # for PIL>8.0
                self.draw.text((box[0], box[1] - h if outside else box[1]), label, fill=txt_color, font=self.font)
        else:  # cv2

            p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))
            #ocr操作
            #左上角(int(box[0]), int(box[1])),右下角(int(box[2]), int(box[3])
            width=abs(int(box[2])-int(box[0]))
            height=abs(int(box[1])-int(box[3]))
            import easyocr
            imgCrop = self.im[int(box[1]):int(box[1])+height, int(box[0]):int(box[0])+width].copy()
            #可以把这里写成接口函数,就可以试试不同ocr的效果
            reader = easyocr.Reader(['en'],gpu = False)
            result = reader.readtext(imgCrop)
            print(result)

        

在这里插入图片描述
可以识别但是会因为字符相似性产生较大误差。

法二:cnocr
    def box_label(self, box, label='', color=(128, 128, 128), txt_color=(255, 255, 255)):
        # Add one xyxy box to image with label
        if self.pil or not is_ascii(label):
            self.draw.rectangle(box, width=self.lw, outline=color)  # box
            if label:
                w, h = self.font.getsize(label)  # text width, height
                outside = box[1] - h >= 0  # label fits outside box
                self.draw.rectangle((box[0],
                                     box[1] - h if outside else box[1],
                                     box[0] + w + 1,
                                     box[1] + 1 if outside else box[1] + h + 1), fill=color)
                # self.draw.text((box[0], box[1]), label, fill=txt_color, font=self.font, anchor='ls')  # for PIL>8.0
                self.draw.text((box[0], box[1] - h if outside else box[1]), label, fill=txt_color, font=self.font)
        else:  # cv2

            p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))
            #ocr操作
            #左上角(int(box[0]), int(box[1])),右下角(int(box[2]), int(box[3])
            width=abs(int(box[2])-int(box[0]))
            height=abs(int(box[1])-int(box[3]))

            imgCrop = self.im[int(box[1]):int(box[1])+height, int(box[0]):int(box[0])+width].copy()
            #可以把这里写成接口函数,就可以试试不同ocr的效果

            ########easyocr#########
            # import easyocr
            # reader = easyocr.Reader(['en'],gpu = False)
            # result = reader.readtext(imgCrop)
            # print(result)


            #######cnocr
            from cnocr import CnOcr
            ocr = CnOcr(rec_model_name='en_number_mobile_v2.0')
            out = ocr.ocr(imgCrop)
            print(out)

整体效果完全可以!!!
在这里插入图片描述

法三:数字识别模型

2.1.2 调优或者重新训练

调优的话,当然是包括3个方面:(1)数字区域识别 (2)ocr (3)后处理
首先检查一下当前detect的效果:

2.1.2.1 在数字区域识别上:

(1)覆盖区域不全影响检测效果
(2)竖式排布效果差检测
我的想法是通过opencv仿射变换增加竖直图像排布的图片

在这里插入图片描述
上诉两个问题刚好是同一张图

(3)小概率的误识别
在这里插入图片描述
在这里插入图片描述

一个比较直观的想法就是调高阈值以及增加训练集

2.1.2.2数字的识别

对于数字的识别上:
(1)竖直
(2)模糊,重影
(3)破损,拍摄不全导致的字母不全

在这里插入图片描述
在这里插入图片描述

当然对于一些数字的识别效果比较差,既然选定使用cnocr现在的主要方法就是如何进一步优化!!!
训练自己的数据集是必须的了

2.1.2.3后处理

我的目标效果是:
在这里插入图片描述
对于正对的图片确实可以取得比较好的效果,但是由于曝光,数字破损等原因,效果会变差。
因此后处理除了对ocr获得的数字进行分类输出之外,更重要的是进行一些opencv的图像操作以提高图片数字的可识别性能。

(1)对于曝光过度的后处理策略:灰度拉伸
def grey_scale(image):
    img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    rows, cols = img_gray.shape
    flat_gray = img_gray.reshape((cols * rows)).tolist()
    min1 = min(flat_gray)
    max1 = max(flat_gray)
    print('min = %d,max = %d' % (min1, max1))
    output = np.uint8(255 / (max1 - min1) * (img_gray - min1) + 0.5)
    return output

在这里插入图片描述
img2就是进行了灰度拉伸清晰度upup,因为字体和背景底色不确定因此难以进一步进行腐蚀和膨胀

(2)直方图均衡化
def balance(src):
    (b, g, r) = cv2.split(src)
    # 对三个通道都进行均衡化
    bH = cv2.equalizeHist(b)
    gH = cv2.equalizeHist(g)
    rH = cv2.equalizeHist(r)
    # 最后合并
    result = cv2.merge((bH, gH, rH))
    return result
(3) 通过仿射变换矫正图像

2.1.2.4训练自己的数据集

详细介绍!!!
在这里插入图片描述
他的文件标注格式好像是可以是txt。其中写入放入训练集
①每一张图片的名称
②用\t分割
③对应的文字。但每一个文字要用单个空格分割,含有空格的话就要用代替
在这里插入图片描述
我的训练集中的数量确实是可以做一个数据集的但是我一个人做确实是有点扛不住,所以我的想法是直接在“en_number_mobile_v2.0”这个模型上面调优以增强其泛化性

3. 最后

做完之后,我们最后是决定整体使用paddle来做(手动难过

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolo+ocr集装箱字符识别(pytorch版本) 的相关文章

  • 使用背景校正图像 (Python)

    我正在开发一个项目 对标签上的文本进行 OCR 操作 我的工作是对图像进行倾斜校正 使其可以用超正方体读取 I have been using this approach https www pyimagesearch com 2017 0
  • 为什么ssd和yolo没有roi池化层?

    我们知道目标检测框架像faster rcnn and mask rcnn has an roi pooling layer or roi align layer 但是为什么ssd和yolo框架没有这样的层呢 首先我们要明白这样做的目的是什么
  • 如何避免 PyTorch 中的“CUDA 内存不足”

    我认为对于 GPU 内存较低的 PyTorch 用户来说 这是一个非常常见的消息 RuntimeError CUDA out of memory Tried to allocate X MiB GPU X X GiB total capac
  • pytorch grad 在 .backward() 之后为 None

    我刚刚安装火炬 1 0 0 on Python 3 7 2 macOS 并尝试tutorial https pytorch org tutorials beginner blitz autograd tutorial html sphx g
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • 为什么我在这里遇到被零除的错误?

    所以我正在关注这个文档中的教程 https pytorch org tutorials beginner data loading tutorial html在自定义数据集上 我使用的是 MNIST 数据集 而不是教程中的奇特数据集 这是D
  • Google Vision API 文本识别器无法正常工作

    我使用 Google Vision API 来读取报纸等任何物体上的文本或墙上的文本 我已经尝试过来自 Google 开发者网站的相同示例 但我的文本识别器总是返回 falseIsOperational功能 我在 Blackberry ke
  • 使用 KL 散度时,变分自动编码器为每个输入 mnist 图像提供相同的输出图像

    当不使用 KL 散度项时 VAE 几乎完美地重建 mnist 图像 但在提供随机噪声时无法正确生成新图像 当使用 KL 散度项时 VAE 在重建和生成图像时都会给出相同的奇怪输出 这是损失函数的 pytorch 代码 def loss fu
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 如何使用pytorch构建多任务DNN,例如超过100个任务?

    下面是使用 pytorch 为两个回归任务构建 DNN 的示例代码 这forward函数返回两个输出 x1 x2 用于大量回归 分类任务的网络怎么样 例如 100 或 1000 个输出 对所有输出 例如 x1 x2 x100 进行硬编码绝对
  • 在 google Vision OCR 中被识别为单个单词的特殊字符?

    我试图让谷歌视觉 OCR 正则表达式可搜索 我已经完成了它 并且当文档仅包含英文字符时效果很好 但当有其他语言的文本时 它就会失败 发生这种情况是因为我在谷歌视觉单词组件中只有英文字符 如下所示 VISION API WORD COUNTE
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • PyTorch 中的交叉熵

    交叉熵公式 但为什么下面给出loss 0 7437代替loss 0 since 1 log 1 0 import torch import torch nn as nn from torch autograd import Variable
  • 在 Pytorch 中估计高斯模型的混合

    我实际上想估计一个以高斯混合作为基本分布的归一化流 所以我有点被火炬困住了 但是 您可以通过估计 torch 中高斯模型的混合来在代码中重现我的错误 我的代码如下 import numpy as np import matplotlib p
  • 如何使用 pytorch 同时迭代两个数据加载器?

    我正在尝试实现一个接收两张图像的暹罗网络 我加载这些图像并创建两个单独的数据加载器 在我的循环中 我想同时遍历两个数据加载器 以便我可以在两个图像上训练网络 for i data in enumerate zip dataloaders1
  • Tess4j 问题 java.lang.UnsatisfiedLinkError

    我正在尝试解决 Tess4J 安装问题 1 我在 WEB INF win32 x86 中创建了一个文件夹2 我把 libtesseract302 dll 和 liblept168 dll 放在那里 然后将其添加到 java 构建路径中的源
  • 在Pytorch中计算欧几里得范数..理解和实现上的麻烦

    我见过另一个 StackOverflow 线程讨论计算欧几里德范数的各种实现 但我很难理解特定实现的原因 如何工作 该代码可以在 MMD 指标的实现中找到 https github com josipd torch two sample b
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 将 Pytorch LSTM 的状态参数转换为 Keras LSTM

    我试图将现有的经过训练的 PyTorch 模型移植到 Keras 中 在移植过程中 我陷入了LSTM层 LSTM 网络的 Keras 实现似乎具有三种状态类型的状态矩阵 而 Pytorch 实现则具有四种状态矩阵 例如 对于hidden l
  • 在requirements.txt中包含.whl安装

    如何将其包含在requirements txt 文件中 对于Linux pip install http download pytorch org whl cu75 torch 0 1 12 post2 cp27 none linux x8

随机推荐

  • 计讯物联水利RTU赋能智慧水务,用科技守护供水生命线

    水是城市生存和发展 群众安身立命的必备条件之一 xff0c 城市的发展以及社会经济活动都离不开水 因此 xff0c 随着信息化技术的迅猛发展 xff0c 水务数字化已成为必然趋势 计讯物联依托数字孪生可视化 物联网 大数据 三维地理信息系统
  • 计讯物联环保数采仪TS910在扬尘预警监测解决方案的应用

    方案背景 随着我国经济高速发展和城市化进程的加速 xff0c 城市建设工程规模不断扩大 xff0c 工程施工给居住区 学校 医院等周边环境带来了巨大的影响 xff0c 特别是扬尘污染带来的细颗粒物 xff0c 严重危害到人体健康和大气环境质
  • 喜讯丨计讯物联荣获厦门软件园党群服务中心篮球赛亚军

    蓄势待发迎 篮 上 xff0c 齐心协力谱新篇 12月17日 xff0c 厦门软件园党群服务中心篮球赛完美落幕 计讯物联一路过关斩将 xff0c 荣获厦门软件园党群服务中心篮球赛亚军 决胜雅马哈 xff0c 强势晋级半决赛 随着一声哨响 x
  • Ubuntu 命令行安装chrome

    1 1 下载 Google Chrome 使用Ctrl 43 Alt 43 T快捷键或者点击终端图标 xff0c 打开你的终端 使用wget来下载 Google Chrome deb 软件包 xff1a wget https dl goog
  • unity实现物体沿指定的平滑曲线移动(贝塞尔曲线拟合)

    先上原文链接 xff1a unity 实现物体沿指定的平滑曲线移动 xff08 通过贝塞尔曲线实现 xff09 以梦为马 不负韶华的博客 CSDN博客 unity 贝塞尔曲线移动 输入程序后 xff0c 首先设置Size的值 xff0c 即
  • A*Pathfind Project的使用

    本文主要是对该文章的改进 xff1a Unity学习笔记 易学易会的unity中A星寻路插件 A Pathfind Project的使用 秋瞑小雁客的博客 CSDN博客 unity 寻路插件 上述文章中的代码在运行过程中 xff0c 角色到
  • 如何在Ubuntu上安装Apache Http服务器

    有两种方法可以在Ubuntu上安装Apache Http服务器 xff1a 使用apt命令自动安装 配置和构建源代码 xff0c 然后手动安装 1 自动安装 1 使用 apt cache search 命令搜索Apache软件包 apt c
  • Ubuntu18.04安装ROS系统

    1 Ubuntu与ROS的版本对应 Ubuntu ROS1 016 04LTSKinetic LTS18 04LTSMelodic LTS20 04LTSNoetic LTS 2 安装 本文为Ubuntu18 04版本下的安装 2 1准备工
  • 从Unity导出Obj格式的地形(Terrian)

    1 在Unity中创建C 脚本 using UnityEngine using System Collections using UnityEditor using System IO using UnityEngine SceneMana
  • Unity导出工作台(Console)数据

    首先在Unity中添加C 脚本 xff1a using System Collections using System Collections Generic using UnityEngine using UnityEditor usin
  • 2022研究生数学建模B题思路

    子问题1 xff1a 排样优化问题 要求建立混合整数规划模型 xff0c 在满足生产订单需求和相关约束条件下 xff0c 尽可能减少板材用量 约束 1 在相同栈 stack xff09 里的产品项 item xff09 的宽度 xff08
  • 找到并标记Mesh顶点

    1 在Unity 3D中新建一个物体 本文以Cube为例 2 创建一个C 脚本 命名为MeshTest 3 在脚本中写入程序 在打开的脚本 MeshTest 上编写代码 xff0c 首先获取 MeshFilter 组件 xff0c 然后获取
  • win11 命令 wmic:无效的指令 解决办法

    我想你肯定看到过让你修改环境变量的方法 但是 xff0c 如果你的电脑就根本没有装wmic xff0c 再怎么修改环境变量也是徒劳 我们打开设置 xff1a Win 43 I 点击应用 选择 可选功能 添加可选功能 搜索wmic xff0c
  • 【STM32】GPIO_InitTypeDef GPIO_InitStructure;语句的理解

    这句话声明一个结构体 xff0c 名字是GPIO InitStructure xff0c 结构体原型由GPIO InitTypeDef 确定 xff0c 在stm32中用来初始化GPIO 设置完GPIO InitStructure里面的内容
  • 如何在VScode上运行C语言

    如何在VS code上运行C语言 安装VS code 下载MinGW w64 xff1b 查验是否成功 我在VS code上尝试运行C语言后 xff0c 想和大家分享一下经验 安装VS code 下载MinGW w64 xff1b 查验是否
  • Node.js 如何实现OCR文字识别

    Node js 如何实现OCR文字识别 OCR Optical Character Recognition 是指用光学技术识别文字图像的技术 随着全新的技术出现 xff0c OCR 技术已经发展成为一种非常先进的技术 xff0c 可以从图片
  • Jetson nano烧录与简介

    Jetson nano 烧录教程 文章目录 Jetson nano 烧录教程 Jetson nano 简介1 Jetson Nano 接口介绍2 盒内包含3 不包含的物品 xff08 额外购入 xff09 4 Jetson nano的三种供
  • 51单片机-定时器(简易时钟的实现)

    文章目录 前言一 定时器的功能以及定时器的结构定时器的功能定时器的结构 二 定时器的控制工作模式寄存器TMOD控制寄存器TCON写代码来初始化定时器 三 定时器引发中断简易时钟主程序main c延时函数Delay c控制LCD162模块LC
  • 用于评估婴儿认知发展的IMU内嵌式玩具

    0 5岁是神经发育的敏感时期 xff0c 对身心健康至关重要的EF xff08 执行功能 Executive functions xff09 会在这个时期出现 在现代临床和研究实践中 xff0c 编码员通过手动标记视频中婴儿在使用玩具或社交
  • yolo+ocr集装箱字符识别(pytorch版本)

    前言 这个是我们 的大创项目 当我们拿到一份数据集 xff0c 首先就是要对整个项目有个较为清晰的认识 xff0c 整体的思路是什么 xff0c 难点在哪 xff0c 怎么部署和实现 1 整体的思路 xff1a 先通过目标检测网络 xff0