Day 12 - 标签图片的方法与实作

资料增量 (Data Augmentation) 的部份因为 YOLOV3 可以透过 cfg 档的设定来自动进行资料增量,所以我们就不在这边进行资料增量的前置处理。

接着进行的是图片标签 (Labeling/Annotation) 的动作,这是一个很乏味的动作,主要就是把原始图片中要训练的图片标示出来,并说明标示物件标签,而把这些资讯存成文字档。光是标签就可以分成三类需要考虑的因素:

  1. 图片标注的类型 (Image Annotation Types):可以是边界框 (Bounding boxes),多边形分割 (Polygonal Segmentation),语义分割 (Semantic Segmentation),3D 长方体 (3D cuboids),关键点和界标 (Key-Point and Landmark),直线和样条 (Lines and Splines)。下图显示边界框与关键点和界标的图型。使用边界框来标注物件是很常见的标注方式,将目标物件用矩型标注出来,YOLOV3也是使用这种方式。


图 1、 使用边界框来标注物件 (Original Photo by Patricia Jekki on Unsplash)

很明显的,使用关键点和界标的标注对于检测面部特征、面部表情、情绪、人体部位和姿势很有用。


图 2、 使用关键点和界标来标注物件 (Original Photo from COCO dataset)

  1. 图片标注的格式 (Image Annotation Formats):可以分成 COCO,Pascal VOC 与 YOLO 三种不同的格式。简单来区分是 COCO 使用的是 JSON 的格式;Pascal VOC 使用 XML 格式;而 YOLO 则是一般文字格式,可以说是类似 CSV 格式,只是都是以空白来进行不同栏位。以下分别是他们的简单样板。

COCO format

