近期公司有个项目,需要解决长尾样本的问题,所以测试了一下paddlepaddle小样本的能力。

环境::T4  、ubuntu 、cuda-11.6 、py3.9、   paddlepaddle-gpu==2.6.0、pip install opencv-python==4.5.5.64 -i https://pypi.tuna.tsinghua.edu.cn/simple    、 pip install  numpy==1.23.0

预训练模型:ppyoloe_crn_s_obj365_pretrained.pdparams

数据集下载地址:五种水果目标检测数据集coco格式_数据集-飞桨AI Studio星河社区


1、数据集准备五种水果:蕃茄、核桃、桔子、龙眼、青枣。共300张图像,640*480.COCO格式

2、先正常训练一波
数据如下:165步0.735的%表现

3、用脚本每个coco类别从原train.json提取10张图片,代码:
 

import json
from collections import defaultdict
import argparse
import osdef create_small_sample_coco(original_json, output_json, samples_per_class=10):"""从COCO格式的标注文件中,为每个类别提取指定数量的样本,并生成新的COCO标注文件参数:original_json (str): 原始COCO标注文件路径output_json (str): 输出的小样本COCO标注文件路径samples_per_class (int): 每个类别提取的样本数量"""# 加载原始标注数据with open(original_json, 'r', encoding='utf-8') as f:coco_data = json.load(f)# 确保必要的字段存在,不存在则添加默认值required_fields = {'info': {'description': 'Small sample dataset'},'licenses': [{'id': 0, 'name': 'Unknown'}],'categories': [],'images': [],'annotations': []}for field, default in required_fields.items():if field not in coco_data:print(f"警告: 标注文件缺少 '{field}' 字段,将使用默认值")coco_data[field] = default# 1. 统计每个类别的标注数量category_counts = defaultdict(int)for ann in coco_data['annotations']:cat_id = ann['category_id']category_counts[cat_id] += 1# 检查是否有类别if not category_counts:print("错误: 标注文件中未找到任何类别或标注")return# 2. 为每个类别选择指定数量的样本selected_images = set()  # 存储被选中的image_idcategory_samples = defaultdict(int)  # 记录每个类别已选择的样本数for ann in coco_data['annotations']:cat_id = ann['category_id']img_id = ann['image_id']# 如果该类别已选样本数不足,且该图片尚未被选中if category_samples[cat_id] < samples_per_class and img_id not in selected_images:selected_images.add(img_id)category_samples[cat_id] += 1# 检查是否所有类别都已选够样本if all(count >= samples_per_class for count in category_samples.values()):break# 3. 筛选出被选中的图片及其标注filtered_images = [img for img in coco_data['images'] if img['id'] in selected_images]filtered_annotations = [ann for ann in coco_data['annotations'] if ann['image_id'] in selected_images]# 4. 构建新的COCO数据集small_coco = {'info': coco_data['info'],'licenses': coco_data['licenses'],'categories': coco_data['categories'],'images': filtered_images,'annotations': filtered_annotations}# 5. 保存新的标注文件with open(output_json, 'w', encoding='utf-8') as f:json.dump(small_coco, f, indent=2)# 打印统计信息print(f"成功创建小样本数据集!")print(f"原始图片数量: {len(coco_data['images'])}")print(f"筛选后图片数量: {len(filtered_images)}")print(f"每个类别样本数: {samples_per_class}")print(f"保存路径: {output_json}")# 检查每个类别的实际样本数actual_counts = defaultdict(int)for ann in filtered_annotations:actual_counts[ann['category_id']] += 1# 映射类别ID到类别名称id_to_name = {cat['id']: cat['name'] for cat in coco_data['categories']}print("\n每个类别的实际样本数:")for cat_id, count in actual_counts.items():cat_name = id_to_name.get(cat_id, f"类别_{cat_id}")print(f"  {cat_name} (ID:{cat_id}): {count}个样本")if __name__ == "__main__":parser = argparse.ArgumentParser(description='从COCO数据集中创建小样本数据集')parser.add_argument('--input', '-i', required=True, help='原始COCO标注文件路径')parser.add_argument('--output', '-o', required=True, help='输出的小样本COCO标注文件路径')parser.add_argument('--samples', '-s', type=int, default=10, help='每个类别提取的样本数,默认为10')args = parser.parse_args()# 检查输入文件是否存在if not os.path.exists(args.input):print(f"错误: 输入文件 '{args.input}' 不存在")exit(1)# 检查输出目录是否存在,不存在则创建output_dir = os.path.dirname(args.output)if output_dir and not os.path.exists(output_dir):os.makedirs(output_dir)create_small_sample_coco(args.input, args.output, args.samples)

4、再次训练

python tools/train.py -c configs/few-shot/ppyoloe_plus_crn_s_80e_contrast_pcb.yml  --amp  --eval --use_vdl=True --vdl_log_dir=./visdrone/

在39步精度达到0.69%

