资源简介

该脚本可以通过opencv的dnn模块调用darknet模型对数据进行自动标注,生成xml文件,使用时需要自己修改路径。

资源截图

代码片段和文件信息

#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : DongLZ
# date: 2020-05-22

from xml.etree import ElementTree as ET
import cv2
import os
import numpy as np
from os import getcwd

imgdir = ‘img‘ 
IMAGES_LIST=os.listdir(imgdir) # 图片路径

weightsPath = “./face/face.weights“
configPath = “./face/face.cfg“
labelsPath = “./face/face.names“
LABELS = open(labelsPath).read().strip().split(“\n“)
print(LABELS)

net = cv2.dnn.readNetFromDarknet(configPath weightsPath)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

def coordinate_get(img):
    coordinates_list=[] # 创建坐标列表
    boxes = []
    confidences = []
    classIDs = []
    (H W) = img.shape[:2]
    # 得到 YOLO需要的输出层
    ln = net.getlayerNames()
    ln = [ln[i[0] - 1] for i in net.getUnconnectedOutlayers()]
    # 从输入图像构造一个blob,然后通过加载的模型,给我们提供边界框和相关概率
    blob = cv2.dnn.blobFromImage(img 1 / 255.0 (416 416) swapRB=True crop=False)
    net.setInput(blob)
    layerOutputs = net.forward(ln)

    # 在每层输出上循环
    for output in layerOutputs:
        # 对每个检测进行循环
        for detection in output:
            scores = detection[5:]
            classID = np.argmax(scores)
            confidence = scores[classID]
            # 过滤掉那些置信度较小的检测结果
            if confidence > 0.01:
                # 框后接框的宽度和高度
                box = detection[0:4]  * np.array([W H W H])
                (centerX centerY width height) = box.astype(“int“)
                # 边框的左上角
                x = int(centerX - (width / 2))
                y = int(centerY - (height / 2))
                # 更新检测出来的框
                boxes.append([x y int(width) int(height)])
                confidences.append(float(confidence))
                classIDs.append(classID) 

    idxs = cv2.dnn.NMSBoxes(boxes confidences 0.2 0.3)
    if len(idxs) > 0:
        for i in idxs.flatten():
            (x y) = (boxes[i][0] boxes[i][1])
            (w h) = (boxes[i][2] boxes[i][3])

            xmin = int(x)
            ymin = int(y)
            xmax = int(x + w)
            ymax = int(y + h)
            coordinates_list.append([xminyminxmaxymaxclassIDs[i]])

    return coordinates_list

#创建一级分支object
def create_object(rootxiyixayaobj_name):   # 参数依次,树根,xmin,ymin,xmax,ymax
    #创建一级分支object
    _object=ET.SubElement(root‘object‘)
    #创建二级分支
    name=ET.SubElement(_object‘name‘)
 

评论

共有 条评论