保存結果,改爲xml,修改XML

1.先把識別結果保存爲.txt文件。

##保存測量結果爲XML文件
from ctypes import *
import math
import random
"""The Python implementation of the GRPC helloworld.Greeter server."""
from concurrent import futures
import time
import logging
import numpy as np
import cv2
from ctypes import *
import math
import socket
import sys
import threading
import json
import random
import time
import gc
import objgraph
#import darknetmain
import psutil
import os
from multiprocessing import Process,Lock
import weakref

def sample(probs):
    s = sum(probs)
    probs = [a/s for a in probs]
    r = random.uniform(0, 1)
    for i in range(len(probs)):
        r = r - probs[i]
        if r <= 0:
            return i
    return len(probs)-1

def c_array(ctype, values):
    arr = (ctype*len(values))()
    arr[:] = values
    return arr

class BOX(Structure):
    _fields_ = [("x", c_float),
                ("y", c_float),
                ("w", c_float),
                ("h", c_float)]

class DETECTION(Structure):
    _fields_ = [("bbox", BOX),
                ("classes", c_int),
                ("prob", POINTER(c_float)),
                ("mask", POINTER(c_float)),
                ("objectness", c_float),
                ("sort_class", c_int)]


class IMAGE(Structure):
    _fields_ = [("w", c_int),
                ("h", c_int),
                ("c", c_int),
                ("data", POINTER(c_float))]

class METADATA(Structure):
    _fields_ = [("classes", c_int),
                ("names", POINTER(c_char_p))]

    

#lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)
lib = CDLL("libdarknet.so", RTLD_GLOBAL)
lib.network_width.argtypes = [c_void_p]
lib.network_width.restype = c_int
lib.network_height.argtypes = [c_void_p]
lib.network_height.restype = c_int

predict = lib.network_predict
predict.argtypes = [c_void_p, POINTER(c_float)]
predict.restype = POINTER(c_float)

set_gpu = lib.cuda_set_device
set_gpu.argtypes = [c_int]

make_image = lib.make_image
make_image.argtypes = [c_int, c_int, c_int]
make_image.restype = IMAGE

get_network_boxes = lib.get_network_boxes
get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)]
get_network_boxes.restype = POINTER(DETECTION)

make_network_boxes = lib.make_network_boxes
make_network_boxes.argtypes = [c_void_p]
make_network_boxes.restype = POINTER(DETECTION)

free_detections = lib.free_detections
free_detections.argtypes = [POINTER(DETECTION), c_int]

free_ptrs = lib.free_ptrs
free_ptrs.argtypes = [POINTER(c_void_p), c_int]

network_predict = lib.network_predict
network_predict.argtypes = [c_void_p, POINTER(c_float)]

reset_rnn = lib.reset_rnn
reset_rnn.argtypes = [c_void_p]

load_net = lib.load_network
load_net.argtypes = [c_char_p, c_char_p, c_int]
load_net.restype = c_void_p

do_nms_obj = lib.do_nms_obj
do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

do_nms_sort = lib.do_nms_sort
do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

free_image = lib.free_image
free_image.argtypes = [IMAGE]

letterbox_image = lib.letterbox_image
letterbox_image.argtypes = [IMAGE, c_int, c_int]
letterbox_image.restype = IMAGE

load_meta = lib.get_metadata
lib.get_metadata.argtypes = [c_char_p]
lib.get_metadata.restype = METADATA

load_image = lib.load_image_color
load_image.argtypes = [c_char_p, c_int, c_int]
load_image.restype = IMAGE

rgbgr_image = lib.rgbgr_image
rgbgr_image.argtypes = [IMAGE]

predict_image = lib.network_predict_image
predict_image.argtypes = [c_void_p, IMAGE]
predict_image.restype = POINTER(c_float)

def classify(net, meta, im):
    out = predict_image(net, im)
    res = []
    for i in range(meta.classes):
        res.append((meta.names[i], out[i]))
    res = sorted(res, key=lambda x: -x[1])
    return res

