图像半自动标注「建议收藏」

图像半自动标注「建议收藏」前言标注数据集对深度学习而言是很重要的一步,但是标注数据是件很繁琐的工作,而半自动标注可以减轻工作量。Github(https://github.com/virajmavani/semi-auto-image-annotation-tool)上有一款自动标注工具,它以RetinaNet作为建议算法,使用预训练的RetinaNet模型从MSCOCO数据集建议80个类对象。这款工具我没有…

大家好,又见面了,我是你们的朋友全栈君。

前言

标注数据集对深度学习而言是很重要的一步,但是标注数据是件很繁琐的工作,而半自动标注可以减轻工作量。
Github(https://github.com/virajmavani/semi-auto-image-annotation-tool)上有一款自动标注工具,它以RetinaNet作为建议算法,使用预训练的RetinaNet模型从MS COCO数据集建议80个类对象。
这款工具我没有安装使用,从Demo来看效果还是挺好的,大部分目标都能检测出来。
我这里要说的半自动标注是什么?
其实就是通过训练好的模型检测目标,输出包含目标类别和位置的txt文件,然后再将其转换为xml文件,最后再使用标注工具进行完善。
当然,前提是模型的精度越高越好,如果检测结果不准确,就会增加工作量,导致无法使用。

训练模型

首先我们要训练出一个可用的模型,精度越高越好。

使用模型对数据集进行测试

以车辆检测为例,测试结果如下图所示:


图像半自动标注「建议收藏」


得到包含目标类别和位置的txt文件,部分内容如下:

00001.png car 1028 367 1241 520
00001.png car 671 382 938 610
00001.png car 939 339 1019 402

把txt文件转换为xml文件,代码如下:

#! /usr/bin/python
# -*- coding:UTF-8 -*-
import os, sys
import glob
from PIL import Image

# 图像存储位置
src_img_dir = ""  # 添加你的路径
# 图像的 ground truth 的 txt 文件存放位置
src_txt_dir = ""
src_xml_dir = ""

img_Lists = glob.glob(src_img_dir + '/*.jpg')

img_basenames = [] # e.g. 100.jpg
for item in img_Lists:
    img_basenames.append(os.path.basename(item))

img_names = [] # e.g. 100
for item in img_basenames:
    temp1, temp2 = os.path.splitext(item)
    img_names.append(temp1)

for img in img_names:
    im = Image.open((src_img_dir + '/' + img + '.jpg'))
    width, height = im.size

    # open the crospronding txt file
    gt = open(src_txt_dir + '/' + img + '.txt').read().splitlines()

    # write in xml file
    xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')
    xml_file.write('<annotation>\n')
    xml_file.write(' <folder>VOC2007</folder>\n')
    xml_file.write(' <filename>' + str(img) + '.jpg' + '</filename>\n')
    xml_file.write(' <size>\n')
    xml_file.write(' <width>' + str(width) + '</width>\n')
    xml_file.write(' <height>' + str(height) + '</height>\n')
    xml_file.write(' <depth>3</depth>\n')
    xml_file.write(' </size>\n')

    # write the region of image on xml file
    for img_each_label in gt:
        spt = img_each_label.split(' ') #这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。
        xml_file.write(' <object>\n')
        xml_file.write(' <name>' + str(spt[4]) + '</name>\n')
        xml_file.write(' <pose>Unspecified</pose>\n')
        xml_file.write(' <truncated>0</truncated>\n')
        xml_file.write(' <difficult>0</difficult>\n')
        xml_file.write(' <bndbox>\n')
        xml_file.write(' <xmin>' + str(spt[0]) + '</xmin>\n')
        xml_file.write(' <ymin>' + str(spt[1]) + '</ymin>\n')
        xml_file.write(' <xmax>' + str(spt[2]) + '</xmax>\n')
        xml_file.write(' <ymax>' + str(spt[3]) + '</ymax>\n')
        xml_file.write(' </bndbox>\n')
        xml_file.write(' </object>\n')

    xml_file.write('</annotation>')

对应的XML文件:

  <annotation>
    <folder>VOC2007</folder>
    <filename>00001.png</filename>
    <size>
        <width>1280</width>
        <height>1024</height>
        <depth>3</depth>
    </size>
    <object>
        <name>car</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>1028</xmin>
            <ymin>367</ymin>
            <xmax>1241</xmax>
            <ymax>520</ymax>
        </bndbox>
    </object>
    <object>
        <name>car</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>671</xmin>
            <ymin>382</ymin>
            <xmax>938</xmax>
            <ymax>610</ymax>
        </bndbox>
    </object>
    <object>
        <name>car</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>939</xmin>
            <ymin>339</ymin>
            <xmax>1019</xmax>
            <ymax>402</ymax>
        </bndbox>
    </object>
</annotation>

打开标注软件完善标注

如下图所示,上一步的结果可能会出现以下情况:

  • 检测结果不准确
  • 有目标未被检测出来


    图像半自动标注「建议收藏」

因此,还需要我们手动标注进行完善。

总结

如果半自动标注工具的效果能达到要求,就会大幅减小标注的工作量。
但是,精度和效率很难达到平衡,目前来看,主流方法还是全人工标注。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147535.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++读写文件的几种方法_include有什么用

    c++读写文件的几种方法_include有什么用在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结:这里主要是讨论fstream的内容:#includeofstream//文件写操作内存写入存储设备ifstream//文件读操作,存储设备读区到内存中fstrea

    2026年1月27日
    6
  • JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)

    JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)接着鼠标拖拽div(1)解决问题,当在拖拽事件所在的页面按下键盘的ctrl+A全选后,再去拖拽div,浏览器会默认去搜索网页中的内容,拖拽功能就会失效,(搜索网页内容是浏览器的默认行为,所以要想不发生这种情况,就得将其取消,是谁执行之后触发了浏览器的默认行为,就在谁里面returnfalse即可取消浏览器的默认行为,但这种方式ie8及以下的版本不支持。)在ie8及以下版本浏览器中,如果调用了元素的setCapture()方法,那么点击任何事物都会来执行这个元素绑定的响应函数。例如:btn.oncl

    2022年5月8日
    54
  • java简历的项目经验怎么写_适合大学生做的java项目

    java简历的项目经验怎么写_适合大学生做的java项目前言今年的金三银四已经过去一大半了,在这其中参与过不少面试,2021都说工作不好找,这也是对开发人员的要求变向的提高了。之前在Github上收获15K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty与RPC、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等内容非常丰富,已经帮很多人拿下互联网一线公司的offer美团一面:1、Concurr

    2022年10月7日
    6
  • Python表白代码:太秀了,用过的人都找到了对象…【满屏玫瑰盛开】

    Python表白代码:太秀了,用过的人都找到了对象…【满屏玫瑰盛开】导语暗恋让人受尽委屈!一开始,你是我的秘密,我怕你知道,又怕你不知道,又怕你知道装作不知道!这大概就是暗恋的感受吧,可若是双向奔赴,那简更是甜蜜度爆表,快同小编吃下这波狗粮!跟着上一期的玫瑰花花样表白之后,小编新出了2款新型升级之后的表白代码!花样表白总有一款是你喜欢的!效果满分~正文还是熟悉的配方!熟悉的味道!盛开的蓝玫瑰效果如下:附源码:t.setup(800,800)t.hideturtle()t.speed(11)t.penup().

    2022年5月5日
    100
  • bootstrap的一些方法「建议收藏」

    bootstrap的一些方法「建议收藏」bootstrap就是相当于对标签的id和class的封装,和一些js的封装。

    2022年7月2日
    29
  • Laravel自定义 封装便捷返回Json数据格式引用

    Laravel自定义 封装便捷返回Json数据格式引用

    2021年11月7日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号