annotation{
"id" : int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
categories[{
"id": int,
"name": str,
"supercategory": str,
}]

Pascal VOC

<annotation> <folder>Train</folder> <filename>01.png</filename>      <path>/path/Train/01.png</path> <source>  <database>Unknown</database> </source><size>  <width>224</width>  <height>224</height>  <depth>3</depth>   </size> <segmented>0</segmented> <object>  <name>36</name>  <pose>Frontal</pose>  <truncated>0</truncated>  <difficult>0</difficult>  <occluded>0</occluded>  <bndbox>   <xmin>90</xmin>   <xmax>190</xmax>   <ymin>54</ymin>   <ymax>70</ymax>  </bndbox> </object>
</annotation>

而 YOLO 的格式如下所示,每一行代表一个物件,分别表示物件名称 (object-class),物件中心 x 位在整张图片宽 (image_width) 的比例,物件中心 y 位在整张图片高 (image_height) 的比例,物件宽度 (target_width) 占整张图片宽度 (image_width) 的比例,物件长度 (target_height) 占整张图片长度 (image_height) 的比例。物件中心点座标 (x,y),物件的

<object-class> <x_iw_ratio> <y_ih_ratio> <tw_iw_ratio> <th_ih_ratio>

两者的换算公式如下:

# Pascal VOC
ymin, xmin, ymax, xmax, image_w, image_h = PascalVOC# 将 Pascal VOC 中的资料转换成 YOLO 格式
(x_iw_ratio, y_ih_ratio) = ( ( (xmin + xmax) * 0.5 ) / image_w, ((ymin + ymax) * 0.5 ) / image_h)
tw_iw_ratio = (xmax - xmin) * 1. / image_w
th_ih_ratio = (ymax - ymin) * 1. / image_h
  1. 标签工具:标签工作可以简单的分成半自动跟手动,半自动的标签工具有:Anno-Mage,显示出来的自动标示功能还不错,只是已经 1,2 年没有继续维护了;而大多数是用手动工具 labelImg。

这边就不介绍如何使用 labelImg,可以参阅 目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程,这边先测试当取得标签档时,如何确认标签档是否可以正确的在图片上生成边界框。

下图是我们标签了下方的两只鱼,而 YOLO 标签内容如下,通常我们不会把物件名称直接打出来,因为这只是对应之用,所以我们给定标签为 0。

00-frame-0001.txt

0 0.962963 0.447917 0.414815 0.137500
0 0.263889 0.422917 0.416667 0.122917


图 3、标签后的图片

接着我们试着根据 YOLO 的标签内容,将 YOLO 格式转换成边界框的左上角 (min_x, min_y) 和右下角 (max_x, max_y),重新画上边界框,以确保标签内容的正确性。

./utils/yoloDrawLabel.py

import cv2# 设定输入与输出
inputLabelPath = '../labels/00-frame-0001.txt'
inputImgPath = '../images/00-frame-608x608-0001.jpg'
outputImgPath = '../labels/00-frame-608x608-0001.jpg'
# 图片大小固定为 608*608
img_w= img_h = 608
# 载入图片
cv2image = cv2.imread(inputImgPath)with open(inputLabelPath) as f:for line in f:line = line.strip() # 删除多余的空白data = line.split() # 将 YOLO 一列的内容转成一维阵列# 将 YOLO 格式转换为边界框的左上角和右下角座标bbox_width = float(data[3]) * img_wbbox_height = float(data[4]) * img_hcenter_x = float(data[1]) * img_wcenter_y = float(data[2]) * img_hmin_x, min_y = center_x - (bbox_width / 2), center_y - (bbox_height / 2)max_x, max_y = center_x + (bbox_width / 2), center_y + (bbox_height / 2)print(min_x,min_y,max_x,max_y)# 在图片上写上物件名称cv2.putText(cv2image, 'Altolamprologus compressiceps', (int(min_x), int(min_y-6)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)# 画出边界框cv2.rectangle(cv2image, (int(min_x),int(min_y)), (int(max_x),int(max_y)), (0,255,255), 2)# 将档案另存新图片档cv2.imwrite(r'{}'.format(outputImgPath), cv2image)f.close()

下图为输出结果,可以确认 YOLO 文字档中的内容是正确的。


图 4、读取 YOLO 文件档验证标签是否正确的图片

参考资料

  • Image Data Labelling and Annotation — Everything you need to know, https://towardsdatascience.com/image-data-labelling-and-annotation-everything-you-need-to-know-86ede6c684b1
  • List of annotation tools for machine learning research, https://www.simonwenkel.com/2019/07/19/list-of-annotation-tools-for-machine-learning-research.html
  • yolo-labeler 0.0.3, https://pypi.org/project/yolo-labeler/
  • 目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程, https://blog.csdn.net/weixin_41010198/article/details/106378404
  • Yolo2Pascal-annotation-conversion,https://github.com/hai-h-nguyen/Yolo2Pascal-annotation-conversion
  • labelImg,https://github.com/tzutalin/labelImg
  • Anno-Mage: A Semi Automatic Image Annotation Tool, https://github.com/virajmavani/semi-auto-image-annotation-tool

Day 12 - 标签图片的方法与实作相关推荐

  1. img标签插入图片的方法

    img标签的使用方法 代码如下: 基本语法 <img src="图片的路径" >(都是网页找图片的路径) (1)当网页和图片在同一个文件夹时(都没有被包) <im ...

  2. HTML怎么设置自动滚动的图片,转:HTML中让图片滚动的marquee标签的使用方法

    实例: 需要滚动的文字 需要滚动的文字 也可以程序代码 也可以是图片 说明: 1.中间的内容可以为 文字,图片,也可以是由程序生成的文字或图片 2.onMouseOut="this.star ...

  3. python将图片保存到excel_使用Python导出Excel图表以及导出为图片的方法

    本篇讲下如何使用纯python代码将excel 中的图表导出为图片.这里需要使用的模块有win32com.pythoncom模块. 网上经查询有人已经写好的模块pyxlchart,具体代码如下: fr ...

  4. selenium提取数据之driver对象定位标签元素获取标签对象的方法

    selenium提取数据之driver对象定位标签元素获取标签对象的方法 在selenium中可以通过多种方式来定位标签,返回标签元素对象 find_element_by_id (返回一个元素) fi ...

  5. SEO优化技巧之Alt标签的使用方法

    Alt标签是什么?简单来说,Alt标签是为了给搜索引擎蜘蛛介绍图片信息的.因为搜索引擎不能识别图片,只能识别文字,所以我们在优化网站的时候一定要合理的运用Alt标签,下面就一起来了解一下. 1.在首页 ...

  6. Android 圆形/圆角图片的方法

    Android 圆形/圆角图片的方法 眼下网上有非常多圆角图片的实例,Github上也有一些成熟的项目.之前做项目,为了稳定高效都是选用Github上的项目直接用.但这样的结束也是Android开发必 ...

  7. C#实现缩放和剪裁图片的方法示例

    C#实现缩放和剪裁图片的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  8. HTML5新增的video标签,HTML5中video标签的使用方法

    HTML5中video标签的使用方法 发布时间:2020-08-27 11:33:56 来源:亿速云 阅读:100 作者:小新 这篇文章将为大家详细讲解有关HTML5中video标签的使用方法,小编觉 ...

  9. ajax静态加载图片,JQuery实现Ajax加载图片的方法

    本文实例讲述了JQuery实现Ajax加载图片的方法.分享给大家供大家参考,具体如下: 最近在学习JQuery,想从原理上模拟一下无刷新的相册浏览. 最先想到的思路是利用缓存,也就是先显示提示消息,然 ...

  10. js给php赋值,JavaScript_javascript给span标签赋值的方法,js给span标签赋值的方法?一般 - phpStudy...

    javascript给span标签赋值的方法 js给span标签赋值的方法?一般有两种方法: 第一种方法:输出html function s(){ document.getElementById(&q ...

最新文章

  1. 无法将stdClass类型的对象用作数组?
  2. (五)Java工具类ArrayUtils详解
  3. 从 2018 年 Nacos 开源说起
  4. dwz(jui)刷新当前dialog的方法
  5. LG P4198 楼房重建(线段树)
  6. web.xml中webAppRootKey
  7. 房地产企业的客户细分战略
  8. 如何导出久其报表所有数据_久其报表软件基本操作流程..docx
  9. Linux无法下载GCC
  10. 明清时期中央朝廷与地方关系中的江南著姓望族
  11. Common Electrical I/O (CEI)
  12. ACTF2022 rsa leak
  13. 电脑端滚动截屏工具FastStone Capture
  14. 认计算机电源,电脑硬件认识之什么是电脑的电源[图文]
  15. LINUX系统程序设计中C/C++编程工具使用
  16. 京东云与金山云合并!云计算行业真的要大洗牌吗?
  17. jmeter模拟mysql长连接_jmeter链接mysql数据库
  18. React使用西瓜播放器
  19. SimpleDateFormat替换方案
  20. 国电+广电,入场5G!

热门文章

  1. 1188: 选票统计(一)(结构体专题)
  2. Linux学习总结(60)——Linux系统常用命令速查手册
  3. Spring Boot Admin
  4. 深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
  5. 域名生成企业邮箱golang企业邮箱发邮件 golang gmail发邮件
  6. GitHub 总星 4w+!删库?女装?表情包?这些沙雕中文项目真是我每天快乐的源泉!
  7. 航芯技术分享 | BMS专题之BMS基础功能模块概述
  8. 用一根网线连接树莓派跟pc
  9. OSChina 周三乱弹 ——人生四人行,一男两女是夫妻,还有一个单身狗
  10. Educational Codeforces Round 91 (Rated for Div. 2) . d Berserk And Fireball