二、VOC可视化数据集
1、作用
在做目标检测时,首先要检查标注数据。一方面是要了解标注的情况,另一方面是检查数据集的标注和格式是否正确,只有正确的情况下才能进行下一步的训练。
2、代码实现
import os
# import sys
import cv2
import random
from tqdm import tqdm
# import numpy as np
import argparse
import xml.etree.ElementTree as ETdef xml_reader(filename):""" Parse a PASCAL VOC xml file """tree = ET.parse(filename)objects = []for obj in tree.findall('object'):obj_struct = {}obj_struct['name'] = obj.find('name').textbbox = obj.find('bndbox')obj_struct['bbox'] = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]objects.append(obj_struct)return objectsdef get_image_list(image_dir, suffix=['jpg', 'png']):'''get all image path ends with suffix'''if not os.path.exists(image_dir):print("PATH:%s not exists" % image_dir)return []imglist = []for root, sdirs, files in os.walk(image_dir):if not files:continuefor filename in files:filepath = os.path.join(root, filename)if filename.split('.')[-1] in suffix:imglist.append(filepath)return imglistif __name__ == "__main__":parser = argparse.ArgumentParser(description='check data')parser.add_argument('--input', dest='input', help='The input dir of images', type=str)parser.add_argument('--output', dest='output', default='temp', help='The output dir of images', type=str)parser.add_argument('--num', dest='num', default=50, help='The number of images you want to check', type=int)args = parser.parse_args()if not os.path.exists(args.output):os.makedirs(args.output)img_list = get_image_list(args.input)img_list = random.sample(img_list, args.num)for img_path in tqdm(img_list):img = cv2.imread(img_path)if img is None or not img.any():continuexml_path = img_path.replace("JPEGImages", "Annotations").replace(".jpg", ".xml").replace(".png", ".xml")objects = xml_reader(xml_path)if len(objects) == 0:continue# draw box and namefor obj in objects:name = obj['name']box = obj['bbox']p1 = (box[0], box[1])p2 = (box[2], box[3])p3 = (max(box[0], 15), max(box[1], 15))cv2.rectangle(img, p1, p2, (0, 0, 255), 2)cv2.putText(img, name, p3, cv2.FONT_ITALIC, 1, (0, 255, 0), 2)img_name = os.path.basename(img_path)cv2.imwrite(os.path.join(args.output, img_name), img)
3、使用方法
python Visual_dataset.py --input VOCdevkit/JPEGImages --output ./Result_imgs --num 3408python 上述代码的文件名称 --input 图片地址 --output 输出文件夹地址 --num 图片数量
4、常见报错
(python38) D:\pythontorch\VOC>python Visual_dataset.py --input VOCdevkit/ImageSets --output Result_imgs --num 3408
Traceback (most recent call last):
File "Visual_dataset.py", line 55, in <module>
img_list = random.sample(img_list, args.num)
File "C:\ProgramData\Anaconda3\envs\python38\lib\random.py", line 363, in sample
raise ValueError("Sample larger than population or is negative")
ValueError: Sample larger than population or is negative原因 你的路径写错了