tf-faster-rcnn 처리에 대한 몇 가지 작은 코드

7272 단어
1. 자신의 데이터 집합의 파일 이름을pascal voc의 이름으로 통일적으로 수정: 코드 이름:xmlnode.py
# coding:utf-8
import os
import os.path
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
from w3lib.html import remove_tags

findpath ='/media/ymw/LANKEXIN/02facexml'
filenames=os.listdir(findpath)
s=[]
save_path ='/media/ymw/LANKEXIN/02facexml'
for file in filenames:

    tree = ET.parse(os.path.join(findpath, file))
    root = tree.getroot()

    #       01face (1).jpg  000001.jpg
    nodename = root[1].text
    re_nodename = nodename[:-4].replace('02face (', '').replace(')', '')
    new_num = int(re_nodename) + 1696
    new_nodename = str(new_num)
    new_nodename1 = new_nodename.zfill(6) + '.jpg'
    # new_nodename1 = re_nodename.zfill(6) + '.jpg'
    root[1].text = new_nodename1


    tree.write(os.path.join(save_path, file))


2. 자신의 데이터 세트 마크업 형식을pascal voc의 마크업 형식으로 전환: 코드 이름: newxml.py
# coding:utf-8
import os
import os.path
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
findpath = '/media/ymw/LANKEXIN/02facexml'
filenames = os.listdir(findpath)
s = []
xml_path = '/media/ymw/LANKEXIN/02facexml'
for file in filenames:

#       (  pascal voc      )
    tree = ET.parse(os.path.join(findpath, file))
    root = tree.getroot()
    source = Element('source')
    root.append(source)


    database = Element('database')
    database.text = 'The VOC2007 Database'
    source.append(database)
    annotation = Element('annotation')
    annotation.text = 'PASCAL VOC2007'
    source.append(annotation)
    image = Element('image')
    image.text = 'flickr'
    source.append(image)
    #   bndbox     
    object = root.getchildren()[3]
    face = object.getchildren()[0]
    big = face.getchildren()[1]

    #  ...  object        

    one = Element('name')
    one.text = 'cat'
    object.append(one)
    two = Element('pose')
    two.text = 'Unspecified'
    object.append(two)
    three = Element('truncated')
    three.text = '0'
    object.append(three)
    four = Element('difficult')
    four.text = '0'
    object.append(four)
    object.append(big)
    object.remove(face)
    # bndbox = ET.SubElement(face, 'bndbox')
    # bndbox.text = big.text
    nodename2 = root[3].tag
    root[3].tag = 'object'
    root[3][4].tag = 'bndbox'

#                   
    tree.write(os.path.join(xml_path, file))



3. Annotations 폴더에서 ImageSets를 생성하고, xml 파일에서 txt 파일을 생성합니다. 코드 이름: xml2txt.py
# coding:utf-8
import os
import random

trainval_percent = 0.98  #   trainval_percent   ,      ,    
train_percent = 0.98  #           ,    
xmlfilepath = '/home/ymw/  /xinan/Cat Face/catxml_total'
txtsavepath = '/home/ymw/  /xinan/Cat Face/cattxt_total/'
total_xml = os.listdir(xmlfilepath)

num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)

ftrainval = open(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/val.txt', 'w')

for i in list:
    org_name=total_xml[i][:-4]+'
' re_name=org_name.replace('01face (', '').replace(')', '') name=re_name.zfill(7) if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest .close()

4. 시각화된 데이터 세트 검사 오류: 코드 이름:view.py
# -*- coding: UTF-8 -*-
from xml.etree import ElementTree as ET
import cv2
import os

imgpath = '/home/ymw/PycharmProjects/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/JPEGImages'
xmlpath = '/home/ymw/  /facebig_xml'
imgnames = os.listdir(imgpath)
for imgname in imgnames:

    img = cv2.imread(os.path.join(imgpath, imgname))
    index = imgname[:-4]
    xmlname = index + '.xml'
   
    tree = ET.parse(os.path.join(xmlpath, xmlname))
    root = tree.getroot()
    bndbox = root.getchildren()[3].getchildren()[4]
  
    big_xmin = int(bndbox.getchildren()[0].text)
    big_ymin = int(bndbox.getchildren()[1].text)
    big_xmax = int(bndbox.getchildren()[2].text)
    big_ymax = int(bndbox.getchildren()[3].text)
       
    cv2.rectangle(img, (big_xmin, big_ymin), (big_xmax, big_ymax), (0, 0, 255), 2)

    cv2.imwrite(os.path.join('/home/ymw/PycharmProjects/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/viewimgs',imgname), img)


5. 자신의 마크업에 좌표값이 0인지 확인(tf-faster-rcnn에 영향을 미쳐 프로그램 오류 발생: total loss = Nan):
#coding:utf-8
from xml.etree import ElementTree as ET

import os
import shutil,re

xmlpath = '/media/ymw/LANKEXIN/facebig_xml_right'
xmlnames = os.listdir(xmlpath)
i = 0
a = []
# f = open('/home/ymw/  /1.txt', 'w')
for xmlname in xmlnames:
    # f.writelines(xmlname + '
') tree = ET.parse(os.path.join(xmlpath, xmlname)) root = tree.getroot() small = root.getchildren()[3].getchildren()[0].getchildren()[0] big = root.getchildren()[3].getchildren()[4] # object = tree.findall('object') big_xmin = int(big.getchildren()[0].text) big_ymin = int(big.getchildren()[1].text) big_xmax = int(big.getchildren()[2].text) big_ymax = int(big.getchildren()[3].text) small_xmin = int(small.getchildren()[0].text) small_ymin = int(small.getchildren()[1].text) small_xmax = int(small.getchildren()[2].text) small_ymax = int(small.getchildren()[3].text) if big_xmin > small_xmin: i = i+1 # newpath = '/media/ymw/LANKEXIN/02facexml/02face_cuowu' # os.remove(os.path.join(xmlpath, xmlname)) # xmlnum = xmlname[:-4].replace('02face (', '').replace(')', '') # # print(i) print(xmlname)

이 단락 프로그램은 자신의 데이터 집중 좌표 값이 0인 그림 이름을 선별합니다. i는 개수를 표시하고 xmlname은 바로 선별할 파일 이름입니다.6. 테스트 세트 이미지 시각화 처리: 테스트 머신 이미지copy를 데이터/demo 폴더에 원래의 테스트 이미지를 교체하고 모든 테스트 세트 이미지 이름을 목록에 출력하여 테스트 세트 이미지의 시각화를 완성한다.코드 이름:copytestimg.py
import os
import shutil

# img_txtpath voc    ImageSets  text.txt,             
img_txtpath ='tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/ImageSets/Main/test.txt'
# dir .jpg      
dir = 'tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/JPEGImages'
# newpath       copy     
newpath = '/home/ymw/  /demo_test'

with open(img_txtpath) as f:
    img_index = [x.strip()+'.jpg' for x in f.readlines()]  #      pascal_voc.py              
                                                           #        +'.jpg'         ,      demo.py 
    # print(img_index)
    for file in img_index:
        img_path = os.path.join(dir, file)
        shutil.copy(img_path, newpath)  #         copy

좋은 웹페이지 즐겨찾기