PPOCRLabel格式转换成yolo格

您好,上次提问使用PPOCRLabel格式转换成yolo格式,发现是我的路径名字不对,现在我修改咯,但是发现报错。
代码:


```python
import os
import cv2

filename = "/home/lixinru/PaddleOCR/dataset/train_data/train_data_all"

"""
# 读取数据文件
"""


def read_txt(file_name):
    data = []
    file = open(file_name, 'r', encoding='utf-8')
    file_data = file.readlines()  # 读取所有行
    for row in file_data:
        tmp_list = row.split(' ')
        data.append(tmp_list)  # 将每行数据插入data中
    file.close()
    return data


"""
# 创建文件夹
"""


def create_folder(filename):
    filename = filename.strip()
    filename = filename.rstrip("\\")
    isExists = os.path.exists(filename)

    if not isExists:
        os.makedirs(filename)
        print(filename + "创建成功")
        return True
    else:
        print(filename + "已存在")
        return False


"""
# 创建txt标注文件
"""


def txt_create(name, msg):
    desktop_path = filename  # 新创建的txt文件的存放路径
    full_path = desktop_path + "/" + name.split('.')[0] + '.txt'

    if os.path.exists(full_path):
        file = open(full_path, 'a', encoding='utf-8')
        file.write(msg + '\n')
        file.close()
    else:
        file = open(full_path, 'w', encoding='utf-8')
        file.write(msg + '\n')
        file.close()


"""
# 坐标归一化
"""


def normalization(xmin, ymin, xmax, ymax, img_w, img_h):
    x = round((xmin + xmax) / (2.0 * img_w), 6)
    y = round((ymin + ymax) / (2.0 * img_h), 6)
    w = round((xmax - xmin) / (1.0 * img_w), 6)
    h = round((ymax - ymin) / (1.0 * img_h), 6)
    return x, y, w, h


"""
# 每张图片的尺寸
"""


def get_img_size(img_path):
    print(img_path)
    mat = cv2.imread(img_path)
    if mat is None:
        return mat
    return mat.shape


if __name__ == "__main__":
    data = read_txt("/home/lixinru/PaddleOCR/dataset/train_data/train_data_all/Label.txt")  # 原始数据表
    create_folder("/home/lixinru/Vir_env/Turning")

    for img_data in data:
        img_name = str(img_data).split("\\t")[0].split('/')[1]  # 每行数据提取图片名
        xywh = str(img_data).split("\\t")[1].split("\\n")[0].replace("',", "").replace("'", "").strip('[').strip(
            ']').replace("false", "1").replace("true", "1")  # 每行数据提取坐标信息BAOCUO
        # print(xywh)
        xywh = eval(xywh)  # 转换为元组或者字典
        img_size = get_img_size(img_name)
        if img_size is None:
            continue
        if type(xywh) == tuple:
            for xy_line in xywh:
                yolo_data = normalization(xy_line['points'][0][0], xy_line['points'][0][1], xy_line['points'][2][0],
                                          xy_line['points'][2][1], img_size[1],
                                          img_size[0])  # 处理每个字典的坐标信息,转换为归一化后的yolo标注格式
                # print("0 %s %s %s %s" % (str(yolo_data[0]) , str(yolo_data[1]) , str(yolo_data[2]) , str(yolo_data[3])))
                # print(img_name)
                txt_create(img_name, "0 %s %s %s %s" % (
                str(yolo_data[0]), str(yolo_data[1]), str(yolo_data[2]), str(yolo_data[3])))
        if type(xywh) == dict:
            yolo_data = normalization(xywh['points'][0][0], xywh['points'][0][1], xywh['points'][2][0],
                                      xywh['points'][2][1], img_size[1], img_size[0])
            txt_create(img_name,
                       "0 %s %s %s %s" % (str(yolo_data[0]), str(yolo_data[1]), str(yolo_data[2]), str(yolo_data[3])))
            # print("0 %s %s %s %s" % (str(yolo_data[0]) , str(yolo_data[1]) , str(yolo_data[2]) , str(yolo_data[3])))
            # print(img_name)


报错是很多行下面的内容:
```python
[ WARN:0@0.702] global /io/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('home'): can't open/read file: check file path/integrity
[ WARN:0@0.702] global /io/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('home'): can't open/read file: check file path/integrity
[ WARN:0@0.702] global /io/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('home'): can't open/read file: check file path/integrity
[ WARN:0@0.702] global /io/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('home'): can't open/read file: check file path/integrity

您好,从报错来看,主要是imread函数在读取图片时出现了问题。
这个问题主要有两个方面需要检查:

  1. 图片路径是否正确
    在代码中生成图片路径时,最好打印出来看一下是否与实际图片路径一致。很可能由于路径拼接错误,导致imread无法读取到图片。
  2. 图片本身是否正常
    有时图片由于各种原因损坏或无法打开,也会导致imread失败。可以试着用其他图片查看程序打开图片,查看图片是否正常。
    建议的解决方案:
  3. 在get_img_size函数中打印出img_path,检查是否与实际路径一致。
  4. 可以在imread之前,用os.path.exists(img_path)检查图片路径是否存在。
  5. 尝试直接读取几张样本图片,看是否可以成功打开。
  6. 如果样本图片可以打开,那么问题可能出在路径拼接上,需要重新检查各个变量,以及字符串拼接的逻辑。
  7. 如果样本图片也无法打开,说明图片本身可能有问题,需要重新检查图片数据。
  8. 另外也可以试试opencv的新版本,有时不同版本的兼容性会有差异。
    希望这些思路可以帮助您进一步定位和解决这个问题。如果还有其他疑问,欢迎随时提出来,我会继续尝试提供些思路。