基于旋转框的目标检测算法简单实操

使用labelme工具,使用多边形方式进行标注。

pip install labelme

标注完成后只需要将标注的数据使用opencv的最小外接矩形框进行转化即可。

labelme标注的多边形格式数据转换成COCO旋转框格式,转换脚本代码如下:

import os
import json
import cv2
import numpy as npdef rotate_rectangle(polygon):"""将多边形转换为旋转矩形:param polygon: 多边形的顶点坐标列表:return: 旋转矩形的中心点坐标、宽度、高度和旋转角度"""points = np.array(polygon, dtype=np.float32)rect = cv2.minAreaRect(points)center, (width, height), angle = rectreturn list(center), width, height, angledef get_rectangle_points(center, width, height, angle):"""根据旋转矩形的中心点、宽度、高度和旋转角度计算四个顶点坐标:param center: 中心点坐标:param width: 宽度:param height: 高度:param angle: 旋转角度:return: 四个顶点坐标"""rect = ((center[0], center[1]), (width, height), angle)box = cv2.boxPoints(rect)box = np.int0(box)return box.flatten().tolist()def convert_to_coco_format(input_folder, output_file):"""将LabelMe格式的JSON文件转换为COCO格式:param input_folder: 包含JSON文件的文件夹路径:param output_file: 输出的COCO格式JSON文件路径"""coco_data = {"info": {"description": "HanXi_locate","url": "","version": "1.0","year": 2017,"contributor": "","date_created": "2025-01-09"},"licenses": [],"images": [],"annotations": [],"categories": []}category_set = set()  # 用于跟踪已经添加的类别category_id_map = {}  # 用于映射类别名称到类别IDimage_id = 1annotation_id = 1for filename in os.listdir(input_folder):if filename.endswith(".json"):with open(os.path.join(input_folder, filename), "r") as f:data = json.load(f)# 添加图像信息image_info = {"id": image_id,"width": data["imageWidth"],"height": data["imageHeight"],"file_name": data["imagePath"],"license": 0,"flickr_url": "","coco_url": "","date_captured": ""}coco_data["images"].append(image_info)# 添加标注信息for shape in data["shapes"]:if shape["shape_type"] == "polygon":polygon = shape["points"]center, width, height, angle = rotate_rectangle(polygon)points = get_rectangle_points(center, width, height, angle)label = shape["label"]if label not in category_set:category_id = len(category_set) + 1category_id_map[label] = category_idcategory_set.add(label)coco_data["categories"].append({"supercategory": "none",  "id": category_id,"name": label})# Calculate bounding box coordinatesx, y, w, h = cv2.boundingRect(np.array(points).reshape((-1, 1, 2)))annotation_info = {"id": annotation_id,"image_id": image_id,"category_id": category_id_map[label],"segmentation": [points],"area": width * height,"bbox": [x, y, w, h],  # Add bounding box information"iscrowd": 0,"ignore": 0}coco_data["annotations"].append(annotation_info)annotation_id += 1image_id += 1# 保存为COCO格式的JSON文件with open(output_file, "w") as f:json.dump(coco_data, f, indent=4)if __name__ == "__main__":input_folder = "./hanxi"output_file = "val.json"convert_to_coco_format(input_folder, output_file)

最终将数据整理成如下格式:

hanxi_locate_coco
├── annotations
│   ├── train.json
│   ├── val.json
├── train
│   ├── 1.jpg
│   ├── 5.jpg
│   ├── ...
├── val
│   ├── 2.jpg
│   ├── 7.jpg
│   ├── ...

本文使用PaddleDetection套件进行算法训练研发。具体安装方式参照PaddleDetection官网:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py install
cd ppdet/ext_op
python setup.py install

选择轻量级的PPYoloE-R算法。具体配置文件参照PaddleDetection/configs/rotate/ppyoloe_r/ppyoloe_r_crn_s_3x_dota_ms.yml。

