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