YOLO数据集自动标注(预标注)

最近标注,数据集一直很头疼,所以想着预训练下然后自动生成再微调数据集会省事很多,

虽然达不到很好的效果,自动标注的情况主要还是看识别的准确率怎么样

下面做下笔记记录,将预测出来的类别直接生成xml文件,省去重复标注的过程,只需要手动微调就行

import cv2
import numpy as np
import time,os
import xml.dom.minidom
import xml.etree.ElementTree as ET
from xml.dom.minidom import Document

FONT = cv2.FONT_HERSHEY_PLAIN
# 定义检测的置信阈值.
conf_thresh = 0.5
time_start = time.time()

class xmlvalue():
    def __init__(self,fname,folder,path,img):
        """
        :param fname: 图片名称
        :param folder: 父级文件夹
        :param p: 图片路径
        :param img: 图片
        #:param label: 类别词典,(类别:标注框)
        """
        self.filname = fname
        self.folder = folder
        self.path = path
        self.Img = img

    def setlabel(self, label):
        self.Label = label

# -------------------------类别-----------------------
def labelobject(doc,DOCUMENT,labelname,coor):
    object = doc.createElement('object')
    # object.appendChild(doc.createTextNode("JPEGImages"))
    DOCUMENT.appendChild(object)

    name = doc.createElement('name')
    name.appendChild(doc.createTextNode(str(labelname)))
    object.appendChild(name)

    pose = doc.createElement('pose')
    pose.appendChild(doc.createTextNode("Unspecified"))
    object.appendChild(pose)

    truncated = doc.createElement('truncated')
    truncated.appendChild(doc.createTextNode("0"))
    object.appendChild(truncated)

    difficult = doc.createElement('difficult')
    difficult.appendChild(doc.createTextNode("0"))
    object.appendChild(difficult)

# """------------------*******坐标*******---------------------------"""
    bndbox = doc.createElement('bndbox')
    object.appendChild(bndbox)
    xmin = doc.createElement('xmin')
    xmin.appendChild(doc.createTextNode(str(coor[1])))
    bndbox.appendChild(xmin)

    ymin = doc.createElement('ymin')
    ymin.appendChild(doc.createTextNode(str(coor[2])))
    bndbox.appendChild(ymin)

    xmax = doc.createElement('xmax')
    xmax.appendChild(doc.createTextNode(str(coor[3])))
    bndbox.appendChild(xmax)

    ymax = doc.createElement('ymax')
    ymax.appendChild(doc.createTextNode(str(coor[4])))
    bndbox.appendChild(ymax)
    return object


def creatxml(Cxml):
    doc = Document()  # 创建DOM文档对象

    DOCUMENT = doc.createElement('annotation')  # 创建根元素
    # DOCUMENT.setAttribute('content_method',"full")#设置命名空间
    # DOCUMENT.setAttribute('xsi:noNamespaceSchemaLocation','DOCUMENT.xsd')#引用本地XML Schema
    doc.appendChild(DOCUMENT)
    ############item:Python处理XML之Minidom################

    # 创建节点
    folder = doc.createElement('folder')
    # 添加值
    folder.appendChild(doc.createTextNode(Cxml.folder))
    # 添加至父节点中
    DOCUMENT.appendChild(folder)

    filename = doc.createElement('filename')
    filename.appendChild(doc.createTextNode(Cxml.filname))
    DOCUMENT.appendChild(filename)

    path = doc.createElement('path')
    path.appendChild(doc.createTextNode(Cxml.path))
    DOCUMENT.appendChild(path)

    """
    <source>
            <database>Unknown</database>
        </source>
    """
    """----------------***source***-----------------------"""
    source = doc.createElement('source')
    DOCUMENT.appendChild(source)

    database = doc.createElement('database')
    database.appendChild(doc.createTextNode("Unknown"))
    source.appendChild(database)
    """----------------***size***-----------------------"""
    size = doc.createElement('size')
    DOCUMENT.appendChild(size)

    imgshape = Cxml.Img.shape
    width = doc.createElement('width')
    width.appendChild(doc.createTextNode(str(imgshape[1])))
    size.appendChild(width)
    height = doc.createElement('height')
    height.appendChild(doc.createTextNode(str(imgshape[0])))
    size.appendChild(height)
    depth = doc.createElement('depth')
    depth.appendChild(doc.createTextNode(str(imgshape[2])))
    size.appendChild(depth)
    """
    <segmented>0</segmented>
    """
    segmented = doc.createElement('segmented')
    segmented.appendChild(doc.createTextNode("0"))
    DOCUMENT.appendChild(segmented)
    for value in Cxml.Label:
        DOCUMENT.appendChild(labelobject(doc,DOCUMENT, value[0],value))
    ########### 将DOM对象doc写入文件
    xmlname = Cxml.path[:-3]+"xml"
    print("save to :" ,xmlname)
    f = open(xmlname, 'w')
    # f.write(doc.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8'))
    doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
    f.close()


