PaddleX icon indicating copy to clipboard operation
PaddleX copied to clipboard

训练产生的错误

Open Shengshenlan opened this issue 2 years ago • 3 comments

Checklist:

  1. 查找历史相关issue寻求解答
  2. 翻阅FAQ常见问题汇总和答疑
  3. 确认bug是否在新版本里还未修复
  4. 翻阅PaddleX API文档说明

描述问题

复现

  1. 您是否已经正常运行我们提供的教程

  2. 您是否在教程的基础上修改代码内容?还请您提供运行的代码 `

解压文件

!mkdir work/data !unzip -oq data/data115729/VisDrone2019-DET-train.zip -d work/data !unzip -oq data/data115729/VisDrone2019-DET-val.zip -d work/data

import os import cv2 import numpy as np from PIL import Image

这里只检测这11个类

category_list = ['pedestrain', 'people', 'bicycle', 'car', 'van','truck', 'tricycle', 'awning-tricycle', 'bus', 'motor']

生成对应的xml文件

from xml.etree import ElementTree as et import xml.dom.minidom as minidom

import os import cv2 import numpy as np from PIL import Image

for mode in ['train', 'val']: i = 0 all_img_path = '/home/aistudio/work/VisDrone_PascalVOC/VisDrone2019-DET-{}/images'.format(mode) img_list = os.listdir(all_img_path) for img_name in img_list: anno_path = "/home/aistudio/work/VisDrone_PascalVOC/VisDrone2019-DET-{}/annotations".format(mode) +'/'+ img_name[:-4] + ".txt" if not os.path.isfile(anno_path): print('File is not exist!', anno_path) continue img_path = os.path.join(all_img_path, img_name) img = cv2.imread(img_path) h, w, c = img.shape # 创建根节点 root = et.Element('annotation') # 添加子节点 et.SubElement(root, 'folder').text = all_img_path et.SubElement(root, 'filename').text = img_name source = et.SubElement(root, 'source') et.SubElement(source, 'database').text = "unKnown"

    size = et.SubElement(root,'size')
    et.SubElement(size,'width').text = str(w)
    et.SubElement(size,'height').text = str(h)
    et.SubElement(size,'depth').text = str(c)

    et.SubElement(root,"segmented").text = '0'

    
    with open(anno_path, 'r') as f:
        o = et.SubElement(root, "object")
        for lineStr in f.readlines():
            try:
                if ',' in lineStr:
                    xmin, ymin, w, h, score, category, trunc, occlusion = lineStr.split(',')
                else:
                    xmin, ymin, w, h, score, category, trunc, occlusion = lineStr.split()
            except:
                # print('error: ', anno_path, 'line: ', lineStr)            
                continue 
            
            if int(category) in [0, 11] or int(w) < 4 or int(h) < 4:
                continue    
            et.SubElement(o, "name").text = category_list[int(category) - 1]
            et.SubElement(o, "pose").text = "Unspecified"
            et.SubElement(o,"truncated").text = '0'
            et.SubElement(o,"difficult").text = '0'
            bndbox = et.SubElement(o,"bndbox")
            et.SubElement(bndbox,'xmin').text = xmin
            et.SubElement(bndbox,'ymin').text = ymin
            et.SubElement(bndbox,'xmax').text = str(int(xmin) + int(w) - 1)
            et.SubElement(bndbox,'ymax').text = str(int(ymin) + int(h) - 1)
    
    if i % 500 == 0:
        print("处理到第{}张图片".format(i))

    i += 1
    # 将根目录转化为树行结构
    tree = et.ElementTree(root)
    rough_str = et.tostring(root, 'utf-8')

    # 格式化
    reparsed = minidom.parseString(rough_str)
    new_str = reparsed.toprettyxml(indent='\t')
    xml_root_path = "/home/aistudio/work/VisDrone_PascalVOC/Annotations_{}".format(mode)
    if not os.path.exists(xml_root_path):
        os.makedirs(xml_root_path)
    xml_path = os.path.join(xml_root_path, img_name[:-4] + ".xml")
    f = open(xml_path, 'w', encoding='utf-8')
    # 保存
    f.write(new_str)
    f.close()

print("{}集处理完毕".format(mode))

生成train_list.txt

生成val_list.txt

for mode in ['train', 'val']: i = 0 all_img_path = '/home/aistudio/work/VisDrone_PascalVOC/VisDrone2019-DET-{}/images'.format(mode) img_list = os.listdir(all_img_path) print(len(img_list)) all_anno_path = "/home/aistudio/work/VisDrone_PascalVOC/Annotations_{}".format(mode) anno_list = os.listdir(all_anno_path) with open("/home/aistudio/work/VisDrone_PascalVOC/{}_list.txt".format(mode),'w') as f: for i in range(len(anno_list)): img_path = os.path.join(all_img_path, img_list[i]) xml_path = os.path.join(all_anno_path, anno_list[i]) f.write(img_path+ " "+ xml_path + '\n')

生成dataSet

import paddlex as pdx from paddlex.det import transforms

train_transforms = transforms.Compose([ transforms.Normalize() ])

eval_transforms = transforms.Compose([ transforms.Normalize() ])

train_dataset = pdx.datasets.VOCDetection( data_dir='/home/aistudio/work/VisDrone_PascalVOC', file_list='/home/aistudio/work/VisDrone_PascalVOC/train_list.txt', label_list='/home/aistudio/work/VisDrone_PascalVOC/labels.txt', transforms=train_transforms) eval_dataset = pdx.datasets.VOCDetection( data_dir='/home/aistudio/work/VisDrone_PascalVOC', file_list='/home/aistudio/work/VisDrone_PascalVOC/val_list.txt', label_list='/home/aistudio/work/VisDrone_PascalVOC/labels.txt', transforms=eval_transforms)

num_classes = len(train_dataset.labels) model = pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53') model.train( num_epochs=20, train_dataset=train_dataset, train_batch_size=8, eval_dataset=eval_dataset, learning_rate=0.000125, lr_decay_epochs=[210, 240], save_interval_epochs=5, save_dir='output/yolov3_darknet53', use_vdl=True)

`

  1. 您使用的数据集是?

