【PyTorch】crnn-json格式解析与图片子框获取

解析标注的集装箱数据,根据坐标获取其中的子框与label进行crnn训练

#-*- coding: UTF-8 -*-
import json
import os
import sys
from tqdm import tqdm
import cv2


img_path = 'C:/Users/admin/Desktop/123/jizhuangx/image/'
img_split = 'C:/Users/admin/Desktop/123/jizhuangx/splitImages/'
json_path = 'C:/Users/admin/Desktop/123/jizhuangx/json/'

def min_max_xy(points):
    xlist = []
    ylist = []
    for list_fn in points:
        xlist.append(list_fn[0])
        ylist.append(list_fn[1])
    #print('11111:', xlist)
    #print('22222:', ylist)
    xmin = min(xlist)
    xmax = max(xlist)
    ymin = min(ylist)
    ymax = max(ylist)
    #print('1111111111:', xmin, ymin, xmax, ymax)
    return xmin, ymin, xmax, ymax

def resolve_json(jsonname):
    with open(jsonname) as f:
        data = ''
        while True:
            line = f.readline()
            #print('1111:', line)
            if not line:
                break
            #if 'imageData' in line:
            #    continue
            data += line.rstrip()
        data = json.loads(data)
        #print('22222222:', data)
        #print('222223333:', type(data))  #解析成字典对象
        img_name = data['imagePath']
        name, _ = os.path.splitext(img_name)
        img = cv2.imread(os.path.join(img_path,img_name))
        
        nLength = len(data['shapes'])
        #for shape in data['shapes']: #每个元素是个字典对象
        out = []
        for i in range(nLength):
            #i = 0
            img_newName = name + '-%03d' % i + '.jpg'
            label = data['shapes'][i]['label']
            str = img_newName + ' ' +label + '\n'
            out.append(str)
            #points = shape['points']
            points = data['shapes'][i]['points']
            x_min, y_min, x_max, y_max = min_max_xy(points)
            img_tmp = img[y_min:y_max, x_min:x_max]
            cv2.imwrite(os.path.join(img_split, img_newName), img_tmp)
            
        with open('C:/Users/admin/Desktop/123/jizhuangx/splitlabel.txt', 'a') as o:
            o.writelines(out)
            #for x, y in shape['points']:
                #i += 2
                #print(str(x) + " " + str(y))
                #txt_file = open('label/' + bfn + '.txt', 'a')
                #if i % 8 == 0:
                    #strResult = str(x) + ',' + str(y) + '\n'
                    #txt_file.write(strResult)
                #else:
                    #strResult = str(x) + ',' + str(y) + ','
                    #txt_file.write(strResult)
            #txt_file.close()
def main():        
    
    json_fns = os.listdir(json_path)
    json_fns.sort()
    #print('111111111111:', json_fns)

    for json_fn in json_fns:
        #try:
        #_, fn = os.path.split(json_fn)
        #print('111111111111:', json_fn)
        bfn, ext = os.path.splitext(json_fn)
        if ext.lower() not in ['.json']:
            continue
        resolve_json(json_path + json_fn)
        
        #except:
        #    print("Error processing {}".format(json_fn))

if __name__ == '__main__':
    main()

 