def readimg(frame,Cxml):

    frame_id = 0
    frame_id += 1
    # frame = cv2.resize(frame, (640, 480))

    blob = cv2.dnn.blobFromImage(frame, 1 / 255, (416, 416), swapRB=True)

    net.setInput(blob)
    outs = net.forward(output_layers)

    confidences = []
    class_ids = []
    boxes = []

    for out in outs:
        for detection in out:

            scores = detection[5:]

            class_id = np.argmax(scores)

            confidence = scores[class_id]

            if confidence > conf_thresh:

                height, width, channels = frame.shape
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)
                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                confidences.append(float(confidence))
                class_ids.append(class_id)
                boxes.append([x, y, w, h])

    indexes = cv2.dnn.NMSBoxes(boxes, confidences, conf_thresh, 0.4)

    mdict = []
    for i in range(len(boxes)):
        # If the box remained after NMS.
        if i in indexes:
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            mlist = [label,x,y,x+w,y+h]
            mdict.append(mlist)
            confidence = confidences[i]

            color = colors[class_ids[i]]
            # Draw the box.
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255,0,0), 2)

            cv2.putText(frame,  label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 2)

    Cxml.setlabel(mdict)
    creatxml(Cxml)
    elapsed_time = time.time() - time_start
    fps = frame_id / elapsed_time
    cv2.putText(frame, "FPS: " + str(round(fps, 2)), (8, 30), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 0), 2)

    # cv2.imshow("Camera", frame)
    # cv2.waitKey(2)


if __name__ == '__main__':

    JPEGpath = 'image'
    # 测试图片,
    path = os.getcwd()
    path = os.path.join(path,JPEGpath)

    net = cv2.dnn.readNet("./model/yolov4-tiny.weights", "./model/yolov4-tiny.cfg")

    layer_names = net.getLayerNames()
    output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    with open("./model/coco.names", "r") as f:
        classes = [line.strip() for line in f.readlines()]

  colors = np.random.uniform(0, 255, size=(len(classes), 3))
for i in os.listdir(path): if i.endswith('jpg') or i.endswith('png'): zpath = os.path.join(path, i) img = cv2.imread(zpath) # newpath = zpath.replace('test', 'voc2007de') Cxml = xmlvalue(i,JPEGpath,zpath,img) readimg(img,Cxml) # rtsp = "rtsp://admin:cqits12345@192.168.1.108/cam/realmonitor?channel=1&subtype=0" # # Initialise a video capture object with the first camera. # cap = cv2.VideoCapture("hat.mp4") # fps = int(cap.get(cv2.CAP_PROP_FPS)) # width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # # fourcc = cv2.VideoWriter_fourcc(*'XVID') # # videoWriter = cv2.VideoWriter('11.avi', fourcc, int(fps), (int(width), int(height))) # sucess, frame = cap.read() # while sucess: # sucess, frame = cap.read() # readimg(frame) # cv2.waitKey(2)

  

posted @ 2020-11-11 16:35  土豆吖  阅读(2865)  评论(1编辑  收藏  举报