VisDrone2019-DET-无人机视角数据集

  1. 请提供您出现的报错信息及相关log

C++ Traceback (most recent call last):

0 std::thread::_State_impl<std::thread::_Invoker<std::tuple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}> > >::_M_run() 1 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) 2 paddle::framework::details::FastThreadedSSAGraphExecutor::RunOp(paddle::framework::details::OpHandleBase*, std::shared_ptr<paddle::framework::BlockingQueue > const&, unsigned long*) 3 paddle::framework::details::FastThreadedSSAGraphExecutor::RunOpSync(paddle::framework::details::OpHandleBase*) 4 paddle::framework::details::OpHandleBase::Run(paddle::platform::DeviceType) 5 paddle::framework::details::ComputationOpHandle::RunImpl() 6 paddle::framework::OperatorBase::Run(paddle::framework::Scope const&, phi::Place const&) 7 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, phi::Place const&) const 8 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, phi::Place const&, paddle::framework::RuntimeContext*) const 9 void phi::KernelImpl<void ()(phi::CPUContext const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, paddle::optionalphi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, std::vector<int, std::allocator > const&, std::vector<int, std::allocator > const&, int, float, int, bool, float, phi::DenseTensor, phi::DenseTensor*, phi::DenseTensor*, phi::DenseTensor*), &(void phi::Yolov3LossGradKernel<float, phi::CPUContext>(phi::CPUContext const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, paddle::optionalphi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, std::vector<int, std::allocator > const&, std::vector<int, std::allocator > const&, int, float, int, bool, float, phi::DenseTensor*, phi::DenseTensor*, phi::DenseTensor*, phi::DenseTensor*))>::KernelCallHelper<paddle::optionalphi::DenseTensor const&, phi::DenseT 10 void phi::Yolov3LossGradKernel<float, phi::CPUContext>(phi::CPUContext const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, paddle::optionalphi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, phi::DenseTensor const&, std::vector<int, std::allocator > const&, std::vector<int, std::allocator > const&, int, float, int, bool, float, phi::DenseTensor*, phi::DenseTensor*, phi::DenseTensor*, phi::DenseTensor*)


Error Message Summary:

FatalError: Segmentation fault is detected by the operating system. [TimeInfo: *** Aborted at 1677570357 (unix time) try "date -d @1677570357" if you are using GNU date ***] [SignalInfo: *** SIGSEGV (@0x7f4c32a37d80) received by PID 16238 (TID 0x7f4a627fc700) from PID 849575296 ***]

环境

  1. 请提供您使用的PaddlePaddle和PaddleX的版本号

PaddlePaddle 2.4.0 paddlex 1.3.0

  1. 请提供您使用的操作系统信息,如Linux/Windows/MacOS linux

  2. 请问您使用的Python版本是? 3.7.4

  3. 请问您使用的CUDA/cuDNN的版本号是? 11.2

Shengshenlan avatar Feb 28 '23 12:02 Shengshenlan

paddlex 1.3.0 配套的版本PaddlePaddle 2.4.0 太高了,可以降低PaddlePaddle版本试试。如1.8.4,或者升级paddlex 到2.0以上,PaddlePaddle使用2.3

lailuboy avatar Mar 02 '23 03:03 lailuboy

可是当我把 paddlex 换成2.0 paddlepaddle 换成 2.1.2 就会提示我 Your running script needs PaddleX<2.0.0, please refer to https://github.com/PaddlePaddle/PaddleX/tree/release/2.0-rc/tutorials/train#%E7%89%88%E6%9C%AC%E5%8D%87%E7%BA%A7 to solve this issue.

Shengshenlan avatar Mar 02 '23 07:03 Shengshenlan

接口有一些变化,把训练的代码按照新版本文档修改一下

lailuboy avatar Mar 02 '23 11:03 lailuboy