作者:gengjiang3_946 | 来源:互联网 | 2023-07-05 15:15
前言 使用百度开源的paddleX工具,我们可以很容易快速训练出使用我们自己标注的数据的目标检测,图像分类,实例分割,语义分割的深度网络模型,本文,主要记录如何全流程使用pddleX来训练一个简单用于检测猫狗ppyolo_tiny模型。
(一)数据准备 这里的图片,我们直接在百度图片上搜索“猫狗”,随机下载10张图片,存到“JPEGImages文件夹 ”里。
(二)使用labelme标注工具进行标注 (1)labelme安装&启动 #前提时安装了anaconda #安装 conda activate my_paddlex conda install pyqt pip install labelme #启动 conda activate my_paddlex labelme
(2)目标框标注 打开矩形框标注工具(右键菜单->Create Rectangle),具体如下图所示
使用拖拉的方式对目标物体进行标识,并在弹出的对话框中写明对应label(当label已存在时点击即可, 此处请注意label勿使用中文),具体如下图所示,当框标注错误时,可点击左侧的“Edit Polygons”再点击标注框,通过拖拉进行修改,也可再点击“Delete Polygon”进行删除。
点击右侧”Save“,将标注结果保存到中创建的文件夹Annotations目录中
(3)更多类型的标注 这部分直接复制了paddleX里的文档 数据标注。
详见文档图像分类数据标注
详见文档目标检测数据标注
详见文档实例分割数据标注
详见文档语义分割数据标注
(三)使用paddlex提供的工具将labelme标注的数据转转换成VOC格式的数据 LabelMe标注后的数据还需要进行转换为PascalVOC或MSCOCO格式,才可以用于目标检测任务的训练,创建D:\dataset_voc
目录,在python环境中安装paddlex后,使用如下命令即可
paddlex --data_conversion --source labelme --to PascalVOC \ --pics D:\MyDataset\JPEGImages \ --annotations D:\MyDataset\Annotations \ --save_dir D:\dataset_voc
详细用法,参考官方文档
(四)数据切分 目标检测 使用paddlex命令即可将数据集随机划分成70%训练集,20%验证集和10%测试集:
paddlex --split_dataset --format VOC --dataset_dir D:\MyDataset --val_value 0.2 --test_value 0.1
执行上面命令行,会在D:\MyDataset下生成labels.txt, train_list.txt, val_list.txt和test_list.txt,分别存储类别信息,训练样本列表,验证样本列表,测试样本列表 详细用法,参考官方文档
(五)数据加载 这里介绍的是PascalVOC格式的检测数据集的读取,参考代码在后面的完整代码中,MSCOCO格式的检测数据集与语义分割任务数据集的读取,参考官方文档
(六)数据增强 参考官方文档
(七)模型导入 paddlex.det中的模型 YOLOv3 = cv. models. YOLOv3 FasterRCNN = cv. models. FasterRCNN PPYOLO = cv. models. PPYOLO PPYOLOTiny = cv. models. PPYOLOTiny PPYOLOv2 = cv. models. PPYOLOv2 MaskRCNN = cv. models. MaskRCNN
paddlex.det中的模型 UNet = cv. models. UNet DeepLabV3P = cv. models. DeepLabV3P FastSCNN = cv. models. FastSCNN HRNet = cv. models. HRNet BiSeNetV2 = cv. models. BiSeNetV2
paddlex.cls中的模型 ResNet18 = cv. models. ResNet18 ResNet34 = cv. models. ResNet34 ResNet50 = cv. models. ResNet50 ResNet101 = cv. models. ResNet101 ResNet152 = cv. models. ResNet152 ResNet18_vd = cv. models. ResNet18_vd ResNet34_vd = cv. models. ResNet34_vd ResNet50_vd = cv. models. ResNet50_vd ResNet50_vd_ssld = cv. models. ResNet50_vd_ssld ResNet101_vd = cv. models. ResNet101_vd ResNet101_vd_ssld = cv. models. ResNet101_vd_ssld ResNet152_vd = cv. models. ResNet152_vd ResNet200_vd = cv. models. ResNet200_vd MobileNetV1 = cv. models. MobileNetV1 MobileNetV2 = cv. models. MobileNetV2 MobileNetV3_small = cv. models. MobileNetV3_small MobileNetV3_small_ssld = cv. models. MobileNetV3_small_ssld MobileNetV3_large = cv. models. MobileNetV3_large MobileNetV3_large_ssld = cv. models. MobileNetV3_large_ssld AlexNet = cv. models. AlexNet DarkNet53 = cv. models. DarkNet53 DenseNet121 = cv. models. DenseNet121 DenseNet161 = cv. models. DenseNet161 DenseNet169 = cv. models. DenseNet169 DenseNet201 = cv. models. DenseNet201 DenseNet264 = cv. models. DenseNet264 HRNet_W18_C = cv. models. HRNet_W18_C HRNet_W30_C = cv. models. HRNet_W30_C HRNet_W32_C = cv. models. HRNet_W32_C HRNet_W40_C = cv. models. HRNet_W40_C HRNet_W44_C = cv. models. HRNet_W44_C HRNet_W48_C = cv. models. HRNet_W48_C HRNet_W64_C = cv. models. HRNet_W64_C Xception41 = cv. models. Xception41 Xception65 = cv. models. Xception65 Xception71 = cv. models. Xception71 ShuffleNetV2 = cv. models. ShuffleNetV2 ShuffleNetV2_swish = cv. models. ShuffleNetV2_swish
下面是各类模型的官方文档,后面完整代码中,实例代码 图像分类模型API 目标检测模型API 实例分割模型API 图像分割模型API 模型加载API
(八)模型训练与参数调整 模型训练 训练参数调整
(九)完整代码 import paddlex as pdxfrom paddlex import transforms as T train_transforms = T. Compose( [ T. MixupImage( mixup_epoch= - 1 ) , T. RandomDistort( ) , T. RandomExpand( im_padding_value= [ 123.675 , 116.28 , 103.53 ] ) , T. RandomCrop( ) , T. RandomHorizontalFlip( ) , T. BatchRandomResize( target_sizes= [ 192 , 224 , 256 , 288 , 320 , 352 , 384 , 416 , 448 , 480 , 512 ] , interp= 'RANDOM' ) , T. Normalize( mean= [ 0.485 , 0.456 , 0.406 ] , std= [ 0.229 , 0.224 , 0.225 ] ) ] ) eval_transforms = T. Compose( [ T. Resize( target_size= 320 , interp= 'CUBIC' ) , T. Normalize( mean= [ 0.485 , 0.456 , 0.406 ] , std= [ 0.229 , 0.224 , 0.225 ] ) ] ) train_dataset = pdx. datasets. VOCDetection( data_dir= '/home/libufan/桌面/catDog/voc' , file_list= '/home/libufan/桌面/catDog/voc/train_list.txt' , label_list= '/home/libufan/桌面/catDog/voc/labels.txt' , transforms= train_transforms, shuffle= True ) eval_dataset = pdx. datasets. VOCDetection( data_dir= '/home/libufan/桌面/catDog/voc' , file_list= '/home/libufan/桌面/catDog/voc/val_list.txt' , label_list= '/home/libufan/桌面/catDog/voc/labels.txt' , transforms= eval_transforms) num_classes = len ( train_dataset. labels) model = pdx. det. PPYOLOTiny( num_classes= num_classes) model. train( num_epochs= 100 , train_dataset= train_dataset, train_batch_size= 1 , eval_dataset= eval_dataset, pretrain_weights= 'COCO' , learning_rate= 0.005 , warmup_steps= 1000 , warmup_start_lr= 0.0 , lr_decay_epochs= [ 130 , 540 ] , lr_decay_gamma= .5 , save_interval_epochs= 20 , save_dir= 'output/ppyolotiny' , use_vdl= True ) model = pdx. load_model( 'output/ppyolotiny/best_model' ) image_name = 'insect_det/JPEGImages/0217.jpg' result = model. predict( image_name) pdx. det. visualize( image_name, result, threshold= 0.5 , save_dir= './output/ppyolotiny' ) '' '