近期在做船仅仅识别方面的事情,须要大量的负样本来训练adaboost分类器。
我从网上下载到一个pascal_voc的数据集。须要找到不包括船仅仅的那些复制出来。
数据集特点
对于每一个图片有一个xml文件。介绍了这个文件的信息,有个object标签介绍了图片中目标类别
![老人与狗](http://upload-images.jianshu.io/upload_images/454341-6b56b28bd72e7f72.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
VOC2007 000001.jpg The VOC2007 Database PASCAL VOC2007 flickr
341012865 Fried Camels Jinky the Fruit Bat 353 500 3 0
比方上面这个就包括dog和person
解决方式
我们须要做的就是这道叶子节点里的name看是不是boat假设不是的话就取到这个图片
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;namespace 获取负样本{ class Program { static void Main(string[] args) { /*首先获取xml文件夹下的全部文件的文件夹列表和名称*/ //ListfileNames = new List ();//存储文件名称; //C:\Users\dragonfive\Desktop\pascal_voc\VOCtrainval_06-Nov-2007\VOCdevkit\VOC2007\Annotations string path = @"C:\Users\dragonfive\Desktop\pascal_voc\VOCtrainval_06-Nov-2007\VOCdevkit\VOC2007\Annotations\"; string imageSourcePath = @"C:\Users\dragonfive\Desktop\pascal_voc\VOCtrainval_06-Nov-2007\VOCdevkit\VOC2007\JPEGImages\"; string imageDestPath = @"D:\IP_CV_WorkSpace\Img\NegSample\"; int numberOfNegSample = 0; foreach (var file in Directory.GetFiles(path,"*.xml"))//这个获取的文件名称带前面的文件夹; { //Console.WriteLine(file); //获取该路径的不带扩展名的文件名称; string fileName = Path.GetFileNameWithoutExtension(file); //Console.WriteLine(fileName); //以下读取xml的内容 //string xmlData = File.ReadAllText(file, Encoding.Default); //Console.WriteLine(xmlData); /*循环完毕每一个xml文件的解析,假设没有boat就拷贝到新的文件夹*/ XmlDocument doc = new XmlDocument(); doc.Load(file); XmlElement root = doc.DocumentElement; XmlNodeList listNodes = root.SelectNodes("/annotation/object/name"); bool hasBoat = false; foreach (XmlNode node in listNodes ) { //Console.WriteLine(node.InnerText); //假设当中含有boat就continue,否则赋值到负样本的位置; if (node.InnerText == "boat") { hasBoat = true; Console.WriteLine(fileName+"里面有船"); break; } } if (hasBoat==false) { //复制 File.Copy(imageSourcePath + fileName + ".jpg", imageDestPath + fileName + ".jpg",true); Console.WriteLine("成功复制"+fileName); numberOfNegSample++; } //Console.ReadKey(); } Console.WriteLine("共计复制负样本个数为:" + numberOfNegSample); Console.ReadKey(); } }}