将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述

1.1 yolov9

YOLOv9意味着实时目标检测的重大进步,引入了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进,在MS COCO数据集上建立了新的基准。YOLOv9项目由一个独立的开源团队开发,建立在Ultralytics YOLOv5提供的强大代码库的基础上,展示了人工智能研究社区的合作精神。
在这里插入图片描述
yolov9模型在coco数据集的效果如下所示
在这里插入图片描述

1.2 gdip介绍

gdip-yolo是2022年提出了一个端到端的图像自适应目标检测框架,其论文中的效果展示了良好的图像增强效果。其提出了gdip模块 |mdgip模块 |GDIP regularizer模块等模块,并表明这是效果提升的关键。
在这里插入图片描述

2、gdip-yolov9实现

基于将gidp模块、ipam集成到ultralytics项目中实现支持预训练权重的gidp-yolov8、ipam-yolov8 所实现的项目代码进行实现。

2.1 创建yaml文件

将以下代码保存为yolov9c-gdip.yaml,如果是要使用IPAM模块,则将- [-1, 1, GatedDIP, [256,7,"gdip-RTTS.pt"]] # GDIP模块修改为 - [-1, 1, IPAM, []] # ia-seg模块

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv9c
# 618 layers, 25590912 parameters, 104.0 GFLOPs# parameters
nc: 80  # number of classes# gelan backbone
backbone:- [-1, 1, GatedDIP, [256,7,"gdip-RTTS.pt"]] # GDIP模块- [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2- [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4- [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]]  # 2- [-1, 1, ADown, [256]]  # 3-P3/8- [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]]  # 4- [-1, 1, ADown, [512]]  # 5-P4/16- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]]  # 6- [-1, 1, ADown, [512]]  # 7-P5/32- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]]  # 8- [-1, 1, SPPELAN, [512, 256]]  # 9head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 7], 1, Concat, [1]]  # cat backbone P4- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]]  # 12- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 5], 1, Concat, [1]]  # cat backbone P3- [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]]  # 15 (P3/8-small)- [-1, 1, ADown, [256]]- [[-1, 13], 1, Concat, [1]]  # cat head P4- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]]  # 18 (P4/16-medium)- [-1, 1, ADown, [512]]- [[-1, 10], 1, Concat, [1]]  # cat head P5- [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]]  # 21 (P5/32-large)- [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)

2.2 生成gidp-yolov9模型

打开https://docs.ultralytics.com/models/yolov9/#performance-on-ms-coco-dataset 下载yolov9c模型

参考将gidp模块、ipam集成到ultralytics项目中实现支持预训练权重的gidp-yolov8、ipam-yolov8 中3.3 使用yolov8预训练权重 节中的代码,保存gidp-yolov9.pt模型

代码与执行效果如下所示。如果要生成yolov9c-IPAM模型,在创建好模型后放到save_model函数的第三个参数即可。
在这里插入图片描述

2.3 使用yolov9c-gdip模型

使用代码如下所示


from ultralytics import YOLO
if __name__ == '__main__':path="yolov9c-gdip.yaml"model=YOLO(path)model.load("gidp-yolov9c.pt")#加载生成好的预训练模型# 使用模型model.train(data="coco128.yaml", epochs=3,batch=4)  # 训练模型metrics = model.val(data="coco128.yaml")  # 在验证集上评估模型性能results = model("https://ultralytics.com/images/bus.jpg")  # 对图像进行预测success = model.export(format="onnx") 

代码执行日志输出如下所示,可以看到预训练权重正常加载,模型训练验证精度正常,且模型可以正常导出onnx模型。

