1. 修改 void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen) ( 在 ./example/detector.c)
set_init_filename(filename, "01451"); // 額外添加, 01451 為起始編號-1
while(1){
/*if(filename){ // 這段註解掉,因為我們要設定自己的 filename
strncpy(input, filename, 256);
} else {
printf("Enter Image Path: ");
fflush(stdout);
input = fgets(input, 256, stdin);
if(!input) return;
strtok(input, "\n");
}*/
set_filename(filename); // 設定下一個的 filename
...
if(out_file){
...
}
else{
save_image(im, "predictions");
char filename_copy[0x100];
strcpy(filename_copy, filename);
save_xml_data(im, filename_copy, names, dets, nboxes, thresh); // 添加這行,用來存 xml 檔
free_detections(dets, nboxes);
}
//if (filename) break; // 只判別一個 file . 註解掉不會進入無窮迴圈嗎?會阿,ctrl c 就好了,不然自己添加終止條件
}
}
2. 添加在 test_detector 上方
void save_xml_data(image im, char *filename, char **names, detection *dets, int num, float thresh)
{
int i = strlen(filename), j;
filename[i-4] = 0;
char buff_name[256];
sprintf(buff_name, "./MyData/Annotations/%s.xml", filename);
FILE *fp;
fp = fopen(buff_name, "w+");
int width = 640;
int height = 480;
char prefix[0x400];
char object[0x400];
char suffix[0x400] = "</annotation>";
sprintf(prefix, "<annotation><folder>JPEGImages</folder><filename>%s.jpg</filename><path>/home/xavier/Desktop/Project/training_data/Image/%1$s.jpg</path><source><database>Unknown</database></source><size><width>%d</width><height>%d</height><depth>3</depth></size><segmented>0</segmented>", filename, width, height);
fputs(prefix, fp);
for(i = 0; i<num; i++)
for(j = 0; j<5; j++){
if( dets[i].prob[j] > thresh){
box b = dets[i].bbox;
int left = (b.x-b.w/2.)*im.w;
int right = (b.x+b.w/2.)*im.w;
int top = (b.y-b.h/2.)*im.h;
int bot = (b.y+b.h/2.)*im.h;
sprintf(object, "<object><name>%s</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>%d</xmin><ymin>%d</ymin><xmax>%d</xmax><ymax>%d</ymax></bndbox></object>", names[j], left, top, right, bot);
fputs(object, fp);
}
}
fputs(suffix, fp);
fclose(fp);
}
void set_init_filename(char *filename, char *start_point)
{
sprintf(filename, "./MyData/JPEGImages/%s.jpg", start_point);
}
void set_filename(char *filename)
{
int len = strlen(filename);
filename[len - 5]++; //.jpg\0
int i;
for(i = len-5; i>=len-8; i--)
if(filename[i] > '9'){
filename[i] = '0';
filename[i-1]++;
}else break;
}