#def detect(net, meta, image, thresh=.3, hier_thresh=.3, nms=.55):
def detect(net, meta, image, thresh=.3, hier_thresh=.3, nms=.35):
    im = load_image(image, 0, 0)
    num = c_int(0)
    pnum = pointer(num)
    predict_image(net, im)
    dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum)
    num = pnum[0]
    if (nms): do_nms_obj(dets, num, meta.classes, nms);

    res = []
    for j in range(num):
        for i in range(meta.classes):
            if dets[j].prob[i] > 0:
                b = dets[j].bbox
                res.append((meta.names[i].decode(), dets[j].prob[i], (b.x, b.y, b.w, b.h)))
    res = sorted(res, key=lambda x: -x[1])
    free_image(im)
    free_detections(dets, num)
    return res
    
if __name__ == "__main__":
    #net = load_net("cfg/densenet201.cfg", "/home/pjreddie/trained/densenet201.weights", 0)
    #im = load_image("data/wolf.jpg", 0, 0)
    #meta = load_meta("cfg/imagenet1k.data")
    #r = classify(net, meta, im)
    #print r[:10]
    #net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0)
    #meta = load_meta("cfg/coco.data")
    net = load_net(b"cfg/yolov3-voc.cfg", b"yolov3-voc_10000.weights", 0)
    meta = load_meta(b"cfg/voc.data")
    #print (r)
    p0="/media/yll/ylw/yll/work/bag/9.25data"
    #p0="/media/yll/ylw/yll/work/bag/11"
    #p0="/media/yll/ylw/yll/work/bag/record9.25/10"
    oldfile=os.listdir(p0)
    for ii in oldfile:
        path1=os.path.join(p0,ii)
        print("開始開始開始",path1)
        teimage=cv2.imread(path1)
        boxes = detect(net, meta, path1.encode('utf-8'))
        #boxes=retun(teimage)
        #print("shape shape shape",teimage.shape)
        #print(boxes,len(boxes))
        fw = open('./result117.txt','a')
        print("11111111",ii,boxes)
        if  len(boxes) > 0:
            #for i in range(len(boxes)):
                #score=boxes[i][1]
                #label=boxes[i][0]
                #aa=int(boxes[1])
            print("222222222",boxes)
            fw.write(str(ii)+""+str(boxes)+"\n")
            #fw.write("\n")
                #fw = open('./result.txt','a')
    fw.close()
    """
                if (label==b"package"):
                    #print("ddd")
                    fw = open('./result.txt','a')   #保存結果的文件,下同
                    fw.write(str(ii)+" "+str(boxes)+"\n")
                    #fw.close()
                elif (str(label)=="person"):
                    fw = open('./result.txt','a')   #保存結果的文件,下同
                    fw.write(str(ii)+""+str(boxes)+"\n")
                    #fw.close()
    """
    

2,將txt改爲XML文件

from skimage import io
import shutil
import random
import os
import string
headstr = """\
<annotation>
    <folder>VOC2007</folder>
    <filename>%s.jpg</filename>
    <path>%s</path>
    <source>
        <database>Unknown</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
    </source>
    <size>
        <width>%d</width>
        <height>%d</height>
        <depth>%d</depth>
    </size>
    <segmented>0</segmented>
"""
objstr = """\
    <object>
        <name>%s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%d</xmin>
            <ymin>%d</ymin>
            <xmax>%d</xmax>
            <ymax>%d</ymax>
        </bndbox>
    </object>
"""
 
tailstr = '''\
</annotation>
'''

def writexml(idx, head, bbxes, tail):
    filename = "Annotations/%06d.xml" % (idx)
    f = open(filename, "w")
    f.write(head)
    for bbx in bbxes:
        f.write(objstr % ('face', bbx[0], bbx[1], bbx[0] + bbx[2], bbx[1] + bbx[3]))
    f.write(tail)
    f.close()