256 7
load pretrain model from gdip-RTTS.pt
WARNING ⚠️ The file 'gidp-yolov9c.pt' appears to be improperly saved or formatted. For optimal results, use model.save('filename.p
t') to correctly save YOLO models.
Transferred 963/963 items from pretrained weights
New https://pypi.org/project/ultralytics/8.2.1 available 😃 Update with 'pip install -U ultralytics'
Ultralytics YOLOv8.2.0 🚀 Python-3.8.16 torch-2.1.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060 Laptop GPU, 12288MiB)
engine\trainer: task=detect, mode=train, model=yolov9c-gdip.yaml, data=coco128.yaml, epochs=3, time=None, patience=100, batch=4, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\trainfrom  n    params  module                                       arguments
256 7
load pretrain model from gdip-RTTS.pt0                  -1  1   6538646  ultralytics.nn.modules.GDIP.GatedDIP         [256, 7, 'gdip-RTTS.pt']      1                  -1  1      1856  ultralytics.nn.modules.conv.Conv             [3, 64, 3, 2]2                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]3                  -1  1    212864  ultralytics.nn.modules.block.RepNCSPELAN4    [128, 256, 128, 64, 1]4                  -1  1    164352  ultralytics.nn.modules.block.ADown           [256, 256]5                  -1  1    847616  ultralytics.nn.modules.block.RepNCSPELAN4    [256, 512, 256, 128, 1]6                  -1  1    656384  ultralytics.nn.modules.block.ADown           [512, 512]7                  -1  1   2857472  ultralytics.nn.modules.block.RepNCSPELAN4    [512, 512, 512, 256, 1]       8                  -1  1    656384  ultralytics.nn.modules.block.ADown           [512, 512]9                  -1  1   2857472  ultralytics.nn.modules.block.RepNCSPELAN4    [512, 512, 512, 256, 1]       10                  -1  1    656896  ultralytics.nn.modules.block.SPPELAN         [512, 512, 256]11                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']12             [-1, 7]  1         0  ultralytics.nn.modules.conv.Concat           [1]13                  -1  1   3119616  ultralytics.nn.modules.block.RepNCSPELAN4    [1024, 512, 512, 256, 1]      14                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']15             [-1, 5]  1         0  ultralytics.nn.modules.conv.Concat           [1]16                  -1  1    912640  ultralytics.nn.modules.block.RepNCSPELAN4    [1024, 256, 256, 128, 1]      17                  -1  1    164352  ultralytics.nn.modules.block.ADown           [256, 256]18            [-1, 13]  1         0  ultralytics.nn.modules.conv.Concat           [1]19                  -1  1   2988544  ultralytics.nn.modules.block.RepNCSPELAN4    [768, 512, 512, 256, 1]       20                  -1  1    656384  ultralytics.nn.modules.block.ADown           [512, 512]21            [-1, 10]  1         0  ultralytics.nn.modules.conv.Concat           [1]22                  -1  1   3119616  ultralytics.nn.modules.block.RepNCSPELAN4    [1024, 512, 512, 256, 1]      23        [16, 19, 22]  1   5644480  ultralytics.nn.modules.head.Detect           [80, [256, 512, 512]]
YOLOv9c-gdip summary: 660 layers, 32129558 parameters, 32129542 gradients, 159.2 GFLOPsTransferred 963/963 items from pretrained weightsLogging results to runs\detect\train
Starting training for 3 epochs...Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size1/3      5.35G     0.9777      1.222      1.194         54        640: 100%|██████████| 32/32 [00:11<00:00,  2.67it/s]     Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:04<00:00,  3  all        128        929      0.805      0.711      0.814       0.65Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size2/3      5.83G     0.9605     0.9842      1.164         44        640: 100%|██████████| 32/32 [00:11<00:00,  2.83it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:03<00:00,  4.all        128        929      0.836      0.706      0.821      0.654Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size3/3      5.22G     0.9349     0.8878      1.175         85        640: 100%|██████████| 32/32 [00:11<00:00,  2.84it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:03<00:00,  4.all        128        929      0.824      0.723      0.824      0.6593 epochs completed in 0.022 hours.
Optimizer stripped from runs\detect\train\weights\last.pt, 64.8MB
Optimizer stripped from runs\detect\train\weights\best.pt, 64.8MBValidating runs\detect\train\weights\best.pt...
Ultralytics YOLOv8.2.0 🚀 Python-3.8.16 torch-2.1.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060 Laptop GPU, 12288MiB)
YOLOv9c-gdip summary (fused): 426 layers, 31919574 parameters, 0 gradients, 157.8 GFLOPsClass     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 16/16 [00:03<00:00,  4.all        128        929      0.829      0.722      0.824       0.66person        128        254      0.959      0.646      0.858      0.666bicycle        128          6      0.847        0.5      0.687      0.529car        128         46          1      0.367      0.653      0.336motorcycle        128          5      0.916          1      0.995      0.831airplane        128          6       0.95          1      0.995      0.921bus        128          7       0.93      0.714      0.857      0.753train        128          3      0.896          1      0.995       0.93truck        128         12      0.927        0.5      0.715      0.431boat        128          6      0.648      0.333      0.571       0.47traffic light        128         14      0.958      0.429       0.47      0.275stop sign        128          2      0.872          1      0.995      0.946bench        128          9          1      0.633       0.94      0.724bird        128         16      0.985          1      0.995      0.711cat        128          4      0.908          1      0.995      0.946dog        128          9          1      0.876      0.995      0.884horse        128          2      0.778          1      0.995      0.754elephant        128         17      0.883      0.941      0.944      0.815bear        128          1      0.761          1      0.995      0.895zebra        128          4      0.919          1      0.995      0.943giraffe        128          9      0.921          1      0.995      0.858backpack        128          6      0.914        0.5       0.64      0.468umbrella        128         18      0.815      0.833      0.896      0.669handbag        128         19      0.693      0.263      0.507      0.401tie        128          7          1      0.694      0.839      0.665suitcase        128          4      0.924          1      0.995      0.648frisbee        128          5      0.984        0.8      0.962      0.788skis        128          1       0.83          1      0.995      0.895snowboard        128          7      0.679      0.714      0.855      0.637sports ball        128          6      0.625        0.5      0.533      0.304kite        128         10      0.788      0.376      0.582      0.165baseball bat        128          4      0.948          1      0.995      0.663baseball glove        128          7          1      0.407       0.44       0.31skateboard        128          5      0.588        0.6      0.646       0.53tennis racket        128          7          1      0.667      0.721      0.587bottle        128         18      0.761      0.556      0.694       0.45wine glass        128         16      0.643      0.812      0.788      0.538cup        128         36      0.849      0.782      0.862      0.612fork        128          6      0.585      0.333       0.75      0.589knife        128         16      0.673       0.75       0.79       0.58spoon        128         22      0.864      0.682      0.751       0.62bowl        128         28      0.825      0.786      0.812      0.732banana        128          1      0.782          1      0.995      0.995sandwich        128          2      0.639          1      0.995      0.995orange        128          4      0.934          1      0.995      0.765broccoli        128         11      0.766      0.302      0.531      0.375carrot        128         24      0.768      0.828      0.844      0.612hot dog        128          2      0.641          1      0.995      0.995pizza        128          5      0.826      0.954      0.962      0.874donut        128         14      0.664          1      0.972      0.901cake        128          4        0.9          1      0.995      0.904chair        128         35      0.721      0.514      0.751      0.547couch        128          6      0.805       0.69      0.839      0.697potted plant        128         14          1      0.623      0.868      0.672bed        128          3      0.671          1      0.995      0.929dining table        128         13      0.812      0.385      0.689      0.585toilet        128          2      0.416        0.5      0.497       0.45tv        128          2      0.852          1      0.995      0.895laptop        128          3      0.758      0.667      0.723       0.68mouse        128          2          1          0      0.497      0.204remote        128          8      0.921        0.5       0.69      0.625cell phone        128          8          1      0.462      0.614      0.426microwave        128          3      0.827          1      0.995      0.897oven        128          5      0.437        0.4        0.4      0.251sink        128          6          1      0.422      0.623      0.452refrigerator        128          5      0.529          1       0.92      0.787book        128         29      0.738      0.293      0.583      0.335clock        128          9      0.937      0.889      0.975       0.82vase        128          2      0.727          1      0.995      0.995scissors        128          1          1          0      0.995      0.199teddy bear        128         21      0.865      0.857      0.913       0.66toothbrush        128          5      0.855          1      0.995      0.856
Speed: 0.2ms preprocess, 26.0ms inference, 0.0ms loss, 0.8ms postprocess per imageDownloading https://ultralytics.com/images/bus.jpg to 'bus.jpg'...
100%|███████████████████████████████████████████████████████████████████████████████████████████| 476k/476k [00:00<00:00, 650kB/s] 
image 1/1 D:\yolo_seq\ultralytics-main\bus.jpg: 640x480 5 persons, 1 bus, 143.0ms
Speed: 1.0ms preprocess, 143.0ms inference, 1.0ms postprocess per image at shape (1, 3, 640, 480)
Ultralytics YOLOv8.2.0 🚀 Python-3.8.16 torch-2.1.1+cu121 CPU (12th Gen Intel Core(TM) i7-12700H)PyTorch: starting from 'runs\detect\train\weights\best.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) (1, 84, 8400) (61.8 MB)ONNX: starting export with onnx 1.13.1 opset 17...
ONNX: export success ✅ 104.5s, saved as 'runs\detect\train\weights\best.onnx' (124.5 MB)Export complete (107.6s)
Results saved to D:\yolo_seq\ultralytics-main\runs\detect\train\weights
Predict:         yolo predict task=detect model=runs\detect\train\weights\best.onnx imgsz=640  
Validate:        yolo val task=detect model=runs\detect\train\weights\best.onnx imgsz=640 data=D:\yolo_seq\ultralytics-main\ultralytics\cfg\datasets\coco128.yaml  
Visualize:       https://netron.app

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

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

相关文章

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【详细的Kylin使用心得】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

超级USB设备工具箱V2.0 绿色版-供大家学习研究参考

1、芯片精灵 ChipGenius V3.01 2、惠普U盘格式化工具 V2.2.0 3、MFormat V1.00中文版 4、MyDisk V2.50 5、安全移除USB磁盘&#xff08;Disk Ejector&#xff09; 6、U盘烧录修复工具&#xff08;PortFree Production Program&#xff09; V3.38 7、护U使者 V1.28 8、闪存精灵2…

【缺啥补啥】图表征学习-1

图表征学习&#xff1a; 学习图中的元素&#xff0c;如节点、边、子图或整个图的向量表征&#xff0c;并应用基于向量的机器学习算法进行图数据的建模和分析 动态环境&#xff1a; 图数据包括结构、特征、性质、任务等&#xff0c;随时间发生变化 开放环境&#xff1a; 泛指数据…

如何批量给Word文件增加前缀序号?“汇帮批量重命名”帮助你批量给word文件增加前缀序号。

批量给Word文件增加前缀序号的过程&#xff0c;对于经常处理大量文档的人来说&#xff0c;是一项既繁琐又必要的任务。首先&#xff0c;我们需要明确为什么要给Word文件增加前缀序号。在很多情况下&#xff0c;当我们需要按照一定的顺序对多个文档进行管理和归档时&#xff0c;…

基于STC15系列库操作LED灯

一、准备工作 1. 基于STC15系列库的工程模板 参考&#xff1a;51单片机工程模板的建立&#xff08;基于STC15系列库&#xff09;-CSDN博客 2. Keil编译器 二、程序编写 1. 新建 led.c 和 led.h 文件并存放于 user/led 文件夹下&#xff1b; 2. 新建 user.c 和 user.h 文件并…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见&#xff0c;到底是出现了DNS污染还是DNS劫持。什么是DNS污染&#xff1f;什么是DNS劫持&#xff1f;我们该如何辨别DNS污染和DNS劫持&#xff1f; DNS劫持&#xff1a; DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

android 创建module

文章目的&#xff1a; 快速创建module并使用 创建步骤&#xff1a; 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性&#xff0c;否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此&#xff0c;可在APP中…

针对springcloud gateway 跨域问题解决方案

springcloud gateway版本 <spring-boot.version>2.3.3.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>跨域问题说明 application:1 Access to XMLHttpRequest at https://xxxxxxxxxx from origin http://l…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

IMX6ULL-UBOOT驱动移植

介绍 IMX6ULL正点原子开发板使用的是14x14_evk的芯片 其中14x14代表的是芯片的尺寸。 本教程的标识符以nsouther或者 NSOUTHER NSouther为主 添加板子自己的配置文件 板子的默认配置文件保存在 configs目录下&#xff0c;我们以mx6ull_14x14_evk_emmc_defconfig为主&#xf…

SOT23-6封装单键触摸感应触发芯片TC233A

前言&#xff1a; 触摸芯片很多&#xff0c;现在触摸按键已经应用到很多行业&#xff0c;虽然不能覆盖所有的按键&#xff0c;但确实用的越来越多&#xff0c;国产的价格也便宜的令人发指&#xff0c;比如这个TC233A&#xff0c;也就一毛多一点。 TC233A概述 TC233A 是一个单…

【Shell语言】linux中awk命令

linux中awk命令 看这里放声嘶吼谁也不舍得沉默 宽阔也抓不住我下一秒钟的echo ——《暂时失控》苏打绿 awk命令简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 B…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

Python中的Super方法实现问题及解决方案

1、问题背景 在Python中&#xff0c;super方法用于在子类中调用父类的方法。Guido van Rossum曾给出了一个纯Python实现的super方法&#xff0c;以便更好地理解其工作原理。然而&#xff0c;在这个实现中&#xff0c;存在一个问题&#xff1a;当传入的对象不是要调用的父类的实…

C++入门 (2)

文章目录 C入门C输入输出缺省参数全缺省半缺省函数声明与定义分离 函数重载C支持函数重载的原理--名字修饰 C入门 C输入输出 C输入输出包含在# include《iostream》中 cout 类似在控制台中输出&#xff0c;使用cout需要使用流插入符&#xff08;<<&#xff09; 这个符号…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…

Object.hasOwn is not a function

背景 开发一个H5页面,使用Object.hasOwn来测试属性是否存在,在error监控中,发现某些用户访问会出现如下报错: 问题分析 因为不是所有的用户都报错,继而先去mdn上查看这个api的浏览器兼容性: Object.hasOwn() - JavaScript | MDN 从【Can I Use】上也查看了此web技术的…