问题描述
我正在使用 YOLO 进行对象检测,并想编辑代码文件以对文件夹中的所有图像运行检测,我发现此功能 Github link to the function
我编辑了 here 中的“test_detector”函数,如下所示:
while (1) {
folder = opendir("./result_img/");
char str1[100] = "./result_img/";
while( (entry=readdir(folder)) != NULL)
{
if((strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0 || (entry->d_name) == '.' ) || (strcmp(entry->d_name,"Server_v1.py")==0))
{
printf(".");
sleep(0.5);
continue;
}
if (filename) {
strcat(str1,entry->d_name);
strncpy(input,str1,256);
closedir(folder);
if (strlen(input) > 0)
if (input[strlen(input) - 1] == 0x0d) input[strlen(input) - 1] = 0;
}
else {
printf("Enter Image Path: ");
fflush(stdout);
input = fgets(input,256,stdin);
if (!input) break;
strtok(input,"\n");
}
//image im;
//image sized = load_image_resize(input,net.w,net.h,net.c,&im);
image im = load_image(input,net.c);
image sized;
if(letter_Box) sized = letterBox_image(im,net.h);
else sized = resize_image(im,net.h);
layer l = net.layers[net.n - 1];
int k;
for (k = 0; k < net.n; ++k) {
layer lk = net.layers[k];
if (lk.type == YOLO || lk.type == GAUSSIAN_YOLO || lk.type == REGION) {
l = lk;
printf(" Detection layer: %d - type = %d \n",k,l.type);
}
}
//Box *Boxes = calloc(l.w*l.h*l.n,sizeof(Box));
//float **probs = calloc(l.w*l.h*l.n,sizeof(float*));
//for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float*)xcalloc(l.classes,sizeof(float));
float *X = sized.data;
//time= what_time_is_it_Now();
double time = get_time_point();
network_predict(net,X);
//network_predict_image(&net,im); letterBox = 1;
printf("%s: Predicted in %lf milli-seconds.\n",input,((double)get_time_point() - time) / 1000);
//printf("%s: Predicted in %f seconds.\n",(what_time_is_it_Now()-time));
int nBoxes = 0;
detection *dets = get_network_Boxes(&net,im.w,im.h,thresh,hier_thresh,1,&nBoxes,letter_Box);
if (nms) {
if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets,nBoxes,l.classes,nms);
else diounms_sort(dets,nms,l.nms_kind,l.beta_nms);
}
draw_detections_v3(im,dets,names,alphabet,ext_output,input);
save_image(im,"predictions");
if (!dont_show) {
show_image(im,"predictions");
}
if (json_file) {
if (json_buf) {
char *tmp = ",\n";
fwrite(tmp,sizeof(char),strlen(tmp),json_file);
}
++json_image_id;
json_buf = detection_to_json(dets,json_image_id,input);
fwrite(json_buf,strlen(json_buf),json_file);
free(json_buf);
}
// pseudo labeling concept - fast.ai
if (save_labels)
{
char labelpath[4096];
replace_image_to_label(input,labelpath);
FILE* fw = fopen(labelpath,"wb");
int i;
for (i = 0; i < nBoxes; ++i) {
char buff[1024];
int class_id = -1;
float prob = 0;
for (j = 0; j < l.classes; ++j) {
if (dets[i].prob[j] > thresh && dets[i].prob[j] > prob) {
prob = dets[i].prob[j];
class_id = j;
}
}
if (class_id >= 0) {
sprintf(buff,"%d %2.4f %2.4f %2.4f %2.4f\n",class_id,dets[i].bBox.x,dets[i].bBox.y,dets[i].bBox.w,dets[i].bBox.h);
fwrite(buff,strlen(buff),fw);
}
}
fclose(fw);
}
free_detections(dets,nBoxes);
free_image(im);
free_image(sized);
if (dont_show) {
wait_until_press_key_cv();
destroy_all_windows_cv();
}
if (filename) break;
}
sleep(1);
printf("outside the loop");
char newname[100];
removeSubstrr(str1,"./result_img/");
sprintf(newname,"./pfiles/%s",str1);
//remove(input);
printf("newname %s\n",newname);
rename (input,newname);
//sleep(1);
}
if (json_file) {
char *tmp = "\n]";
fwrite(tmp,json_file);
fclose(json_file);
}
// free memory
free_ptrs((void**)names,net.layers[net.n - 1].classes);
free_list_contents_kvp(options);
free_list(options);
int i;
const int nsize = 8;
for (j = 0; j < nsize; ++j) {
for (i = 32; i < 127; ++i) {
free_image(alphabet[j][i]);
}
free(alphabet[j]);
}
free(alphabet);
free_network(net);
}
当我运行以下代码时,如果文件夹不为空,它运行良好。一旦文件夹在一段时间后为空,我就会收到分段错误(核心转储)错误。如果我将“sleep(1)”放在第一个循环的末尾,代码运行良好,但每次检测需要 1 秒,这对应用程序来说很慢。
我发现如果我删除“if(filename)break;”这一行即使文件夹不为空,代码也会在循环结束时停止。
filename 始终为真,因为它通过命令行传递
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)