5、预测一下

python tools/infer.py -c configs/few-shot/ppyoloe_plus_crn_s_80e_contrast_pcb.yml -o weights=output1/best_model.pdparams --infer_img=/home/PaddleDetection/dataset/coco/fruit5_coco/images/106.jpg

6、训练配置

_BASE_: ['../datasets/coco_detection.yml','../runtime.yml','./_base_/optimizer_80e.yml','./_base_/ppyoloe_plus_crn.yml','./_base_/ppyoloe_plus_reader.yml',
]log_iter: 100
snapshot_epoch: 5
weights: output/ppyoloe_plus_crn_s_80e_contrast_pcb/model_finalpretrain_weights: ./ppyoloe_crn_s_obj365_pretrained.pdparams
depth_mult: 0.33
width_mult: 0.50epoch: 190LearningRate:base_lr: 0.0001schedulers:- !CosineDecaymax_epochs: 596- !LinearWarmupstart_factor: 0.epochs: 5YOLOv3:backbone: CSPResNetneck: CustomCSPPANyolo_head: PPYOLOEContrastHeadpost_process: ~PPYOLOEContrastHead:fpn_strides: [32, 16, 8]grid_cell_scale: 5.0grid_cell_offset: 0.5static_assigner_epoch: 100use_varifocal_loss: Trueloss_weight: {class: 1.0, iou: 2.5, dfl: 0.5, contrast: 0.2}static_assigner:name: ATSSAssignertopk: 9assigner:name: TaskAlignedAssignertopk: 13alpha: 1.0beta: 6.0contrast_loss:name: SupContrasttemperature: 100sample_num: 2048thresh: 0.75nms:name: MultiClassNMSnms_top_k: 1000keep_top_k: 300score_threshold: 0.01nms_threshold: 0.7num_classes: 5
metric: COCO
map_type: integralTrainDataset:!COCODataSetimage_dir: imagesanno_path: /home/PaddleDetection/dataset/small.jsondataset_dir: /home/PaddleDetection/dataset/coco/fruit5_coco/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']EvalDataset:!COCODataSetimage_dir: imagesanno_path: /home/PaddleDetection/dataset/coco/fruit5_coco/annotations/instance_val.jsondataset_dir: /home/PaddleDetection/dataset/coco/fruit5_coco/TestDataset:!ImageFolderanno_path: /home/PaddleDetection/dataset/coco/fruit5_coco/annotations/instance_val.jsondataset_dir: /home/PaddleDetection/dataset/coco/fruit5_coco/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90486.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90486.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90486.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构化布线系统详解

1. 结构化布线系统概述 结构化布线系统(Structured Cabling System, SCS)是一种标准化、模块化的建筑物或建筑群内信息传输基础设施&#xff0c;它为语音、数据、图像等多媒体业务提供了统一的物理传输介质。与传统的点对点布线方式不同&#xff0c;结构化布线采用层次化、标准…

【Java学习】匿名内部类的向外访问机制

目录 一、方法局部变量的访问 1.生命周期 1.1方法生命周期 1.2匿名实例生命周期 1.3生命超时性 2.变量捕获 2.1按值捕获 2.1.1值捕获优势 2.1.1.1生命及时访问 2.1.1.2线程安全 2.1.2常量值捕获优势 2.2按引用捕获 引用捕获风险 (1)生命超时访问 (2)线程不安全 …

LinkedList的模拟实现+LinkedList和ArrayList的区别

目录 LinkedList的模拟实现 什么是双向链表 增加数据 头插法&#xff1a; 尾插法&#xff1a; 指定的下标插入&#xff1a; 删除数据 删除双向链表中出现的第一个key 置空所有数据 LinkedList和ArrayList的区别 顺序表对应的集合类是ArrayList&#xff1b;链表对应的集…

Vue + WebSocket 实时数据可视化实战:多源融合与模拟数据双模式设计

在现代交通大屏项目中&#xff0c;实时数据的采集和可视化尤为重要。本文结合 Vue3 和 ECharts&#xff0c;分享一个支持多 WebSocket 数据源实时合并、模拟数据调试、自动重连的完整设计方案&#xff0c;帮助你快速搭建健壮的数据可视化组件。一、项目背景与核心需求实时接收多…

C#索引器、接口、泛型

以下是对提供的 C# 代码中涉及的核心知识点的梳理和总结&#xff0c;涵盖索引器、接口、泛型三大核心内容&#xff0c;以及相关实践要点&#xff1a;一、索引器&#xff08;Indexer&#xff09;索引器是一种允许类或结构体像数组一样通过[]语法访问成员的特殊成员&#xff0c;本…

界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Excel——INDEX和MATCH傻傻分不清?

核心逻辑​先用 MATCH 找到目标姓名在表格中的 ​行号&#xff0c;再用 INDEX 根据行号 ​提取对应信息。就像查字典&#xff1a;先用拼音找到字的页码&#xff08;MATCH 找行号&#xff09;再翻到该页看具体解释&#xff08;INDEX 取数据&#xff09;​分步拆解&#xff08;以…

