darknet  v3
instance-segmenter.c
Go to the documentation of this file.
1 #include "darknet.h"
2 #include <sys/time.h>
3 #include <assert.h>
4 
5 void normalize_image2(image p);
6 void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display)
7 {
8  int i;
9 
10  float avg_loss = -1;
11  char *base = basecfg(cfgfile);
12  printf("%s\n", base);
13  printf("%d\n", ngpus);
14  network **nets = calloc(ngpus, sizeof(network*));
15 
16  srand(time(0));
17  int seed = rand();
18  for(i = 0; i < ngpus; ++i){
19  srand(seed);
20 #ifdef GPU
21  cuda_set_device(gpus[i]);
22 #endif
23  nets[i] = load_network(cfgfile, weightfile, clear);
24  nets[i]->learning_rate *= ngpus;
25  }
26  srand(time(0));
27  network *net = nets[0];
28  image pred = get_network_image(net);
29 
30  image embed = pred;
31  embed.c = 3;
32  embed.data += embed.w*embed.h*80;
33 
34  int div = net->w/pred.w;
35  assert(pred.w * div == net->w);
36  assert(pred.h * div == net->h);
37 
38  int imgs = net->batch * net->subdivisions * ngpus;
39 
40  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
41  list *options = read_data_cfg(datacfg);
42 
43  char *backup_directory = option_find_str(options, "backup", "/backup/");
44  char *train_list = option_find_str(options, "train", "data/train.list");
45 
46  list *plist = get_paths(train_list);
47  char **paths = (char **)list_to_array(plist);
48  printf("%d\n", plist->size);
49  int N = plist->size;
50 
51  load_args args = {0};
52  args.w = net->w;
53  args.h = net->h;
54  args.threads = 32;
55  args.scale = div;
56  args.num_boxes = 90;
57 
58  args.min = net->min_crop;
59  args.max = net->max_crop;
60  args.angle = net->angle;
61  args.aspect = net->aspect;
62  args.exposure = net->exposure;
63  args.saturation = net->saturation;
64  args.hue = net->hue;
65  args.size = net->w;
66  args.classes = 80;
67 
68  args.paths = paths;
69  args.n = imgs;
70  args.m = N;
71  args.type = ISEG_DATA;
72 
73  data train;
74  data buffer;
75  pthread_t load_thread;
76  args.d = &buffer;
77  load_thread = load_data(args);
78 
79  int epoch = (*net->seen)/N;
80  while(get_current_batch(net) < net->max_batches || net->max_batches == 0){
81  double time = what_time_is_it_now();
82 
83  pthread_join(load_thread, 0);
84  train = buffer;
85  load_thread = load_data(args);
86 
87  printf("Loaded: %lf seconds\n", what_time_is_it_now()-time);
88  time = what_time_is_it_now();
89 
90  float loss = 0;
91 #ifdef GPU
92  if(ngpus == 1){
93  loss = train_network(net, train);
94  } else {
95  loss = train_networks(nets, ngpus, train, 4);
96  }
97 #else
98  loss = train_network(net, train);
99 #endif
100  if(display){
101  image tr = float_to_image(net->w/div, net->h/div, 80, train.y.vals[net->batch*(net->subdivisions-1)]);
102  image im = float_to_image(net->w, net->h, net->c, train.X.vals[net->batch*(net->subdivisions-1)]);
103  pred.c = 80;
104  image mask = mask_to_rgb(tr);
105  image prmask = mask_to_rgb(pred);
106  image ecopy = copy_image(embed);
107  normalize_image2(ecopy);
108  show_image(ecopy, "embed", 1);
109  free_image(ecopy);
110 
111  show_image(im, "input", 1);
112  show_image(prmask, "pred", 1);
113  show_image(mask, "truth", 100);
114  free_image(mask);
115  free_image(prmask);
116  }
117  if(avg_loss == -1) avg_loss = loss;
118  avg_loss = avg_loss*.9 + loss*.1;
119  printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen);
120  free_data(train);
121  if(*net->seen/N > epoch){
122  epoch = *net->seen/N;
123  char buff[256];
124  sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
125  save_weights(net, buff);
126  }
127  if(get_current_batch(net)%100 == 0){
128  char buff[256];
129  sprintf(buff, "%s/%s.backup",backup_directory,base);
130  save_weights(net, buff);
131  }
132  }
133  char buff[256];
134  sprintf(buff, "%s/%s.weights", backup_directory, base);
135  save_weights(net, buff);
136 
137  free_network(net);
138  free_ptrs((void**)paths, plist->size);
139  free_list(plist);
140  free(base);
141 }
142 
143 void predict_isegmenter(char *datafile, char *cfg, char *weights, char *filename)
144 {
145  network *net = load_network(cfg, weights, 0);
146  set_batch_network(net, 1);
147  srand(2222222);
148 
149  clock_t time;
150  char buff[256];
151  char *input = buff;
152  while(1){
153  if(filename){
154  strncpy(input, filename, 256);
155  }else{
156  printf("Enter Image Path: ");
157  fflush(stdout);
158  input = fgets(input, 256, stdin);
159  if(!input) return;
160  strtok(input, "\n");
161  }
162  image im = load_image_color(input, 0, 0);
163  image sized = letterbox_image(im, net->w, net->h);
164 
165  float *X = sized.data;
166  time=clock();
167  float *predictions = network_predict(net, X);
168  image pred = get_network_image(net);
169  image prmask = mask_to_rgb(pred);
170  printf("Predicted: %f\n", predictions[0]);
171  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
172  show_image(sized, "orig", 1);
173  show_image(prmask, "pred", 0);
174  free_image(im);
175  free_image(sized);
176  free_image(prmask);
177  if (filename) break;
178  }
179 }
180 
181 
182 void demo_isegmenter(char *datacfg, char *cfg, char *weights, int cam_index, const char *filename)
183 {
184 #ifdef OPENCV
185  printf("Classifier Demo\n");
186  network *net = load_network(cfg, weights, 0);
187  set_batch_network(net, 1);
188 
189  srand(2222222);
190  CvCapture * cap;
191 
192  if(filename){
193  cap = cvCaptureFromFile(filename);
194  }else{
195  cap = cvCaptureFromCAM(cam_index);
196  }
197 
198  if(!cap) error("Couldn't connect to webcam.\n");
199  cvNamedWindow("Segmenter", CV_WINDOW_NORMAL);
200  cvResizeWindow("Segmenter", 512, 512);
201  float fps = 0;
202 
203  while(1){
204  struct timeval tval_before, tval_after, tval_result;
205  gettimeofday(&tval_before, NULL);
206 
207  image in = get_image_from_stream(cap);
208  image in_s = letterbox_image(in, net->w, net->h);
209 
210  network_predict(net, in_s.data);
211 
212  printf("\033[2J");
213  printf("\033[1;1H");
214  printf("\nFPS:%.0f\n",fps);
215 
216  image pred = get_network_image(net);
217  image prmask = mask_to_rgb(pred);
218  show_image(prmask, "Segmenter", 10);
219 
220  free_image(in_s);
221  free_image(in);
222  free_image(prmask);
223 
224  gettimeofday(&tval_after, NULL);
225  timersub(&tval_after, &tval_before, &tval_result);
226  float curr = 1000000.f/((long int)tval_result.tv_usec);
227  fps = .9*fps + .1*curr;
228  }
229 #endif
230 }
231 
232 
233 void run_isegmenter(int argc, char **argv)
234 {
235  if(argc < 4){
236  fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
237  return;
238  }
239 
240  char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
241  int *gpus = 0;
242  int gpu = 0;
243  int ngpus = 0;
244  if(gpu_list){
245  printf("%s\n", gpu_list);
246  int len = strlen(gpu_list);
247  ngpus = 1;
248  int i;
249  for(i = 0; i < len; ++i){
250  if (gpu_list[i] == ',') ++ngpus;
251  }
252  gpus = calloc(ngpus, sizeof(int));
253  for(i = 0; i < ngpus; ++i){
254  gpus[i] = atoi(gpu_list);
255  gpu_list = strchr(gpu_list, ',')+1;
256  }
257  } else {
258  gpu = gpu_index;
259  gpus = &gpu;
260  ngpus = 1;
261  }
262 
263  int cam_index = find_int_arg(argc, argv, "-c", 0);
264  int clear = find_arg(argc, argv, "-clear");
265  int display = find_arg(argc, argv, "-display");
266  char *data = argv[3];
267  char *cfg = argv[4];
268  char *weights = (argc > 5) ? argv[5] : 0;
269  char *filename = (argc > 6) ? argv[6]: 0;
270  if(0==strcmp(argv[2], "test")) predict_isegmenter(data, cfg, weights, filename);
271  else if(0==strcmp(argv[2], "train")) train_isegmenter(data, cfg, weights, gpus, ngpus, clear, display);
272  else if(0==strcmp(argv[2], "demo")) demo_isegmenter(data, cfg, weights, cam_index, filename);
273 }
274 
275 
void run_isegmenter(int argc, char **argv)
float hue
Definition: darknet.h:576
int min_crop
Definition: darknet.h:470
float decay
Definition: darknet.h:447
char ** paths
Definition: darknet.h:553
image copy_image(image p)
Definition: image.c:519
int batch
Definition: darknet.h:436
void demo_isegmenter(char *datacfg, char *cfg, char *weights, int cam_index, const char *filename)
int find_arg(int argc, char *argv[], char *arg)
Definition: utils.c:120
void set_batch_network(network *net, int b)
Definition: network.c:339
int w
Definition: darknet.h:559
float learning_rate
Definition: darknet.h:445
float hue
Definition: darknet.h:478
float momentum
Definition: darknet.h:446
void free_data(data d)
Definition: data.c:665
int max
Definition: darknet.h:565
int show_image(image p, const char *name, int ms)
Definition: image.c:575
char * find_char_arg(int argc, char **argv, char *arg, char *def)
Definition: utils.c:163
float aspect
Definition: darknet.h:573
char * basecfg(char *cfgfile)
Definition: utils.c:179
void ** list_to_array(list *l)
Definition: list.c:82
size_t * seen
Definition: darknet.h:437
char * option_find_str(list *l, char *key, char *def)
Definition: option_list.c:104
float train_network(network *net, data d)
Definition: network.c:314
int size
Definition: darknet.h:603
void free_list(list *l)
Definition: list.c:67
Definition: darknet.h:512
int h
Definition: darknet.h:558
void free_network(network *net)
Definition: network.c:716
int max_crop
Definition: darknet.h:469
data_type type
Definition: darknet.h:580
image float_to_image(int w, int h, int c, float *data)
Definition: image.c:774
void save_weights(network *net, char *filename)
Definition: parser.c:1080
int size
Definition: darknet.h:565
network_predict
Definition: darknet.py:79
float exposure
Definition: darknet.h:575
image get_network_image(network *net)
Definition: network.c:466
int h
Definition: darknet.h:514
int max_batches
Definition: darknet.h:453
letterbox_image
Definition: darknet.py:98
float aspect
Definition: darknet.h:475
int threads
Definition: darknet.h:552
int num_boxes
Definition: darknet.h:564
int m
Definition: darknet.h:556
void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display)
data * d
Definition: darknet.h:577
free_image
Definition: darknet.py:95
int subdivisions
Definition: darknet.h:440
image load_image_color(char *filename, int w, int h)
Definition: image.c:1486
void predict_isegmenter(char *datafile, char *cfg, char *weights, char *filename)
int classes
Definition: darknet.h:566
float get_current_rate(network *net)
Definition: network.c:90
float saturation
Definition: darknet.h:477
int scale
Definition: darknet.h:568
float sec(clock_t clocks)
Definition: utils.c:232
float saturation
Definition: darknet.h:574
int find_int_arg(int argc, char **argv, char *arg, int def)
Definition: utils.c:133
network * load_network(char *cfg, char *weights, int clear)
Definition: network.c:53
int n
Definition: darknet.h:555
void * load_thread(void *ptr)
Definition: data.c:1090
void normalize_image2(image p)
Definition: image.c:485
int c
Definition: darknet.h:515
int w
Definition: darknet.h:513
void cuda_set_device(int n)
Definition: cuda.c:176
Definition: darknet.h:602
int min
Definition: darknet.h:565
list * read_data_cfg(char *filename)
Definition: option_list.c:7
matrix X
Definition: darknet.h:540
int c
Definition: darknet.h:468
int gpu_index
Definition: cuda.c:1
size_t get_current_batch(network *net)
Definition: network.c:63
float ** vals
Definition: darknet.h:534
int h
Definition: darknet.h:468
float angle
Definition: darknet.h:572
list * get_paths(char *filename)
Definition: data.c:12
free_ptrs
Definition: darknet.py:76
pthread_t load_data(load_args args)
Definition: data.c:1180
void error(const char *s)
Definition: utils.c:253
int w
Definition: darknet.h:468
image mask_to_rgb(image mask)
Definition: image.c:28
Definition: darknet.h:538
double what_time_is_it_now()
Definition: utils.c:27
float * data
Definition: darknet.h:516
matrix y
Definition: darknet.h:541
float exposure
Definition: darknet.h:476
float angle
Definition: darknet.h:474