写在前面
做数据集处理实验时突然意识到,越多的统计实验可能更适合比赛里,关于发现创新点的实验需要有针对性的实验才行。
还有就是怎么才能提升代码能力啊,有找别人的代码的时间,自己都能改了,呜呜呜呜。
三种可视化实验
简单有效的
实验代码
"""
目的:将原图片(img)与其xml(xml),合成为打标记的图片(labelled),矩形框标记用红色即可
已有:(1)原图片文件夹(imgs_path),(2)xml文件夹(xmls_path)
思路:
step1: 读取(原图片文件夹中的)一张图片
step2: 读取(xmls_path)该图片的xml文件,并获取其矩形框的两个对角顶点的位置
step3: 依据矩形框顶点坐标,在该图片中画出该矩形框
step4: 图片另存为'原文件名'+'_labelled',存在‘lablled’文件夹中
"""
import os
import cv2 as cv
import xml.etree.ElementTree as ET
def xml_jpg2labelled(imgs_path, xmls_path, labelled_path):
imgs_list = os.listdir(imgs_path)
xmls_list = os.listdir(xmls_path)
nums = len(imgs_list)
for i in range(nums):
img_path = os.path.join(imgs_path, imgs_list[i])
xml_path = os.path.join(xmls_path, xmls_list[i])
img = cv.imread(img_path)
labelled = img
root = ET.parse(xml_path).getroot()
objects = root.findall('object')
for obj in objects:
bbox = obj.find('bndbox')
xmin = int(float(bbox.find('xmin').text.strip()))
ymin = int(float(bbox.find('ymin').text.strip()))
xmax = int(float(bbox.find('xmax').text.strip()))
ymax = int(float(bbox.find('ymax').text.strip()))
labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1)
cv.imwrite('%s%s_labelled.jpg' % (labelled_path, imgs_list[i]), labelled)
# cv.imshow('labelled', labelled)
# cv.imshow('origin', origin)
# cv.waitKey()
if __name__ == '__main__':
imgs_path = 'G:\\pythonproject\\gt_visualization\\image'
xmls_path = 'G:\\pythonproject\\gt_visualization\\box'
labelled_path = 'G:\\pythonproject\\gt_visualization1\\replace'
xml_jpg2labelled(imgs_path, xmls_path, labelled_path)
实验结果
标签清晰的用红框表示,但是不能完全区别类别
复杂到乱七八焦的
实验程序
由于脑子不太清醒替换错了,导致修改后的代码不见了
但是印象里修改的部分很少
吃一堑长一智,我下次绝对做出来实验就及时记录一下
实验结果
生成了一些乱七八焦我还没看懂的东西
不过清楚的地展示了,含有未打标的图片
且不知道为什么还把小海胆、小海星、小扇贝、小海参给裁剪出来了
这个粗框标的也是十分的狂野了
鸡肋的第三种
到最后我也没有找到能将标签信息显示在图片上的程序,就是 用不同颜色区分不同类别,当然原罪还是自己的菜
实验代码
import os
import cv2 as cv
import xml.etree.ElementTree as ET
def xml_to_jpg(imgs_path, xmls_path, out_path):
imgs_list = os.listdir(imgs_path) #读取图片列表
xmls_list = os.listdir(xmls_path) # 读取xml列表
if len(imgs_list) <= len(xmls_list): #若图片个数小于或等于xml个数,从图片里面找与xml匹配的
for imgName in imgs_list:
temp1 = imgName.split('.')[0] #图片名 例如123.jpg 分割之后 temp1 = 123
temp1_ = imgName.split('.')[1] #图片后缀
if temp1_!='jpg' and temp1_ !='jpeg':
continue
for xmlName in xmls_list: #遍历xml列表,
temp2 = xmlName.split('.')[0] #xml名
temp2_ = xmlName.split('.')[1]
if temp2_ != 'xml':
continue
if temp2!=temp1: #判断图片名与xml名是否相同,不同的话跳过下面的步骤 继续找
continue
else: #相同的话 开始读取xml坐标信息,并在对应的图片上画框
img_path = os.path.join(imgs_path, imgName)
xml_path = os.path.join(xmls_path, xmlName)
img = cv.imread(img_path)
labelled = img
root = ET.parse(xml_path).getroot()
for obj in root.iter('object'):
bbox = obj.find('bndbox')
xmin = int(bbox.find('xmin').text.strip())
ymin = int(bbox.find('ymin').text.strip())
xmax = int(bbox.find('xmax').text.strip())
ymax = int(bbox.find('ymax').text.strip())
labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 2)
cv.imwrite(out_path + '\\' +imgName, labelled)
break
else: # 若xml个数小于图片个数,从xml里面找与图片匹配的。下面操作与上面差不多
for xmlName in xmls_list:
temp1 = xmlName.split('.')[0]
temp1_ = xmlName.split('.')[1]
if temp1_ != 'xml':
continue
for imgName in imgs_list:
temp2 = imgName.split('.')[0]
temp2_ = imgName.split('.')[1] # 图片后缀
if temp2_ != 'jpg' and temp2_ != 'jpeg':
continue
if temp2 != temp1:
continue
else:
img_path = os.path.join(imgs_path, imgName)
xml_path = os.path.join(xmls_path, xmlName)
img = cv.imread(img_path)
labelled = img
root = ET.parse(xml_path).getroot()
for obj in root.iter('object'):
bbox = obj.find('bndbox')
xmin = int(bbox.find('xmin').text.strip())
ymin = int(bbox.find('ymin').text.strip())
xmax = int(bbox.find('xmax').text.strip())
ymax = int(bbox.find('ymax').text.strip())
labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1)
cv.imwrite(out_path + '\\' +imgName, labelled)
break
if __name__ == '__main__':
# 使用英文路径,中文路径读不进来
imgs_path = r'G:\pythonproject\gt_visualization\image' #图片路径
xmls_path = r'G:\pythonproject\gt_visualization\box' #xml路径
retangele_img_path = r'G:\pythonproject\gt_visualization2\new_data' #保存画框后图片的路径
xml_to_jpg(imgs_path, xmls_path, retangele_img_path)
实验结果
这个的实验结果和第一种比较像,或许区别在于 红框更红了吧
总之,又是觉得很难发文章的一天