本人最近在捣鼓数据集,网上找的大多数数据集的标注都不是很精确,如果用这些数据集直接训练效果会不理想,但是全部重新标注工作量太大,所以博主写了一个程序可以直观看到数据集标注的GT,以确定需要重新打标注的图片。代码里面的txt是数据集的所有txt合到一起后的文本,如下图所示:

python和matlab生成exe_数据集

把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"

代码链接贴出:链接 

效果图如图所示:

python和matlab生成exe_数据集_02

把图片连接成视频,我以前用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);

链接也贴出:

链接