闲扯淡之机器学习——Python图像标注工具实现

时间过得真快,最近好久没有和大家闲扯淡了,好像,好像你们啊!!最近工作比较忙,一直想写点东西,但是身不由己啊。好不容易抽出一点时间写了一个工具——图像标注工具,这个工具与github上的labelImg很像,坦白承认我的却抄袭labelImg的部分标注方法(臭不要脸的抄袭,赶快滚,有多远滚多远)。


(2018年8月14日)最近发现一个比较好用的标注工具labelme,我个人感觉这个应该比labelImg好用,这里是labelme的github的连接,关于如何使用这个工具请移步这里


我这这一个工具的目的:
1.最近在学习python,所以想练练手;
2.labelImg只能够标注矩形目标区域,局限性比较多,我想写一个更加通用的工具(更加通用可能有点太自大了,写到最好发现,我写的东西也有很多局限性,后面我会不断的迭代);
现在给大家展示一下这个软件的界面:
这里写图片描述
这个界面是初始界面,下面的界面是工作时的界面:
这里写图片描述
散点标注为下图:
这里写图片描述

这里我主要使用python中的tkinter库实现界面(我在网上看到:有人说这个库不好,至于这个库的好坏我不过评论,仁者见仁智者见智吧),标注文件目前仅支持XML。
目前存在的问题:
1.未知的bug(自己测试难免会有问题)
2.离散点标注,目前要求标注四个点;
3.标注文件保存格式仅支持XML;
4.代码书写不规范;
5.仅支持中文;
6.部分弹窗不友好。
针对以上问题,会在后期的版本改正这些问题,改正完2,4,6后,我会将这个工程共享到github。众人拾柴火焰高,求大神帮忙,一起完善改进,谢谢!!


修改于2018年8月14日,主要优化了界面和代码,优化后的界面如下图:
这里写图片描述
下面贴出一部分代码:

#-*- coding:utf-8 -*-

import codecs
from lxml import etree
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement

class XMLWrite:
    def __init__(self,folder_path,file_name):
        self.folder_path = folder_path
        self.file_name = file_name
        self.top = Element('Images')
        self.object = None

    def create_object(self,path,object_name = 'objectName',tag_name = 'FilePath'):
        self.object = SubElement(self.top, object_name)
        self.object.set(tag_name, path)

    def set_lable_info(self, lable ,lable_name='LableName'):
        if self.object == None:
            raise Exception('没有创建object对象,create_object方法')
        plate = SubElement(self.object, lable_name)
        plate.text = lable

    def set_object_info(self,tag_name = 'Size',**args):
        if self.object == None:
            raise Exception('没有创建object对象,create_object方法')

        size = SubElement(self.object, tag_name)
        for key in args:
            sub = SubElement(size, key)
            sub.text = str(args[key])

    def set_position_rect(self,tag_name = 'Position',**args):
        if self.object == None:
            raise Exception('没有创建object对象,create_object方法')
        point = SubElement(self.object, tag_name)

        for key in args:
            sub = SubElement(point, key)
            sub.text = str(args[key])

    def set_position_scat(self, tag_name = 'Position',info = None):
        if self.object == None:
            raise Exception('没有创建object对象,create_object方法')
        point = SubElement(self.object,tag_name)
        for key in info:
            sub = SubElement(point, key)
            sub.set('x',str(info[key][0]))
            sub.set('y', str(info[key][1]))

    def prettify(self, elem):
        rough_string = ElementTree.tostring(elem, 'utf8')
        root = etree.fromstring(rough_string)
        return etree.tostring(root, pretty_print=True, encoding='utf-8').replace("  ".encode(), "\t".encode())

    def save(self,targetFile=None):
        #root = self.genXML()
        out_file = None
        if targetFile is None:
            out_file = codecs.open(self.file_name + '.xml', 'w', encoding='utf-8')
        else:
            out_file = codecs.open(targetFile, 'w', encoding='utf-8')
        prettifyResult = self.prettify(self.top)
        out_file.write(prettifyResult.decode('utf8'))
        out_file.close()

这里更新有添加了JSON格式,JSON格式很简单,大家在使用过程中直接把XML改成JSON就可以了,这一块我后期会完善,下面是JSON格式的代码:

#-*- coding:utf-8 -*-

import json

class JSON:
    def __init__(self):
        pass

    def JSONRead(self,path):
        with open(path, 'r') as json_f:
            data = json.load(json_f)
        return data

    def JSONWrite(self,path,dict_info):
        with open(path,'w') as json_f:
            json.dump(dict_info, json_f)

上面主要用于处理xml文件的。

#!/usr/bin/env python3
# coding:utf-8

import os
import filetype
import tkinter as tk
from lib import XML_LIB
import tkinter.ttk as ttk
from tkinter import simpledialog
from PIL import Image, ImageTk
import tkinter.messagebox as mb
import tkinter.filedialog as dir
'''
这是一个基于tkinter库的图像标注工具,目前支持标注矩形区域和散点区域,标注文件支持XML和JSON格式
'&#
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值