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

图像半自动标注「建议收藏」前言标注数据集对深度学习而言是很重要的一步,但是标注数据是件很繁琐的工作,而半自动标注可以减轻工作量。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>

打开标注软件完善标注

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

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


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

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

总结

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 手把手教你学SVN

    手把手教你学SVN注意转载须保留原文链接(http://www.cnblogs.com/wzhiq896/p/6822713.html)作者:wangwen896SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。对于很多新手来…

  • dhcp option 82 接入交换机_dhcpoption怎么配置

    dhcp option 82 接入交换机_dhcpoption怎么配置Option82应用场景在该场景下,临时接入者可以在不安装认证客户端的情况下,直接访问Internet资源,但是不能访问学校、企业、政府单位的内网,适用于各种会务、学术交流、临时参观等应用场景,正式员工可以在会议区通过认证接入到内网。为了实现该场景,我们首先要对神州数码网络交换机产品的DHCPOption82功能进行描述。Option82相关技术Option82功能介绍  DH…

    2022年10月16日
  • 布隆过滤器-原理介绍[通俗易懂]

    布隆过滤器-原理介绍[通俗易懂]一、布隆过滤器概念引入     (BloomFilter)是由布隆(BurtonHowardBloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例Falsepositives,即BloomFilter报告某一元素存在

  • SpringCloud系列之客户端负载均衡Netflix Ribbon

    SpringCloud系列之客户端负载均衡Netflix Ribbon

    2020年11月19日
  • C语言-链表排序_单链表的排序c语言

    C语言-链表排序_单链表的排序c语言C语言-链表排序题目描述已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。输入第一行,a、b两个链表元素的数量N、M,用空格隔开。接下来N行是a的数据然后M行是b的数据每行数据由学号和成绩两部分组成输出按照学号升序排列的数据样例输入235100689382495210样例输出210382…

    2022年10月11日
  • Keil5最新注册机到2032

    Keil5最新注册机到2032嘿,好久不见啦,我这个马虎鬼,新的一年大家要平安顺遂、万事如意。真的过了好久没有写博客了,不在的这段时间发生了很多变故,要相信一切都会变美好的。加油啦,马虎鬼~用博客记录点滴,不管怎样,认真做自己吧~一、注册机资源百度i链接:链接:https://pan.baidu.com/s/1chvIeo9UVhnDK-a-Jq3pGg提取码:bi4u二、操作首先用管理员身份打开Keil5;在界面中选中下方菜单栏中的选项;点击后,可以看到如下的界面;选择右上角的ID,选中复制;接着.

发表回复

您的电子邮箱地址不会被公开。

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