制造业低代码平台实战评测:简道云、钉钉宜搭、华为云Astro、金蝶云·苍穹、斑斑低代码,谁更值得选?

上回聊了斑斑和简道云&#xff0c;不少同行私信问我其他几个低代码平台怎么样&#xff0c;今天就给大家来个"五大门派"终极对决&#xff01; 一、先说痛点 制造业搞数字化最怕三件事&#xff1a; 1.钱花了没效果&#xff08;大平台用不起&#xff0c;小工具不够用&…

Jenkins中HTML文件显示样式问题解决方案

Jenkins中HTML文件显示样式问题解决方案 问题描述 在Jenkins中归档的HTML文件显示格式失效&#xff0c;样式无法正常显示&#xff0c;但在本地浏览器中打开却能正常显示。 问题原因 Jenkins为了安全考虑&#xff0c;默认设置了严格的内容安全策略(Content Security Policy, CSP…

四、配置文件

文章目录1. 文件类型1.1 properties1.2 yaml1.2.1 简介1.2.2 基本语法1.2.3 数据类型1.2.4 示例2. 配置提示1. 文件类型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#x…

Python常用医疗AI库以及案例解析(场景化进阶版)

📊 框架应用拓扑图用例 #mermaid-svg-lZ1J5KCaVWBV2kAu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-icon{fill:#552222;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-text{fill:#552222;st…

Python高效操作Kafka实战指南

Python操作Kafka的高效 以下是使用Python操作Kafka的高效消息发送实例,涵盖基础发送、批量处理、异步回调等场景。示例基于confluent-kafka库(推荐)和kafka-python库,代码均经过实测。 流程图 基础消息发送(同步) from confluent_kafka import Producerproducer = Pro…

离线快速处理PDF格式转化的方案

日常办公中&#xff0c;PDF 几乎成了我们离不开的文件格式。然而像 WPS 这样的工具&#xff0c;不少实用功能都需要额外付费才能解锁。它的打开方式很简单&#xff0c;双击桌面图标即可运行。它不会弹出主界面&#xff0c;而是默默驻留在系统托盘区&#xff0c;需要时双击图标就…

SpringMVC注解与SpringCloudOpenFeign注解对比

1. 背景知识 梳理SpringMVC和SpringCloudOpenFeign常用注解后&#xff1a; Spring MVC中常用注解_笔记-CSDN博客Spring Cloud OpenFeign 常用注解_笔记-CSDN博客 这里对两类注解做个对比。理解两者定位&#xff08;服务端 vs 客户端&#xff09;是掌握注解使用的关键&#x…

Linux 时间同步的流程

一、问题时间RTC时间、系统时间(UTC)和本地时间的关系如下&#xff1a;‌RTC时间‌&#xff08;硬件时钟&#xff09;&#xff1a;显示为UTC时间格式&#xff1a;02:50:35/02:51:28由主板电池供电&#xff0c;独立于系统运行‌12通常存储UTC时间&#xff08;Linux默认配置&…

VSCode——python选择解释器消失的解决办法

VSCode软件的左下角 设置——检查更新&#xff1a;

笛卡尔积规避:JOIN条件完整性检查要点

笛卡尔积是数据库查询中的高风险操作&#xff0c;多表JOIN时缺失有效关联条件会导致结果集指数级膨胀&#xff0c;引发‌性能塌方‌甚至系统崩溃‌。以下是核心检查策略及防御方案&#xff1a;一、笛卡尔积的致命影响‌‌性能塌方‌百万级订单表与千万级用户表缺失ON条件时&…

Vimba相机二次开发教程,基于Python

文章目录安装获取图像辅助数据Vimba 是由 Allied Vision 开发的一套软件开发套件&#xff08;SDK&#xff09;&#xff0c;主要用于控制和操作其工业相机产品。它提供了一套完整的 API 和工具&#xff0c;支持多种操作系统和编程语言&#xff0c;便于开发者快速集成相机功能到应…

电子测试行业软件ATECLOUD与ETEST对比分析-纳米软件

在当今科技飞速发展的时代&#xff0c;电测行业对于自动化测试平台的依赖程度日益加深。高效、精准的自动化测试平台不仅能够提升测试效率&#xff0c;还能确保产品质量。ATECLOUD 与 ETEST 作为电测行业中颇受瞩目的自动化测试平台&#xff0c;各自展现出独特的优势与特点。下…

自动化测试中的常见测试方法

自动化测试中的常见测试方法在自动化测试中&#xff0c;除了数据驱动&#xff08;Data-Driven Testing&#xff09;&#xff0c;还有多种主流方法&#xff0c;每种方法适用于不同场景和需求。以下是常见的自动化测试方法分类及详解&#xff1a;一、关键字驱动测试&#xff08;K…