<think>好的,我现在需要帮助用户解决如何在图片中检测和定位文字的问题,也就是OCR文字位置识别。首先,我得回忆一下相关的知识和方法。根据用户提供的引用,有三个主要的资源:使用Tesseract OCR、Python调用百度OCR,以及基于TensorFlow/Keras/PyTorch的OCR项目。我需要结合这些信息,给出一个结构清晰的回答。 首先,用户的问题是如何在图片中检测和定位文字的位置。这通常涉及两个步骤:文本检测和文本识别。但用户主要关注的是检测和定位,也就是找到文字所在的区域,而不是识别具体的文字内容。不过,通常这两个步骤是结合在一起的,比如先检测再识别。 接下来,我需要考虑不同的方法。根据引用[1]和[3],Tesseract OCR和基于深度学习的架(如TensorFlow/Keras/PyTorch)都可以用于文字检测和识别。而引用[2]提到Python调用百度OCR,这可能是一个API服务,可以处理整个OCR过程,包括定位。 首先,我应该分步骤说明不同的方法。比如,传统OCR工具如Tesseract,可能需要预处理图像,然后使用其内置的检测功能。然后,深度学习方法可能更灵活,可以自定义模型来检测文字区域。再者,云服务API如百度OCR,用户只需要调用接口,就能返回文字位置信息,这可能对编程能力要求较低。 需要确保每个步骤都清晰,并给出具体的代码示例或命令,例如如何使用Tesseract的Python包装库pytesseract来获取文字的位置。同时,对于深度学习方法,可能需要提到一些流行的架或项目,比如EAST检测器或CRNN模型,但用户提供的引用中有个CV-OCR项目,基于TensorFlow和PyTorch,所以应该引用那个项目作为例。 另外,需要注意用户提到的“定位文字的位置”,可能需要强调文本检测部分,即使用目标检测或区域检测算法来找出文字区域的位置坐标。比如,EAST(Efficient and Accurate Scene Text detector)是一种常用的文本检测模型,可以输出文字区域的边界。 同时,引用[3]中的项目提供了训练代码,用户如果有自定义数据集的需求,可以参考该项目进行训练和调整。但如果是直接使用预训练模型,可能更简单。 对于云服务方案,百度OCR的API会返回每个文字区域的位置信息,比如顶点坐标,用户只需要调用API并解析结果即可。这对于快速实现且不需要本地计算资源的用户来说是个好选择。 需要确保回答中的技术术语正确,并且每个方法都有具体的步骤或代码示例。比如,使用Tesseract的话,代码可能包括导入库,读取图片,调用image_to_data函数获取的位置;使用百度OCR的话,需要安装SDK,获取API key,发送请求并解析返回的JSON数据中的位置字段;对于深度学习架,可能需要加载预训练模型,进行推理,然后解析输出层得到文本坐标。 还要注意用户可能需要安装哪些库,比如pytesseract需要安装Tesseract引擎本身,以及Python的库。而百度OCR需要安装baidu-aip等包。同时,引用中的项目可能需要克隆GitHub仓库,安装依赖项,按照文档运行代码。 最后,在相关问题部分,应该涵盖性能优化、多语言支持、处理复杂背景、提升准确率等常见问题,这样用户可以根据自己的需求进一步探索。 现在,需要将这些思路整理成一个结构化的回答,分步骤说明不同的方法,给出代码示例,并正确引用提供的资料。同时,确保使用正确的LaTeX格式,虽然这个问题中可能数学公式不多,但如果有变量或方程的话,需要用$...$包裹。不过在这个问题中可能更多是代码和步骤,所以重点在于代码块和引用标记。</think>在图片中检测和定位文字的位置通常分为两步:**文字区域检测**和**OCR识别**。以下是具体方法及实现步骤: --- ### 一、传统OCR工具定位文字(Tesseract) Tesseract OCR 支持文字区域检测识别,通过 Python 的 `pytesseract` 库可直接获取文字位置信息。 1. **安装依赖**: ```bash pip install pytesseract opencv-python # 需额外安装 Tesseract 引擎(Windows:https://github.com/UB-Mannheim/tesseract/wiki) ``` 2. **代码示例**: ```python import cv2 import pytesseract image = cv2.imread('image.jpg') data = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT) # 提取文字位置信息(左、顶、宽、高) for i in range(len(data['text'])): if data['conf'][i] > 60: # 置信度阈值 x, y, w, h = data['left'][i], data['top'][i], data['width'][i], data['height'][i] cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imwrite('output.jpg', image) ``` 此方法适用于简单场景,但对复杂布局或低分辨率图片效果有限[^1]。 --- ### 二、深度学习架实现文字检测 基于引用[3]的 **CV-OCR** 项目,使用预训练模型检测文字区域: 1. **克隆项目并安装依赖**: ```bash git clone https://github.com/cxh1231/CV-OCR cd CV-OCR pip install -r requirements.txt # 根据版本选择keras或pytorch ``` 2. **加载模型并推理**: ```python # 示例代码(以EAST检测器为例) import cv2 from models.east import load_east_model model = load_east_model('east.pb') # 加载预训练模型 image = cv2.imread('image.jpg') boxes = model.detect(text_regions=image) # 获取文本坐标 # 绘制检测 for box in boxes: cv2.polylines(image, [box], isClosed=True, color=(0, 255, 0), thickness=2) cv2.imwrite('output.jpg', image) ``` 此方法对倾斜、弯曲文本的定位更准确[^3]。 --- ### 三、云服务API(百度OCR) 通过调用百度OCR API直接返回文字位置信息: 1. **安装SDK并配置API Key**: ```bash pip install baidu-aip ``` ```python from aip import AipOcr APP_ID = 'your_app_id' API_KEY = 'your_api_key' SECRET_KEY = 'your_secret_key' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) ``` 2. **调用接口并解析结果**: ```python with open('image.jpg', 'rb') as f: image = f.read() result = client.general(image) # 提取文字位置(返回顶点坐标) for word in result['words_result']: vertices = word['location'] # 格式:{'left':x, 'top':y, 'width':w, 'height':h} print(f"文字位置:{vertices}") ``` 此方法适合快速集成,但需网络支持[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值