Automati c обрезка изображения из ограничивающих рамок аннотация python - PullRequest
0 голосов
/ 28 апреля 2020

Я разрабатываю CNN для распознавания изображений. У меня есть набор различных изображений, где на каждом изображении у меня есть набор различных ограничивающих рамок (как минимум 3 ограничивающих рамки для каждого изображения).

Я бы хотел автоматически извлечь часть внутри ограничивающих рамок Обрезая их, получают набор обрезанных изображений, соответствующих содержимому каждой ограничивающей рамки. Я создал vo c xml и накопительный файл .csv , который содержит все детали для каждого изображения, здесь выписка:

,filepath,x1,x2,y1,y2,class_name
0,71.jpeg,81,118,98,122,os
1,71.jpeg,120,156,83,110,od
2,71.jpeg,107,161,136,154,m

По сути, у меня есть упомянутые изображения в формате .jpeg в отдельной папке (\ train_images) и файлы аннотаций. У вас есть быстрое внедрение, которое решает эту проблему.

Спасибо

1 Ответ

0 голосов
/ 28 апреля 2020

Ну, я нашел способ извлечь обрезанные изображения с помощью этого кода:

#crop images
import numpy as np # linear algebra
import xml.etree.ElementTree as ET # for parsing XML
import matplotlib.pyplot as plt # to show images
from PIL import Image # to read images
import os
import glob

root_images="/content/images"
root_annots="/content/annotation"

all_images=os.listdir("/content/images/")
print(f"Total images : {len(all_images)}")

breeds = glob.glob('/content/annotation/')
annotation=[]
for b in breeds:
    annotation+=glob.glob(b+"/*")
print(f"Total annotation : {len(annotation)}")

breed_map={}
for annot in annotation:
    breed=annot.split("/")[-2]
    index=breed.split("-")[0]
    breed_map.setdefault(index,breed)
    
print(f"Total Breeds : {len(breed_map)}")

def bounding_box(image):
    #bpath=root_annots+str(breed_map[image.split("_")[0]])+"/"+str(image.split(".")[0])
    #print (bpath)
    #print(root_annots)
    #print (str(breed_map[image.split("_")[0]]))
    #print (str(image.split(".")[0]))
    bpath=root_annots+"/"+str(image.split(".")[0]+".xml")
    tree = ET.parse(bpath)
    root = tree.getroot()
    objects = root.findall('object')
    
    for o in objects:
        bndbox = o.find('bndbox') # reading bound box
        xmin = int(bndbox.find('xmin').text)
        ymin = int(bndbox.find('ymin').text)
        xmax = int(bndbox.find('xmax').text)
        ymax = int(bndbox.find('ymax').text)
        
        
    return (xmin,ymin,xmax,ymax)
    
lt.figure(figsize=(10,10))
bbox=[]
for i,image in enumerate(all_images):
    bbox=bounding_box(image 
    print (bbox)  
    im=Image.open(os.path.join(root_images,image))
    im=im.crop(bbox)
      
      #plt.subplot(3,3,j+1)
      #plt.axis("off")
      #plt.imshow(im)
      #bbox=[]  
               
             im.save('/content/results_imgs/{}.jpeg'.format(j,im)) 

Но если вы запустите этот код, он извлечет только одно изображение из нескольких ограничивающих рамок в каждом xml. Как мне изменить его, чтобы получить все изображения из нескольких ограничивающих рамок, аннотированных внутри каждого xml?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...