首页 > 其他分享 >计算机视觉库supervision学习-day(3)-各种Annotator

计算机视觉库supervision学习-day(3)-各种Annotator

时间:2024-10-25 12:21:40浏览次数:6  
标签:0.5 image cv2 Annotator supervision annotator detections sv day

上一次学习了supervision库的Detections类,按照官方文档,接下来学习的是各种Annotator标注器类,我主要学习几个我感兴趣的、有意思的Annotator类型

一、Annotator

所有的XxxAnnotator类都是继承自BaseAnnotator类,并重写了其中的annotator方法

(注:由于几乎大部分的XxxAnnotator类的构造函数__init__都含有参数color,thickness和color_look_up,分别代表边框颜色、边框粗细和颜色映射关系,且都有相应的默认值,一般来说使用默认即可,故后文就不再将这几个参数再写一遍,只会将不同标注器的独有参数标注出来,详细信息可见https://supervision.roboflow.com/0.24.0/detection/annotators官方信息)

  1. BoxAnnotator

    • 作用:

      • 使用一个矩形框标注检测对象
    • 代码:

    import cv2
    import supervision as sv
    from ultralytics import YOLO
    
    model=YOLO('yolo11n.pt')
    image=cv2.imread('images/cars.png')
    result=model(image)[0]
    
    detections=sv.Detections.from_ultralytics(result)
    
    annotator=sv.BoxAnnotator()								 #创建BoxAnnotator实例
    annotator.annotate(scene=image,detections=detections) 	    #调用annotator方法
    
    image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)		   #缩放图片大小,使得图片截图小一点
    cv2.imshow('img1',image)
    cv2.waitKey(0)
    
    • 结果:

    image-20241024222355759

  2. BoxCornerAnnotator

    • 作用:

      • 用四角框标注检测对象
    • 构造函数参数:

      • corner_length:角标的长度,默认为15
    • 代码:

      # 导库、打开图像、导入模型等操作省略了
      annotator=sv.BoxCornerAnnotator(corner_length=40)
      annotator.annotate(scene=image,detections=detections)
      
      image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
      cv2.imshow('img1',image)
      cv2.waitKey(0)
      
    • 结果:

      image-20241024225638431

  3. EllipseAnnotator

    • 作用:

      • 用椭圆框标注检测目标
    • 构造函数参数:

      1. start_angle:椭圆的起始角度,默认为-45,顺时针为正方向
      2. end_angle:椭圆的结束角度,默认为235,顺时针为正方向
    • 代码

      #省略
      #代码中若设置了粗细度,只为能明显一些,没有其他含义
      annotator=sv.EllipseAnnotator(start_angle=-35,end_angle=220,thickness=10)
      
      annotator.annotate(scene=image,detections=detections)
      
      image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
      cv2.imshow('img1',image)
      cv2.waitKey(0)
      
    • 结果:

      image-20241024231741031

  4. HaloAnnotator

    • 作用:

      • 用光环效果标记检测目标,该标注器需要用到Detections类中的mask属性,因此如果使用yolo的话,需要用图像分割的模型例如yolo11n-seg.pt来产生mask
    • 构造函数参数:

      1. opacity:mask的不透明度,默认为0.8
      2. kernel_size:用于创建光环的平均池化内核大小,默认为40
      3. 注意:该类因为使用mask而非线条绘制边框,因此没有thickness属性
    • 代码:

      import cv2
      import supervision as sv
      from ultralytics import YOLO
      
      model=YOLO('yolo11n-seg.pt')
      image=cv2.imread('images/cars.png')
      result=model(image)[0]
      
      detections=sv.Detections.from_ultralytics(result)
      
      annotator=sv.HaloAnnotator(opacity=1.0,kernel_size=80)
      annotator.annotate(scene=image,detections=detections)
      
      image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
      cv2.imshow('img1',image)
      cv2.waitKey(0)
      
    • 结果(有点离谱,用seg模型,后面几个路障被识别成人了):

      image-20241024233621941

  5. PercentageBarAnnotator

    • 作用:

      • 用百分比框来标注检测图像
    • 构造函数参数:

      1. height:百分比框的高,默认为16
      2. width:百分比框的宽,默认为88
      3. border_color:百分比框的边框线条颜色,默认为BLACK
      4. position:百分比条的锚点位置,默认为TOP_CENTER
      5. border_thickness:边框粗细,默认为None
    • annotate方法:

      1. custom_values:百分比条的值,如果为None则表示使用该物体的检测置信度来作为值,如果要自定义,应传入一个ndarray数组,长度与检测数目相等,且取值为[0,1],用以表示百分比
    • 代码:

      #省略
      annotator=sv.PercentageBarAnnotator(height=30,width=300)
      #使用默认的置信度来表示百分比的值
      annotator.annotate(scene=image,detections=detections)
      
      image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
      cv2.imshow('img1',image)
      cv2.waitKey(0)
      
    • 结果:

      image-20241025002954294

  6. PixelateAnnotator

    • 作用:

      • 对检测区域进行像素化,注意,这个类不需要mask,他是直接对矩形框的范围内像素化
    • 构造函数参数(仅有一参数):

      1. pixel_size:像素块的大小,默认为20
    • 代码:

      #省略
      annotator=sv.PixelateAnnotator(pixel_size=30)
      annotator.annotate(scene=image,detections=detections)
      
      image=cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
      cv2.imshow('img1',image)
      cv2.waitKey(0)
      
    • 结果:

      image-20241025003642085

