若若's profile芳草天涯PhotosBlogListsMore Tools Help

Blog


    October 11

    C++批量修改文件名

    从驴子上拖cd,最恼火就是乱七八糟的文件名和专门存放文件名的文本文件闹分裂。
    索性写个程序,从txt读取文件名列表,然后修改文件夹下所有文件的文件名。
    小程序仅限mp3文件。
     
     1 #include "stdafx.h"
     2 #include <afx.h>
     3 #include <iostream>
     4 #include <fstream> 
     5 #include <string>
     6 using namespace std;
     7 
     8 int RenameFromTXT(string InputFolderPath, string InputTXTName)
     9 {    
    10     int result=-1;
    11     CString cstr, CNewName;
    12     string str, OldName, NewName;
    13     CFileFind finder;   
    14     CString FolderPath = InputFolderPath.c_str();
    15     bool ifFind = finder.FindFile(FolderPath + "*.mp3"); 
    16 
    17     if(ifFind == false){
    18         cout<<"Folder not found!"<<endl;
    19         return -1;
    20     }
    21 
    22     ifstream inputNewName(InputTXTName.c_str());
    23     if(!inputNewName){
    24         cout<<"TXT-file not found!"<<endl;
    25         return -1;
    26     }
    27 
    28     while(ifFind)   
    29     {   
    30         ifFind = finder.FindNextFile();  
    31         cstr = finder.GetFilePath();
    32         USES_CONVERSION;
    33         OldName = W2A(cstr);
    34         cout<<"old path: "<<OldName.c_str()<<endl;
    35         getline(inputNewName, str);
    36         cout<<"new name: "<<str.c_str()<<endl;
    37         cstr = FolderPath + str.c_str();       
    38         CNewName = cstr + ".mp3";
    39         NewName = W2A(CNewName);
    40         cout<<"new path: "<<NewName<<endl;
    41         result = rename(OldName.c_str(), NewName.c_str());
    42         if( result == 0)
    43             cout<<"File successfully renamed!"<<endl;
    44         else{
    45             cout<<"Error renaming file: Permission denied"<<endl;
    46             cout<<"The new filename may contain \ / : ? \" < > |"<<endl;
    47             return -1;
    48         }
    49         cout<<endl;
    50         result=-1;
    51     }
    52     finder.Close();
    53     inputNewName.close();
    54     return 0;
    55 }
    56 
    57 int main(int argc, char **argv)
    58 {    
    59     string input1 = "D:\\Musik\\V.A.-.[Eurovision.Song.Contest.Moscow.2009.(2CD).(2009)].专辑.(MP3)\\";
    60     string input2 = "D:\\Musik\\NewNameList.txt";
    61     RenameFromTXT(input1, input2);
    62 
    63     system("pause");
    64     return 0;
    65 }

    main中调用时,只要输入待改文件名的文件夹路径,和存放新名字的文本文件路径和名字就行。 

    其中NewNameList.txt内容格式如下:

    101. Susanna Georgi — Le Teva Decisio (Get A Life) [Andorra]
    102. Kejsi Tola — Carry Me In Your Dreams [Albania]
    103. Inga & Anush — Jan Jan [Armenia]
    104. AySel & Arash — Always [Azerbaijan]
    105. Regina — Bistra Voda [Bosnia & Herzagovina]
    106. Copycat — Copycat [Belgium]
    107. Krasimir Avramov — Illusion [Bulgaria]
    108. Petr Elfimov — Eyes That Never Lie [Belarus]
    109. Lovebugs — Highest Heights, The [Switzerland]
    110. Christina Metaxa — Firefly [Cyprus]
    111. Gipsy.cz — Aven Romale [Czech Republic]
    112. Alex Swings Oscar Sings! — Miss Kiss Kiss Bang [Germany]
    113. Brinck — Believe Again [Denmark]
    114. Urban Symphony — Randajad [Estonia]
    115. Soraya — La Noche Es Para Mi (The Night Is For Me) [Spain]
    116. Waldo's People — Lose Control [Finland]
    117. Patricia Kaas — Et S'il Falliat Le Faire [France]
    118. Jade Ewen — It's My Time [United Kingdom]
    119. Sakis Rouvas — This Is Our Night [Greece]
    120. Igor Cukrov feat. Andrea — Lijepa Tena (Beautiful Tena) [Croatia]
    121. Zoli Adok — Dance With Me [Hungary]
    201. Sinead Mulvey & Black Daisy — Et Cetera [Ireland]
    202. Noa & Mira Awad — There Must Be Another Way [Israel]
    203. Yohanna — Is It True [Iceland]
    204. Sasha Son — Love [Lithuania]
    205. Intars Busulis — Probka [Latvia]
    206. Nelly Ciobanu — Hora Din Moldova (Dancing Moldova) [Moldova]
    207. Andrea Demirovic — Just Get Out Of My Life[Montenegro]
    208. Next Time — Neshto Shto Ke Ostane [FYR Macedonia]
    209. Chiara — What If We [Malta]
    210. Toppers — Shine [Netherlandsnew wave Eurovision 2009 mix]
    211. Alexander Rybak — Fairytale [Norway]
    212. Lidia Kopania — I Don't Wanna Leave [Poland]
    213. Flor-De-Lis — Todas As Ruas Do Amor [Portugal]
    214. Elena — Balkan Girls, The [Romania]
    215. Marko Kon & Milaan — Cipela [Serbia]
    216. Anastasia Prikhodko — Mamo [Russia]
    217. Malena Ernman — La Voix [Sweden]
    218. Nela Pociskova & Kamil Mikulcik — Let' Tmou [Slovakia]
    219. Quartissimo — Love Symphony [Slovenia]
    220. Hadise — Dum Tek Tek [Turkey]
    221. Svetlana Loboda — Be My Valentine! (Anti-crisis Girl) [Ukraine]

     

    一秒钟全改了,很爽Smiley mit geöffnetem Mund

    October 08

    神游记

    最近变得有点唯心。
     
    原因是张纪中要新拍《西游记》,说了句《西游记》扬道抑佛的话,迅速被新浪河蟹了。然而缠绕我多年的问题来了,西游记里又是太上老君又是如来佛祖,是道是佛从未搞清,只当是牛鬼蛇神一锅乱,现如今老大不小了,却是忍不住想要弄明白。慕名看了篇号称中国古典文学普及研究会《西游记》文化研究委员会会长写的长篇博文,于是我就五雷轰顶风中凌乱了。
     
    不是说这位佛道儒的专家说得有多雷人,而是这些观点对我原有认知的冲击力相当之大。这篇东西很长,大概意思是:《西游记》是很严肃的作品,不是老版电视剧那种给小孩子看的神话;它自身有很完整的思想体系,而这个系统就是道家思想;它的作者原本不是吴承恩,而是丘处机,不过或许可能是后人对某道人的思想文字整编,究竟是不是丘处机不能够确定,但一定不是吴承恩,换作者名字的事是五四运动的时候干出来的;唐僧看似取经,实则却求不到佛,因为第一次他求到的是假佛,尔后见到真佛却不自知;猴子代表了人心,当它意识到“我”的存在,也就是“心”字加上“吾”字,便是“悟”,悟空的师父点化了他,让他有了觉悟;人一旦有了觉悟,按道家说法,去除恶念便能到达十万八千里,心绪变化七十二般,这些都能解释通了;唐僧师徒实则也代表了人的五脏,众多妖怪也是器官内脏喜怒哀乐之类,其中地名也与人体严格对应,整部《西游记》都是在人体内转悠,其实也就是脑子里YY的产物,是借着玄奘取经来大书特书的道家教科书。
     
    居然是这样,居然我还觉得挺对,我是不是被洗脑了?
     
    于是被马哲洗过的脑,开始有点慌张了。什么“本我”“自我”“超我”,这样的词汇都一齐出现,我是谁,谁是我。姬无命是怎么被秀才弄死的。
     
    “我生从何来,死往何处,我为何要出现在这个世界上,我的出现对这个世界来说意味着什么,是世界选择了我,还是我选择了世界。我和宇宙有必然的联系吗?宇宙是否有尽头,时间是否有长短,过去的时间在哪里消失了,未来的时间又在何处停止,我在这一刻提出的问题,还是你刚才听到的问题吗?”
     
    其实想想,这个世界虽然是客观存在的,可是对于每个人来说,却各不相同。就像盲人摸象,每个人的世界都只能是他自己经历过理解过的独特的世界;就算两个人共同经历过一件事,他们的所见所想所记所忽略遗忘也会完全不同。总觉得“主观意识”这个词还是不能等同于“觉悟”的。人之所以有着不同的世界,是因为外界环境影响和个人自身觉悟不同。这话说了怎么和没说一样。然而现在真的在想,觉悟这个东西确实太重要了,没有它或者不重视,人过得懵懵懂懂。
     
    不懂哲学,表述混乱,观点模糊,不成文字。
    October 03

    C++编程思想(2nd卷一):函数重载与默认参数

    在C++中,struct和class唯一的不同之处就在于,struct默认为public,而class默认为private。


    在使用默认参数时必须记住两条规则:
    1.只有参数列表的后部参数才是可默认的,也就是说,不可以在一个默认参数后面又跟一个非默认的参数。
    2.一旦在一个参数调用中开始使用默认参数,那么这个参数后面的所有参数都必须是默认的。
    默认参数只能放在函数声明中,通常在一个头文件中。编译器必须在使用该函数之前知道默认值。


    占位符参数:
    函数声明时,参数可以没有标识符。其目的在于以后可以修改函数定义而不需要修改所有的函数调用。

    October 01

    十月一日·红

    心的颜色 祝愿的表情

    普天同庆之时 天涯海角之中

    还有慕尼黑一隅

    那抹红

    September 30

    不会创新因循守旧的神经网

    现在最大的问题就是神经网络不会创新,只会在原有的类的基础上进行分类。
    想要教他创新,结果却很不理想。。。
      1 //////////////////////////////////////////////////////////////////////////
      2 // File Name: pnn.cpp
      3 // Author:    Ruoruo(du#in.tum.de)
      4 //////////////////////////////////////////////////////////////////////////
      5 #include "stdafx.h"
      6 #include "cv.h"
      7 #include "highgui.h"
      8 #include <ml.h>
      9 #include <time.h>
     10 #include <ctype.h>
     11 #include <vector>
     12 #include <math.h> 
     13 #include <iostream>
     14 using namespace std;
     15 
     16 static CvScalar colors[] = 
     17     {
     18         {{0,0,255}},
     19         {{0,128,255}},
     20         {{0,255,255}},
     21         {{0,255,0}},
     22         {{255,128,0}},
     23         {{255,255,0}},
     24         {{255,0,0}},
     25         {{255,0,255}}
     26     };
     27 
     28 int main( int argc, char** argv )
     29 {
     30     vector<float> point;
     31     vector<float> result;
     32 
     33     float p[10= { 1.32.7,
     34                     1.53.0,
     35                     1.72.8,
     36                     1.62.6,
     37                     1.22.9 };
     38     float res[5= { 0,0,0,0,0 };
     39     int i;
     40     for(i=0; i<10; i++)
     41     {
     42         point.push_back(p[i]);
     43         if(i<5) result.push_back(res[i]);
     44     }
     45 
     46     CvMat* input = cvCreateMat( 52, CV_32FC1 );
     47     cvInitMatHeader( input, 52, CV_32FC1, p );
     48     CvMat* output = cvCreateMat( 51, CV_32FC1 );
     49     cvInitMatHeader( output, 51, CV_32FC1, res );
     50     IplImage* img = cvCreateImage(cvSize(450450), IPL_DEPTH_8U, 3);
     51     img->origin = 1;
     52     for(i= 0; i<5; i++)
     53     {
     54         cvCircle(img, cvPoint((int)(p[i*2]*100), (int)(p[i*2+1]* 100)), 5, colors[(int)res[i]%8], 1, CV_AA, 0);
     55     }
     56     
     57     int layer_num[3= { 241 };
     58     CvMat* layer_size = cvCreateMatHeader( 13, CV_32S );
     59     cvInitMatHeader( layer_size, 13, CV_32S, layer_num );
     60     CvANN_MLP pnn;
     61     pnn.create( layer_size, CvANN_MLP::SIGMOID_SYM, 11 );
     62     CvANN_MLP_TrainParams params;
     63     params.term_crit = cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, \
     64         3000.0000001 );
     65     params.train_method = 0;
     66     params.bp_dw_scale = 0.1;
     67     params.bp_moment_scale = 0.1;
     68     cout<<"begin training"<<endl;
     69     pnn.train( input, output, 00params );
     70     cout<<"end training"<<endl;
     71     pnn.save( "pNN_DATA.xml" );
     72 
     73     //begin to test
     74     float testp[24= { 1.42.75,
     75                         4.30.2
     76                         4.24.3,
     77                         1.452.85,
     78                         4.20.4,
     79                         4.14.0,
     80                         4.30.5,
     81                         4.04.2,
     82                         1.52.7
     83                         4.14.2
     84                         1.62.7,
     85                         4.00.3 };
     86     /*float testp[24] = { 1.4, 2.75,
     87                         4.3, 0.2, 
     88                         4.2, 4.3,
     89                         1.45, 2.85,
     90                         4.25, 0.3,
     91                         4.25, 4.25,
     92                         3.5, 1.2,
     93                         3.0, 3.7,
     94                         4.0, 2.7, 
     95                         0.2, 0.2, 
     96                         2.8, 2.7,
     97                         2.7, 2.8 };*/
     98     CvMat* test_point = cvCreateMat( 12, CV_32FC1 );    
     99     CvMat* test_result = cvCreateMat( 11, CV_32FC1 );
    100     CvFont font;
    101     double hScale=0.5;
    102     double vScale=0.5;
    103     int lineWidth=1;
    104     cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);
    105 
    106     for(i= 0; i<12; i++)
    107     {
    108         cvSetReal2D( test_point, 00, testp[2*i] );
    109         cvSetReal2D( test_point, 01, testp[2*i+1] );
    110         pnn.predict(test_point, test_result);
    111         cout<<cvmGet(test_result,0,0)<<endl;
    112 
    113         float delta = 1;
    114         int best_class = 0;
    115         int max_class = 0;
    116         for(int ii=0; ii<result.size(); ii++){
    117             if(fabs(cvmGet(test_result,0,0- (float)result[ii])<delta){
    118                 delta = fabs(cvmGet(test_result,0,0- (float)result[ii]);
    119                 best_class = result[ii];
    120             }
    121             if(result[ii]>=max_class)
    122                 max_class = result[ii];
    123         }
    124 
    125         point.push_back(testp[2*i]);
    126         point.push_back(testp[2*i+1]);
    127 
    128         if( delta>0.06 ){
    129             int new_result = max_class+1;
    130             cvmSet( test_result,0,0,new_result );
    131             result.push_back((float)new_result );
    132         }
    133         else{
    134             cvmSet( test_result,0,0,best_class );
    135             result.push_back((float)best_class );
    136         }
    137 
    138         int new_point_size = point.size();
    139         int new_result_size = result.size();
    140             
    141         CvMat* input = cvCreateMat( new_result_size, 2, CV_32FC1 );
    142         CvMat* output = cvCreateMat( new_result_size, 1, CV_32FC1 );
    143 
    144         for(int ii=0; ii<new_result_size; ii++)
    145         {
    146             cvmSet( input, ii, 0, point[2*ii]);
    147             cvmSet( input, ii, 1, point[2*ii+1]);
    148             cvmSet( output, ii, 0, result[ii]);
    149         }
    150         //cout<<"begin training again"<<endl;
    151         pnn.train( input, output, 00params );
    152         //cout<<"end training"<<endl;
    153 
    154         cvCircle( img, cvPoint((int)(testp[i*2]*100), (int)(testp[i*2+1]* 100)), 0, colors[(int)cvmGet(test_result,0,0)%8], 10, CV_AA, 0 );
    155 
    156         char buffer[10];
    157         _itoa(i,buffer,10);
    158         string point_id(buffer);
    159         cvPutText(img, point_id.c_str(), cvPoint(testp[2*i]*100,testp[2*i+1]*100), &font, cvScalar(255,255,255));
    160 
    161         cout<<i<<""<<"("<<testp[i*2]<<""<<testp[i*2+1]<<")"<<"\t"<<cvmGet(test_result,0,0)<<endl;
    162     }
    163 
    164     cvNamedWindow( "Coordinates" , 1 ); 
    165     cvShowImage( "Coordinates" ,img);
    166 
    167     cvWaitKey( 0 );
    168 
    169     cvDestroyWindow("Coordinates");
    170     cvReleaseImage(&img);
    171 
    172     return 0;
    173 }

    明明右下角四个点是一类,应该同色。显然点6和11分类错误了,6变成了第3个新类而11变成了第4个新类。或许类的名字对内部计算有很大影响,但目前还没有更好的办法,总之我这个循循善诱谆谆教诲的算法很垃圾就对了。。。

    最近压力好大 = =

    September 27

    C++的文件读写操作练习

    捡基础捡基础 = =|||
     
    #include <iostream>
    #include <fstream>
    #include <string> 
     
    #define WordByWord 1
    #define LineByLine 2
     
    void ReadAndShow( string fname, int flag )
    {
     ifstream fin( fname.c_str() );
     int i = 1;
     string s;
     
     if( !fin )
     {
      cout<<"File dose not exist!"<<endl;
      exit(-1);
     }
     if( flag == WordByWord)
     {
      while( fin>>s ){
       cout<<i<<". word: "<<s<<endl;
       i++;
      }
     }
     else if( flag == LineByLine )
     {
      while( getline(fin, s) ){
       cout<<i<<". line: "<<s<<endl;
       i++;
      }
     }
     else
     {
      cout<<"Error: The second argument should be 1 or 2."<<endl;
      exit(-1);
     }
     cout<<endl;
     fin.close();
    }
     
    int main()
    {
     string filename = "data.txt";
     ofstream fout( filename.c_str() );
     fout<<"Ich schreibe irgendwas hier,"<<endl;
     fout<<"um zu testen."<<endl;
     fout.close();
     ReadAndShow( filename, WordByWord );
     ReadAndShow( filename, LineByLine );
     
     return 0 ;
    }
     
    输出结果:
    Photobucket
    August 02

    翻译有关OpenCV海尔训练——(四)训练样本

    1.海尔训练
    现在,我们使用haartraining.exe来训练我们自己的分类器。训练语句如下:

    Usage: ./haartraining
      -data <dir_name>
      -vec <vec_file_name>
      -bg <background_file_name>
      [-npos <number_of_positive_samples = 2000>]
      [-nneg <number_of_negative_samples = 2000>]
      [-nstages <number_of_stages = 14>]
      [-nsplits <number_of_splits = 1>]
      [-mem <memory_in_MB = 200>]
      [-sym (default)] [-nonsym]
      [-minhitrate <min_hit_rate = 0.995000>]
      [-maxfalsealarm <max_false_alarm_rate = 0.500000>]
      [-weighttrimming <weight_trimming = 0.950000>]
      [-eqw]
      [-mode <BASIC (default) | CORE | ALL>]
      [-w <sample_width = 24>]
      [-h <sample_height = 24>]
      [-bt <DAB | RAB | LB | GAB (default)>]
      [-err <misclass (default) | gini | entropy>]
      [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>]
      [-minpos <min_number_of_positive_samples_per_cluster = 500>]


    Kuranov et. al. 指出,20*20的样本识别的正确率最高。另外,对于18*18的尺寸,四分裂节点表现最好。而对于20*20的样本,两节点显然更好。分裂节点数分别是2、3或4的弱树分类器间的差小于它们的中间节点。
    此外,关于20阶训练有个说法。假设我的测试集合代表了学习任务,我可以期望一个报错率是0.5^20≈9.6e-07,识对率是0.999^20≈0.98。
    所以,使用20*20的样本大小,并且Nsplit=2, Nstages=20, MINhitrate=0.9999(default: 0.995), MAXfalsealarm=0.5(default: 0.5), weighttrimming=0.95(default: 0.95)是比较优的组合。

    $ haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7000 -nneg 3019 -w 20 -h 20 -nonsym -mem 512 -mode ALL


    "-nonsym"选项用于没有垂直(左-右)对称的对象类。如果对象类是垂直对称的,例如正脸,则用"-sym (default)"。这样会增大运算速度,因为类海尔特征只有一半投入使用。
    "-mode ALL"使用了类海尔特征的扩展集。默认只使用竖直特征,ALL除了能使用竖直特征,还能使用转角为45°的特征集合。
    "-mem 512"是以MB为单位的预计算可使用的内存大小。默认是200MB。
    另外还有一些选项没有用到:

    [-bt <DAB | RAB | LB | GAB (default)>]
    [-err <misclass (default) | gini | entropy>]
    [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>]
    [-minpos <min_number_of_positive_samples_per_cluster = 500>]


    #你可以使用OpenMP(multi-processing).
    #一次训练持续三天。

    2.生成XML文件
    当海尔训练过程完全结束,它将会生成一个xml文件。
    如果你想要将一个中级海尔训练输出目录树转化为一个xml文件,在目录OpenCV/samples/c/convert_cascade.c下有个程序可供使用。
    输入的格式为:

    $ convert_cascade --size="<sample_width>x<sampe_height>" <haartraining_ouput_dir> <ouput_file>


    举例:

    $ convert_cascade --size="20x20" haarcascade haarcascade.xml

    翻译有关OpenCV海尔训练——(三)创建样本

    1.创建训练样本
    Kuranov et. al.指出,他们用了5000个含有正脸模板的正样本和3000个负样本进行训练,其中的5000个正样本是由1000张带脸的图像生成的。
    然而,你可能已经注意到了,以上四个方法都无法实现一下子由1000张图生成5000张图。我们必须先使用方法1使每张原图生成5张或者更多的正样本图,然后将这个过程重复1000次或更多次,最后合并所有生成的样本输出至vec文件中。
    我写了一个mergevec.cpp用来合并vec文件,还有一个叫createtrainsamples.pl的脚本用以重复该过程1000遍甚至更多遍。 我生成了7000个样本而不是5000,因为教程上说7000是最适当的数字。请将路径改为createsamples的位置。

    createtrainsamples.pl的输入格式为:

    $ perl createtrainsamples.pl <positives.dat> <negatives.dat> <vec_output_dir> [<totalnum = 7000>] [<createsample_command_options = "./createsamples -w 20 -h 20...">]


    mergevec的输入格式为:

    $ mergevec <collection_file_of_vecs> <output_vec_file_name>


    一个收集文件(一个含有文件名列表的文件)可以由下法生成:

    $ find [dir_name] -name '*.[ext]' > [collection_file_name]


    举例:

    $ cd HaarTraining/bin
    $ find ../../data/negatives/ -name '*.jpg' > negatives.dat
    $ find ../../data/umist_cropped/ -name '*.pgm' > positives.dat

    $ perl createtrainsamples.pl positives.dat negatives.dat samples 7000 "./createsamples  -bgcolor 0 -bgthresh 0 -maxxangle 1.1 -maxyangle 1.1 maxzangle 0.5 -maxidev 40 -w 20 -h 20"
    $ find samples/ -name '*.vec' > samples.dat # to create a collection file for vec files
    $ mergevec samples.dat samples.vec
    $ # createsamples -vec samples.vec -show -w 20 -h 20 # Extra: If you want to see inside


    20*20的样本大小检测正确率最高。


    2.创建测试样本
    测试样本是正样本镶嵌在负样本中并且正样本定位已知的样本图像。手动创建这样的图像是完全可行的。我们也能使用前面所说的第三种方法去综合这些图像。但是,我们只能一次加工一张图,如此,编写一个脚本(svn:createtestsamples.pl)可以帮助我们重复这种过程。

    createtestsamples.pl的输入格式为:

    $ perl createtestsamples.pl <positives.dat> <negatives.dat> <output_dir> [<totalnum = 1000>] [<createsample_command_options = "./createsamples -w 20 -h 20...">]


    这样就能生成许多jpg文件,并在<output_dir>中生成info.dat。jpg文件名格式是<number>_<x>_<y>_<width>_<height>.jpg,这里的x, y, width和height是嵌入对象的边缘矩形的坐标。

    举例:

    $ # cd HaarTraining/bin
    $ # find ../../data/negatives/ -name '*.jpg' > negatives.dat
    $ # find ../../data/umist_cropped/ -name '*.pgm' > positives.dat
    $ perl createtestsamples.pl positives.dat negatives.dat tests 1000 "./createsamples -bgcolor 0 -bgthresh 0 -maxxangle 1.1 -maxyangle 1.1 -maxzangle 0.5 maxidev 40"
    $ find tests/ -name 'info.dat' -exec cat \{\} \; > tests.dat # merge info files

    翻译有关OpenCV海尔训练——(二)创建样本(参考)

    我们可以使用createsamples utility(\bin\createsamples.exe)创建训练样本,并且测试它们。以下是选项列表:

    Usage: ./createsamples
      [-info <description_file_name>]例(C:\Temp2\positives\train.txt)
      [-img <image_file_name>]
      [-vec <vec_file_name>]例(data\positives.vec)
      [-bg <background_file_name>]
      [-num <number_of_samples = 1000>]例(-num 500)
      [-bgcolor <background_color = 0>]
      [-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
      [-maxidev <max_intensity_deviation = 40>]
      [-maxxangle <max_x_rotation_angle = 1.100000>]
      [-maxyangle <max_y_rotation_angle = 1.100000>]
      [-maxzangle <max_z_rotation_angle = 0.500000>]
      [-show [<scale = 4.000000>]]
      [-w <sample_width = 24>]
      [-h <sample_height = 24>]例(-w 20 -h 20)

     

    1. 由一个样本创建多个样本
    当选项-img, -bg和-vec被初始化时,这个函数(cvhaartraining.cpp#cvCreateTrainingSamples)会被启用。

    -img <one_positive_image>
    -bg <collection_file_of_negatives>
    -vec <name_of_the_output_file_containing_the_generated_samples>

    例如:

    $ createsamples -img face.png -num 10 -bg negatives.dat -vec samples.vec -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20

     

    这个例子由一个正样本生成数量为<num>的多个样本。值得注意的是,只有前<num>个在<collection_file_of_negatives>中负样本会被采用。
    收集文件的格式(<collection_file_of_negatives>)为:

    img/img1.jpg
    img/img2.jpg

    它可以通过find命令来创建:

    $ cd [your working directory]
    $ find [image dir] -name '*.[image ext]' > [description file]

    比如:

    $ find ../../data/negatives/ -name '*.jpg' > negatives.dat

    2. 由多个样本创建训练样本
    当选项-img和-vec被初始化时,这个函数(cvhaartraining.cpp#cvCreateTestSamples)将会被启用。

    -info <description_file_of_samples>
    -vec <name_of_the_output_file_containing_the_generated_samples>

    例如:

    $ createsamples -info samples.dat -vec samples.vec -w 20 -h 20



    如此,就生成了未经变形的样本,你可以将其想象为一个文件格式转换函数。
    <description_file_of_samples>的格式为:

    [filename] [# of objects] [[x y width height] [... 2nd object] ...]
    [filename] [# of objects] [[x y width height] [... 2nd object] ...]
    [filename] [# of objects] [[x y width height] [... 2nd object] ...]


    其中,(x, y)是对象的左上角坐标,而整个样本图像的左上角为原点(0, 0)。例如:
    img/img1.jpg 1 140 100 45 45
    img/img2.jpg 2 100 200 50 50 50 30 25 25
    img/img3.jpg 1 0 0 20 20
    姑且称其为描述文件格式。
    这个方法获得了样本区域、重定大小并且将它们转化为.vec格式。但是它不能从一个样本生成多个样本。所以,在你已经有了大量的样本(5000到7000左右)时,才好使用这个方法。
    利用find命令和identify命令可以创建一个描述文件:

    $ cd <your working directory>
    $ find <dir> -name '*.<ext>' -exec identify -format '%i 1 0 0 %w %h' \{\} \; > <description_file>


    例如:

    $ find ../../data/umist_cropped -name '*.pgm' -exec identify -format '%i 1 0 0 %w %h' \{\} \; > samplesdescription.dat


    如果所有的样本图像都有着相同的大小尺寸,则命令写起来可以更加容易快捷:

    $ find <dir> -name '*.<ext>' -exec echo \{\} 1 0 0 <width> <height> \; > <description_file>


    例如:

    $ find ../../data/umist_cropped -name '*.pgm' -exec echo \{\} 1 0 0 20 20 \; > samplesdescription.dat


    好了,现在已经有了一个对象检测器了。

    3.创建测试样本
    这个方法(cvsamples.cpp#cvCreateTrainingSamplesFromInfo)是创建测试样本和它们的从单个样本变换而来的基本信息。

    开启条件:选项-img, -bg和-info被初始化。

    -img <one_positive_image>
    -bg <collection_file_of_negatives>
    -info <generated_description_file_for_the_generated_test_images>

    这里-w和-h被用作确定嵌入在测试样本中的正样本的最小尺寸。

    $ createsamples -img face.png -num 10 -bg negatives.dat -info test.dat -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0



    输出样本的文件名格式是<number>_<x>_<y>_<width>_<height>.jpg,其中x, y, width和height说明了植入对象的边界矩形的坐标。
    <description_file_for_test_samples>格式与2.中描述文件格式格式相同。

    4.显示样本
    这个方法(cvsamples.cpp#cvShowVecSamples)是用一个vec文件显示样本图像。

    开启条件:选项-vec被初始化。例如:

    $ createsamples -vec samples.vec -w 20 -h 20
    July 31

    翻译有关OpenCV海尔训练——(一)数据准备

    作者:Naotoshi Seo

    OpenCV给我们提供了很多训练分类器的方法和程序。对于人脸检测的分类器训练叫做海尔训练,我们可以用这些方法创建我们自己的分类器。

    (一)数据准备:

    • 正样本(人脸)
              我们需要收集只含有脸部的图像。The UMIST Face Database 有着类似Video般的连续脸部图像,不论是正脸的还是侧脸的。我以为训练这些图像能生成一个面部表情鲁棒性很好的脸部检测器。然而我想得太过美好了,事实上效果一般。后来我又用了基于CMU PIE Database的正面脸部数据库,它包含了许多不同光照条件的图像,可是效果与前面类似,都不理想。MIT CBCL Face Data是另一种选择,它囊括了2429张正脸图像,其中也有一些不同的表情与光强。原本是很适合海尔训练的,然而该库的图像原始大小只有19*19,这样,我们就无法进行检测更好尺寸的人脸的实验。
              OpenCV的开发者有可能使用了FERET数据库。
    • 负样本(背景)
              我们同样需要收集一些我们不感兴趣的对象(也就是不含有人脸的图像)来生成海尔练级分类器。
    • 测试自然状态的图像(人脸在背景中)
              我们可以利用createsamples utility来综合测试图像集,不过有个专门的测试自然状态的图像集合就更好了。
              OpenCV的开发者使用了CMU-MIT Frontal Face Test Set去进行他们关于这类图像的实验。这个集合有个有关范围的描述,涵盖了眼睛、鼻子和嘴唇的中心及两端的方位信息,然而并没有由矩形区域来表示的人脸定位。
              但是,比如人脸区域的矩形可以由以下方法计算得出:
              以鼻子的高度作为矩形的上沿,以嘴巴的高度作为矩形的下沿,以嘴巴的左端作为矩形的左边缘,以嘴巴的右端作为矩形的右边缘。
              虽然此法不够完美,不过看起来还算可行。
    • 如何手动快速生成图像
              我使用的软件是imageclipper,这个软件不仅对海尔训练有帮助,而且也可应用于计算机视觉和机器学习研究等领域。它有如下特点:
              自动打开同一目录下的图像序列;以帧为单位打开视频文件;通过某快捷键方便剪切图像并跳至下一幅图像;直接用鼠标左键选定并剪切图像中的区域;通过鼠标右键移动或重置图像区域;所选定的区域也可显示在下一幅图中。
    May 30

    sth. interesting on the 17th floor

    On the 17th floor, I can see many more things. They may be things like the clouds, objects of everchanging beauty, appearing in an endless variety of shapes, being dyed milky white in sunlit sky or graceful rosy purple during the twilight hours or whatever you may figure out.  They may like a image of vast sky, which seems faintly tinted in a peaceful sunny day or darker hued like a ink and wash painting in a summer rainstorm. They may like a visible capricious wind breezing through distant groves, and also like the birds' gold chirms scatteringly from among the woods. And anything else, maybe a plane with a trail passing by my window and making a proposal of marriage to another gilr… Haha, just kidding.

    with pictures for the turth

     DSCF8123

    DSCF8138

    DSCF8139

    DSCF8140

    A man named Raimer made a proposal just now to a woman named Ruth. This Ruth may live in my apartment building.

    May 21

    楼上偶得彩虹有感

            刚问mengmeng想不想下去凑凑热闹,一阵狂风平地暴起。一时间絮絮垃圾塑料袋飞了满天,远处一团低低厚厚的云层墨泼一般由北向南直压过来,地上也是灰黄的无边沙尘随之席卷覆盖,一片郁郁苍苍的绿意瞬间被吞没。露天享受着音乐的人们匆忙逃窜,大棚里的乐队不受影响唱得仍酣。忽然乌云之中一道纵向的裂空之闪,雷鸣与乐队的鼓声遥相呼应,天地一片诡异的热闹。倾盆大雨接踵而至,没有丝毫耽误,将天色的明暗度带到了最低点。然而却也酣畅淋漓干脆利落,短短五分钟乌云就已耗尽不见,天空瞬间转蓝,西边还能坚持两小时的太阳应该是等不及这太长的序幕而跳了出来,照得东方一片光鲜,忽而抬头竟已有一道彩虹清晰呈现。楼下的歌还不错,远处的彩虹很美。然而能目睹这一切,是十七楼的特权,于是还是坐定听歌看风景背英语,悠哉乐哉。

            算来上一次看到彩虹,还是大约十年前和翎子在仪化开阔的游泳池。暴雨时闭气躲在水下,比起仓惶逃回屋的人们,我们自然最先看到雨后的美景了。前两天翎子提升,在这里借助十多年后慕尼黑的彩虹穿越一下,祝之贺之~

    有图有真相

    Rainbow 009

     Rainbow 010

    只是想一下

            头发已经太长了,大太阳下,脸色黄黄的很没精神。想念中医院的黄汤,即使那么苦那么难以下咽;想念御用了六年的理发师,惊叹恋旧恋到一定程度了;梦中抱紧了我的猫,不许它乱动,可事实上如今它已经老迈到无法上蹿下跳;想着家,却更加茫然。新的没呆过两天,旧的早已面目全非,再往前追溯,才发觉久远到无从可想……只有想想不变的家人,然而又是那么害怕他们在老去而我还没有真正长大,奇怪在外时间越长就越没有自信……世上的事总不得完美,有的人厌家而不愿回,我却恋家而不得回。

            转眼又是学生城一年一度的盛会,从我入住以来,已是第三届了。回想第一次经历,确实非常新鲜有趣。最奇妙的是很久以前就知道了这个StuStaCulum的盛名,没想到搬家居然能搬到主场。可以想见当时乐队震耳欲聋的嘶吼和使人内脏欲裂的重低音效由于相见恨晚的历史原因和混沌懵懂的客观阶段,完完全全转换成了兴奋与激动。如今坐在距离音箱十七楼远的地方,只有空空回想那时的欢歌狂舞和灯火阑珊,却实实在在地忌惮着那种身临其境的耳鸣与不适。远处的呼声与歌唱,还有震动中的节奏,都足以带回我那一部分的每个细节每刻记忆……

            已经弄不清对这稔熟的客乡是什么感情了,只知道有些压力有些累。究竟何时才能练就一身没心没肺,享受漂泊的新奇与自由,真正单纯地快乐着,只因此心安处是吾乡呢?

    May 06

    念想之间 尘埃落定

            我把钥匙卡在门旁一照,“滴——”一响,推门进屋。直映入眼的是实验室的凌乱。电脑拥挤地排列着,桌上摊着纸笔鼠标垫和乱七八糟的线甚至是刀叉,小机器人安静地站在电脑之间,一抬头便是窗外死角处又细又高尚未长成努力撑着叶子随风摇动的树苗……这样的不华丽不整洁却能突然间令我兴奋不已。就好像一下子回到了几年前,老爸的电子楼实验室,那散着横七竖八的板子元件电烙铁以及电线的拼接起来的桌子,一两本或熟悉或新鲜的教材书籍,老旧而反应迟钝的电脑,落着尘埃的键盘和其上用得油光的按键,窗外月色下的瘦削的没有叶子的细长花枝,还有那花枝顶上安静站立着的洁白的玉兰花……输入用户名和密码登陆,同样的一层薄灰的键盘,同样的干净发白的按键,同样的原始朴实的Windows界面。很好,这就是我想要的,并不枝繁叶茂但载满回忆的角落。

    May 04

    When I remenber when…

     

    Some things can never be replaced

    Some things are with me for always

    These are things I will remember

    Again and again

    When I remember when

    April 22

    摘录:详解费米能级

    IC1第一堂课上得晕乎乎的,居然还冒出一个完全陌生的名词——费米能级。

    找篇详解,还是很晕@_@

    举个例子,一小学由一班学生,学生人数为50人,班上所提供的座位
    有60个.老师以学生的身高进行座位的分配.经分配后,班上身高较
    高的学生将配往后座,而且经分配后,班上将留下10个空位.这是一
    般我们小时候常经历的生活经验.电子在原子内分布的情形与分布
    的规则,与上面这个例子十分的相似.电子的能级,好比是例子里的
    座位;而电子的能量,则好比是例子里学生身高.能量较高的电子,
    就好像是身高较高的学生一般,将占往高位的能级(即例子里的后
    座),并使低位能的能级留下空缺(即空位).因为材料的导电性与位
    于导带的导电电子密度(或数量)有关,为了了解这一点,我们势必
    要先了解电子的量子状态分布(如例子里的座位分配),及电子的能
    量分布(即学生的身高分布)后,才能让我们掌握有多少自由电子位
    于导带内(即有多少身高较高的学生能坐在后座).在材料科学上,
    我们通常称前者(即电子的量子状态分布)为状态密度(Density 
    of Status),以N(E)表示;后者(即电子的能量分布)称为费米
    在绝对温度零度(0 k)时,原子内电子所能占住的最高能级的能
    量". 也就是说,在0 k时,所有低于Ef的能级将完全为电子所占满,
    而高于Ef的能级则完全空着,当物体所在的环境温度高于0 k后,虽
    然大多数的电子依然处于低能级上,但是一小部分的电子将因环境
    所提供的能量,而开始转往较高的能级,使电子的分布不再局限于
    Ef的下方,至于费米函数,则可以定义为:" 当物体所在的环境温度
    高于绝对零度时,在能量为Ef的能级上,发现电子的几率为50%", 

    发表用户:电子狂客 发表时间:2006-7-3 10:18:55

    April 19

    桃李春风

            马上又要开学了,不嫌麻烦啰嗦两句。最近天气真是很好,总是淡蓝色的天空飘着有些透明的白云,极其干净清爽,加之和煦的暖风,让我想起云淡风轻。加入校内大军,看到了很多老同学。有的已经在各大城市打拼了,有些在美国加拿大读硕读博,还有的去英国读硕士已经毕业,准备结婚。我一直沿着自己的路在走,将身边的风景抛在脑后,一转身,却原来已经白云苍狗。其实是很正常的事,只是觉得有些突然。在屋里闭关闷得发疯的时候,晚上看见桌前窗玻璃反射到自己在灯下的虚像的时候,总是会想起以前,那些经过岁月沉淀只留下朦胧美好的碎片影像,仿佛就是“桃李春风一杯酒,江湖夜雨十年灯”的真实写照。不是嫌气氛太过寂寞,而是现在的学习就得耐得住寂寞,若是焦躁得在小宿舍的方寸之地打转就只能去图书馆找寂寞了,心情很是矛盾。就在这样安安静静过日子的时候,惊闻同屋两年的室友要回国工作了,今晚就办了Party,很快。原来德国这个能熬死人的地方,想要过得快照样很快。于是熬着熬着,有人要走了,Qiu和文林学长搬入了学生城,薇薇的千金随着春雷也来到世上。周围的事物注定不断变化,可是难得此时此刻无力掌控的天气真的很好。这样的天气,就该傍晚去Englischer Garten小跑一圈,和mengmeng去宝马博物馆转悠转悠,跟Qiu和Dong在楼下大院打打乒乓球,或者搭上个懒人去韩国餐厅小小腐败一顿庆祝开学……是否今日的江湖夜雨,明朝来看又成了桃李春风?

    April 10

    春夏秋冬又一春

            昨天终于忙完一个阶段,赶紧喘口气。晚上马不停蹄地跟mengmeng去看了《拉贝日记》,从4月2日上映起就一直惦记着,觉得这种片子就应该花钱去支持。本来以为晚场不一定有空位,结果去了才知道楼上楼下的人加起来总共也就二十来个,十分冷清。即使心里已经做足了准备不是来娱乐的,是来受虐的,可是当看到鬼子开着卡车扫射战俘,无辜百姓的头颅摆成一排后面是脖子横截面鲜红的尸山,再强大的心理也抵不过这种蹂躏与折磨。何况电影镜头主要只是给了安全区的屠杀这一冰山小角,更何况真实的历史只可能比电影更加无法想象的惨绝人寰呢!当看到南京的百姓聚在纳粹党旗下躲避日军空袭的时候,一切国家与民族的界限都不复存在,人性原是如此,像是黑暗中的光辉。当然,影片主要还是以德国人的视角拍摄的,“它虽然涉及到了“南京大屠杀”,但电影的主旨还是在讲述一个普通德国人如何在巨大的灾难面前发现人性,升华人性的故事。它虽然很好地完成了这个关于人性的故事,但它并没有能力和资格去升华和质询中国人的集体伤痛。这并不是电影技法的失误,也不是电影立场的失误,而是因为这样的一场巨大灾难和伤痛,虽然有人性的共同之处,但那种痛彻心扉的悲怆和发问,只能由中国人自己完成。”可是我已经不能确定,我这已经被压抑拷打过一遍的脆弱小心肝儿是否还能经得起《南京!南京!》的再次折腾。。。

            今天是Karfreitag,有受难才有重生,有寒冬才有暖春,复活节马上就要到了。铭记历史,展望未来吧。如今其实已经阳光明媚。出去转转透透气,感受到了巴伐利亚傲人的蓝天,树枝上的新绿是鲜嫩鲜嫩的,迎春花灿烂得晃眼。沉郁是为了能更好地看清希望之所在吧。春夏秋冬又一春……

    March 24

    人间四月芳菲尽,慕城雪花犹盛开

            翎子是说杭州回暖了么?我现在已经不知道慕尼黑到底是什么季节。半夜的闪电和雷声,天明时低沉的云层,刮得我进不了楼的风,直来直去的小冰雹,转着圈的漫天飞雪,转而出了太阳,然后沉入云后镶金边去了,最后终于天黑了,这个世界清静了……一小时换三种天气,我真是受够了。于是也回答了峰哥为何不写点抒情的小博客了,心里全是怨气,外加不安吧。

            这学期送走了老爸,说实话没能为他做什么,我心里十分十分难过。他的眼镜被风刮走的时候我没在他身边,幸好没出什么事,但这不是我能原谅德国这种死人天气的原因。什么什么?好吧我不得不承认主要还是我自己照顾不周,再加上一条怨天尤人也是我的错……他踏上ICE时的背影,是有些沧桑弱小了,我的眼中除了泪水,还看到一种力量……

            然后就是告别了一个Praktikum,这真不是一段令人愉快的经历。它使我平生第一次明白了,这个世界上还有你认认真真也做不好的事。所幸结果没有想象中的烂,或许连子啊上帝啊老天爷也看不过眼了吧……

            考了一堆试,结束后和mengmeng去北德转了一圈。汉堡雨中和夜幕下的港口,不莱梅放晴的童话雕塑,汉诺威优雅的温室兰花,还有五天的穷游暴走,近乎瘫痪地回到慕尼黑……至少这些是终生难忘的。坏事就是觊觎上正统长焦DC了,等待啊等待,有朝一日把单反王族踢下神坛,来一次草根庶民的胜利吧!

           “死都不怕,就要安逸。”与时俱进地看着《团长》,不敢怠慢脖子上还悬着的那把刀,给安逸的假期找点儿不安逸,天天因为耗费了不该耗费的时间而忏悔。但还是忍不住,为松山战役流泪,为以前从不知晓的远征军而唏嘘不已。二战真可怕,重新审视脚下这片土地,德军与苏联红军,不敢想象……这首Lube的《Davai Za(为了)》一下就吸引了我,太动听太悲壮太压抑太……

            汉堡游照片集锦        不莱梅照片集锦        汉诺威照片集锦

            Davai Za 介绍、歌词大意及MV

    February 02

    人与人之间果然是有差别的!

    > Wegen des MVV-Streiks (http://www.mvg-mobil.de/streikinfo.htm), kann
    > ich am naechsten Dienstag Garching nicht erreichen.
    Also, auch im Falle eines Streikes gilt zunächst mal: Man muss zur
    Prüfung erscheinen. Wir müssen auch in der Arbeit erscheinen. Vielleicht
    finden Sie Kommilitonen, die Sie am Dienstag mitnehmen. Sie können auch
    mit der S-Bahn fahren, dann Bus 230 von Ismaning und 690 von
    Eching/Neufahrn - falls die Busse fahren.
    > Koennten Sie den Termin fuer dbpra01 den naechsten Tag verschieben?
    > Also B: Mittwoch: 4.2.09, 15:00 Uhr. Ich danke Ihnen fuers Verständnis.
    Leider ist dieser Termin nun nicht mehr frei, da ich andere
    Verpflichtungen habe.
    Gruß,
    angelika reiser

    ===============================================

    Liebe Hörerinnen und Hörer der Vorlesung Elektronisches Publizieren,
    angesichts des MVV-Streiks ist es morgen nicht so einfach, nach Garching
    rauszukommen. Ich möchte Ihnen und mir das Chaos ersparen; deshalb lasse
    ich die morgige (und damit die letzte) Vorlesung Elektronisches
    Publizieren ausfallen. Im Laufe des Tages stelle ich Ihnen noch die
    letzten Folien in's Netz und vervollständige das Inhaltsverzeichnis, die
    Lernziele und die typischen Prüfungsfragen. Sie bekommen auch Material
    zu dem Thema XLink und XQuery-Implementierung von XLink, das eigentlich
    für morgen vorgesehen war. Dieses Thema ist aber nicht mehr
    Prüfungsgegenstand.
    Ich bedanke mich für Ihr Interesse an der Vorlesung und wünsche Ihnen
    eine erholsame und fruchtbare vorlesungsfreie Zeit. Die meisten von
    Ihnen sehe ich ja noch zur mündlichen Prüfung.
    Mit freundlichen Grüßen,
    Anne Brüggemann-Klein

    咬牙切齿,留作纪念!