################################## dataset ##############################
metric: RBOX
num_classes: 1 TrainDataset:name: COCODataSetimage_dir: trainanno_path: annotations/train.jsondataset_dir: dataset/hanxi_locate_coco/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd', 'gt_poly']EvalDataset:name: COCODataSetimage_dir: valanno_path: annotations/val.jsondataset_dir: dataset/hanxi_locate_coco/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd', 'gt_poly']TestDataset:name: ImageFolderanno_path: annotations/val.jsondataset_dir: dataset/hanxi_locate_coco/################################## runtime ##############################
use_gpu: true
use_xpu: false
use_mlu: false
use_npu: false
log_iter: 5
save_dir: output_locate
snapshot_epoch: 5
print_flops: false
print_params: false# Exporting the model
export:post_process: True  # Whether post-processing is included in the network when export model.nms: True           # Whether NMS is included in the network when export model.benchmark: False    # It is used to testing model performance, if set `True`, post-process and NMS will not be exported.fuse_conv_bn: False################################## optimizer_3x ##############################
epoch: 50
LearningRate:base_lr: 0.008schedulers:- name: CosineDecaymax_epochs: 44- name: LinearWarmupstart_factor: 0.steps: 1000OptimizerBuilder:clip_grad_by_norm: 35.optimizer:momentum: 0.9type: Momentumregularizer:factor: 0.0005type: L2
################################## ppyoloe_r_reader ##############################
worker_num: 4
image_height: &image_height 512
image_width: &image_width 512
image_size: &image_size [*image_height, *image_width]TrainReader:sample_transforms:- Decode: {}- Poly2Array: {}- RandomRFlip: {}- RandomRRotate: {angle_mode: 'value', angle: [0, 90, 180, -90]}- RandomRRotate: {angle_mode: 'value', angle: [30, 60], rotate_prob: 0.5}- RResize: {target_size: *image_size, keep_ratio: True, interp: 2}- Poly2RBox: {filter_threshold: 2, filter_mode: 'edge', rbox_type: 'oc'}batch_transforms:- NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True}- Permute: {}- PadRGT: {}- PadBatch: {pad_to_stride: 32}batch_size: 2shuffle: truedrop_last: trueuse_shared_memory: truecollate_batch: trueEvalReader:sample_transforms:- Decode: {}- Poly2Array: {}- RResize: {target_size: *image_size, keep_ratio: True, interp: 2}- NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True}- Permute: {}batch_transforms:- PadBatch: {pad_to_stride: 32}batch_size: 2collate_batch: falseTestReader:sample_transforms:- Decode: {}- Resize: {target_size: *image_size, keep_ratio: True, interp: 2}- NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True}- Permute: {}batch_transforms:- PadBatch: {pad_to_stride: 32}batch_size: 2################################## model ##############################
architecture: YOLOv3
norm_type: sync_bn
use_ema: true
ema_decay: 0.9998YOLOv3:backbone: CSPResNetneck: CustomCSPPANyolo_head: PPYOLOERHeadpost_process: ~CSPResNet:layers: [3, 6, 6, 3]channels: [64, 128, 256, 512, 1024]return_idx: [1, 2, 3]use_large_stem: Trueuse_alpha: TrueCustomCSPPAN:out_channels: [768, 384, 192]stage_num: 1block_num: 3act: 'swish'spp: trueuse_alpha: TruePPYOLOERHead:fpn_strides: [32, 16, 8]grid_cell_offset: 0.5use_varifocal_loss: truestatic_assigner_epoch: -1loss_weight: {class: 1.0, iou: 2.5, dfl: 0.05}static_assigner:name: FCOSRAssignerfactor: 12threshold: 0.23boundary: [[512, 10000], [256, 512], [-1, 256]]assigner:name: RotatedTaskAlignedAssignertopk: 13alpha: 1.0beta: 6.0nms:name: MultiClassNMSnms_top_k: 2000keep_top_k: -1score_threshold: 0.1nms_threshold: 0.1normalized: False################################## custom ##############################
weights: output_locate/model_final
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/CSPResNetb_s_pretrained.pdparams
depth_mult: 0.33
width_mult: 0.50

PU单卡训练

CUDA_VISIBLE_DEVICES=0 
python tools/train.py -c config_locate.yml

GPU多卡训练

CUDA_VISIBLE_DEVICES=0,1,2,3 
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c config_locate.yml
# 导出模型
python tools/export_model.py -c config_locate.yml -o weights=output_locate/model_final.pdparams# 预测图片
python deploy/python/infer.py --image_dir dataset/hanxi_locate_coco/val --model_dir=output_locate/output_inference/config_locate --device=gpu

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

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

相关文章

重塑视频创作的格局!ComfyUI-Mochi本地部署教程

一、介绍 mochi是近期Genmo公司开源的先进视频生成模型,具有高保真运动和强大的提示遵循性。此模型的发布极大的缩小了闭源和开源视频生成系统之间的差距。 目前,视频生成模型与现实之间存在巨大差距。其中最影响视频生成的两个关键功能也就是运动质量和…

el-table自定义按钮控制扩展expand

需求:自定义按钮实现表格扩展内容的展开和收起,实现如下: 将type“expand”的表格列的宽度设置为width"1",让该操作列不展示出来,然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

Ubuntu 22.04 英伟达开发环境 CUDA 12.4 | cuDNN 9.0.0 | TensorRT 10.1 版本安装指南