以上就是我本人感兴趣的一些标注框,更多详细细节可以到supervision的官方文档里去查看

标签:0.5,image,cv2,Annotator,supervision,annotator,detections,sv,day
From: https://www.cnblogs.com/WineMarks-Garden/p/18501618

相关文章

  • CAN201 In Class Test 1 Thursday Session
    CAN201InClassTest1ThursdaySession2MultiplayerNumberGuessingGame(UDPSockets)ObjectiveThisinclasstestisrequiredtousePythonforsocketprogramming.Youwillcreateamultiplayer“numberguessing”gameusingUDPsocketsprogramming,wi......
  • AM05 AUT24 Outfit Of The Day Recommendation
    AM05AUT24FinalProjectAssignment:OutfitOfTheDayRecommendationSystem1AM05AUT24FinalProjectAssignment:OutfitOfTheDayRecommendationSystemIntroductionWelcometoyourfinalprojectfortheDataManagementcourse.Thisprojectisdesigned......
  • Unet网络搭建Day1
    Pycharm内搭建虚拟环境:一、将PyCharm中的终端运行前面的PS修改成当前环境解决方法:只需要在pycharm的设置中修改一些terminal的环境即可,具体步骤如下:1.打开pycharm中的settings;2.找到Terminal选项;3.将shellpath的位置改为cmd.exe;4.点击ok;5.重启pycharm即可。二、wandb......
  • Java开发学习day06--方法
    随笔记录学习之路,如有侵权请联系我删除,学习内容主要来自黑马 1.方法概述1.1方法的概念:方法(method)是程序中最小的执行单元注意:    方法必须先创建才可以使用,该过程成为方法定义    方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用2.......
  • 网络编程(Day34)
    一、学习内容网络发展历史发展阶段1.APRAnet阶段---冷战产物2.TCP/IP协议阶段--只有TCP和IP两个协议3.osi开放系统互联模型4.TCP/IP协议族(重要)5.量子通信(可能)TCP/IP两个协议阶段概念在计算机网络中,要做到有条不紊的交换数据,需要遵循一些事先约定好的规则......
  • java基础day04:方法(函数),练习
    一、Java中的方法(函数)1.定义方法也叫代码块,用于实现代码的封装,方便调用。主要目的是实现代码复用。2、方法和函数关系方法和函数的关系定义方法(面向对象)在类中定义的成员。也可以叫成员方法,属于类创建出来的对象的功能函数(面向过程)3、定义方法        ......
  • IO进程_day5
    目录线程Thread1.什么是线程1.1概念1.2进程和线程区别1.3线程资源2.函数接口2.1创建线程:pthread_create2.2退出线程:pthread_exit2.3回收线程资源练习:通过父子进程完成对文件的拷贝(cp)练习:输入输出,quit结束3.同步3.1概念3.2同步机制3.3函数接......
  • Day 11 函数对象 + 函数的嵌套 + 名称空间与作用域
    目录0昨日复习0.1函数0.2定义0.3三种形式的函数0.3.1无参函数0.3.2有参函数0.3.3空函数0.4函数的返回值0.5函数的调用0.6函数参数的应用0.6.1形参0.6.2实参0.6.3位置形参0.6.4位置实参0.6.5默认形参0.6.6关键字实参0.7可变长参数0.7.1*形参0.7.2*实参0.7.3**......
  • 代码随想录算法训练营day25| 491.递增子序列 46.全排列 47.全排列2
    学习资料:https://programmercarl.com/0491.递增子序列.html#算法公开课排列与组合的区别,不用startIndex,而每个树层都从0开始,但是要跳过已经用过的数(用used判断)学习记录:491.递增子序列(添加一个数组used(hash表),来保持数组每个位置上的数的使用情况,没用过为0,用过变成1)点击查看代......
  • 0基础学java之Day14
    Object含义:基类也叫做超类,Object是所有类的祖先类注意:如果一个类没有明确继承的父类,默认继承Objectequals:比较两个对象内存地址是否相同hashCode():获取对象的hash值注意:1.hash码是内存地址+散列算法得到的一个数字2.hash码不等于内存地址3.hash码可能相同getClass:......