本人最近在捣鼓数据集,网上找的大多数数据集的标注都不是很精确,如果用这些数据集直接训练效果会不理想,但是全部重新标注工作量太大,所以博主写了一个程序可以直观看到数据集标注的GT,以确定需要重新打标注的图片。代码里面的txt是数据集的所有txt合到一起后的文本,如下图所示:
把llabel文件夹下大量的txt文件合并为一个txt,可以用bash语句执行:
cat ./labels/* >> a.txt
matlab代码如下:
%对于有txt的数据集,可以用这个程序看标注的是否准确;
%by Chen yh;
clc;
clear;
imgpath='F:\数据集Dataest\CITY数据集\JPEGImages\';%图像存放文件夹
txtpath='C:\Users\chen\Desktop\VOC2007xml\VOC2007xml\img\a.txt';%txt文件
fidin=fopen(txtpath,'r');
lastname='begin';
while ~feof(fidin)%文件指针到达文件末尾时,该表达式值为Fause,否则为true
tline=fgetl(fidin);%fgetl从这个文件中读取一行数据并丢弃其中的换行符。如果读取成功,tline容纳了读取到的文本字符串如果遇到EOF,tline为数值-1
str = regexp(tline, ' ','split');%分割,str:分割后的字符串,' ':分隔符的字符
filepath=[imgpath,str{1}];%获得txt对应的图片路径
if strcmp(str{1},lastname)
else
%{
while 1
pause(0.01)
if strcmpi(get(gcf,'CurrentCharacter'),'n')
break;
end
end 要是让图片一直显示,不是每一张单独显示,等待按键在显示另一张图片,就取消这段注释,注释掉pause
%}
pause;%按任意键开始和显示下一张图片
img=imread(filepath);
imshow(img);
end
rectangle('Position',[str2double(str{3}),str2double(str{4}),str2double(str{5})-str2double(str{3}),str2double(str{6})-str2double(str{4})],'LineWidth',4,'EdgeColor','r');
pause(0.5)
lastname=str{1};
end
fclose(fidin);
matlab源代码已上传。链接
2018.2.2
前一段时间需要把数据集的GT以视频的形式展示出来,所以重新写了个Python脚本去实现,注释给的较为详细,以下贴出代码段并给出链接。时间段,所以脚本写的很粗糙,仅仅供实现功能。
# -*- coding:UTF-8 -*-
import numpy as np
import sys,os
import cv2
def get_class(lab): #类别替换,便于打标签
if lab == "Car":
cls = lab
if lab == "Pedestrian":
cls = "Ped"
if lab == "Cyclist":
cls = "Cyc"
return cls
root = "/home/its/tp/"
txt_path = root + 'txt/' #label的txt存放路径
jpg_path = root + 'jpg/' #原始jpg路径
txt_file = os.listdir(txt_path)
num=0
for txt_file_name in txt_file:
jpg_file_name = jpg_path + txt_file_name.split('.')[0]+'.jpg'
txt = txt_path + txt_file_name
with open(txt) as t: #遍历所有label
lines = t.readlines()
label= []
xmin =[]
ymin=[]
xmax=[]
ymax=[]
for line in lines: #获得GT信息
line.strip()
label1=line.split(' ')[1]
xmin1=line.split(' ')[2]
ymin1=line.split(' ')[3]
xmax1=line.split(' ')[4]
ymax1=line.split(' ')[5]
#GT的height和width都大于20才显示,if语句可以改动或者删除
if (int(xmax1)-int(xmin1))> 20 and (int(ymax1)-int(ymin1))>20:
label.append(label1)
xmin.append(xmin1)
ymin.append(ymin1)
xmax.append(xmax1)
ymax.append(ymax1)
num = num+1
else:
continue
ori_img = cv2.imread(jpg_file_name) #画图
for i in range(len(label)):
pmin = (int(xmin[i]),int(ymin[i]))
pmax = (int(xmax[i]),int(ymax[i]))
cv2.rectangle(ori_img,pmin,pmax,(0,0,255),2)
p_rec_min = (max(pmin[0]-10,0),max(pmin[1]-15,0))
p_rec_max = (max(pmin[0]+15,0),max(pmin[1]-5,0))
cv2.rectangle(ori_img,p_rec_min,p_rec_max,(255,0,0),-1)
p = (max(pmin[0]-10,0),max(pmin[1]-5,0))
cv2.putText(ori_img,get_class(label[i]),p,cv2.FONT_ITALIC, 0.4, (255, 255, 255), 1)
jpg_new = "/home/its/tp/jpg_new/"+txt_file_name.split('.')[0]+'.jpg' #保存图片并重命名
cv2.imwrite(jpg_new,ori_img)
print "共处理了 "+str(num)+" 个GT"
代码链接贴出:链接
效果图如图所示:
把图片连接成视频,我以前用opencv写过,所以就没用python了,在此也贴出代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//声明IplImage指针
IplImage* Image = NULL;
CvVideoWriter* video = cvCreateVideoWriter("bbox.avi", -1, 3, cvSize(960, 600), 1);
char filename[200];//保存图像名的数组
for (int m = 1; m < 100; m++) //图像命名规则为00*.jpg
{
sprintf_s(filename, "E:\\学习\\vc\\jpg_new\\%d.jpg", 2*m-1);
Image = cvLoadImage(filename);
cvShowImage("读取", Image);
cvWriteFrame(video, Image);
char c = cvWaitKey(150);
if (c == 27) break;//按下ESC停止
}
cvReleaseVideoWriter(&video);
链接也贴出:
链接