NVIDIA 驱动安装 前置 笔者近期重整服务器,计划重新安装操作系统并配置新的开发环境。服务器的主要配置如下: Dell PowerEdge R730 Intel Xeon E5-2630v3 x2 64GB ECC DDR4 NVIDIA GeForce RTX 2080 Ti Rev. A Ubuntu 22.04.5 LTS x86_64 (No Desktop…

数据结构-栈、队列和数组

栈 栈的定义 栈是只允许在一端进行插入或删除操作的线性表。首先栈式一种线性表,但限定这种线性表只能在某一端进行插入和删除操作,如图所示。 栈包括: 栈顶(Top)。允许进入插入删除的那一端。 栈底(Butt…

Mysql快速列出来所有列信息

文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来,以备注中的中文名为列名。 实现思路 最终展示效果,即拼接出可执行执行…

LLM大模型实践10-聊天机器人

大型语言模型带给我们的激动人心的一种可能性是,我们可以通过它构建定制的聊天机器人 (Chatbot),而且只需很少的工作量。在这一章节的探索中,我们将带你了解如何利用会话形式,与具 有个性化特性&#xff08…

用python实现烟花代码,完整代码拿走不谢

有时候用python实现一些有趣的代码,既有趣,又能提升知识 使用Python实现动态烟花代码 效果如下: 不废话,直接上代码: import pygame from random import randint, uniform, choice import mathvector pygame.math…

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介:系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等,总体功能模块运用自顶向下的分层思想。 系统简介:系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…

使用强化学习训练神经网络玩俄罗斯方块

一、说明 在 2024 年暑假假期期间,Tim学习并应用了Q-Learning (一种强化学习形式)来训练神经网络玩简化版的俄罗斯方块游戏。在本文中,我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…

大湾区经济网与澳门红刊杂志社签署战略合作

大湾区经济网澳门1月9日电(王强)2025年1月9日,在粤港澳大湾区建设稳步推进的时代背景下,大湾区经济网与澳门红刊杂志社成功签署了合作协议,标志着双方在媒体战略合作领域迈出了坚实的一步,将共同为粤港澳大…

力扣 二叉树的最大深度

树的遍历,dfs与bfs基础。 题目 注意这种题要看根节点的深度是0还是1。 深度优先遍历dfs,通过递归分别计算左子树和右子树的深度,然后返回左右子树深度的最大值再加上 1。递归会一直向下遍历树,直到达到叶子节点或空节点。在回溯…

Chapter 4.6:Coding the GPT model

4 Implementing a GPT model from Scratch To Generate Text 4.6 Coding the GPT model 本章从宏观视角介绍了 DummyGPTModel,使用占位符表示其构建模块,随后用真实的 TransformerBlock 和 LayerNorm 类替换占位符,组装出完整的 1.24 亿参数…

IDEA的Git界面(ALT+9)log选项不显示问题小记

IDEA的Git界面ALT9 log选项不显示问题 当前问题idea中log界面什么都不显示其他选项界面正常通过命令查询git日志正常 预期效果解决办法1. 检查 IDEA 的 Git 设置2. 刷新 Git Log (什么都没有大概率是刷新不了)3. 检查分支和日志是否存在4. 清理 IDEA 缓存 (我用这个成功解决)✅…

埃安UT正式入局纯电小车之争,海豚能否守擂成功

文/王俣祺 导语:2025年刚刚来临,第一波车市竞争就开打了,早在去年广州车展就吸睛无数的埃安 UT ,日前正式开启预售,被称为比亚迪海豚的“最强对手”,主要是其价格和配置也确实全面对标了 比亚迪海豚。那么&…

java中的日期处理:只显示日期,不显示时间的两种处理方式

需要记录某个操作的操作时间,数据库中该字段为DATE类型; 插入数据的时候,使用数据库函数NOW()获取当前日期并插入: <insert id="batchInsertOrgTestersByProjectId">insert into project_org_testers(project_unid, org_tester_id,franchise_date) value…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目&#xff0c;前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

【大数据基础】大数据概述

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识&#xff0c;分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数…

解决Qt打印中文字符出现乱码

在 Windows 平台上&#xff0c;默认的控制台编码可能不是 UTF-8&#xff0c;这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体&#xff0c;并确保控制台输出为 UTF-8 编码&#xff1a; 1. Qt 应用程序代码 在 Qt 中&#xff0c;我们可以使用 QApplic…

测试用例颗粒度说明

当我们在编写测试用例时&#xff0c;总是会遇到一个问题&#xff1a;如何确定测试用例的颗粒度&#xff1f;测试用例过于粗糙&#xff0c;可能无法全面覆盖系统的细节&#xff1b;而颗粒度过细&#xff0c;又会导致测试重复、冗余。掌握合适的颗粒度&#xff0c;不仅可以提高测…

【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用

系列文章目录 大模型&#xff08;LLMs&#xff09;基础面 01-大模型&#xff08;LLM&#xff09;面试全解&#xff1a;主流架构、训练目标、涌现能力全面解析 02-【大模型&#xff08;LLM&#xff09;面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…