From 168af40fe9a3cc81c6ee16b3e81f154780c36bdb Mon Sep 17 00:00:00 2001 From: Scheaven <xuepengqiang> Date: 星期四, 03 六月 2021 15:03:27 +0800 Subject: [PATCH] up new v4 --- lib/detecter_tools/darknet/tree.c | 270 +++++++++++++++++++++++++++--------------------------- 1 files changed, 135 insertions(+), 135 deletions(-) diff --git a/lib/detecter_tools/darknet/tree.c b/lib/detecter_tools/darknet/tree.c index 446f220..8a2c231 100644 --- a/lib/detecter_tools/darknet/tree.c +++ b/lib/detecter_tools/darknet/tree.c @@ -1,135 +1,135 @@ -#include <stdio.h> -#include <stdlib.h> -#include "tree.h" -#include "utils.h" -#include "data.h" - -void change_leaves(tree *t, char *leaf_list) -{ - list *llist = get_paths(leaf_list); - char **leaves = (char **)list_to_array(llist); - int n = llist->size; - int i,j; - int found = 0; - for(i = 0; i < t->n; ++i){ - t->leaf[i] = 0; - for(j = 0; j < n; ++j){ - if (0==strcmp(t->name[i], leaves[j])){ - t->leaf[i] = 1; - ++found; - break; - } - } - } - fprintf(stderr, "Found %d leaves.\n", found); -} - -float get_hierarchy_probability(float *x, tree *hier, int c) -{ - float p = 1; - while(c >= 0){ - p = p * x[c]; - c = hier->parent[c]; - } - return p; -} - -void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves) -{ - int j; - for(j = 0; j < n; ++j){ - int parent = hier->parent[j]; - if(parent >= 0){ - predictions[j] *= predictions[parent]; - } - } - if(only_leaves){ - for(j = 0; j < n; ++j){ - if(!hier->leaf[j]) predictions[j] = 0; - } - } -} - -int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride) -{ - float p = 1; - int group = 0; - int i; - while (1) { - float max = 0; - int max_i = 0; - - for (i = 0; i < hier->group_size[group]; ++i) { - int index = i + hier->group_offset[group]; - float val = predictions[(i + hier->group_offset[group])*stride]; - if (val > max) { - max_i = index; - max = val; - } - } - if (p*max > thresh) { - p = p*max; - group = hier->child[max_i]; - if (hier->child[max_i] < 0) return max_i; - } - else if (group == 0) { - return max_i; - } - else { - return hier->parent[hier->group_offset[group]]; - } - } - return 0; -} - -tree *read_tree(char *filename) -{ - tree t = {0}; - FILE *fp = fopen(filename, "r"); - - char *line; - int last_parent = -1; - int group_size = 0; - int groups = 0; - int n = 0; - while((line=fgetl(fp)) != 0){ - char* id = (char*)xcalloc(256, sizeof(char)); - int parent = -1; - sscanf(line, "%s %d", id, &parent); - t.parent = (int*)xrealloc(t.parent, (n + 1) * sizeof(int)); - t.parent[n] = parent; - - t.name = (char**)xrealloc(t.name, (n + 1) * sizeof(char*)); - t.name[n] = id; - if(parent != last_parent){ - ++groups; - t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); - t.group_offset[groups - 1] = n - group_size; - t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); - t.group_size[groups - 1] = group_size; - group_size = 0; - last_parent = parent; - } - t.group = (int*)xrealloc(t.group, (n + 1) * sizeof(int)); - t.group[n] = groups; - ++n; - ++group_size; - } - ++groups; - t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); - t.group_offset[groups - 1] = n - group_size; - t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); - t.group_size[groups - 1] = group_size; - t.n = n; - t.groups = groups; - t.leaf = (int*)xcalloc(n, sizeof(int)); - int i; - for(i = 0; i < n; ++i) t.leaf[i] = 1; - for(i = 0; i < n; ++i) if(t.parent[i] >= 0) t.leaf[t.parent[i]] = 0; - - fclose(fp); - tree* tree_ptr = (tree*)xcalloc(1, sizeof(tree)); - *tree_ptr = t; - //error(0); - return tree_ptr; -} +#include <stdio.h> +#include <stdlib.h> +#include "tree.h" +#include "utils.h" +#include "data.h" + +void change_leaves(tree *t, char *leaf_list) +{ + list *llist = get_paths(leaf_list); + char **leaves = (char **)list_to_array(llist); + int n = llist->size; + int i,j; + int found = 0; + for(i = 0; i < t->n; ++i){ + t->leaf[i] = 0; + for(j = 0; j < n; ++j){ + if (0==strcmp(t->name[i], leaves[j])){ + t->leaf[i] = 1; + ++found; + break; + } + } + } + fprintf(stderr, "Found %d leaves.\n", found); +} + +float get_hierarchy_probability(float *x, tree *hier, int c) +{ + float p = 1; + while(c >= 0){ + p = p * x[c]; + c = hier->parent[c]; + } + return p; +} + +void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves) +{ + int j; + for(j = 0; j < n; ++j){ + int parent = hier->parent[j]; + if(parent >= 0){ + predictions[j] *= predictions[parent]; + } + } + if(only_leaves){ + for(j = 0; j < n; ++j){ + if(!hier->leaf[j]) predictions[j] = 0; + } + } +} + +int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride) +{ + float p = 1; + int group = 0; + int i; + while (1) { + float max = 0; + int max_i = 0; + + for (i = 0; i < hier->group_size[group]; ++i) { + int index = i + hier->group_offset[group]; + float val = predictions[(i + hier->group_offset[group])*stride]; + if (val > max) { + max_i = index; + max = val; + } + } + if (p*max > thresh) { + p = p*max; + group = hier->child[max_i]; + if (hier->child[max_i] < 0) return max_i; + } + else if (group == 0) { + return max_i; + } + else { + return hier->parent[hier->group_offset[group]]; + } + } + return 0; +} + +tree *read_tree(char *filename) +{ + tree t = {0}; + FILE *fp = fopen(filename, "r"); + + char *line; + int last_parent = -1; + int group_size = 0; + int groups = 0; + int n = 0; + while((line=fgetl(fp)) != 0){ + char* id = (char*)xcalloc(256, sizeof(char)); + int parent = -1; + sscanf(line, "%s %d", id, &parent); + t.parent = (int*)xrealloc(t.parent, (n + 1) * sizeof(int)); + t.parent[n] = parent; + + t.name = (char**)xrealloc(t.name, (n + 1) * sizeof(char*)); + t.name[n] = id; + if(parent != last_parent){ + ++groups; + t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); + t.group_offset[groups - 1] = n - group_size; + t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); + t.group_size[groups - 1] = group_size; + group_size = 0; + last_parent = parent; + } + t.group = (int*)xrealloc(t.group, (n + 1) * sizeof(int)); + t.group[n] = groups; + ++n; + ++group_size; + } + ++groups; + t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); + t.group_offset[groups - 1] = n - group_size; + t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); + t.group_size[groups - 1] = group_size; + t.n = n; + t.groups = groups; + t.leaf = (int*)xcalloc(n, sizeof(int)); + int i; + for(i = 0; i < n; ++i) t.leaf[i] = 1; + for(i = 0; i < n; ++i) if(t.parent[i] >= 0) t.leaf[t.parent[i]] = 0; + + fclose(fp); + tree* tree_ptr = (tree*)xcalloc(1, sizeof(tree)); + *tree_ptr = t; + //error(0); + return tree_ptr; +} -- Gitblit v1.8.0