#def excute_datasets(idx, datatype):
i=0
f_bbx = open('/media/yll/ylw/yll/work/bag/darknet1test/result117.txt', 'r')
for  filename in f_bbx:
        #filename = f_bbx.readline().strip('\n')
        #print(",,,,,,,,,,,,,,,,,",filename[:7])
        if not filename:
            break
        print(filename[0:6],filename[0:10])
        i+=1
        #print(i)
        p0="/media/yll/ylw/yll/work/bag/9.25data/"+str(filename[0:10])
        path1="/media/yll/ylw/yll/work/bag/darknet1/rename/24/"+str(filename[0:6]+".xml")
        #print(filename)
        #print("ssssssssss",i,p0)
        im = io.imread(p0)
        idx=filename[0:6]
        idpath="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC2007/JPEGImages/"+str(filename[0:10])
        #idpath="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC2007/JPEGImages"+
         
        head = headstr % (idx,idpath, im.shape[1], im.shape[0], im.shape[2])

        f = open(path1, 'w')
        f.write(head)
        boxes=eval(filename[10:])
        #print("aaaaaaaaaaaa",numss[0])
        
        for i in range (len(boxes)):
            xmin=boxes[i][2][0]-boxes[i][2][2]/2
            ymin=boxes[i][2][1]-boxes[i][2][3]/2
            xmax=boxes[i][2][0]+boxes[i][2][2]/2
            ymax=boxes[i][2][1]+boxes[i][2][3]/2
                        
            #print("ddddqqqqq",ind,len(boxes))
            f.write(objstr % (str(boxes[i][0]), xmin, ymin,xmax ,ymax))
        f.write(tailstr)    

        f.close()

3.該圖片名字並修改XML文件

# -*- coding: UTF-8 -*-
##修改xml文件
import xml.etree.ElementTree as ET
import os 
import cv2
def xmlre(cca,ccc,ccd,result2):
    if  ccc in result2:
            tree=ET.parse(i)
            root=tree.getroot()
            filename = tree.find("filename")
            filename.text=str(cca)
            path = tree.find("path")
            #c2=
            aa=path4+str(cca)
            #print(aa)
            path.text =aa
            tree.write(ccd,encoding='utf-8')

spath="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC2007/JPEGImages"
result=[]
path1="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC2007/Annotations"
path2="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC200711/Annotations"
path0="/media/yll/ylw/yll/work/bag/record9.25/data/xml (復件)"
path4="/media/yll/ylw/yll/work/bag/darknet1/VOCdevkit/VOC2007/JPEGImages/"
path5="/media/yll/ylw/yll/work/bag/darknet1/rename/22"
path6="/media/yll/ylw/yll/work/bag/9.25data"
#XML路徑#XML路徑
xml=os.listdir(path5)
for file in xml:
        #filename=os.path.join(path0,file)
        result.append(file)
#圖片路徑#圖片路徑
filelist = os.listdir(path6)
total_sum = len(filelist)
i = 1 

for item in filelist:
    # endswith() 方法用於判斷字符串是否以指定後綴結尾,如果以指定後綴結尾返回True,否則返回False。
    if item.endswith('.jpg'):
        # os.path.join 用於路徑拼接,src爲完整圖片路徑
        src = os.path.join(os.path.abspath(path6),item)
        str1 = str(i+16623)
        cA=str1.zfill(6)+'.jpg'
        cC=item[0:6]+'.xml'
        cD=str1.zfill(6)+'.xml'
        if cC in result:
            path15=os.path.join(path5,cC)
            #path5=path0+str(cC)
            tree=ET.parse(path15)
            root=tree.getroot()
            filename = tree.find("filename")
            filename.text=cA
            path = tree.find("path")
            #c2=
            aa=path4+str(cA)
            print(aa)
            path.text =aa
            tree.write(cD,encoding='utf-8')
        dst = os.path.join(os.path.abspath(path6),str1.zfill(6)+'.jpg')
        os.rename(src,dst)

4,給XML文件增加節點屬性

# -*- coding: UTF-8 -*-
import xml.etree.ElementTree as ET
import os 
import cv2
path0="/media/yll/ylw/yll/work/bag/darknet/VOCdevkit/000001.xml"
tree=ET.parse(path0)

root=tree.getroot()
newNode = ET.Element('annotation')
newNodeName = ET.Element('path')
newNodeName.text = '/media/yll/ylw/yll/work/bag/darknet/VOCdevkit/VOC2007/JPEGImages/010765.jpg'
#newNode.append(newNodeName)
root.insert(2, newNodeName)
#root[3].set('na')
print(root[2])
ET.dump(root)
#insert
#tree.set(source, 'cc') 
#root.set=mei
#rank = ET.SubElement(root,'source',{'rank':'2'}) 
#rank.text = '1'
tree.write("/media/yll/ylw/yll/work/bag/darknet/VOCdevkit/000002.xml")
#path.appendChild="ccc"
#c1=path.text
#print(root[3][0].text)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章