mirror of
https://github.com/pjreddie/darknet.git
synced 2023-08-10 21:13:14 +03:00
@crossbot I will murder you in your sleep ⚔️
This commit is contained in:
71
examples/art.c
Normal file
71
examples/art.c
Normal file
@ -0,0 +1,71 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/classifier.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
void demo_art(char *cfgfile, char *weightfile, int cam_index)
|
||||
{
|
||||
#ifdef OPENCV
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
|
||||
srand(2222222);
|
||||
CvCapture * cap;
|
||||
|
||||
cap = cvCaptureFromCAM(cam_index);
|
||||
|
||||
char *window = "ArtJudgementBot9000!!!";
|
||||
if(!cap) error("Couldn't connect to webcam.\n");
|
||||
cvNamedWindow(window, CV_WINDOW_NORMAL);
|
||||
cvResizeWindow(window, 512, 512);
|
||||
int i;
|
||||
int idx[] = {37, 401, 434};
|
||||
int n = sizeof(idx)/sizeof(idx[0]);
|
||||
|
||||
while(1){
|
||||
image in = get_image_from_stream(cap);
|
||||
image in_s = resize_image(in, net.w, net.h);
|
||||
show_image(in, window);
|
||||
|
||||
float *p = network_predict(net, in_s.data);
|
||||
|
||||
printf("\033[2J");
|
||||
printf("\033[1;1H");
|
||||
|
||||
float score = 0;
|
||||
for(i = 0; i < n; ++i){
|
||||
float s = p[idx[i]];
|
||||
if (s > score) score = s;
|
||||
}
|
||||
score = score;
|
||||
printf("I APPRECIATE THIS ARTWORK: %10.7f%%\n", score*100);
|
||||
printf("[");
|
||||
int upper = 30;
|
||||
for(i = 0; i < upper; ++i){
|
||||
printf("%c", ((i+.5) < score*upper) ? 219 : ' ');
|
||||
}
|
||||
printf("]\n");
|
||||
|
||||
free_image(in_s);
|
||||
free_image(in);
|
||||
|
||||
cvWaitKey(1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void run_art(int argc, char **argv)
|
||||
{
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
char *cfg = argv[2];
|
||||
char *weights = argv[3];
|
||||
demo_art(cfg, weights, cam_index);
|
||||
}
|
||||
|
364
examples/captcha.c
Normal file
364
examples/captcha.c
Normal file
@ -0,0 +1,364 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
void fix_data_captcha(data d, int mask)
|
||||
{
|
||||
matrix labels = d.y;
|
||||
int i, j;
|
||||
for(i = 0; i < d.y.rows; ++i){
|
||||
for(j = 0; j < d.y.cols; j += 2){
|
||||
if (mask){
|
||||
if(!labels.vals[i][j]){
|
||||
labels.vals[i][j] = SECRET_NUM;
|
||||
labels.vals[i][j+1] = SECRET_NUM;
|
||||
}else if(labels.vals[i][j+1]){
|
||||
labels.vals[i][j] = 0;
|
||||
}
|
||||
} else{
|
||||
if (labels.vals[i][j]) {
|
||||
labels.vals[i][j+1] = 0;
|
||||
} else {
|
||||
labels.vals[i][j+1] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void train_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = 1024;
|
||||
int i = *net.seen/imgs;
|
||||
int solved = 1;
|
||||
list *plist;
|
||||
char **labels = get_labels("/data/captcha/reimgs.labels.list");
|
||||
if (solved){
|
||||
plist = get_paths("/data/captcha/reimgs.solved.list");
|
||||
}else{
|
||||
plist = get_paths("/data/captcha/reimgs.raw.list");
|
||||
}
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
clock_t time;
|
||||
pthread_t load_thread;
|
||||
data train;
|
||||
data buffer;
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.paths = paths;
|
||||
args.classes = 26;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.labels = labels;
|
||||
args.d = &buffer;
|
||||
args.type = CLASSIFICATION_DATA;
|
||||
|
||||
load_thread = load_data_in_thread(args);
|
||||
while(1){
|
||||
++i;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
fix_data_captcha(train, solved);
|
||||
|
||||
/*
|
||||
image im = float_to_image(256, 256, 3, train.X.vals[114]);
|
||||
show_image(im, "training");
|
||||
cvWaitKey(0);
|
||||
*/
|
||||
|
||||
load_thread = load_data_in_thread(args);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "/home/pjreddie/imagenet_backup/%s_%d.weights",base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void test_captcha(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
int i = 0;
|
||||
char **names = get_labels("/data/captcha/reimgs.labels.list");
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int indexes[26];
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
//printf("Enter Image Path: ");
|
||||
//fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, net.w, net.h);
|
||||
float *X = im.data;
|
||||
float *predictions = network_predict(net, X);
|
||||
top_predictions(net, 26, indexes);
|
||||
//printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
for(i = 0; i < 26; ++i){
|
||||
int index = indexes[i];
|
||||
if(i != 0) printf(", ");
|
||||
printf("%s %f", names[index], predictions[index]);
|
||||
}
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void valid_captcha(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
char **labels = get_labels("/data/captcha/reimgs.labels.list");
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
list *plist = get_paths("/data/captcha/reimgs.fg.list");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
int N = plist->size;
|
||||
int outputs = net.outputs;
|
||||
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
int i, j;
|
||||
for(i = 0; i < N; ++i){
|
||||
if (i%100 == 0) fprintf(stderr, "%d\n", i);
|
||||
image im = load_image_color(paths[i], net.w, net.h);
|
||||
float *X = im.data;
|
||||
float *predictions = network_predict(net, X);
|
||||
//printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
int truth = -1;
|
||||
for(j = 0; j < 13; ++j){
|
||||
if (strstr(paths[i], labels[j])) truth = j;
|
||||
}
|
||||
if (truth == -1){
|
||||
fprintf(stderr, "bad: %s\n", paths[i]);
|
||||
return;
|
||||
}
|
||||
printf("%d, ", truth);
|
||||
for(j = 0; j < outputs; ++j){
|
||||
if (j != 0) printf(", ");
|
||||
printf("%f", predictions[j]);
|
||||
}
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void train_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
float avg_loss = -1;
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = 1024;
|
||||
int i = net.seen/imgs;
|
||||
list *plist = get_paths("/data/captcha/train.auto5");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
clock_t time;
|
||||
while(1){
|
||||
++i;
|
||||
time=clock();
|
||||
data train = load_data_captcha(paths, imgs, plist->size, 10, 200, 60);
|
||||
translate_data_rows(train, -128);
|
||||
scale_data_rows(train, 1./128);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
net.seen += imgs;
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net.seen);
|
||||
free_data(train);
|
||||
if(i%10==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "/home/pjreddie/imagenet_backup/%s_%d.weights",base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void decode_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
setbuf(stdout, NULL);
|
||||
srand(time(0));
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
set_batch_network(&net, 1);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
char filename[256];
|
||||
while(1){
|
||||
printf("Enter filename: ");
|
||||
fgets(filename, 256, stdin);
|
||||
strtok(filename, "\n");
|
||||
image im = load_image_color(filename, 300, 57);
|
||||
scale_image(im, 1./255.);
|
||||
float *X = im.data;
|
||||
float *predictions = network_predict(net, X);
|
||||
image out = float_to_image(300, 57, 1, predictions);
|
||||
show_image(out, "decoded");
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(0);
|
||||
#endif
|
||||
free_image(im);
|
||||
}
|
||||
}
|
||||
|
||||
void encode_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
float avg_loss = -1;
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = 1024;
|
||||
int i = net.seen/imgs;
|
||||
list *plist = get_paths("/data/captcha/encode.list");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
clock_t time;
|
||||
while(1){
|
||||
++i;
|
||||
time=clock();
|
||||
data train = load_data_captcha_encode(paths, imgs, plist->size, 300, 57);
|
||||
scale_data_rows(train, 1./255);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
net.seen += imgs;
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net.seen);
|
||||
free_matrix(train.X);
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "/home/pjreddie/imagenet_backup/%s_%d.weights",base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void validate_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int numchars = 37;
|
||||
list *plist = get_paths("/data/captcha/solved.hard");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
int imgs = plist->size;
|
||||
data valid = load_data_captcha(paths, imgs, 0, 10, 200, 60);
|
||||
translate_data_rows(valid, -128);
|
||||
scale_data_rows(valid, 1./128);
|
||||
matrix pred = network_predict_data(net, valid);
|
||||
int i, k;
|
||||
int correct = 0;
|
||||
int total = 0;
|
||||
int accuracy = 0;
|
||||
for(i = 0; i < imgs; ++i){
|
||||
int allcorrect = 1;
|
||||
for(k = 0; k < 10; ++k){
|
||||
char truth = int_to_alphanum(max_index(valid.y.vals[i]+k*numchars, numchars));
|
||||
char prediction = int_to_alphanum(max_index(pred.vals[i]+k*numchars, numchars));
|
||||
if (truth != prediction) allcorrect=0;
|
||||
if (truth != '.' && truth == prediction) ++correct;
|
||||
if (truth != '.' || truth != prediction) ++total;
|
||||
}
|
||||
accuracy += allcorrect;
|
||||
}
|
||||
printf("Word Accuracy: %f, Char Accuracy %f\n", (float)accuracy/imgs, (float)correct/total);
|
||||
free_data(valid);
|
||||
}
|
||||
|
||||
void test_captcha(char *cfgfile, char *weightfile)
|
||||
{
|
||||
setbuf(stdout, NULL);
|
||||
srand(time(0));
|
||||
//char *base = basecfg(cfgfile);
|
||||
//printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
set_batch_network(&net, 1);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
char filename[256];
|
||||
while(1){
|
||||
//printf("Enter filename: ");
|
||||
fgets(filename, 256, stdin);
|
||||
strtok(filename, "\n");
|
||||
image im = load_image_color(filename, 200, 60);
|
||||
translate_image(im, -128);
|
||||
scale_image(im, 1/128.);
|
||||
float *X = im.data;
|
||||
float *predictions = network_predict(net, X);
|
||||
print_letters(predictions, 10);
|
||||
free_image(im);
|
||||
}
|
||||
}
|
||||
*/
|
||||
void run_captcha(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5]: 0;
|
||||
if(0==strcmp(argv[2], "train")) train_captcha(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "test")) test_captcha(cfg, weights, filename);
|
||||
else if(0==strcmp(argv[2], "valid")) valid_captcha(cfg, weights, filename);
|
||||
//if(0==strcmp(argv[2], "test")) test_captcha(cfg, weights);
|
||||
//else if(0==strcmp(argv[2], "encode")) encode_captcha(cfg, weights);
|
||||
//else if(0==strcmp(argv[2], "decode")) decode_captcha(cfg, weights);
|
||||
//else if(0==strcmp(argv[2], "valid")) validate_captcha(cfg, weights);
|
||||
}
|
||||
|
273
examples/cifar.c
Normal file
273
examples/cifar.c
Normal file
@ -0,0 +1,273 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
|
||||
void train_cifar(char *cfgfile, char *weightfile)
|
||||
{
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
int classes = 10;
|
||||
int N = 50000;
|
||||
|
||||
char **labels = get_labels("data/cifar/labels.txt");
|
||||
int epoch = (*net.seen)/N;
|
||||
data train = load_all_cifar10();
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
clock_t time=clock();
|
||||
|
||||
float loss = train_network_sgd(net, train, 1);
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.95 + loss*.05;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
free_network(net);
|
||||
free_ptrs((void**)labels, classes);
|
||||
free(base);
|
||||
free_data(train);
|
||||
}
|
||||
|
||||
void train_cifar_distill(char *cfgfile, char *weightfile)
|
||||
{
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
int classes = 10;
|
||||
int N = 50000;
|
||||
|
||||
char **labels = get_labels("data/cifar/labels.txt");
|
||||
int epoch = (*net.seen)/N;
|
||||
|
||||
data train = load_all_cifar10();
|
||||
matrix soft = csv_to_matrix("results/ensemble.csv");
|
||||
|
||||
float weight = .9;
|
||||
scale_matrix(soft, weight);
|
||||
scale_matrix(train.y, 1. - weight);
|
||||
matrix_add_matrix(soft, train.y);
|
||||
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
clock_t time=clock();
|
||||
|
||||
float loss = train_network_sgd(net, train, 1);
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.95 + loss*.05;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
free_network(net);
|
||||
free_ptrs((void**)labels, classes);
|
||||
free(base);
|
||||
free_data(train);
|
||||
}
|
||||
|
||||
void test_cifar_multi(char *filename, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(time(0));
|
||||
|
||||
float avg_acc = 0;
|
||||
data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin");
|
||||
|
||||
int i;
|
||||
for(i = 0; i < test.X.rows; ++i){
|
||||
image im = float_to_image(32, 32, 3, test.X.vals[i]);
|
||||
|
||||
float pred[10] = {0};
|
||||
|
||||
float *p = network_predict(net, im.data);
|
||||
axpy_cpu(10, 1, p, 1, pred, 1);
|
||||
flip_image(im);
|
||||
p = network_predict(net, im.data);
|
||||
axpy_cpu(10, 1, p, 1, pred, 1);
|
||||
|
||||
int index = max_index(pred, 10);
|
||||
int class = max_index(test.y.vals[i], 10);
|
||||
if(index == class) avg_acc += 1;
|
||||
free_image(im);
|
||||
printf("%4d: %.2f%%\n", i, 100.*avg_acc/(i+1));
|
||||
}
|
||||
}
|
||||
|
||||
void test_cifar(char *filename, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
srand(time(0));
|
||||
|
||||
clock_t time;
|
||||
float avg_acc = 0;
|
||||
float avg_top5 = 0;
|
||||
data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin");
|
||||
|
||||
time=clock();
|
||||
|
||||
float *acc = network_accuracies(net, test, 2);
|
||||
avg_acc += acc[0];
|
||||
avg_top5 += acc[1];
|
||||
printf("top1: %f, %lf seconds, %d images\n", avg_acc, sec(clock()-time), test.X.rows);
|
||||
free_data(test);
|
||||
}
|
||||
|
||||
void extract_cifar()
|
||||
{
|
||||
char *labels[] = {"airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"};
|
||||
int i;
|
||||
data train = load_all_cifar10();
|
||||
data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin");
|
||||
for(i = 0; i < train.X.rows; ++i){
|
||||
image im = float_to_image(32, 32, 3, train.X.vals[i]);
|
||||
int class = max_index(train.y.vals[i], 10);
|
||||
char buff[256];
|
||||
sprintf(buff, "data/cifar/train/%d_%s",i,labels[class]);
|
||||
save_image_png(im, buff);
|
||||
}
|
||||
for(i = 0; i < test.X.rows; ++i){
|
||||
image im = float_to_image(32, 32, 3, test.X.vals[i]);
|
||||
int class = max_index(test.y.vals[i], 10);
|
||||
char buff[256];
|
||||
sprintf(buff, "data/cifar/test/%d_%s",i,labels[class]);
|
||||
save_image_png(im, buff);
|
||||
}
|
||||
}
|
||||
|
||||
void test_cifar_csv(char *filename, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
srand(time(0));
|
||||
|
||||
data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin");
|
||||
|
||||
matrix pred = network_predict_data(net, test);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < test.X.rows; ++i){
|
||||
image im = float_to_image(32, 32, 3, test.X.vals[i]);
|
||||
flip_image(im);
|
||||
}
|
||||
matrix pred2 = network_predict_data(net, test);
|
||||
scale_matrix(pred, .5);
|
||||
scale_matrix(pred2, .5);
|
||||
matrix_add_matrix(pred2, pred);
|
||||
|
||||
matrix_to_csv(pred);
|
||||
fprintf(stderr, "Accuracy: %f\n", matrix_topk_accuracy(test.y, pred, 1));
|
||||
free_data(test);
|
||||
}
|
||||
|
||||
void test_cifar_csvtrain(char *filename, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
srand(time(0));
|
||||
|
||||
data test = load_all_cifar10();
|
||||
|
||||
matrix pred = network_predict_data(net, test);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < test.X.rows; ++i){
|
||||
image im = float_to_image(32, 32, 3, test.X.vals[i]);
|
||||
flip_image(im);
|
||||
}
|
||||
matrix pred2 = network_predict_data(net, test);
|
||||
scale_matrix(pred, .5);
|
||||
scale_matrix(pred2, .5);
|
||||
matrix_add_matrix(pred2, pred);
|
||||
|
||||
matrix_to_csv(pred);
|
||||
fprintf(stderr, "Accuracy: %f\n", matrix_topk_accuracy(test.y, pred, 1));
|
||||
free_data(test);
|
||||
}
|
||||
|
||||
void eval_cifar_csv()
|
||||
{
|
||||
data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin");
|
||||
|
||||
matrix pred = csv_to_matrix("results/combined.csv");
|
||||
fprintf(stderr, "%d %d\n", pred.rows, pred.cols);
|
||||
|
||||
fprintf(stderr, "Accuracy: %f\n", matrix_topk_accuracy(test.y, pred, 1));
|
||||
free_data(test);
|
||||
free_matrix(pred);
|
||||
}
|
||||
|
||||
|
||||
void run_cifar(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_cifar(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "extract")) extract_cifar();
|
||||
else if(0==strcmp(argv[2], "distill")) train_cifar_distill(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "test")) test_cifar(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "multi")) test_cifar_multi(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "csv")) test_cifar_csv(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "csvtrain")) test_cifar_csvtrain(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "eval")) eval_cifar_csv();
|
||||
}
|
||||
|
||||
|
1145
examples/classifier.c
Normal file
1145
examples/classifier.c
Normal file
File diff suppressed because it is too large
Load Diff
385
examples/coco.c
Normal file
385
examples/coco.c
Normal file
@ -0,0 +1,385 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/detection_layer.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/box.h"
|
||||
#include "darknet/demo.h"
|
||||
|
||||
char *coco_classes[] = {"person","bicycle","car","motorcycle","airplane","bus","train","truck","boat","traffic light","fire hydrant","stop sign","parking meter","bench","bird","cat","dog","horse","sheep","cow","elephant","bear","zebra","giraffe","backpack","umbrella","handbag","tie","suitcase","frisbee","skis","snowboard","sports ball","kite","baseball bat","baseball glove","skateboard","surfboard","tennis racket","bottle","wine glass","cup","fork","knife","spoon","bowl","banana","apple","sandwich","orange","broccoli","carrot","hot dog","pizza","donut","cake","chair","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush"};
|
||||
|
||||
int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};
|
||||
|
||||
void train_coco(char *cfgfile, char *weightfile)
|
||||
{
|
||||
//char *train_images = "/home/pjreddie/data/voc/test/train.txt";
|
||||
//char *train_images = "/home/pjreddie/data/coco/train.txt";
|
||||
char *train_images = "data/coco.trainval.txt";
|
||||
//char *train_images = "data/bags.train.list";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
data train, buffer;
|
||||
|
||||
|
||||
layer l = net.layers[net.n - 1];
|
||||
|
||||
int side = l.side;
|
||||
int classes = l.classes;
|
||||
float jitter = l.jitter;
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.classes = classes;
|
||||
args.jitter = jitter;
|
||||
args.num_boxes = side;
|
||||
args.d = &buffer;
|
||||
args.type = REGION_DATA;
|
||||
|
||||
args.angle = net.angle;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
clock_t time;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
/*
|
||||
image im = float_to_image(net.w, net.h, 3, train.X.vals[113]);
|
||||
image copy = copy_image(im);
|
||||
draw_coco(copy, train.y.vals[113], 7, "truth");
|
||||
cvWaitKey(0);
|
||||
free_image(copy);
|
||||
*/
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0 || (i < 1000 && i%100 == 0)){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void print_cocos(FILE *fp, int image_id, box *boxes, float **probs, int num_boxes, int classes, int w, int h)
|
||||
{
|
||||
int i, j;
|
||||
for(i = 0; i < num_boxes; ++i){
|
||||
float xmin = boxes[i].x - boxes[i].w/2.;
|
||||
float xmax = boxes[i].x + boxes[i].w/2.;
|
||||
float ymin = boxes[i].y - boxes[i].h/2.;
|
||||
float ymax = boxes[i].y + boxes[i].h/2.;
|
||||
|
||||
if (xmin < 0) xmin = 0;
|
||||
if (ymin < 0) ymin = 0;
|
||||
if (xmax > w) xmax = w;
|
||||
if (ymax > h) ymax = h;
|
||||
|
||||
float bx = xmin;
|
||||
float by = ymin;
|
||||
float bw = xmax - xmin;
|
||||
float bh = ymax - ymin;
|
||||
|
||||
for(j = 0; j < classes; ++j){
|
||||
if (probs[i][j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, probs[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int get_coco_image_id(char *filename)
|
||||
{
|
||||
char *p = strrchr(filename, '_');
|
||||
return atoi(p+1);
|
||||
}
|
||||
|
||||
void validate_coco(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
char *base = "results/";
|
||||
list *plist = get_paths("data/coco_val_5k.list");
|
||||
//list *plist = get_paths("/home/pjreddie/data/people-art/test.txt");
|
||||
//list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
int side = l.side;
|
||||
|
||||
int j;
|
||||
char buff[1024];
|
||||
snprintf(buff, 1024, "%s/coco_results.json", base);
|
||||
FILE *fp = fopen(buff, "w");
|
||||
fprintf(fp, "[\n");
|
||||
|
||||
box *boxes = calloc(side*side*l.n, sizeof(box));
|
||||
float **probs = calloc(side*side*l.n, sizeof(float *));
|
||||
for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
int t;
|
||||
|
||||
float thresh = .01;
|
||||
int nms = 1;
|
||||
float iou_thresh = .5;
|
||||
|
||||
int nthreads = 8;
|
||||
image *val = calloc(nthreads, sizeof(image));
|
||||
image *val_resized = calloc(nthreads, sizeof(image));
|
||||
image *buf = calloc(nthreads, sizeof(image));
|
||||
image *buf_resized = calloc(nthreads, sizeof(image));
|
||||
pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.type = IMAGE_DATA;
|
||||
|
||||
for(t = 0; t < nthreads; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
time_t start = time(0);
|
||||
for(i = nthreads; i < m+nthreads; i += nthreads){
|
||||
fprintf(stderr, "%d\n", i);
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
pthread_join(thr[t], 0);
|
||||
val[t] = buf[t];
|
||||
val_resized[t] = buf_resized[t];
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t < m; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
char *path = paths[i+t-nthreads];
|
||||
int image_id = get_coco_image_id(path);
|
||||
float *X = val_resized[t].data;
|
||||
network_predict(net, X);
|
||||
int w = val[t].w;
|
||||
int h = val[t].h;
|
||||
get_detection_boxes(l, w, h, thresh, probs, boxes, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, side*side*l.n, classes, iou_thresh);
|
||||
print_cocos(fp, image_id, boxes, probs, side*side*l.n, classes, w, h);
|
||||
free_image(val[t]);
|
||||
free_image(val_resized[t]);
|
||||
}
|
||||
}
|
||||
fseek(fp, -2, SEEK_CUR);
|
||||
fprintf(fp, "\n]\n");
|
||||
fclose(fp);
|
||||
|
||||
fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start));
|
||||
}
|
||||
|
||||
void validate_coco_recall(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
char *base = "results/comp4_det_test_";
|
||||
list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
int side = l.side;
|
||||
|
||||
int j, k;
|
||||
FILE **fps = calloc(classes, sizeof(FILE *));
|
||||
for(j = 0; j < classes; ++j){
|
||||
char buff[1024];
|
||||
snprintf(buff, 1024, "%s%s.txt", base, coco_classes[j]);
|
||||
fps[j] = fopen(buff, "w");
|
||||
}
|
||||
box *boxes = calloc(side*side*l.n, sizeof(box));
|
||||
float **probs = calloc(side*side*l.n, sizeof(float *));
|
||||
for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
|
||||
float thresh = .001;
|
||||
int nms = 0;
|
||||
float iou_thresh = .5;
|
||||
float nms_thresh = .5;
|
||||
|
||||
int total = 0;
|
||||
int correct = 0;
|
||||
int proposals = 0;
|
||||
float avg_iou = 0;
|
||||
|
||||
for(i = 0; i < m; ++i){
|
||||
char *path = paths[i];
|
||||
image orig = load_image_color(path, 0, 0);
|
||||
image sized = resize_image(orig, net.w, net.h);
|
||||
char *id = basecfg(path);
|
||||
network_predict(net, sized.data);
|
||||
get_detection_boxes(l, 1, 1, thresh, probs, boxes, 1);
|
||||
if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms_thresh);
|
||||
|
||||
char labelpath[4096];
|
||||
find_replace(path, "images", "labels", labelpath);
|
||||
find_replace(labelpath, "JPEGImages", "labels", labelpath);
|
||||
find_replace(labelpath, ".jpg", ".txt", labelpath);
|
||||
find_replace(labelpath, ".JPEG", ".txt", labelpath);
|
||||
|
||||
int num_labels = 0;
|
||||
box_label *truth = read_boxes(labelpath, &num_labels);
|
||||
for(k = 0; k < side*side*l.n; ++k){
|
||||
if(probs[k][0] > thresh){
|
||||
++proposals;
|
||||
}
|
||||
}
|
||||
for (j = 0; j < num_labels; ++j) {
|
||||
++total;
|
||||
box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
|
||||
float best_iou = 0;
|
||||
for(k = 0; k < side*side*l.n; ++k){
|
||||
float iou = box_iou(boxes[k], t);
|
||||
if(probs[k][0] > thresh && iou > best_iou){
|
||||
best_iou = iou;
|
||||
}
|
||||
}
|
||||
avg_iou += best_iou;
|
||||
if(best_iou > iou_thresh){
|
||||
++correct;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
|
||||
free(id);
|
||||
free_image(orig);
|
||||
free_image(sized);
|
||||
}
|
||||
}
|
||||
|
||||
void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh)
|
||||
{
|
||||
image **alphabet = load_alphabet();
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
detection_layer l = net.layers[net.n-1];
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
float nms = .4;
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int j;
|
||||
box *boxes = calloc(l.side*l.side*l.n, sizeof(box));
|
||||
float **probs = calloc(l.side*l.side*l.n, sizeof(float *));
|
||||
for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *));
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
} else {
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input,0,0);
|
||||
image sized = resize_image(im, net.w, net.h);
|
||||
float *X = sized.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms);
|
||||
draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, coco_classes, alphabet, 80);
|
||||
save_image(im, "prediction");
|
||||
show_image(im, "predictions");
|
||||
free_image(im);
|
||||
free_image(sized);
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(0);
|
||||
cvDestroyAllWindows();
|
||||
#endif
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void run_coco(int argc, char **argv)
|
||||
{
|
||||
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
|
||||
float thresh = find_float_arg(argc, argv, "-thresh", .2);
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
int frame_skip = find_int_arg(argc, argv, "-s", 0);
|
||||
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5]: 0;
|
||||
int avg = find_int_arg(argc, argv, "-avg", 1);
|
||||
if(0==strcmp(argv[2], "test")) test_coco(cfg, weights, filename, thresh);
|
||||
else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, avg, .5, 0,0,0,0);
|
||||
}
|
501
examples/darknet.c
Normal file
501
examples/darknet.c
Normal file
@ -0,0 +1,501 @@
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/cuda.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/connected_layer.h"
|
||||
#include "darknet/convolutional_layer.h"
|
||||
|
||||
extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top);
|
||||
extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen);
|
||||
extern void run_voxel(int argc, char **argv);
|
||||
extern void run_yolo(int argc, char **argv);
|
||||
extern void run_detector(int argc, char **argv);
|
||||
extern void run_coco(int argc, char **argv);
|
||||
extern void run_writing(int argc, char **argv);
|
||||
extern void run_captcha(int argc, char **argv);
|
||||
extern void run_nightmare(int argc, char **argv);
|
||||
extern void run_dice(int argc, char **argv);
|
||||
extern void run_compare(int argc, char **argv);
|
||||
extern void run_classifier(int argc, char **argv);
|
||||
extern void run_regressor(int argc, char **argv);
|
||||
extern void run_segmenter(int argc, char **argv);
|
||||
extern void run_char_rnn(int argc, char **argv);
|
||||
extern void run_vid_rnn(int argc, char **argv);
|
||||
extern void run_tag(int argc, char **argv);
|
||||
extern void run_cifar(int argc, char **argv);
|
||||
extern void run_go(int argc, char **argv);
|
||||
extern void run_art(int argc, char **argv);
|
||||
extern void run_super(int argc, char **argv);
|
||||
extern void run_lsd(int argc, char **argv);
|
||||
|
||||
void average(int argc, char *argv[])
|
||||
{
|
||||
char *cfgfile = argv[2];
|
||||
char *outfile = argv[3];
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
network sum = parse_network_cfg(cfgfile);
|
||||
|
||||
char *weightfile = argv[4];
|
||||
load_weights(&sum, weightfile);
|
||||
|
||||
int i, j;
|
||||
int n = argc - 5;
|
||||
for(i = 0; i < n; ++i){
|
||||
weightfile = argv[i+5];
|
||||
load_weights(&net, weightfile);
|
||||
for(j = 0; j < net.n; ++j){
|
||||
layer l = net.layers[j];
|
||||
layer out = sum.layers[j];
|
||||
if(l.type == CONVOLUTIONAL){
|
||||
int num = l.n*l.c*l.size*l.size;
|
||||
axpy_cpu(l.n, 1, l.biases, 1, out.biases, 1);
|
||||
axpy_cpu(num, 1, l.weights, 1, out.weights, 1);
|
||||
if(l.batch_normalize){
|
||||
axpy_cpu(l.n, 1, l.scales, 1, out.scales, 1);
|
||||
axpy_cpu(l.n, 1, l.rolling_mean, 1, out.rolling_mean, 1);
|
||||
axpy_cpu(l.n, 1, l.rolling_variance, 1, out.rolling_variance, 1);
|
||||
}
|
||||
}
|
||||
if(l.type == CONNECTED){
|
||||
axpy_cpu(l.outputs, 1, l.biases, 1, out.biases, 1);
|
||||
axpy_cpu(l.outputs*l.inputs, 1, l.weights, 1, out.weights, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
n = n+1;
|
||||
for(j = 0; j < net.n; ++j){
|
||||
layer l = sum.layers[j];
|
||||
if(l.type == CONVOLUTIONAL){
|
||||
int num = l.n*l.c*l.size*l.size;
|
||||
scal_cpu(l.n, 1./n, l.biases, 1);
|
||||
scal_cpu(num, 1./n, l.weights, 1);
|
||||
if(l.batch_normalize){
|
||||
scal_cpu(l.n, 1./n, l.scales, 1);
|
||||
scal_cpu(l.n, 1./n, l.rolling_mean, 1);
|
||||
scal_cpu(l.n, 1./n, l.rolling_variance, 1);
|
||||
}
|
||||
}
|
||||
if(l.type == CONNECTED){
|
||||
scal_cpu(l.outputs, 1./n, l.biases, 1);
|
||||
scal_cpu(l.outputs*l.inputs, 1./n, l.weights, 1);
|
||||
}
|
||||
}
|
||||
save_weights(sum, outfile);
|
||||
}
|
||||
|
||||
void speed(char *cfgfile, int tics)
|
||||
{
|
||||
if (tics == 0) tics = 1000;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
set_batch_network(&net, 1);
|
||||
int i;
|
||||
time_t start = time(0);
|
||||
image im = make_image(net.w, net.h, net.c*net.batch);
|
||||
for(i = 0; i < tics; ++i){
|
||||
network_predict(net, im.data);
|
||||
}
|
||||
double t = difftime(time(0), start);
|
||||
printf("\n%d evals, %f Seconds\n", tics, t);
|
||||
printf("Speed: %f sec/eval\n", t/tics);
|
||||
printf("Speed: %f Hz\n", tics/t);
|
||||
}
|
||||
|
||||
void operations(char *cfgfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
int i;
|
||||
long ops = 0;
|
||||
for(i = 0; i < net.n; ++i){
|
||||
layer l = net.layers[i];
|
||||
if(l.type == CONVOLUTIONAL){
|
||||
ops += 2l * l.n * l.size*l.size*l.c * l.out_h*l.out_w;
|
||||
} else if(l.type == CONNECTED){
|
||||
ops += 2l * l.inputs * l.outputs;
|
||||
}
|
||||
}
|
||||
printf("Floating Point Operations: %ld\n", ops);
|
||||
printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.);
|
||||
}
|
||||
|
||||
void oneoff(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
int oldn = net.layers[net.n - 2].n;
|
||||
int c = net.layers[net.n - 2].c;
|
||||
scal_cpu(oldn*c, .1, net.layers[net.n - 2].weights, 1);
|
||||
scal_cpu(oldn, 0, net.layers[net.n - 2].biases, 1);
|
||||
net.layers[net.n - 2].n = 9418;
|
||||
net.layers[net.n - 2].biases += 5;
|
||||
net.layers[net.n - 2].weights += 5*c;
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
net.layers[net.n - 2].biases -= 5;
|
||||
net.layers[net.n - 2].weights -= 5*c;
|
||||
net.layers[net.n - 2].n = oldn;
|
||||
printf("%d\n", oldn);
|
||||
layer l = net.layers[net.n - 2];
|
||||
copy_cpu(l.n/3, l.biases, 1, l.biases + l.n/3, 1);
|
||||
copy_cpu(l.n/3, l.biases, 1, l.biases + 2*l.n/3, 1);
|
||||
copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + l.n/3*l.c, 1);
|
||||
copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + 2*l.n/3*l.c, 1);
|
||||
*net.seen = 0;
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
void oneoff2(char *cfgfile, char *weightfile, char *outfile, int l)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights_upto(&net, weightfile, 0, net.n);
|
||||
load_weights_upto(&net, weightfile, l, net.n);
|
||||
}
|
||||
*net.seen = 0;
|
||||
save_weights_upto(net, outfile, net.n);
|
||||
}
|
||||
|
||||
void partial(char *cfgfile, char *weightfile, char *outfile, int max)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights_upto(&net, weightfile, 0, max);
|
||||
}
|
||||
*net.seen = 0;
|
||||
save_weights_upto(net, outfile, max);
|
||||
}
|
||||
|
||||
void rescale_net(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for(i = 0; i < net.n; ++i){
|
||||
layer l = net.layers[i];
|
||||
if(l.type == CONVOLUTIONAL){
|
||||
rescale_weights(l, 2, -.5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
void rgbgr_net(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for(i = 0; i < net.n; ++i){
|
||||
layer l = net.layers[i];
|
||||
if(l.type == CONVOLUTIONAL){
|
||||
rgbgr_weights(l);
|
||||
break;
|
||||
}
|
||||
}
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
void reset_normalize_net(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if (weightfile) {
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < net.n; ++i) {
|
||||
layer l = net.layers[i];
|
||||
if (l.type == CONVOLUTIONAL && l.batch_normalize) {
|
||||
denormalize_convolutional_layer(l);
|
||||
}
|
||||
if (l.type == CONNECTED && l.batch_normalize) {
|
||||
denormalize_connected_layer(l);
|
||||
}
|
||||
if (l.type == GRU && l.batch_normalize) {
|
||||
denormalize_connected_layer(*l.input_z_layer);
|
||||
denormalize_connected_layer(*l.input_r_layer);
|
||||
denormalize_connected_layer(*l.input_h_layer);
|
||||
denormalize_connected_layer(*l.state_z_layer);
|
||||
denormalize_connected_layer(*l.state_r_layer);
|
||||
denormalize_connected_layer(*l.state_h_layer);
|
||||
}
|
||||
}
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
layer normalize_layer(layer l, int n)
|
||||
{
|
||||
int j;
|
||||
l.batch_normalize=1;
|
||||
l.scales = calloc(n, sizeof(float));
|
||||
for(j = 0; j < n; ++j){
|
||||
l.scales[j] = 1;
|
||||
}
|
||||
l.rolling_mean = calloc(n, sizeof(float));
|
||||
l.rolling_variance = calloc(n, sizeof(float));
|
||||
return l;
|
||||
}
|
||||
|
||||
void normalize_net(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for(i = 0; i < net.n; ++i){
|
||||
layer l = net.layers[i];
|
||||
if(l.type == CONVOLUTIONAL && !l.batch_normalize){
|
||||
net.layers[i] = normalize_layer(l, l.n);
|
||||
}
|
||||
if (l.type == CONNECTED && !l.batch_normalize) {
|
||||
net.layers[i] = normalize_layer(l, l.outputs);
|
||||
}
|
||||
if (l.type == GRU && l.batch_normalize) {
|
||||
*l.input_z_layer = normalize_layer(*l.input_z_layer, l.input_z_layer->outputs);
|
||||
*l.input_r_layer = normalize_layer(*l.input_r_layer, l.input_r_layer->outputs);
|
||||
*l.input_h_layer = normalize_layer(*l.input_h_layer, l.input_h_layer->outputs);
|
||||
*l.state_z_layer = normalize_layer(*l.state_z_layer, l.state_z_layer->outputs);
|
||||
*l.state_r_layer = normalize_layer(*l.state_r_layer, l.state_r_layer->outputs);
|
||||
*l.state_h_layer = normalize_layer(*l.state_h_layer, l.state_h_layer->outputs);
|
||||
net.layers[i].batch_normalize=1;
|
||||
}
|
||||
}
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
void statistics_net(char *cfgfile, char *weightfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if (weightfile) {
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < net.n; ++i) {
|
||||
layer l = net.layers[i];
|
||||
if (l.type == CONNECTED && l.batch_normalize) {
|
||||
printf("Connected Layer %d\n", i);
|
||||
statistics_connected_layer(l);
|
||||
}
|
||||
if (l.type == GRU && l.batch_normalize) {
|
||||
printf("GRU Layer %d\n", i);
|
||||
printf("Input Z\n");
|
||||
statistics_connected_layer(*l.input_z_layer);
|
||||
printf("Input R\n");
|
||||
statistics_connected_layer(*l.input_r_layer);
|
||||
printf("Input H\n");
|
||||
statistics_connected_layer(*l.input_h_layer);
|
||||
printf("State Z\n");
|
||||
statistics_connected_layer(*l.state_z_layer);
|
||||
printf("State R\n");
|
||||
statistics_connected_layer(*l.state_r_layer);
|
||||
printf("State H\n");
|
||||
statistics_connected_layer(*l.state_h_layer);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
void denormalize_net(char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
gpu_index = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if (weightfile) {
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < net.n; ++i) {
|
||||
layer l = net.layers[i];
|
||||
if (l.type == CONVOLUTIONAL && l.batch_normalize) {
|
||||
denormalize_convolutional_layer(l);
|
||||
net.layers[i].batch_normalize=0;
|
||||
}
|
||||
if (l.type == CONNECTED && l.batch_normalize) {
|
||||
denormalize_connected_layer(l);
|
||||
net.layers[i].batch_normalize=0;
|
||||
}
|
||||
if (l.type == GRU && l.batch_normalize) {
|
||||
denormalize_connected_layer(*l.input_z_layer);
|
||||
denormalize_connected_layer(*l.input_r_layer);
|
||||
denormalize_connected_layer(*l.input_h_layer);
|
||||
denormalize_connected_layer(*l.state_z_layer);
|
||||
denormalize_connected_layer(*l.state_r_layer);
|
||||
denormalize_connected_layer(*l.state_h_layer);
|
||||
l.input_z_layer->batch_normalize = 0;
|
||||
l.input_r_layer->batch_normalize = 0;
|
||||
l.input_h_layer->batch_normalize = 0;
|
||||
l.state_z_layer->batch_normalize = 0;
|
||||
l.state_r_layer->batch_normalize = 0;
|
||||
l.state_h_layer->batch_normalize = 0;
|
||||
net.layers[i].batch_normalize=0;
|
||||
}
|
||||
}
|
||||
save_weights(net, outfile);
|
||||
}
|
||||
|
||||
void mkimg(char *cfgfile, char *weightfile, int h, int w, int num, char *prefix)
|
||||
{
|
||||
network net = load_network(cfgfile, weightfile, 0);
|
||||
image *ims = get_weights(net.layers[0]);
|
||||
int n = net.layers[0].n;
|
||||
int z;
|
||||
for(z = 0; z < num; ++z){
|
||||
image im = make_image(h, w, 3);
|
||||
fill_image(im, .5);
|
||||
int i;
|
||||
for(i = 0; i < 100; ++i){
|
||||
image r = copy_image(ims[rand()%n]);
|
||||
rotate_image_cw(r, rand()%4);
|
||||
random_distort_image(r, 1, 1.5, 1.5);
|
||||
int dx = rand()%(w-r.w);
|
||||
int dy = rand()%(h-r.h);
|
||||
ghost_image(r, im, dx, dy);
|
||||
free_image(r);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/gen_%d", prefix, z);
|
||||
save_image(im, buff);
|
||||
free_image(im);
|
||||
}
|
||||
}
|
||||
|
||||
void visualize(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
visualize_network(net);
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
//test_resize("data/bad.jpg");
|
||||
//test_box();
|
||||
//test_convolutional_layer();
|
||||
if(argc < 2){
|
||||
fprintf(stderr, "usage: %s <function>\n", argv[0]);
|
||||
return 0;
|
||||
}
|
||||
gpu_index = find_int_arg(argc, argv, "-i", 0);
|
||||
if(find_arg(argc, argv, "-nogpu")) {
|
||||
gpu_index = -1;
|
||||
}
|
||||
|
||||
#ifndef GPU
|
||||
gpu_index = -1;
|
||||
#else
|
||||
if(gpu_index >= 0){
|
||||
cuda_set_device(gpu_index);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (0 == strcmp(argv[1], "average")){
|
||||
average(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "yolo")){
|
||||
run_yolo(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "voxel")){
|
||||
run_voxel(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "super")){
|
||||
run_super(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "lsd")){
|
||||
run_lsd(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "detector")){
|
||||
run_detector(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "detect")){
|
||||
float thresh = find_float_arg(argc, argv, "-thresh", .24);
|
||||
char *filename = (argc > 4) ? argv[4]: 0;
|
||||
char *outfile = find_char_arg(argc, argv, "-out", 0);
|
||||
int fullscreen = find_arg(argc, argv, "-fullscreen");
|
||||
test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);
|
||||
} else if (0 == strcmp(argv[1], "cifar")){
|
||||
run_cifar(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "go")){
|
||||
run_go(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "rnn")){
|
||||
run_char_rnn(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "vid")){
|
||||
run_vid_rnn(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "coco")){
|
||||
run_coco(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "classify")){
|
||||
predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5);
|
||||
} else if (0 == strcmp(argv[1], "classifier")){
|
||||
run_classifier(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "regressor")){
|
||||
run_regressor(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "segmenter")){
|
||||
run_segmenter(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "art")){
|
||||
run_art(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "tag")){
|
||||
run_tag(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "compare")){
|
||||
run_compare(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "dice")){
|
||||
run_dice(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "writing")){
|
||||
run_writing(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "3d")){
|
||||
composite_3d(argv[2], argv[3], argv[4], (argc > 5) ? atof(argv[5]) : 0);
|
||||
} else if (0 == strcmp(argv[1], "test")){
|
||||
test_resize(argv[2]);
|
||||
} else if (0 == strcmp(argv[1], "captcha")){
|
||||
run_captcha(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "nightmare")){
|
||||
run_nightmare(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "rgbgr")){
|
||||
rgbgr_net(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "reset")){
|
||||
reset_normalize_net(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "denormalize")){
|
||||
denormalize_net(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "statistics")){
|
||||
statistics_net(argv[2], argv[3]);
|
||||
} else if (0 == strcmp(argv[1], "normalize")){
|
||||
normalize_net(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "rescale")){
|
||||
rescale_net(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "ops")){
|
||||
operations(argv[2]);
|
||||
} else if (0 == strcmp(argv[1], "speed")){
|
||||
speed(argv[2], (argc > 3 && argv[3]) ? atoi(argv[3]) : 0);
|
||||
} else if (0 == strcmp(argv[1], "oneoff")){
|
||||
oneoff(argv[2], argv[3], argv[4]);
|
||||
} else if (0 == strcmp(argv[1], "oneoff2")){
|
||||
oneoff2(argv[2], argv[3], argv[4], atoi(argv[5]));
|
||||
} else if (0 == strcmp(argv[1], "partial")){
|
||||
partial(argv[2], argv[3], argv[4], atoi(argv[5]));
|
||||
} else if (0 == strcmp(argv[1], "average")){
|
||||
average(argc, argv);
|
||||
} else if (0 == strcmp(argv[1], "visualize")){
|
||||
visualize(argv[2], (argc > 3) ? argv[3] : 0);
|
||||
} else if (0 == strcmp(argv[1], "mkimg")){
|
||||
mkimg(argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), argv[7]);
|
||||
} else if (0 == strcmp(argv[1], "imtest")){
|
||||
test_resize(argv[2]);
|
||||
} else {
|
||||
fprintf(stderr, "Not an option: %s\n", argv[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
721
examples/detector.c
Normal file
721
examples/detector.c
Normal file
@ -0,0 +1,721 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/region_layer.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/box.h"
|
||||
#include "darknet/demo.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
|
||||
static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};
|
||||
|
||||
void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
|
||||
{
|
||||
list *options = read_data_cfg(datacfg);
|
||||
char *train_images = option_find_str(options, "train", "data/train.list");
|
||||
char *backup_directory = option_find_str(options, "backup", "/backup/");
|
||||
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network *nets = calloc(ngpus, sizeof(network));
|
||||
|
||||
srand(time(0));
|
||||
int seed = rand();
|
||||
int i;
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
srand(seed);
|
||||
#ifdef GPU
|
||||
cuda_set_device(gpus[i]);
|
||||
#endif
|
||||
nets[i] = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&nets[i], weightfile);
|
||||
}
|
||||
if(clear) *nets[i].seen = 0;
|
||||
nets[i].learning_rate *= ngpus;
|
||||
}
|
||||
srand(time(0));
|
||||
network net = nets[0];
|
||||
|
||||
int imgs = net.batch * net.subdivisions * ngpus;
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
data train, buffer;
|
||||
|
||||
layer l = net.layers[net.n - 1];
|
||||
|
||||
int classes = l.classes;
|
||||
float jitter = l.jitter;
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.classes = classes;
|
||||
args.jitter = jitter;
|
||||
args.num_boxes = l.max_boxes;
|
||||
args.d = &buffer;
|
||||
args.type = DETECTION_DATA;
|
||||
args.threads = 8;
|
||||
|
||||
args.angle = net.angle;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
|
||||
pthread_t load_thread = load_data(args);
|
||||
clock_t time;
|
||||
int count = 0;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
if(l.random && count++%10 == 0){
|
||||
printf("Resizing\n");
|
||||
int dim = (rand() % 10 + 10) * 32;
|
||||
if (get_current_batch(net)+200 > net.max_batches) dim = 608;
|
||||
//int dim = (rand() % 4 + 16) * 32;
|
||||
printf("%d\n", dim);
|
||||
args.w = dim;
|
||||
args.h = dim;
|
||||
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
free_data(train);
|
||||
load_thread = load_data(args);
|
||||
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
resize_network(nets + i, dim, dim);
|
||||
}
|
||||
net = nets[0];
|
||||
}
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data(args);
|
||||
|
||||
/*
|
||||
int k;
|
||||
for(k = 0; k < l.max_boxes; ++k){
|
||||
box b = float_to_box(train.y.vals[10] + 1 + k*5);
|
||||
if(!b.x) break;
|
||||
printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h);
|
||||
}
|
||||
*/
|
||||
/*
|
||||
int zz;
|
||||
for(zz = 0; zz < train.X.cols; ++zz){
|
||||
image im = float_to_image(net.w, net.h, 3, train.X.vals[zz]);
|
||||
int k;
|
||||
for(k = 0; k < l.max_boxes; ++k){
|
||||
box b = float_to_box(train.y.vals[zz] + k*5);
|
||||
printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
|
||||
draw_bbox(im, b, 1, 1,0,0);
|
||||
}
|
||||
show_image(im, "truth11");
|
||||
cvWaitKey(0);
|
||||
save_image(im, "truth11");
|
||||
}
|
||||
*/
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = 0;
|
||||
#ifdef GPU
|
||||
if(ngpus == 1){
|
||||
loss = train_network(net, train);
|
||||
} else {
|
||||
loss = train_networks(nets, ngpus, train, 4);
|
||||
}
|
||||
#else
|
||||
loss = train_network(net, train);
|
||||
#endif
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
i = get_current_batch(net);
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0){
|
||||
#ifdef GPU
|
||||
if(ngpus != 1) sync_nets(nets, ngpus, 0);
|
||||
#endif
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%10000==0 || (i < 1000 && i%100 == 0)){
|
||||
#ifdef GPU
|
||||
if(ngpus != 1) sync_nets(nets, ngpus, 0);
|
||||
#endif
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
#ifdef GPU
|
||||
if(ngpus != 1) sync_nets(nets, ngpus, 0);
|
||||
#endif
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
|
||||
static int get_coco_image_id(char *filename)
|
||||
{
|
||||
char *p = strrchr(filename, '_');
|
||||
return atoi(p+1);
|
||||
}
|
||||
|
||||
static void print_cocos(FILE *fp, char *image_path, box *boxes, float **probs, int num_boxes, int classes, int w, int h)
|
||||
{
|
||||
int i, j;
|
||||
int image_id = get_coco_image_id(image_path);
|
||||
for(i = 0; i < num_boxes; ++i){
|
||||
float xmin = boxes[i].x - boxes[i].w/2.;
|
||||
float xmax = boxes[i].x + boxes[i].w/2.;
|
||||
float ymin = boxes[i].y - boxes[i].h/2.;
|
||||
float ymax = boxes[i].y + boxes[i].h/2.;
|
||||
|
||||
if (xmin < 0) xmin = 0;
|
||||
if (ymin < 0) ymin = 0;
|
||||
if (xmax > w) xmax = w;
|
||||
if (ymax > h) ymax = h;
|
||||
|
||||
float bx = xmin;
|
||||
float by = ymin;
|
||||
float bw = xmax - xmin;
|
||||
float bh = ymax - ymin;
|
||||
|
||||
for(j = 0; j < classes; ++j){
|
||||
if (probs[i][j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, probs[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void print_detector_detections(FILE **fps, char *id, box *boxes, float **probs, int total, int classes, int w, int h)
|
||||
{
|
||||
int i, j;
|
||||
for(i = 0; i < total; ++i){
|
||||
float xmin = boxes[i].x - boxes[i].w/2. + 1;
|
||||
float xmax = boxes[i].x + boxes[i].w/2. + 1;
|
||||
float ymin = boxes[i].y - boxes[i].h/2. + 1;
|
||||
float ymax = boxes[i].y + boxes[i].h/2. + 1;
|
||||
|
||||
if (xmin < 1) xmin = 1;
|
||||
if (ymin < 1) ymin = 1;
|
||||
if (xmax > w) xmax = w;
|
||||
if (ymax > h) ymax = h;
|
||||
|
||||
for(j = 0; j < classes; ++j){
|
||||
if (probs[i][j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, probs[i][j],
|
||||
xmin, ymin, xmax, ymax);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void print_imagenet_detections(FILE *fp, int id, box *boxes, float **probs, int total, int classes, int w, int h)
|
||||
{
|
||||
int i, j;
|
||||
for(i = 0; i < total; ++i){
|
||||
float xmin = boxes[i].x - boxes[i].w/2.;
|
||||
float xmax = boxes[i].x + boxes[i].w/2.;
|
||||
float ymin = boxes[i].y - boxes[i].h/2.;
|
||||
float ymax = boxes[i].y + boxes[i].h/2.;
|
||||
|
||||
if (xmin < 0) xmin = 0;
|
||||
if (ymin < 0) ymin = 0;
|
||||
if (xmax > w) xmax = w;
|
||||
if (ymax > h) ymax = h;
|
||||
|
||||
for(j = 0; j < classes; ++j){
|
||||
int class = j;
|
||||
if (probs[i][class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, probs[i][class],
|
||||
xmin, ymin, xmax, ymax);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
int j;
|
||||
list *options = read_data_cfg(datacfg);
|
||||
char *valid_images = option_find_str(options, "valid", "data/train.list");
|
||||
char *name_list = option_find_str(options, "names", "data/names.list");
|
||||
char *prefix = option_find_str(options, "results", "results");
|
||||
char **names = get_labels(name_list);
|
||||
char *mapf = option_find_str(options, "map", 0);
|
||||
int *map = 0;
|
||||
if (mapf) map = read_map(mapf);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 2);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
list *plist = get_paths(valid_images);
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
|
||||
char buff[1024];
|
||||
char *type = option_find_str(options, "eval", "voc");
|
||||
FILE *fp = 0;
|
||||
FILE **fps = 0;
|
||||
int coco = 0;
|
||||
int imagenet = 0;
|
||||
if(0==strcmp(type, "coco")){
|
||||
if(!outfile) outfile = "coco_results";
|
||||
snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
|
||||
fp = fopen(buff, "w");
|
||||
fprintf(fp, "[\n");
|
||||
coco = 1;
|
||||
} else if(0==strcmp(type, "imagenet")){
|
||||
if(!outfile) outfile = "imagenet-detection";
|
||||
snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
|
||||
fp = fopen(buff, "w");
|
||||
imagenet = 1;
|
||||
classes = 200;
|
||||
} else {
|
||||
if(!outfile) outfile = "comp4_det_test_";
|
||||
fps = calloc(classes, sizeof(FILE *));
|
||||
for(j = 0; j < classes; ++j){
|
||||
snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
|
||||
fps[j] = fopen(buff, "w");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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] = calloc(classes+1, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
int t;
|
||||
|
||||
float thresh = .005;
|
||||
float nms = .45;
|
||||
|
||||
int nthreads = 4;
|
||||
image *val = calloc(nthreads, sizeof(image));
|
||||
image *val_resized = calloc(nthreads, sizeof(image));
|
||||
image *buf = calloc(nthreads, sizeof(image));
|
||||
image *buf_resized = calloc(nthreads, sizeof(image));
|
||||
pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
|
||||
|
||||
image input = make_image(net.w, net.h, net.c*2);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
//args.type = IMAGE_DATA;
|
||||
args.type = LETTERBOX_DATA;
|
||||
|
||||
for(t = 0; t < nthreads; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
time_t start = time(0);
|
||||
for(i = nthreads; i < m+nthreads; i += nthreads){
|
||||
fprintf(stderr, "%d\n", i);
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
pthread_join(thr[t], 0);
|
||||
val[t] = buf[t];
|
||||
val_resized[t] = buf_resized[t];
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t < m; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
char *path = paths[i+t-nthreads];
|
||||
char *id = basecfg(path);
|
||||
copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data, 1);
|
||||
flip_image(val_resized[t]);
|
||||
copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data + net.w*net.h*net.c, 1);
|
||||
|
||||
network_predict(net, input.data);
|
||||
int w = val[t].w;
|
||||
int h = val[t].h;
|
||||
get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms);
|
||||
if (coco){
|
||||
print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
} else if (imagenet){
|
||||
print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
} else {
|
||||
print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
}
|
||||
free(id);
|
||||
free_image(val[t]);
|
||||
free_image(val_resized[t]);
|
||||
}
|
||||
}
|
||||
for(j = 0; j < classes; ++j){
|
||||
if(fps) fclose(fps[j]);
|
||||
}
|
||||
if(coco){
|
||||
fseek(fp, -2, SEEK_CUR);
|
||||
fprintf(fp, "\n]\n");
|
||||
fclose(fp);
|
||||
}
|
||||
fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start));
|
||||
}
|
||||
|
||||
|
||||
void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
|
||||
{
|
||||
int j;
|
||||
list *options = read_data_cfg(datacfg);
|
||||
char *valid_images = option_find_str(options, "valid", "data/train.list");
|
||||
char *name_list = option_find_str(options, "names", "data/names.list");
|
||||
char *prefix = option_find_str(options, "results", "results");
|
||||
char **names = get_labels(name_list);
|
||||
char *mapf = option_find_str(options, "map", 0);
|
||||
int *map = 0;
|
||||
if (mapf) map = read_map(mapf);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
list *plist = get_paths(valid_images);
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
|
||||
char buff[1024];
|
||||
char *type = option_find_str(options, "eval", "voc");
|
||||
FILE *fp = 0;
|
||||
FILE **fps = 0;
|
||||
int coco = 0;
|
||||
int imagenet = 0;
|
||||
if(0==strcmp(type, "coco")){
|
||||
if(!outfile) outfile = "coco_results";
|
||||
snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
|
||||
fp = fopen(buff, "w");
|
||||
fprintf(fp, "[\n");
|
||||
coco = 1;
|
||||
} else if(0==strcmp(type, "imagenet")){
|
||||
if(!outfile) outfile = "imagenet-detection";
|
||||
snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
|
||||
fp = fopen(buff, "w");
|
||||
imagenet = 1;
|
||||
classes = 200;
|
||||
} else {
|
||||
if(!outfile) outfile = "comp4_det_test_";
|
||||
fps = calloc(classes, sizeof(FILE *));
|
||||
for(j = 0; j < classes; ++j){
|
||||
snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
|
||||
fps[j] = fopen(buff, "w");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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] = calloc(classes+1, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
int t;
|
||||
|
||||
float thresh = .005;
|
||||
float nms = .45;
|
||||
|
||||
int nthreads = 4;
|
||||
image *val = calloc(nthreads, sizeof(image));
|
||||
image *val_resized = calloc(nthreads, sizeof(image));
|
||||
image *buf = calloc(nthreads, sizeof(image));
|
||||
image *buf_resized = calloc(nthreads, sizeof(image));
|
||||
pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
//args.type = IMAGE_DATA;
|
||||
args.type = LETTERBOX_DATA;
|
||||
|
||||
for(t = 0; t < nthreads; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
time_t start = time(0);
|
||||
for(i = nthreads; i < m+nthreads; i += nthreads){
|
||||
fprintf(stderr, "%d\n", i);
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
pthread_join(thr[t], 0);
|
||||
val[t] = buf[t];
|
||||
val_resized[t] = buf_resized[t];
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t < m; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
char *path = paths[i+t-nthreads];
|
||||
char *id = basecfg(path);
|
||||
float *X = val_resized[t].data;
|
||||
network_predict(net, X);
|
||||
int w = val[t].w;
|
||||
int h = val[t].h;
|
||||
get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms);
|
||||
if (coco){
|
||||
print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
} else if (imagenet){
|
||||
print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
} else {
|
||||
print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h);
|
||||
}
|
||||
free(id);
|
||||
free_image(val[t]);
|
||||
free_image(val_resized[t]);
|
||||
}
|
||||
}
|
||||
for(j = 0; j < classes; ++j){
|
||||
if(fps) fclose(fps[j]);
|
||||
}
|
||||
if(coco){
|
||||
fseek(fp, -2, SEEK_CUR);
|
||||
fprintf(fp, "\n]\n");
|
||||
fclose(fp);
|
||||
}
|
||||
fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start));
|
||||
}
|
||||
|
||||
void validate_detector_recall(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
list *plist = get_paths("data/voc.2007.test");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
|
||||
int j, k;
|
||||
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] = calloc(classes+1, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
|
||||
float thresh = .001;
|
||||
float iou_thresh = .5;
|
||||
float nms = .4;
|
||||
|
||||
int total = 0;
|
||||
int correct = 0;
|
||||
int proposals = 0;
|
||||
float avg_iou = 0;
|
||||
|
||||
for(i = 0; i < m; ++i){
|
||||
char *path = paths[i];
|
||||
image orig = load_image_color(path, 0, 0);
|
||||
image sized = resize_image(orig, net.w, net.h);
|
||||
char *id = basecfg(path);
|
||||
network_predict(net, sized.data);
|
||||
get_region_boxes(l, sized.w, sized.h, net.w, net.h, thresh, probs, boxes, 1, 0, .5, 1);
|
||||
if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms);
|
||||
|
||||
char labelpath[4096];
|
||||
find_replace(path, "images", "labels", labelpath);
|
||||
find_replace(labelpath, "JPEGImages", "labels", labelpath);
|
||||
find_replace(labelpath, ".jpg", ".txt", labelpath);
|
||||
find_replace(labelpath, ".JPEG", ".txt", labelpath);
|
||||
|
||||
int num_labels = 0;
|
||||
box_label *truth = read_boxes(labelpath, &num_labels);
|
||||
for(k = 0; k < l.w*l.h*l.n; ++k){
|
||||
if(probs[k][0] > thresh){
|
||||
++proposals;
|
||||
}
|
||||
}
|
||||
for (j = 0; j < num_labels; ++j) {
|
||||
++total;
|
||||
box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
|
||||
float best_iou = 0;
|
||||
for(k = 0; k < l.w*l.h*l.n; ++k){
|
||||
float iou = box_iou(boxes[k], t);
|
||||
if(probs[k][0] > thresh && iou > best_iou){
|
||||
best_iou = iou;
|
||||
}
|
||||
}
|
||||
avg_iou += best_iou;
|
||||
if(best_iou > iou_thresh){
|
||||
++correct;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
|
||||
free(id);
|
||||
free_image(orig);
|
||||
free_image(sized);
|
||||
}
|
||||
}
|
||||
|
||||
void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
|
||||
{
|
||||
list *options = read_data_cfg(datacfg);
|
||||
char *name_list = option_find_str(options, "names", "data/names.list");
|
||||
char **names = get_labels(name_list);
|
||||
|
||||
image **alphabet = load_alphabet();
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int j;
|
||||
float nms=.4;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
} else {
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input,0,0);
|
||||
image sized = letterbox_image(im, net.w, net.h);
|
||||
//image sized = resize_image(im, net.w, net.h);
|
||||
//image sized2 = resize_max(im, net.w);
|
||||
//image sized = crop_image(sized2, -((net.w - sized2.w)/2), -((net.h - sized2.h)/2), net.w, net.h);
|
||||
//resize_network(&net, sized.w, sized.h);
|
||||
layer l = net.layers[net.n-1];
|
||||
|
||||
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] = calloc(l.classes + 1, sizeof(float *));
|
||||
|
||||
float *X = sized.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, 0, 0, hier_thresh, 1);
|
||||
if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
|
||||
//else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms);
|
||||
draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes);
|
||||
if(outfile){
|
||||
save_image(im, outfile);
|
||||
}
|
||||
else{
|
||||
save_image(im, "predictions");
|
||||
#ifdef OPENCV
|
||||
cvNamedWindow("predictions", CV_WINDOW_NORMAL);
|
||||
if(fullscreen){
|
||||
cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
|
||||
}
|
||||
show_image(im, "predictions");
|
||||
cvWaitKey(0);
|
||||
cvDestroyAllWindows();
|
||||
#endif
|
||||
}
|
||||
|
||||
free_image(im);
|
||||
free_image(sized);
|
||||
free(boxes);
|
||||
free_ptrs((void **)probs, l.w*l.h*l.n);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void run_detector(int argc, char **argv)
|
||||
{
|
||||
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
|
||||
float thresh = find_float_arg(argc, argv, "-thresh", .24);
|
||||
float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
int frame_skip = find_int_arg(argc, argv, "-s", 0);
|
||||
int avg = find_int_arg(argc, argv, "-avg", 3);
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
|
||||
char *outfile = find_char_arg(argc, argv, "-out", 0);
|
||||
int *gpus = 0;
|
||||
int gpu = 0;
|
||||
int ngpus = 0;
|
||||
if(gpu_list){
|
||||
printf("%s\n", gpu_list);
|
||||
int len = strlen(gpu_list);
|
||||
ngpus = 1;
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
if (gpu_list[i] == ',') ++ngpus;
|
||||
}
|
||||
gpus = calloc(ngpus, sizeof(int));
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
gpus[i] = atoi(gpu_list);
|
||||
gpu_list = strchr(gpu_list, ',')+1;
|
||||
}
|
||||
} else {
|
||||
gpu = gpu_index;
|
||||
gpus = &gpu;
|
||||
ngpus = 1;
|
||||
}
|
||||
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
int fullscreen = find_arg(argc, argv, "-fullscreen");
|
||||
int width = find_int_arg(argc, argv, "-w", 0);
|
||||
int height = find_int_arg(argc, argv, "-h", 0);
|
||||
int fps = find_int_arg(argc, argv, "-fps", 0);
|
||||
|
||||
char *datacfg = argv[3];
|
||||
char *cfg = argv[4];
|
||||
char *weights = (argc > 5) ? argv[5] : 0;
|
||||
char *filename = (argc > 6) ? argv[6]: 0;
|
||||
if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);
|
||||
else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);
|
||||
else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);
|
||||
else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile);
|
||||
else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "demo")) {
|
||||
list *options = read_data_cfg(datacfg);
|
||||
int classes = option_find_int(options, "classes", 20);
|
||||
char *name_list = option_find_str(options, "names", "data/names.list");
|
||||
char **names = get_labels(name_list);
|
||||
demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen);
|
||||
}
|
||||
}
|
118
examples/dice.c
Normal file
118
examples/dice.c
Normal file
@ -0,0 +1,118 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
char *dice_labels[] = {"face1","face2","face3","face4","face5","face6"};
|
||||
|
||||
void train_dice(char *cfgfile, char *weightfile)
|
||||
{
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = 1024;
|
||||
int i = *net.seen/imgs;
|
||||
char **labels = dice_labels;
|
||||
list *plist = get_paths("data/dice/dice.train.list");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
clock_t time;
|
||||
while(1){
|
||||
++i;
|
||||
time=clock();
|
||||
data train = load_data_old(paths, imgs, plist->size, labels, 6, net.w, net.h);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if((i % 100) == 0) net.learning_rate *= .1;
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void validate_dice(char *filename, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
srand(time(0));
|
||||
|
||||
char **labels = dice_labels;
|
||||
list *plist = get_paths("data/dice/dice.val.list");
|
||||
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
int m = plist->size;
|
||||
free_list(plist);
|
||||
|
||||
data val = load_data_old(paths, m, 0, labels, 6, net.w, net.h);
|
||||
float *acc = network_accuracies(net, val, 2);
|
||||
printf("Validation Accuracy: %f, %d images\n", acc[0], m);
|
||||
free_data(val);
|
||||
}
|
||||
|
||||
void test_dice(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
int i = 0;
|
||||
char **names = dice_labels;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int indexes[6];
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, net.w, net.h);
|
||||
float *X = im.data;
|
||||
float *predictions = network_predict(net, X);
|
||||
top_predictions(net, 6, indexes);
|
||||
for(i = 0; i < 6; ++i){
|
||||
int index = indexes[i];
|
||||
printf("%s: %f\n", names[index], predictions[index]);
|
||||
}
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void run_dice(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5]: 0;
|
||||
if(0==strcmp(argv[2], "test")) test_dice(cfg, weights, filename);
|
||||
else if(0==strcmp(argv[2], "train")) train_dice(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "valid")) validate_dice(cfg, weights);
|
||||
}
|
||||
|
915
examples/go.c
Normal file
915
examples/go.c
Normal file
@ -0,0 +1,915 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/data.h"
|
||||
#include <unistd.h>
|
||||
|
||||
int inverted = 1;
|
||||
int noi = 1;
|
||||
static const int nind = 2;
|
||||
|
||||
typedef struct {
|
||||
char **data;
|
||||
int n;
|
||||
} moves;
|
||||
|
||||
char *fgetgo(FILE *fp)
|
||||
{
|
||||
if(feof(fp)) return 0;
|
||||
size_t size = 94;
|
||||
char *line = malloc(size*sizeof(char));
|
||||
if(size != fread(line, sizeof(char), size, fp)){
|
||||
free(line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
moves load_go_moves(char *filename)
|
||||
{
|
||||
moves m;
|
||||
m.n = 128;
|
||||
m.data = calloc(128, sizeof(char*));
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
int count = 0;
|
||||
char *line = 0;
|
||||
while((line = fgetgo(fp))){
|
||||
if(count >= m.n){
|
||||
m.n *= 2;
|
||||
m.data = realloc(m.data, m.n*sizeof(char*));
|
||||
}
|
||||
m.data[count] = line;
|
||||
++count;
|
||||
}
|
||||
printf("%d\n", count);
|
||||
m.n = count;
|
||||
m.data = realloc(m.data, count*sizeof(char*));
|
||||
return m;
|
||||
}
|
||||
|
||||
void string_to_board(char *s, float *board)
|
||||
{
|
||||
int i, j;
|
||||
//memset(board, 0, 1*19*19*sizeof(float));
|
||||
int count = 0;
|
||||
for(i = 0; i < 91; ++i){
|
||||
char c = s[i];
|
||||
for(j = 0; j < 4; ++j){
|
||||
int me = (c >> (2*j)) & 1;
|
||||
int you = (c >> (2*j + 1)) & 1;
|
||||
if (me) board[count] = 1;
|
||||
else if (you) board[count] = -1;
|
||||
else board[count] = 0;
|
||||
++count;
|
||||
if(count >= 19*19) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void board_to_string(char *s, float *board)
|
||||
{
|
||||
int i, j;
|
||||
memset(s, 0, (19*19/4+1)*sizeof(char));
|
||||
int count = 0;
|
||||
for(i = 0; i < 91; ++i){
|
||||
for(j = 0; j < 4; ++j){
|
||||
int me = (board[count] == 1);
|
||||
int you = (board[count] == -1);
|
||||
if (me) s[i] = s[i] | (1<<(2*j));
|
||||
if (you) s[i] = s[i] | (1<<(2*j + 1));
|
||||
++count;
|
||||
if(count >= 19*19) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data random_go_moves(moves m, int n)
|
||||
{
|
||||
data d = {0};
|
||||
d.X = make_matrix(n, 19*19);
|
||||
d.y = make_matrix(n, 19*19+1);
|
||||
int i;
|
||||
for(i = 0; i < n; ++i){
|
||||
float *board = d.X.vals[i];
|
||||
float *label = d.y.vals[i];
|
||||
char *b = m.data[rand()%m.n];
|
||||
int row = b[0];
|
||||
int col = b[1];
|
||||
if(row >= 19 || col >= 19){
|
||||
label[19*19] = 1;
|
||||
} else {
|
||||
label[col + 19*row] = 1;
|
||||
string_to_board(b+2, board);
|
||||
if(board[col + 19*row]) printf("hey\n");
|
||||
}
|
||||
|
||||
int flip = rand()%2;
|
||||
int rotate = rand()%4;
|
||||
image in = float_to_image(19, 19, 1, board);
|
||||
image out = float_to_image(19, 19, 1, label);
|
||||
if(flip){
|
||||
flip_image(in);
|
||||
flip_image(out);
|
||||
}
|
||||
rotate_image_cw(in, rotate);
|
||||
rotate_image_cw(out, rotate);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ngpus, int clear)
|
||||
{
|
||||
int i;
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
printf("%d\n", ngpus);
|
||||
network *nets = calloc(ngpus, sizeof(network));
|
||||
|
||||
srand(time(0));
|
||||
int seed = rand();
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
srand(seed);
|
||||
#ifdef GPU
|
||||
cuda_set_device(gpus[i]);
|
||||
#endif
|
||||
nets[i] = load_network(cfgfile, weightfile, clear);
|
||||
nets[i].learning_rate *= ngpus;
|
||||
}
|
||||
network net = nets[0];
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
|
||||
char buff[256];
|
||||
moves m = load_go_moves(filename);
|
||||
//moves m = load_go_moves("games.txt");
|
||||
|
||||
int N = m.n;
|
||||
printf("Moves: %d\n", N);
|
||||
int epoch = (*net.seen)/N;
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
clock_t time=clock();
|
||||
|
||||
data train = random_go_moves(m, net.batch*net.subdivisions*ngpus);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
|
||||
float loss = 0;
|
||||
#ifdef GPU
|
||||
if(ngpus == 1){
|
||||
loss = train_network(net, train);
|
||||
} else {
|
||||
loss = train_networks(nets, ngpus, train, 4);
|
||||
}
|
||||
#else
|
||||
loss = train_network(net, train);
|
||||
#endif
|
||||
free_data(train);
|
||||
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.95 + loss*.05;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
|
||||
}
|
||||
if(get_current_batch(net)%1000 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%10000 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.backup",backup_directory,base,get_current_batch(net));
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
free_network(net);
|
||||
free(base);
|
||||
}
|
||||
|
||||
void propagate_liberty(float *board, int *lib, int *visited, int row, int col, int side)
|
||||
{
|
||||
if (row < 0 || row > 18 || col < 0 || col > 18) return;
|
||||
int index = row*19 + col;
|
||||
if (board[index] != side) return;
|
||||
if (visited[index]) return;
|
||||
visited[index] = 1;
|
||||
lib[index] += 1;
|
||||
propagate_liberty(board, lib, visited, row+1, col, side);
|
||||
propagate_liberty(board, lib, visited, row-1, col, side);
|
||||
propagate_liberty(board, lib, visited, row, col+1, side);
|
||||
propagate_liberty(board, lib, visited, row, col-1, side);
|
||||
}
|
||||
|
||||
|
||||
int *calculate_liberties(float *board)
|
||||
{
|
||||
int *lib = calloc(19*19, sizeof(int));
|
||||
int visited[361];
|
||||
int i, j;
|
||||
for(j = 0; j < 19; ++j){
|
||||
for(i = 0; i < 19; ++i){
|
||||
memset(visited, 0, 19*19*sizeof(int));
|
||||
int index = j*19 + i;
|
||||
if(board[index] == 0){
|
||||
if ((i > 0) && board[index - 1]) propagate_liberty(board, lib, visited, j, i-1, board[index-1]);
|
||||
if ((i < 18) && board[index + 1]) propagate_liberty(board, lib, visited, j, i+1, board[index+1]);
|
||||
if ((j > 0) && board[index - 19]) propagate_liberty(board, lib, visited, j-1, i, board[index-19]);
|
||||
if ((j < 18) && board[index + 19]) propagate_liberty(board, lib, visited, j+1, i, board[index+19]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return lib;
|
||||
}
|
||||
|
||||
void print_board(FILE *stream, float *board, int swap, int *indexes)
|
||||
{
|
||||
int i,j,n;
|
||||
fprintf(stream, " ");
|
||||
for(i = 0; i < 19; ++i){
|
||||
fprintf(stream, "%c ", 'A' + i + 1*(i > 7 && noi));
|
||||
}
|
||||
fprintf(stream, "\n");
|
||||
for(j = 0; j < 19; ++j){
|
||||
fprintf(stream, "%2d", (inverted) ? 19-j : j+1);
|
||||
for(i = 0; i < 19; ++i){
|
||||
int index = j*19 + i;
|
||||
if(indexes){
|
||||
int found = 0;
|
||||
for(n = 0; n < nind; ++n){
|
||||
if(index == indexes[n]){
|
||||
found = 1;
|
||||
/*
|
||||
if(n == 0) fprintf(stream, "\uff11");
|
||||
else if(n == 1) fprintf(stream, "\uff12");
|
||||
else if(n == 2) fprintf(stream, "\uff13");
|
||||
else if(n == 3) fprintf(stream, "\uff14");
|
||||
else if(n == 4) fprintf(stream, "\uff15");
|
||||
*/
|
||||
if(n == 0) fprintf(stream, " 1");
|
||||
else if(n == 1) fprintf(stream, " 2");
|
||||
else if(n == 2) fprintf(stream, " 3");
|
||||
else if(n == 3) fprintf(stream, " 4");
|
||||
else if(n == 4) fprintf(stream, " 5");
|
||||
}
|
||||
}
|
||||
if(found) continue;
|
||||
}
|
||||
//if(board[index]*-swap > 0) fprintf(stream, "\u25C9 ");
|
||||
//else if(board[index]*-swap < 0) fprintf(stream, "\u25EF ");
|
||||
if(board[index]*-swap > 0) fprintf(stream, " O");
|
||||
else if(board[index]*-swap < 0) fprintf(stream, " X");
|
||||
else fprintf(stream, " ");
|
||||
}
|
||||
fprintf(stream, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
void flip_board(float *board)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 19*19; ++i){
|
||||
board[i] = -board[i];
|
||||
}
|
||||
}
|
||||
|
||||
void predict_move(network net, float *board, float *move, int multi)
|
||||
{
|
||||
float *output = network_predict(net, board);
|
||||
copy_cpu(19*19+1, output, 1, move, 1);
|
||||
int i;
|
||||
if(multi){
|
||||
image bim = float_to_image(19, 19, 1, board);
|
||||
for(i = 1; i < 8; ++i){
|
||||
rotate_image_cw(bim, i);
|
||||
if(i >= 4) flip_image(bim);
|
||||
|
||||
float *output = network_predict(net, board);
|
||||
image oim = float_to_image(19, 19, 1, output);
|
||||
|
||||
if(i >= 4) flip_image(oim);
|
||||
rotate_image_cw(oim, -i);
|
||||
|
||||
axpy_cpu(19*19+1, 1, output, 1, move, 1);
|
||||
|
||||
if(i >= 4) flip_image(bim);
|
||||
rotate_image_cw(bim, -i);
|
||||
}
|
||||
scal_cpu(19*19+1, 1./8., move, 1);
|
||||
}
|
||||
for(i = 0; i < 19*19; ++i){
|
||||
if(board[i]) move[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void remove_connected(float *b, int *lib, int p, int r, int c)
|
||||
{
|
||||
if (r < 0 || r >= 19 || c < 0 || c >= 19) return;
|
||||
if (b[r*19 + c] != p) return;
|
||||
if (lib[r*19 + c] != 1) return;
|
||||
b[r*19 + c] = 0;
|
||||
remove_connected(b, lib, p, r+1, c);
|
||||
remove_connected(b, lib, p, r-1, c);
|
||||
remove_connected(b, lib, p, r, c+1);
|
||||
remove_connected(b, lib, p, r, c-1);
|
||||
}
|
||||
|
||||
|
||||
void move_go(float *b, int p, int r, int c)
|
||||
{
|
||||
int *l = calculate_liberties(b);
|
||||
b[r*19 + c] = p;
|
||||
remove_connected(b, l, -p, r+1, c);
|
||||
remove_connected(b, l, -p, r-1, c);
|
||||
remove_connected(b, l, -p, r, c+1);
|
||||
remove_connected(b, l, -p, r, c-1);
|
||||
free(l);
|
||||
}
|
||||
|
||||
int makes_safe_go(float *b, int *lib, int p, int r, int c){
|
||||
if (r < 0 || r >= 19 || c < 0 || c >= 19) return 0;
|
||||
if (b[r*19 + c] == -p){
|
||||
if (lib[r*19 + c] > 1) return 0;
|
||||
else return 1;
|
||||
}
|
||||
if (b[r*19 + c] == 0) return 1;
|
||||
if (lib[r*19 + c] > 1) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int suicide_go(float *b, int p, int r, int c)
|
||||
{
|
||||
int *l = calculate_liberties(b);
|
||||
int safe = 0;
|
||||
safe = safe || makes_safe_go(b, l, p, r+1, c);
|
||||
safe = safe || makes_safe_go(b, l, p, r-1, c);
|
||||
safe = safe || makes_safe_go(b, l, p, r, c+1);
|
||||
safe = safe || makes_safe_go(b, l, p, r, c-1);
|
||||
free(l);
|
||||
return !safe;
|
||||
}
|
||||
|
||||
int legal_go(float *b, char *ko, int p, int r, int c)
|
||||
{
|
||||
if (b[r*19 + c]) return 0;
|
||||
char curr[91];
|
||||
char next[91];
|
||||
board_to_string(curr, b);
|
||||
move_go(b, p, r, c);
|
||||
board_to_string(next, b);
|
||||
string_to_board(curr, b);
|
||||
if(memcmp(next, ko, 91) == 0) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int generate_move(network net, int player, float *board, int multi, float thresh, float temp, char *ko, int print)
|
||||
{
|
||||
int i, j;
|
||||
int empty = 1;
|
||||
for(i = 0; i < 19*19; ++i){
|
||||
if (board[i]) {
|
||||
empty = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(empty) {
|
||||
return 72;
|
||||
}
|
||||
for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp;
|
||||
|
||||
float move[362];
|
||||
if (player < 0) flip_board(board);
|
||||
predict_move(net, board, move, multi);
|
||||
if (player < 0) flip_board(board);
|
||||
|
||||
|
||||
for(i = 0; i < 19; ++i){
|
||||
for(j = 0; j < 19; ++j){
|
||||
if (!legal_go(board, ko, player, i, j)) move[i*19 + j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int indexes[nind];
|
||||
top_k(move, 19*19+1, nind, indexes);
|
||||
if(thresh > move[indexes[0]]) thresh = move[indexes[nind-1]];
|
||||
|
||||
for(i = 0; i < 19*19+1; ++i){
|
||||
if (move[i] < thresh) move[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
int max = max_index(move, 19*19+1);
|
||||
int row = max / 19;
|
||||
int col = max % 19;
|
||||
int index = sample_array(move, 19*19+1);
|
||||
|
||||
if(print){
|
||||
top_k(move, 19*19+1, nind, indexes);
|
||||
for(i = 0; i < nind; ++i){
|
||||
if (!move[indexes[i]]) indexes[i] = -1;
|
||||
}
|
||||
print_board(stderr, board, player, indexes);
|
||||
for(i = 0; i < nind; ++i){
|
||||
fprintf(stderr, "%d: %f\n", i+1, move[indexes[i]]);
|
||||
}
|
||||
}
|
||||
if (row == 19) return -1;
|
||||
|
||||
if (suicide_go(board, player, row, col)){
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (suicide_go(board, player, index/19, index%19)){
|
||||
index = max;
|
||||
}
|
||||
if (index == 19*19) return -1;
|
||||
return index;
|
||||
}
|
||||
|
||||
void valid_go(char *cfgfile, char *weightfile, int multi, char *filename)
|
||||
{
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
|
||||
float *board = calloc(19*19, sizeof(float));
|
||||
float *move = calloc(19*19+1, sizeof(float));
|
||||
// moves m = load_go_moves("/home/pjreddie/backup/go.test");
|
||||
moves m = load_go_moves(filename);
|
||||
|
||||
int N = m.n;
|
||||
int i;
|
||||
int correct = 0;
|
||||
for(i = 0; i <N; ++i){
|
||||
char *b = m.data[i];
|
||||
int row = b[0];
|
||||
int col = b[1];
|
||||
int truth = col + 19*row;
|
||||
string_to_board(b+2, board);
|
||||
predict_move(net, board, move, multi);
|
||||
int index = max_index(move, 19*19);
|
||||
if(index == truth) ++correct;
|
||||
printf("%d Accuracy %f\n", i, (float) correct/(i+1));
|
||||
}
|
||||
}
|
||||
|
||||
int print_game(float *board, FILE *fp)
|
||||
{
|
||||
int i, j;
|
||||
int count = 3;
|
||||
fprintf(fp, "komi 6.5\n");
|
||||
fprintf(fp, "boardsize 19\n");
|
||||
fprintf(fp, "clear_board\n");
|
||||
for(j = 0; j < 19; ++j){
|
||||
for(i = 0; i < 19; ++i){
|
||||
if(board[j*19 + i] == 1) fprintf(fp, "play black %c%d\n", 'A'+i+(i>=8), 19-j);
|
||||
if(board[j*19 + i] == -1) fprintf(fp, "play white %c%d\n", 'A'+i+(i>=8), 19-j);
|
||||
if(board[j*19 + i]) ++count;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void engine_go(char *filename, char *weightfile, int multi)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
srand(time(0));
|
||||
set_batch_network(&net, 1);
|
||||
float *board = calloc(19*19, sizeof(float));
|
||||
char *one = calloc(91, sizeof(char));
|
||||
char *two = calloc(91, sizeof(char));
|
||||
int passed = 0;
|
||||
while(1){
|
||||
char buff[256];
|
||||
int id = 0;
|
||||
int has_id = (scanf("%d", &id) == 1);
|
||||
scanf("%s", buff);
|
||||
if (feof(stdin)) break;
|
||||
char ids[256];
|
||||
sprintf(ids, "%d", id);
|
||||
//fprintf(stderr, "%s\n", buff);
|
||||
if (!has_id) ids[0] = 0;
|
||||
if (!strcmp(buff, "protocol_version")){
|
||||
printf("=%s 2\n\n", ids);
|
||||
} else if (!strcmp(buff, "name")){
|
||||
printf("=%s DarkGo\n\n", ids);
|
||||
} else if (!strcmp(buff, "time_settings") || !strcmp(buff, "time_left")){
|
||||
char *line = fgetl(stdin);
|
||||
free(line);
|
||||
printf("=%s \n\n", ids);
|
||||
} else if (!strcmp(buff, "version")){
|
||||
printf("=%s 1.0. Want more DarkGo? You can find me on OGS, unlimited games, no waiting! https://online-go.com/user/view/434218\n\n", ids);
|
||||
} else if (!strcmp(buff, "known_command")){
|
||||
char comm[256];
|
||||
scanf("%s", comm);
|
||||
int known = (!strcmp(comm, "protocol_version") ||
|
||||
!strcmp(comm, "name") ||
|
||||
!strcmp(comm, "version") ||
|
||||
!strcmp(comm, "known_command") ||
|
||||
!strcmp(comm, "list_commands") ||
|
||||
!strcmp(comm, "quit") ||
|
||||
!strcmp(comm, "boardsize") ||
|
||||
!strcmp(comm, "clear_board") ||
|
||||
!strcmp(comm, "komi") ||
|
||||
!strcmp(comm, "final_status_list") ||
|
||||
!strcmp(comm, "play") ||
|
||||
!strcmp(comm, "genmove_white") ||
|
||||
!strcmp(comm, "genmove_black") ||
|
||||
!strcmp(comm, "fixed_handicap") ||
|
||||
!strcmp(comm, "genmove"));
|
||||
if(known) printf("=%s true\n\n", ids);
|
||||
else printf("=%s false\n\n", ids);
|
||||
} else if (!strcmp(buff, "list_commands")){
|
||||
printf("=%s protocol_version\nshowboard\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove_black\ngenmove_white\ngenmove\nfinal_status_list\nfixed_handicap\n\n", ids);
|
||||
} else if (!strcmp(buff, "quit")){
|
||||
break;
|
||||
} else if (!strcmp(buff, "boardsize")){
|
||||
int boardsize = 0;
|
||||
scanf("%d", &boardsize);
|
||||
//fprintf(stderr, "%d\n", boardsize);
|
||||
if(boardsize != 19){
|
||||
printf("?%s unacceptable size\n\n", ids);
|
||||
} else {
|
||||
memset(board, 0, 19*19*sizeof(float));
|
||||
printf("=%s \n\n", ids);
|
||||
}
|
||||
} else if (!strcmp(buff, "fixed_handicap")){
|
||||
int handicap = 0;
|
||||
scanf("%d", &handicap);
|
||||
int indexes[] = {72, 288, 300, 60, 180, 174, 186, 66, 294};
|
||||
int i;
|
||||
for(i = 0; i < handicap; ++i){
|
||||
board[indexes[i]] = 1;
|
||||
}
|
||||
} else if (!strcmp(buff, "clear_board")){
|
||||
passed = 0;
|
||||
memset(board, 0, 19*19*sizeof(float));
|
||||
printf("=%s \n\n", ids);
|
||||
} else if (!strcmp(buff, "komi")){
|
||||
float komi = 0;
|
||||
scanf("%f", &komi);
|
||||
printf("=%s \n\n", ids);
|
||||
} else if (!strcmp(buff, "showboard")){
|
||||
printf("=%s \n", ids);
|
||||
print_board(stdout, board, 1, 0);
|
||||
printf("\n");
|
||||
} else if (!strcmp(buff, "play") || !strcmp(buff, "black") || !strcmp(buff, "white")){
|
||||
char color[256];
|
||||
if(!strcmp(buff, "play"))
|
||||
{
|
||||
scanf("%s ", color);
|
||||
} else {
|
||||
scanf(" ");
|
||||
color[0] = buff[0];
|
||||
}
|
||||
char c;
|
||||
int r;
|
||||
int count = scanf("%c%d", &c, &r);
|
||||
int player = (color[0] == 'b' || color[0] == 'B') ? 1 : -1;
|
||||
if((c == 'p' || c == 'P') && count < 2) {
|
||||
passed = 1;
|
||||
printf("=%s \n\n", ids);
|
||||
char *line = fgetl(stdin);
|
||||
free(line);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
continue;
|
||||
} else {
|
||||
passed = 0;
|
||||
}
|
||||
if(c >= 'A' && c <= 'Z') c = c - 'A';
|
||||
if(c >= 'a' && c <= 'z') c = c - 'a';
|
||||
if(c >= 8) --c;
|
||||
r = 19 - r;
|
||||
fprintf(stderr, "move: %d %d\n", r, c);
|
||||
|
||||
char *swap = two;
|
||||
two = one;
|
||||
one = swap;
|
||||
move_go(board, player, r, c);
|
||||
board_to_string(one, board);
|
||||
|
||||
printf("=%s \n\n", ids);
|
||||
//print_board(stderr, board, 1, 0);
|
||||
} else if (!strcmp(buff, "genmove") || !strcmp(buff, "genmove_black") || !strcmp(buff, "genmove_white")){
|
||||
int player = 0;
|
||||
if(!strcmp(buff, "genmove")){
|
||||
char color[256];
|
||||
scanf("%s", color);
|
||||
player = (color[0] == 'b' || color[0] == 'B') ? 1 : -1;
|
||||
} else if (!strcmp(buff, "genmove_black")){
|
||||
player = 1;
|
||||
} else {
|
||||
player = -1;
|
||||
}
|
||||
|
||||
int index = generate_move(net, player, board, multi, .4, 1, two, 0);
|
||||
if(passed || index < 0){
|
||||
printf("=%s pass\n\n", ids);
|
||||
passed = 0;
|
||||
} else {
|
||||
int row = index / 19;
|
||||
int col = index % 19;
|
||||
|
||||
char *swap = two;
|
||||
two = one;
|
||||
one = swap;
|
||||
|
||||
move_go(board, player, row, col);
|
||||
board_to_string(one, board);
|
||||
row = 19 - row;
|
||||
if (col >= 8) ++col;
|
||||
printf("=%s %c%d\n\n", ids, 'A' + col, row);
|
||||
//print_board(board, 1, 0);
|
||||
}
|
||||
|
||||
} else if (!strcmp(buff, "p")){
|
||||
//print_board(board, 1, 0);
|
||||
} else if (!strcmp(buff, "final_status_list")){
|
||||
char type[256];
|
||||
scanf("%s", type);
|
||||
fprintf(stderr, "final_status\n");
|
||||
char *line = fgetl(stdin);
|
||||
free(line);
|
||||
if(type[0] == 'd' || type[0] == 'D'){
|
||||
int i;
|
||||
FILE *f = fopen("game.txt", "w");
|
||||
int count = print_game(board, f);
|
||||
fprintf(f, "%s final_status_list dead\n", ids);
|
||||
fclose(f);
|
||||
FILE *p = popen("./gnugo --mode gtp < game.txt", "r");
|
||||
for(i = 0; i < count; ++i){
|
||||
free(fgetl(p));
|
||||
free(fgetl(p));
|
||||
}
|
||||
char *l = 0;
|
||||
while((l = fgetl(p))){
|
||||
printf("%s\n", l);
|
||||
free(l);
|
||||
}
|
||||
} else {
|
||||
printf("?%s unknown command\n\n", ids);
|
||||
}
|
||||
} else {
|
||||
char *line = fgetl(stdin);
|
||||
free(line);
|
||||
printf("?%s unknown command\n\n", ids);
|
||||
}
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void test_go(char *cfg, char *weights, int multi)
|
||||
{
|
||||
network net = parse_network_cfg(cfg);
|
||||
if(weights){
|
||||
load_weights(&net, weights);
|
||||
}
|
||||
srand(time(0));
|
||||
set_batch_network(&net, 1);
|
||||
float *board = calloc(19*19, sizeof(float));
|
||||
float *move = calloc(19*19+1, sizeof(float));
|
||||
int color = 1;
|
||||
while(1){
|
||||
int i;
|
||||
predict_move(net, board, move, multi);
|
||||
|
||||
int indexes[nind];
|
||||
int row, col;
|
||||
top_k(move, 19*19+1, nind, indexes);
|
||||
print_board(stderr, board, color, indexes);
|
||||
for(i = 0; i < nind; ++i){
|
||||
int index = indexes[i];
|
||||
row = index / 19;
|
||||
col = index % 19;
|
||||
if(row == 19){
|
||||
printf("%d: Pass, %.2f%%\n", i+1, move[index]*100);
|
||||
} else {
|
||||
printf("%d: %c %d, %.2f%%\n", i+1, col + 'A' + 1*(col > 7 && noi), (inverted)?19 - row : row+1, move[index]*100);
|
||||
}
|
||||
}
|
||||
//if(color == 1) printf("\u25EF Enter move: ");
|
||||
//else printf("\u25C9 Enter move: ");
|
||||
if(color == 1) printf("X Enter move: ");
|
||||
else printf("O Enter move: ");
|
||||
|
||||
char c;
|
||||
char *line = fgetl(stdin);
|
||||
int picked = 1;
|
||||
int dnum = sscanf(line, "%d", &picked);
|
||||
int cnum = sscanf(line, "%c", &c);
|
||||
if (strlen(line) == 0 || dnum) {
|
||||
--picked;
|
||||
if (picked < nind){
|
||||
int index = indexes[picked];
|
||||
row = index / 19;
|
||||
col = index % 19;
|
||||
if(row < 19){
|
||||
move_go(board, 1, row, col);
|
||||
}
|
||||
}
|
||||
} else if (cnum){
|
||||
if (c <= 'T' && c >= 'A'){
|
||||
int num = sscanf(line, "%c %d", &c, &row);
|
||||
row = (inverted)?19 - row : row-1;
|
||||
col = c - 'A';
|
||||
if (col > 7 && noi) col -= 1;
|
||||
if (num == 2) move_go(board, 1, row, col);
|
||||
} else if (c == 'p') {
|
||||
// Pass
|
||||
} else if(c=='b' || c == 'w'){
|
||||
char g;
|
||||
int num = sscanf(line, "%c %c %d", &g, &c, &row);
|
||||
row = (inverted)?19 - row : row-1;
|
||||
col = c - 'A';
|
||||
if (col > 7 && noi) col -= 1;
|
||||
if (num == 3) board[row*19 + col] = (g == 'b') ? color : -color;
|
||||
} else if(c == 'c'){
|
||||
char g;
|
||||
int num = sscanf(line, "%c %c %d", &g, &c, &row);
|
||||
row = (inverted)?19 - row : row-1;
|
||||
col = c - 'A';
|
||||
if (col > 7 && noi) col -= 1;
|
||||
if (num == 3) board[row*19 + col] = 0;
|
||||
}
|
||||
}
|
||||
free(line);
|
||||
flip_board(board);
|
||||
color = -color;
|
||||
}
|
||||
}
|
||||
|
||||
float score_game(float *board)
|
||||
{
|
||||
int i;
|
||||
FILE *f = fopen("game.txt", "w");
|
||||
int count = print_game(board, f);
|
||||
fprintf(f, "final_score\n");
|
||||
fclose(f);
|
||||
FILE *p = popen("./gnugo --mode gtp < game.txt", "r");
|
||||
for(i = 0; i < count; ++i){
|
||||
free(fgetl(p));
|
||||
free(fgetl(p));
|
||||
}
|
||||
char *l = 0;
|
||||
float score = 0;
|
||||
char player = 0;
|
||||
while((l = fgetl(p))){
|
||||
fprintf(stderr, "%s \t", l);
|
||||
int n = sscanf(l, "= %c+%f", &player, &score);
|
||||
free(l);
|
||||
if (n == 2) break;
|
||||
}
|
||||
if(player == 'W') score = -score;
|
||||
pclose(p);
|
||||
return score;
|
||||
}
|
||||
|
||||
void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi)
|
||||
{
|
||||
network net = parse_network_cfg(filename);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
|
||||
network net2 = net;
|
||||
if(f2){
|
||||
net2 = parse_network_cfg(f2);
|
||||
if(w2){
|
||||
load_weights(&net2, w2);
|
||||
}
|
||||
}
|
||||
srand(time(0));
|
||||
char boards[600][93];
|
||||
int count = 0;
|
||||
set_batch_network(&net, 1);
|
||||
set_batch_network(&net2, 1);
|
||||
float *board = calloc(19*19, sizeof(float));
|
||||
char *one = calloc(91, sizeof(char));
|
||||
char *two = calloc(91, sizeof(char));
|
||||
int done = 0;
|
||||
int player = 1;
|
||||
int p1 = 0;
|
||||
int p2 = 0;
|
||||
int total = 0;
|
||||
while(1){
|
||||
if (done){
|
||||
float score = score_game(board);
|
||||
if((score > 0) == (total%2==0)) ++p1;
|
||||
else ++p2;
|
||||
++total;
|
||||
fprintf(stderr, "Total: %d, Player 1: %f, Player 2: %f\n", total, (float)p1/total, (float)p2/total);
|
||||
sleep(1);
|
||||
/*
|
||||
int i = (score > 0)? 0 : 1;
|
||||
int j;
|
||||
for(; i < count; i += 2){
|
||||
for(j = 0; j < 93; ++j){
|
||||
printf("%c", boards[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
*/
|
||||
memset(board, 0, 19*19*sizeof(float));
|
||||
player = 1;
|
||||
done = 0;
|
||||
count = 0;
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
}
|
||||
print_board(stderr, board, 1, 0);
|
||||
//sleep(1);
|
||||
network use = ((total%2==0) == (player==1)) ? net : net2;
|
||||
int index = generate_move(use, player, board, multi, .4, 1, two, 0);
|
||||
if(index < 0){
|
||||
done = 1;
|
||||
continue;
|
||||
}
|
||||
int row = index / 19;
|
||||
int col = index % 19;
|
||||
|
||||
char *swap = two;
|
||||
two = one;
|
||||
one = swap;
|
||||
|
||||
if(player < 0) flip_board(board);
|
||||
boards[count][0] = row;
|
||||
boards[count][1] = col;
|
||||
board_to_string(boards[count] + 2, board);
|
||||
if(player < 0) flip_board(board);
|
||||
++count;
|
||||
|
||||
move_go(board, player, row, col);
|
||||
board_to_string(one, board);
|
||||
|
||||
player = -player;
|
||||
}
|
||||
}
|
||||
|
||||
void run_go(int argc, char **argv)
|
||||
{
|
||||
//boards_go();
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
|
||||
int *gpus = 0;
|
||||
int gpu = 0;
|
||||
int ngpus = 0;
|
||||
if(gpu_list){
|
||||
printf("%s\n", gpu_list);
|
||||
int len = strlen(gpu_list);
|
||||
ngpus = 1;
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
if (gpu_list[i] == ',') ++ngpus;
|
||||
}
|
||||
gpus = calloc(ngpus, sizeof(int));
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
gpus[i] = atoi(gpu_list);
|
||||
gpu_list = strchr(gpu_list, ',')+1;
|
||||
}
|
||||
} else {
|
||||
gpu = gpu_index;
|
||||
gpus = &gpu;
|
||||
ngpus = 1;
|
||||
}
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *c2 = (argc > 5) ? argv[5] : 0;
|
||||
char *w2 = (argc > 6) ? argv[6] : 0;
|
||||
int multi = find_arg(argc, argv, "-multi");
|
||||
if(0==strcmp(argv[2], "train")) train_go(cfg, weights, c2, gpus, ngpus, clear);
|
||||
else if(0==strcmp(argv[2], "valid")) valid_go(cfg, weights, multi, c2);
|
||||
else if(0==strcmp(argv[2], "self")) self_go(cfg, weights, c2, w2, multi);
|
||||
else if(0==strcmp(argv[2], "test")) test_go(cfg, weights, multi);
|
||||
else if(0==strcmp(argv[2], "engine")) engine_go(cfg, weights, multi);
|
||||
}
|
||||
|
||||
|
1139
examples/lsd.c
Normal file
1139
examples/lsd.c
Normal file
File diff suppressed because it is too large
Load Diff
416
examples/nightmare.c
Normal file
416
examples/nightmare.c
Normal file
@ -0,0 +1,416 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/region_layer.h"
|
||||
|
||||
// ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2
|
||||
|
||||
float abs_mean(float *x, int n)
|
||||
{
|
||||
int i;
|
||||
float sum = 0;
|
||||
for (i = 0; i < n; ++i){
|
||||
sum += fabs(x[i]);
|
||||
}
|
||||
return sum/n;
|
||||
}
|
||||
|
||||
void calculate_loss(float *output, float *delta, int n, float thresh)
|
||||
{
|
||||
int i;
|
||||
float mean = mean_array(output, n);
|
||||
float var = variance_array(output, n);
|
||||
for(i = 0; i < n; ++i){
|
||||
if(delta[i] > mean + thresh*sqrt(var)) delta[i] = output[i];
|
||||
else delta[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm)
|
||||
{
|
||||
//scale_image(orig, 2);
|
||||
//translate_image(orig, -1);
|
||||
net->n = max_layer + 1;
|
||||
|
||||
int dx = rand()%16 - 8;
|
||||
int dy = rand()%16 - 8;
|
||||
int flip = rand()%2;
|
||||
|
||||
image crop = crop_image(orig, dx, dy, orig.w, orig.h);
|
||||
image im = resize_image(crop, (int)(orig.w * scale), (int)(orig.h * scale));
|
||||
if(flip) flip_image(im);
|
||||
|
||||
resize_network(net, im.w, im.h);
|
||||
layer last = net->layers[net->n-1];
|
||||
//net->layers[net->n - 1].activation = LINEAR;
|
||||
|
||||
image delta = make_image(im.w, im.h, im.c);
|
||||
|
||||
#ifdef GPU
|
||||
net->delta_gpu = cuda_make_array(delta.data, im.w*im.h*im.c);
|
||||
cuda_push_array(net->input_gpu, im.data, net->inputs);
|
||||
|
||||
forward_network_gpu(*net);
|
||||
copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);
|
||||
|
||||
cuda_pull_array(last.delta_gpu, last.delta, last.outputs);
|
||||
calculate_loss(last.delta, last.delta, last.outputs, thresh);
|
||||
cuda_push_array(last.delta_gpu, last.delta, last.outputs);
|
||||
|
||||
backward_network_gpu(*net);
|
||||
|
||||
cuda_pull_array(net->delta_gpu, delta.data, im.w*im.h*im.c);
|
||||
cuda_free(net->delta_gpu);
|
||||
net->delta_gpu = 0;
|
||||
#else
|
||||
net->input = im.data;
|
||||
net->delta = delta.data;
|
||||
forward_network(*net);
|
||||
copy_cpu(last.outputs, last.output, 1, last.delta, 1);
|
||||
calculate_loss(last.output, last.delta, last.outputs, thresh);
|
||||
backward_network(*net);
|
||||
#endif
|
||||
|
||||
if(flip) flip_image(delta);
|
||||
//normalize_array(delta.data, delta.w*delta.h*delta.c);
|
||||
image resized = resize_image(delta, orig.w, orig.h);
|
||||
image out = crop_image(resized, -dx, -dy, orig.w, orig.h);
|
||||
|
||||
/*
|
||||
image g = grayscale_image(out);
|
||||
free_image(out);
|
||||
out = g;
|
||||
*/
|
||||
|
||||
//rate = rate / abs_mean(out.data, out.w*out.h*out.c);
|
||||
|
||||
if(norm) normalize_array(out.data, out.w*out.h*out.c);
|
||||
axpy_cpu(orig.w*orig.h*orig.c, rate, out.data, 1, orig.data, 1);
|
||||
|
||||
/*
|
||||
normalize_array(orig.data, orig.w*orig.h*orig.c);
|
||||
scale_image(orig, sqrt(var));
|
||||
translate_image(orig, mean);
|
||||
*/
|
||||
|
||||
//translate_image(orig, 1);
|
||||
//scale_image(orig, .5);
|
||||
//normalize_image(orig);
|
||||
|
||||
constrain_image(orig);
|
||||
|
||||
free_image(crop);
|
||||
free_image(im);
|
||||
free_image(delta);
|
||||
free_image(resized);
|
||||
free_image(out);
|
||||
|
||||
}
|
||||
|
||||
void smooth(image recon, image update, float lambda, int num)
|
||||
{
|
||||
int i, j, k;
|
||||
int ii, jj;
|
||||
for(k = 0; k < recon.c; ++k){
|
||||
for(j = 0; j < recon.h; ++j){
|
||||
for(i = 0; i < recon.w; ++i){
|
||||
int out_index = i + recon.w*(j + recon.h*k);
|
||||
for(jj = j-num; jj <= j + num && jj < recon.h; ++jj){
|
||||
if (jj < 0) continue;
|
||||
for(ii = i-num; ii <= i + num && ii < recon.w; ++ii){
|
||||
if (ii < 0) continue;
|
||||
int in_index = ii + recon.w*(jj + recon.h*k);
|
||||
update.data[out_index] += lambda * (recon.data[in_index] - recon.data[out_index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
|
||||
{
|
||||
int iter = 0;
|
||||
layer l = get_network_output_layer(net);
|
||||
for (iter = 0; iter < iters; ++iter) {
|
||||
image delta = make_image(recon.w, recon.h, recon.c);
|
||||
|
||||
#ifdef GPU
|
||||
cuda_push_array(net.input_gpu, recon.data, recon.w*recon.h*recon.c);
|
||||
//cuda_push_array(net.truth_gpu, features, net.truths);
|
||||
net.delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c);
|
||||
|
||||
forward_network_gpu(net);
|
||||
cuda_push_array(l.delta_gpu, features, l.outputs);
|
||||
axpy_ongpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1);
|
||||
backward_network_gpu(net);
|
||||
|
||||
cuda_pull_array(net.delta_gpu, delta.data, delta.w*delta.h*delta.c);
|
||||
|
||||
cuda_free(net.delta_gpu);
|
||||
#else
|
||||
net.input = recon.data;
|
||||
net.delta = delta.data;
|
||||
net.truth = features;
|
||||
|
||||
forward_network(net);
|
||||
backward_network(net);
|
||||
#endif
|
||||
|
||||
//normalize_array(delta.data, delta.w*delta.h*delta.c);
|
||||
axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1);
|
||||
//smooth(recon, update, lambda, smooth_size);
|
||||
|
||||
axpy_cpu(recon.w*recon.h*recon.c, rate, update.data, 1, recon.data, 1);
|
||||
scal_cpu(recon.w*recon.h*recon.c, momentum, update.data, 1);
|
||||
|
||||
float mag = mag_array(delta.data, recon.w*recon.h*recon.c);
|
||||
printf("mag: %f\n", mag);
|
||||
//scal_cpu(recon.w*recon.h*recon.c, 600/mag, recon.data, 1);
|
||||
|
||||
constrain_image(recon);
|
||||
free_image(delta);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void run_lsd(int argc, char **argv)
|
||||
{
|
||||
srand(0);
|
||||
if(argc < 3){
|
||||
fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [options! (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[2];
|
||||
char *weights = argv[3];
|
||||
char *input = argv[4];
|
||||
|
||||
int norm = find_int_arg(argc, argv, "-norm", 1);
|
||||
int rounds = find_int_arg(argc, argv, "-rounds", 1);
|
||||
int iters = find_int_arg(argc, argv, "-iters", 10);
|
||||
float rate = find_float_arg(argc, argv, "-rate", .04);
|
||||
float momentum = find_float_arg(argc, argv, "-momentum", .9);
|
||||
float lambda = find_float_arg(argc, argv, "-lambda", .01);
|
||||
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
|
||||
int reconstruct = find_arg(argc, argv, "-reconstruct");
|
||||
int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
|
||||
|
||||
network net = parse_network_cfg(cfg);
|
||||
load_weights(&net, weights);
|
||||
char *cfgbase = basecfg(cfg);
|
||||
char *imbase = basecfg(input);
|
||||
|
||||
set_batch_network(&net, 1);
|
||||
image im = load_image_color(input, 0, 0);
|
||||
|
||||
float *features = 0;
|
||||
image update;
|
||||
if (reconstruct){
|
||||
im = letterbox_image(im, net.w, net.h);
|
||||
|
||||
int zz = 0;
|
||||
network_predict(net, im.data);
|
||||
image out_im = get_network_image(net);
|
||||
image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
|
||||
//flip_image(crop);
|
||||
image f_im = resize_image(crop, out_im.w, out_im.h);
|
||||
free_image(crop);
|
||||
printf("%d features\n", out_im.w*out_im.h*out_im.c);
|
||||
|
||||
|
||||
im = resize_image(im, im.w, im.h);
|
||||
f_im = resize_image(f_im, f_im.w, f_im.h);
|
||||
features = f_im.data;
|
||||
|
||||
int i;
|
||||
for(i = 0; i < 14*14*512; ++i){
|
||||
features[i] += rand_uniform(-.19, .19);
|
||||
}
|
||||
|
||||
free_image(im);
|
||||
im = make_random_image(im.w, im.h, im.c);
|
||||
update = make_image(im.w, im.h, im.c);
|
||||
|
||||
}
|
||||
|
||||
int e;
|
||||
int n;
|
||||
for(e = 0; e < rounds; ++e){
|
||||
fprintf(stderr, "Iteration: ");
|
||||
fflush(stderr);
|
||||
for(n = 0; n < iters; ++n){
|
||||
fprintf(stderr, "%d, ", n);
|
||||
fflush(stderr);
|
||||
if(reconstruct){
|
||||
reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1);
|
||||
//if ((n+1)%30 == 0) rate *= .5;
|
||||
show_image(im, "reconstruction");
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(10);
|
||||
#endif
|
||||
}else{
|
||||
int layer = max_layer + rand()%range - range/2;
|
||||
int octave = rand()%octaves;
|
||||
optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "done\n");
|
||||
char buff[256];
|
||||
if (prefix){
|
||||
sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
|
||||
}else{
|
||||
sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
|
||||
}
|
||||
printf("%d %s\n", e, buff);
|
||||
save_image(im, buff);
|
||||
//show_image(im, buff);
|
||||
//cvWaitKey(0);
|
||||
|
||||
if(rotate){
|
||||
image rot = rotate_image(im, rotate);
|
||||
free_image(im);
|
||||
im = rot;
|
||||
}
|
||||
image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
|
||||
image resized = resize_image(crop, im.w, im.h);
|
||||
free_image(im);
|
||||
free_image(crop);
|
||||
im = resized;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void run_nightmare(int argc, char **argv)
|
||||
{
|
||||
srand(0);
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [layer] [options! (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[2];
|
||||
char *weights = argv[3];
|
||||
char *input = argv[4];
|
||||
int max_layer = atoi(argv[5]);
|
||||
|
||||
int range = find_int_arg(argc, argv, "-range", 1);
|
||||
int norm = find_int_arg(argc, argv, "-norm", 1);
|
||||
int rounds = find_int_arg(argc, argv, "-rounds", 1);
|
||||
int iters = find_int_arg(argc, argv, "-iters", 10);
|
||||
int octaves = find_int_arg(argc, argv, "-octaves", 4);
|
||||
float zoom = find_float_arg(argc, argv, "-zoom", 1.);
|
||||
float rate = find_float_arg(argc, argv, "-rate", .04);
|
||||
float thresh = find_float_arg(argc, argv, "-thresh", 1.);
|
||||
float rotate = find_float_arg(argc, argv, "-rotate", 0);
|
||||
float momentum = find_float_arg(argc, argv, "-momentum", .9);
|
||||
float lambda = find_float_arg(argc, argv, "-lambda", .01);
|
||||
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
|
||||
int reconstruct = find_arg(argc, argv, "-reconstruct");
|
||||
int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
|
||||
|
||||
network net = parse_network_cfg(cfg);
|
||||
load_weights(&net, weights);
|
||||
char *cfgbase = basecfg(cfg);
|
||||
char *imbase = basecfg(input);
|
||||
|
||||
set_batch_network(&net, 1);
|
||||
image im = load_image_color(input, 0, 0);
|
||||
if(0){
|
||||
float scale = 1;
|
||||
if(im.w > 512 || im.h > 512){
|
||||
if(im.w > im.h) scale = 512.0/im.w;
|
||||
else scale = 512.0/im.h;
|
||||
}
|
||||
image resized = resize_image(im, scale*im.w, scale*im.h);
|
||||
free_image(im);
|
||||
im = resized;
|
||||
}
|
||||
//im = letterbox_image(im, net.w, net.h);
|
||||
|
||||
float *features = 0;
|
||||
image update;
|
||||
if (reconstruct){
|
||||
net.n = max_layer;
|
||||
im = letterbox_image(im, net.w, net.h);
|
||||
//resize_network(&net, im.w, im.h);
|
||||
|
||||
network_predict(net, im.data);
|
||||
if(net.layers[net.n-1].type == REGION){
|
||||
printf("region!\n");
|
||||
zero_objectness(net.layers[net.n-1]);
|
||||
}
|
||||
image out_im = copy_image(get_network_image(net));
|
||||
/*
|
||||
image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
|
||||
//flip_image(crop);
|
||||
image f_im = resize_image(crop, out_im.w, out_im.h);
|
||||
free_image(crop);
|
||||
*/
|
||||
printf("%d features\n", out_im.w*out_im.h*out_im.c);
|
||||
|
||||
features = out_im.data;
|
||||
|
||||
/*
|
||||
int i;
|
||||
for(i = 0; i < 14*14*512; ++i){
|
||||
//features[i] += rand_uniform(-.19, .19);
|
||||
}
|
||||
free_image(im);
|
||||
im = make_random_image(im.w, im.h, im.c);
|
||||
*/
|
||||
update = make_image(im.w, im.h, im.c);
|
||||
}
|
||||
|
||||
int e;
|
||||
int n;
|
||||
for(e = 0; e < rounds; ++e){
|
||||
fprintf(stderr, "Iteration: ");
|
||||
fflush(stderr);
|
||||
for(n = 0; n < iters; ++n){
|
||||
fprintf(stderr, "%d, ", n);
|
||||
fflush(stderr);
|
||||
if(reconstruct){
|
||||
reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1);
|
||||
//if ((n+1)%30 == 0) rate *= .5;
|
||||
show_image(im, "reconstruction");
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(10);
|
||||
#endif
|
||||
}else{
|
||||
int layer = max_layer + rand()%range - range/2;
|
||||
int octave = rand()%octaves;
|
||||
optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "done\n");
|
||||
if(0){
|
||||
image g = grayscale_image(im);
|
||||
free_image(im);
|
||||
im = g;
|
||||
}
|
||||
char buff[256];
|
||||
if (prefix){
|
||||
sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
|
||||
}else{
|
||||
sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
|
||||
}
|
||||
printf("%d %s\n", e, buff);
|
||||
save_image(im, buff);
|
||||
//show_image(im, buff);
|
||||
//cvWaitKey(0);
|
||||
|
||||
if(rotate){
|
||||
image rot = rotate_image(im, rotate);
|
||||
free_image(im);
|
||||
im = rot;
|
||||
}
|
||||
image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
|
||||
image resized = resize_image(crop, im.w, im.h);
|
||||
free_image(im);
|
||||
free_image(crop);
|
||||
im = resized;
|
||||
}
|
||||
}
|
||||
|
255
examples/regressor.c
Normal file
255
examples/regressor.c
Normal file
@ -0,0 +1,255 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/cuda.h"
|
||||
#include <sys/time.h>
|
||||
#include <assert.h>
|
||||
|
||||
void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
|
||||
{
|
||||
int i;
|
||||
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
printf("%d\n", ngpus);
|
||||
network *nets = calloc(ngpus, sizeof(network));
|
||||
|
||||
srand(time(0));
|
||||
int seed = rand();
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
srand(seed);
|
||||
#ifdef GPU
|
||||
cuda_set_device(gpus[i]);
|
||||
#endif
|
||||
nets[i] = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&nets[i], weightfile);
|
||||
}
|
||||
if(clear) *nets[i].seen = 0;
|
||||
nets[i].learning_rate *= ngpus;
|
||||
}
|
||||
srand(time(0));
|
||||
network net = nets[0];
|
||||
|
||||
int imgs = net.batch * net.subdivisions * ngpus;
|
||||
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
list *options = read_data_cfg(datacfg);
|
||||
|
||||
char *backup_directory = option_find_str(options, "backup", "/backup/");
|
||||
char *train_list = option_find_str(options, "train", "data/train.list");
|
||||
|
||||
list *plist = get_paths(train_list);
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
int N = plist->size;
|
||||
clock_t time;
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.threads = 32;
|
||||
|
||||
args.min = net.min_crop;
|
||||
args.max = net.max_crop;
|
||||
args.angle = net.angle;
|
||||
args.aspect = net.aspect;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
args.size = net.w;
|
||||
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = N;
|
||||
args.type = REGRESSION_DATA;
|
||||
|
||||
data train;
|
||||
data buffer;
|
||||
pthread_t load_thread;
|
||||
args.d = &buffer;
|
||||
load_thread = load_data(args);
|
||||
|
||||
int epoch = (*net.seen)/N;
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
time=clock();
|
||||
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
|
||||
float loss = 0;
|
||||
#ifdef GPU
|
||||
if(ngpus == 1){
|
||||
loss = train_network(net, train);
|
||||
} else {
|
||||
loss = train_networks(nets, ngpus, train, 4);
|
||||
}
|
||||
#else
|
||||
loss = train_network(net, train);
|
||||
#endif
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
free_network(net);
|
||||
free_ptrs((void**)paths, plist->size);
|
||||
free_list(plist);
|
||||
free(base);
|
||||
}
|
||||
|
||||
void predict_regressor(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, 0, 0);
|
||||
image sized = letterbox_image(im, net.w, net.h);
|
||||
|
||||
float *X = sized.data;
|
||||
time=clock();
|
||||
float *predictions = network_predict(net, X);
|
||||
printf("Predicted: %f\n", predictions[0]);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
free_image(im);
|
||||
free_image(sized);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
|
||||
{
|
||||
#ifdef OPENCV
|
||||
printf("Regressor Demo\n");
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
|
||||
srand(2222222);
|
||||
CvCapture * cap;
|
||||
|
||||
if(filename){
|
||||
cap = cvCaptureFromFile(filename);
|
||||
}else{
|
||||
cap = cvCaptureFromCAM(cam_index);
|
||||
}
|
||||
|
||||
if(!cap) error("Couldn't connect to webcam.\n");
|
||||
cvNamedWindow("Regressor", CV_WINDOW_NORMAL);
|
||||
cvResizeWindow("Regressor", 512, 512);
|
||||
float fps = 0;
|
||||
|
||||
while(1){
|
||||
struct timeval tval_before, tval_after, tval_result;
|
||||
gettimeofday(&tval_before, NULL);
|
||||
|
||||
image in = get_image_from_stream(cap);
|
||||
image in_s = letterbox_image(in, net.w, net.h);
|
||||
show_image(in, "Regressor");
|
||||
|
||||
float *predictions = network_predict(net, in_s.data);
|
||||
|
||||
printf("\033[2J");
|
||||
printf("\033[1;1H");
|
||||
printf("\nFPS:%.0f\n",fps);
|
||||
|
||||
printf("People: %f\n", predictions[0]);
|
||||
|
||||
free_image(in_s);
|
||||
free_image(in);
|
||||
|
||||
cvWaitKey(10);
|
||||
|
||||
gettimeofday(&tval_after, NULL);
|
||||
timersub(&tval_after, &tval_before, &tval_result);
|
||||
float curr = 1000000.f/((long int)tval_result.tv_usec);
|
||||
fps = .9*fps + .1*curr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void run_regressor(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
|
||||
int *gpus = 0;
|
||||
int gpu = 0;
|
||||
int ngpus = 0;
|
||||
if(gpu_list){
|
||||
printf("%s\n", gpu_list);
|
||||
int len = strlen(gpu_list);
|
||||
ngpus = 1;
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
if (gpu_list[i] == ',') ++ngpus;
|
||||
}
|
||||
gpus = calloc(ngpus, sizeof(int));
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
gpus[i] = atoi(gpu_list);
|
||||
gpu_list = strchr(gpu_list, ',')+1;
|
||||
}
|
||||
} else {
|
||||
gpu = gpu_index;
|
||||
gpus = &gpu;
|
||||
ngpus = 1;
|
||||
}
|
||||
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
char *data = argv[3];
|
||||
char *cfg = argv[4];
|
||||
char *weights = (argc > 5) ? argv[5] : 0;
|
||||
char *filename = (argc > 6) ? argv[6]: 0;
|
||||
if(0==strcmp(argv[2], "test")) predict_regressor(data, cfg, weights);
|
||||
else if(0==strcmp(argv[2], "train")) train_regressor(data, cfg, weights, gpus, ngpus, clear);
|
||||
else if(0==strcmp(argv[2], "demo")) demo_regressor(data, cfg, weights, cam_index, filename);
|
||||
}
|
||||
|
||||
|
490
examples/rnn.c
Normal file
490
examples/rnn.c
Normal file
@ -0,0 +1,490 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
typedef struct {
|
||||
float *x;
|
||||
float *y;
|
||||
} float_pair;
|
||||
|
||||
int *read_tokenized_data(char *filename, size_t *read)
|
||||
{
|
||||
size_t size = 512;
|
||||
size_t count = 0;
|
||||
FILE *fp = fopen(filename, "r");
|
||||
int *d = calloc(size, sizeof(int));
|
||||
int n, one;
|
||||
one = fscanf(fp, "%d", &n);
|
||||
while(one == 1){
|
||||
++count;
|
||||
if(count > size){
|
||||
size = size*2;
|
||||
d = realloc(d, size*sizeof(int));
|
||||
}
|
||||
d[count-1] = n;
|
||||
one = fscanf(fp, "%d", &n);
|
||||
}
|
||||
fclose(fp);
|
||||
d = realloc(d, count*sizeof(int));
|
||||
*read = count;
|
||||
return d;
|
||||
}
|
||||
|
||||
char **read_tokens(char *filename, size_t *read)
|
||||
{
|
||||
size_t size = 512;
|
||||
size_t count = 0;
|
||||
FILE *fp = fopen(filename, "r");
|
||||
char **d = calloc(size, sizeof(char *));
|
||||
char *line;
|
||||
while((line=fgetl(fp)) != 0){
|
||||
++count;
|
||||
if(count > size){
|
||||
size = size*2;
|
||||
d = realloc(d, size*sizeof(char *));
|
||||
}
|
||||
d[count-1] = line;
|
||||
}
|
||||
fclose(fp);
|
||||
d = realloc(d, count*sizeof(char *));
|
||||
*read = count;
|
||||
return d;
|
||||
}
|
||||
|
||||
float_pair get_rnn_token_data(int *tokens, size_t *offsets, int characters, size_t len, int batch, int steps)
|
||||
{
|
||||
float *x = calloc(batch * steps * characters, sizeof(float));
|
||||
float *y = calloc(batch * steps * characters, sizeof(float));
|
||||
int i,j;
|
||||
for(i = 0; i < batch; ++i){
|
||||
for(j = 0; j < steps; ++j){
|
||||
int curr = tokens[(offsets[i])%len];
|
||||
int next = tokens[(offsets[i] + 1)%len];
|
||||
|
||||
x[(j*batch + i)*characters + curr] = 1;
|
||||
y[(j*batch + i)*characters + next] = 1;
|
||||
|
||||
offsets[i] = (offsets[i] + 1) % len;
|
||||
|
||||
if(curr >= characters || curr < 0 || next >= characters || next < 0){
|
||||
error("Bad char");
|
||||
}
|
||||
}
|
||||
}
|
||||
float_pair p;
|
||||
p.x = x;
|
||||
p.y = y;
|
||||
return p;
|
||||
}
|
||||
|
||||
float_pair get_rnn_data(unsigned char *text, size_t *offsets, int characters, size_t len, int batch, int steps)
|
||||
{
|
||||
float *x = calloc(batch * steps * characters, sizeof(float));
|
||||
float *y = calloc(batch * steps * characters, sizeof(float));
|
||||
int i,j;
|
||||
for(i = 0; i < batch; ++i){
|
||||
for(j = 0; j < steps; ++j){
|
||||
unsigned char curr = text[(offsets[i])%len];
|
||||
unsigned char next = text[(offsets[i] + 1)%len];
|
||||
|
||||
x[(j*batch + i)*characters + curr] = 1;
|
||||
y[(j*batch + i)*characters + next] = 1;
|
||||
|
||||
offsets[i] = (offsets[i] + 1) % len;
|
||||
|
||||
if(curr > 255 || curr <= 0 || next > 255 || next <= 0){
|
||||
/*text[(index+j+2)%len] = 0;
|
||||
printf("%ld %d %d %d %d\n", index, j, len, (int)text[index+j], (int)text[index+j+1]);
|
||||
printf("%s", text+index);
|
||||
*/
|
||||
error("Bad char");
|
||||
}
|
||||
}
|
||||
}
|
||||
float_pair p;
|
||||
p.x = x;
|
||||
p.y = y;
|
||||
return p;
|
||||
}
|
||||
|
||||
void reset_rnn_state(network net, int b)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < net.n; ++i) {
|
||||
#ifdef GPU
|
||||
layer l = net.layers[i];
|
||||
if(l.state_gpu){
|
||||
fill_ongpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, int tokenized)
|
||||
{
|
||||
srand(time(0));
|
||||
unsigned char *text = 0;
|
||||
int *tokens = 0;
|
||||
size_t size;
|
||||
if(tokenized){
|
||||
tokens = read_tokenized_data(filename, &size);
|
||||
} else {
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
|
||||
text = calloc(size+1, sizeof(char));
|
||||
fread(text, 1, size, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
|
||||
int inputs = net.inputs;
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d\n", net.learning_rate, net.momentum, net.decay, inputs);
|
||||
int batch = net.batch;
|
||||
int steps = net.time_steps;
|
||||
if(clear) *net.seen = 0;
|
||||
int i = (*net.seen)/net.batch;
|
||||
|
||||
int streams = batch/steps;
|
||||
size_t *offsets = calloc(streams, sizeof(size_t));
|
||||
int j;
|
||||
for(j = 0; j < streams; ++j){
|
||||
offsets[j] = rand_size_t()%size;
|
||||
}
|
||||
|
||||
clock_t time;
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
float_pair p;
|
||||
if(tokenized){
|
||||
p = get_rnn_token_data(tokens, offsets, inputs, size, streams, steps);
|
||||
}else{
|
||||
p = get_rnn_data(text, offsets, inputs, size, streams, steps);
|
||||
}
|
||||
|
||||
memcpy(net.input, p.x, net.inputs*net.batch);
|
||||
memcpy(net.truth, p.y, net.truths*net.batch);
|
||||
float loss = train_network_datum(net) / (batch);
|
||||
free(p.x);
|
||||
free(p.y);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
int chars = get_current_batch(net)*batch;
|
||||
fprintf(stderr, "%d: %f, %f avg, %f rate, %lf seconds, %f epochs\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), (float) chars/size);
|
||||
|
||||
for(j = 0; j < streams; ++j){
|
||||
//printf("%d\n", j);
|
||||
if(rand()%10 == 0){
|
||||
//fprintf(stderr, "Reset\n");
|
||||
offsets[j] = rand_size_t()%size;
|
||||
reset_rnn_state(net, j);
|
||||
}
|
||||
}
|
||||
|
||||
if(i%1000==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%10==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void print_symbol(int n, char **tokens){
|
||||
if(tokens){
|
||||
printf("%s ", tokens[n]);
|
||||
} else {
|
||||
printf("%c", n);
|
||||
}
|
||||
}
|
||||
|
||||
void test_char_rnn(char *cfgfile, char *weightfile, int num, char *seed, float temp, int rseed, char *token_file)
|
||||
{
|
||||
char **tokens = 0;
|
||||
if(token_file){
|
||||
size_t n;
|
||||
tokens = read_tokens(token_file, &n);
|
||||
}
|
||||
|
||||
srand(rseed);
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int inputs = net.inputs;
|
||||
|
||||
int i, j;
|
||||
for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp;
|
||||
int c = 0;
|
||||
int len = strlen(seed);
|
||||
float *input = calloc(inputs, sizeof(float));
|
||||
|
||||
/*
|
||||
fill_cpu(inputs, 0, input, 1);
|
||||
for(i = 0; i < 10; ++i){
|
||||
network_predict(net, input);
|
||||
}
|
||||
fill_cpu(inputs, 0, input, 1);
|
||||
*/
|
||||
|
||||
for(i = 0; i < len-1; ++i){
|
||||
c = seed[i];
|
||||
input[c] = 1;
|
||||
network_predict(net, input);
|
||||
input[c] = 0;
|
||||
print_symbol(c, tokens);
|
||||
}
|
||||
if(len) c = seed[len-1];
|
||||
print_symbol(c, tokens);
|
||||
for(i = 0; i < num; ++i){
|
||||
input[c] = 1;
|
||||
float *out = network_predict(net, input);
|
||||
input[c] = 0;
|
||||
for(j = 32; j < 127; ++j){
|
||||
//printf("%d %c %f\n",j, j, out[j]);
|
||||
}
|
||||
for(j = 0; j < inputs; ++j){
|
||||
if (out[j] < .0001) out[j] = 0;
|
||||
}
|
||||
c = sample_array(out, inputs);
|
||||
print_symbol(c, tokens);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void test_tactic_rnn(char *cfgfile, char *weightfile, int num, float temp, int rseed, char *token_file)
|
||||
{
|
||||
char **tokens = 0;
|
||||
if(token_file){
|
||||
size_t n;
|
||||
tokens = read_tokens(token_file, &n);
|
||||
}
|
||||
|
||||
srand(rseed);
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int inputs = net.inputs;
|
||||
|
||||
int i, j;
|
||||
for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp;
|
||||
int c = 0;
|
||||
float *input = calloc(inputs, sizeof(float));
|
||||
float *out = 0;
|
||||
|
||||
while((c = getc(stdin)) != EOF){
|
||||
input[c] = 1;
|
||||
out = network_predict(net, input);
|
||||
input[c] = 0;
|
||||
}
|
||||
for(i = 0; i < num; ++i){
|
||||
for(j = 0; j < inputs; ++j){
|
||||
if (out[j] < .0001) out[j] = 0;
|
||||
}
|
||||
int next = sample_array(out, inputs);
|
||||
if(c == '.' && next == '\n') break;
|
||||
c = next;
|
||||
print_symbol(c, tokens);
|
||||
|
||||
input[c] = 1;
|
||||
out = network_predict(net, input);
|
||||
input[c] = 0;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void valid_tactic_rnn(char *cfgfile, char *weightfile, char *seed)
|
||||
{
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int inputs = net.inputs;
|
||||
|
||||
int count = 0;
|
||||
int words = 1;
|
||||
int c;
|
||||
int len = strlen(seed);
|
||||
float *input = calloc(inputs, sizeof(float));
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
c = seed[i];
|
||||
input[(int)c] = 1;
|
||||
network_predict(net, input);
|
||||
input[(int)c] = 0;
|
||||
}
|
||||
float sum = 0;
|
||||
c = getc(stdin);
|
||||
float log2 = log(2);
|
||||
int in = 0;
|
||||
while(c != EOF){
|
||||
int next = getc(stdin);
|
||||
if(next == EOF) break;
|
||||
if(next < 0 || next >= 255) error("Out of range character");
|
||||
|
||||
input[c] = 1;
|
||||
float *out = network_predict(net, input);
|
||||
input[c] = 0;
|
||||
|
||||
if(c == '.' && next == '\n') in = 0;
|
||||
if(!in) {
|
||||
if(c == '>' && next == '>'){
|
||||
in = 1;
|
||||
++words;
|
||||
}
|
||||
c = next;
|
||||
continue;
|
||||
}
|
||||
++count;
|
||||
sum += log(out[next])/log2;
|
||||
c = next;
|
||||
printf("%d %d Perplexity: %4.4f Word Perplexity: %4.4f\n", count, words, pow(2, -sum/count), pow(2, -sum/words));
|
||||
}
|
||||
}
|
||||
|
||||
void valid_char_rnn(char *cfgfile, char *weightfile, char *seed)
|
||||
{
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int inputs = net.inputs;
|
||||
|
||||
int count = 0;
|
||||
int words = 1;
|
||||
int c;
|
||||
int len = strlen(seed);
|
||||
float *input = calloc(inputs, sizeof(float));
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
c = seed[i];
|
||||
input[(int)c] = 1;
|
||||
network_predict(net, input);
|
||||
input[(int)c] = 0;
|
||||
}
|
||||
float sum = 0;
|
||||
c = getc(stdin);
|
||||
float log2 = log(2);
|
||||
while(c != EOF){
|
||||
int next = getc(stdin);
|
||||
if(next == EOF) break;
|
||||
if(next < 0 || next >= 255) error("Out of range character");
|
||||
++count;
|
||||
if(next == ' ' || next == '\n' || next == '\t') ++words;
|
||||
input[c] = 1;
|
||||
float *out = network_predict(net, input);
|
||||
input[c] = 0;
|
||||
sum += log(out[next])/log2;
|
||||
c = next;
|
||||
printf("%d Perplexity: %4.4f Word Perplexity: %4.4f\n", count, pow(2, -sum/count), pow(2, -sum/words));
|
||||
}
|
||||
}
|
||||
|
||||
void vec_char_rnn(char *cfgfile, char *weightfile, char *seed)
|
||||
{
|
||||
char *base = basecfg(cfgfile);
|
||||
fprintf(stderr, "%s\n", base);
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
int inputs = net.inputs;
|
||||
|
||||
int c;
|
||||
int seed_len = strlen(seed);
|
||||
float *input = calloc(inputs, sizeof(float));
|
||||
int i;
|
||||
char *line;
|
||||
while((line=fgetl(stdin)) != 0){
|
||||
reset_rnn_state(net, 0);
|
||||
for(i = 0; i < seed_len; ++i){
|
||||
c = seed[i];
|
||||
input[(int)c] = 1;
|
||||
network_predict(net, input);
|
||||
input[(int)c] = 0;
|
||||
}
|
||||
strip(line);
|
||||
int str_len = strlen(line);
|
||||
for(i = 0; i < str_len; ++i){
|
||||
c = line[i];
|
||||
input[(int)c] = 1;
|
||||
network_predict(net, input);
|
||||
input[(int)c] = 0;
|
||||
}
|
||||
c = ' ';
|
||||
input[(int)c] = 1;
|
||||
network_predict(net, input);
|
||||
input[(int)c] = 0;
|
||||
|
||||
layer l = net.layers[0];
|
||||
#ifdef GPU
|
||||
cuda_pull_array(l.output_gpu, l.output, l.outputs);
|
||||
#endif
|
||||
printf("%s", line);
|
||||
for(i = 0; i < l.outputs; ++i){
|
||||
printf(",%g", l.output[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
void run_char_rnn(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
char *filename = find_char_arg(argc, argv, "-file", "data/shakespeare.txt");
|
||||
char *seed = find_char_arg(argc, argv, "-seed", "\n\n");
|
||||
int len = find_int_arg(argc, argv, "-len", 1000);
|
||||
float temp = find_float_arg(argc, argv, "-temp", .7);
|
||||
int rseed = find_int_arg(argc, argv, "-srand", time(0));
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
int tokenized = find_arg(argc, argv, "-tokenized");
|
||||
char *tokens = find_char_arg(argc, argv, "-tokens", 0);
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_char_rnn(cfg, weights, filename, clear, tokenized);
|
||||
else if(0==strcmp(argv[2], "valid")) valid_char_rnn(cfg, weights, seed);
|
||||
else if(0==strcmp(argv[2], "validtactic")) valid_tactic_rnn(cfg, weights, seed);
|
||||
else if(0==strcmp(argv[2], "vec")) vec_char_rnn(cfg, weights, seed);
|
||||
else if(0==strcmp(argv[2], "generate")) test_char_rnn(cfg, weights, len, seed, temp, rseed, tokens);
|
||||
else if(0==strcmp(argv[2], "generatetactic")) test_tactic_rnn(cfg, weights, len, temp, rseed, tokens);
|
||||
}
|
212
examples/rnn_vid.c
Normal file
212
examples/rnn_vid.c
Normal file
@ -0,0 +1,212 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/blas.h"
|
||||
|
||||
#ifdef OPENCV
|
||||
image get_image_from_stream(CvCapture *cap);
|
||||
image ipl_to_image(IplImage* src);
|
||||
|
||||
void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters);
|
||||
|
||||
|
||||
typedef struct {
|
||||
float *x;
|
||||
float *y;
|
||||
} float_pair;
|
||||
|
||||
float_pair get_rnn_vid_data(network net, char **files, int n, int batch, int steps)
|
||||
{
|
||||
int b;
|
||||
assert(net.batch == steps + 1);
|
||||
image out_im = get_network_image(net);
|
||||
int output_size = out_im.w*out_im.h*out_im.c;
|
||||
printf("%d %d %d\n", out_im.w, out_im.h, out_im.c);
|
||||
float *feats = calloc(net.batch*batch*output_size, sizeof(float));
|
||||
for(b = 0; b < batch; ++b){
|
||||
int input_size = net.w*net.h*net.c;
|
||||
float *input = calloc(input_size*net.batch, sizeof(float));
|
||||
char *filename = files[rand()%n];
|
||||
CvCapture *cap = cvCaptureFromFile(filename);
|
||||
int frames = cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);
|
||||
int index = rand() % (frames - steps - 2);
|
||||
if (frames < (steps + 4)){
|
||||
--b;
|
||||
free(input);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("frames: %d, index: %d\n", frames, index);
|
||||
cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, index);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < net.batch; ++i){
|
||||
IplImage* src = cvQueryFrame(cap);
|
||||
image im = ipl_to_image(src);
|
||||
rgbgr_image(im);
|
||||
image re = resize_image(im, net.w, net.h);
|
||||
//show_image(re, "loaded");
|
||||
//cvWaitKey(10);
|
||||
memcpy(input + i*input_size, re.data, input_size*sizeof(float));
|
||||
free_image(im);
|
||||
free_image(re);
|
||||
}
|
||||
float *output = network_predict(net, input);
|
||||
|
||||
free(input);
|
||||
|
||||
for(i = 0; i < net.batch; ++i){
|
||||
memcpy(feats + (b + i*batch)*output_size, output + i*output_size, output_size*sizeof(float));
|
||||
}
|
||||
|
||||
cvReleaseCapture(&cap);
|
||||
}
|
||||
|
||||
//printf("%d %d %d\n", out_im.w, out_im.h, out_im.c);
|
||||
float_pair p = {0};
|
||||
p.x = feats;
|
||||
p.y = feats + output_size*batch; //+ out_im.w*out_im.h*out_im.c;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
void train_vid_rnn(char *cfgfile, char *weightfile)
|
||||
{
|
||||
char *train_videos = "data/vid/train.txt";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
|
||||
list *plist = get_paths(train_videos);
|
||||
int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
clock_t time;
|
||||
int steps = net.time_steps;
|
||||
int batch = net.batch / net.time_steps;
|
||||
|
||||
network extractor = parse_network_cfg("cfg/extractor.cfg");
|
||||
load_weights(&extractor, "/home/pjreddie/trained/yolo-coco.conv");
|
||||
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
float_pair p = get_rnn_vid_data(extractor, paths, N, batch, steps);
|
||||
|
||||
memcpy(net.input, p.x, net.inputs*net.batch);
|
||||
memcpy(net.truth, p.y, net.truths*net.batch);
|
||||
float loss = train_network_datum(net) / (net.batch);
|
||||
|
||||
|
||||
free(p.x);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
fprintf(stderr, "%d: %f, %f avg, %f rate, %lf seconds\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time));
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%10==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
|
||||
image save_reconstruction(network net, image *init, float *feat, char *name, int i)
|
||||
{
|
||||
image recon;
|
||||
if (init) {
|
||||
recon = copy_image(*init);
|
||||
} else {
|
||||
recon = make_random_image(net.w, net.h, 3);
|
||||
}
|
||||
|
||||
image update = make_image(net.w, net.h, 3);
|
||||
reconstruct_picture(net, feat, recon, update, .01, .9, .1, 2, 50);
|
||||
char buff[256];
|
||||
sprintf(buff, "%s%d", name, i);
|
||||
save_image(recon, buff);
|
||||
free_image(update);
|
||||
return recon;
|
||||
}
|
||||
|
||||
void generate_vid_rnn(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network extractor = parse_network_cfg("cfg/extractor.recon.cfg");
|
||||
load_weights(&extractor, "/home/pjreddie/trained/yolo-coco.conv");
|
||||
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&extractor, 1);
|
||||
set_batch_network(&net, 1);
|
||||
|
||||
int i;
|
||||
CvCapture *cap = cvCaptureFromFile("/extra/vid/ILSVRC2015/Data/VID/snippets/val/ILSVRC2015_val_00007030.mp4");
|
||||
float *feat;
|
||||
float *next;
|
||||
image last;
|
||||
for(i = 0; i < 25; ++i){
|
||||
image im = get_image_from_stream(cap);
|
||||
image re = resize_image(im, extractor.w, extractor.h);
|
||||
feat = network_predict(extractor, re.data);
|
||||
if(i > 0){
|
||||
printf("%f %f\n", mean_array(feat, 14*14*512), variance_array(feat, 14*14*512));
|
||||
printf("%f %f\n", mean_array(next, 14*14*512), variance_array(next, 14*14*512));
|
||||
printf("%f\n", mse_array(feat, 14*14*512));
|
||||
axpy_cpu(14*14*512, -1, feat, 1, next, 1);
|
||||
printf("%f\n", mse_array(next, 14*14*512));
|
||||
}
|
||||
next = network_predict(net, feat);
|
||||
|
||||
free_image(im);
|
||||
|
||||
free_image(save_reconstruction(extractor, 0, feat, "feat", i));
|
||||
free_image(save_reconstruction(extractor, 0, next, "next", i));
|
||||
if (i==24) last = copy_image(re);
|
||||
free_image(re);
|
||||
}
|
||||
for(i = 0; i < 30; ++i){
|
||||
next = network_predict(net, next);
|
||||
image new = save_reconstruction(extractor, &last, next, "new", i);
|
||||
free_image(last);
|
||||
last = new;
|
||||
}
|
||||
}
|
||||
|
||||
void run_vid_rnn(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
//char *filename = (argc > 5) ? argv[5]: 0;
|
||||
if(0==strcmp(argv[2], "train")) train_vid_rnn(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "generate")) generate_vid_rnn(cfg, weights);
|
||||
}
|
||||
#else
|
||||
void run_vid_rnn(int argc, char **argv){}
|
||||
#endif
|
||||
|
262
examples/segmenter.c
Normal file
262
examples/segmenter.c
Normal file
@ -0,0 +1,262 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/option_list.h"
|
||||
#include "darknet/blas.h"
|
||||
#include "darknet/cuda.h"
|
||||
#include <sys/time.h>
|
||||
#include <assert.h>
|
||||
|
||||
void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
|
||||
{
|
||||
int i;
|
||||
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
printf("%d\n", ngpus);
|
||||
network *nets = calloc(ngpus, sizeof(network));
|
||||
|
||||
srand(time(0));
|
||||
int seed = rand();
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
srand(seed);
|
||||
#ifdef GPU
|
||||
cuda_set_device(gpus[i]);
|
||||
#endif
|
||||
nets[i] = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&nets[i], weightfile);
|
||||
}
|
||||
if(clear) *nets[i].seen = 0;
|
||||
nets[i].learning_rate *= ngpus;
|
||||
}
|
||||
srand(time(0));
|
||||
network net = nets[0];
|
||||
|
||||
int imgs = net.batch * net.subdivisions * ngpus;
|
||||
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
list *options = read_data_cfg(datacfg);
|
||||
|
||||
char *backup_directory = option_find_str(options, "backup", "/backup/");
|
||||
char *train_list = option_find_str(options, "train", "data/train.list");
|
||||
|
||||
list *plist = get_paths(train_list);
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
int N = plist->size;
|
||||
clock_t time;
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.threads = 32;
|
||||
|
||||
args.min = net.min_crop;
|
||||
args.max = net.max_crop;
|
||||
args.angle = net.angle;
|
||||
args.aspect = net.aspect;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
args.size = net.w;
|
||||
args.classes = 80;
|
||||
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = N;
|
||||
args.type = SEGMENTATION_DATA;
|
||||
|
||||
data train;
|
||||
data buffer;
|
||||
pthread_t load_thread;
|
||||
args.d = &buffer;
|
||||
load_thread = load_data(args);
|
||||
|
||||
int epoch = (*net.seen)/N;
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
time=clock();
|
||||
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
|
||||
float loss = 0;
|
||||
#ifdef GPU
|
||||
if(ngpus == 1){
|
||||
loss = train_network(net, train);
|
||||
} else {
|
||||
loss = train_networks(nets, ngpus, train, 4);
|
||||
}
|
||||
#else
|
||||
loss = train_network(net, train);
|
||||
#endif
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
free_network(net);
|
||||
free_ptrs((void**)paths, plist->size);
|
||||
free_list(plist);
|
||||
free(base);
|
||||
}
|
||||
|
||||
void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, 0, 0);
|
||||
image sized = letterbox_image(im, net.w, net.h);
|
||||
|
||||
float *X = sized.data;
|
||||
time=clock();
|
||||
float *predictions = network_predict(net, X);
|
||||
image m = float_to_image(sized.w, sized.h, 81, predictions);
|
||||
image rgb = mask_to_rgb(m);
|
||||
show_image(sized, "orig");
|
||||
show_image(rgb, "pred");
|
||||
cvWaitKey(0);
|
||||
printf("Predicted: %f\n", predictions[0]);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
free_image(im);
|
||||
free_image(sized);
|
||||
free_image(rgb);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
|
||||
{
|
||||
#ifdef OPENCV
|
||||
printf("Regressor Demo\n");
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
|
||||
srand(2222222);
|
||||
CvCapture * cap;
|
||||
|
||||
if(filename){
|
||||
cap = cvCaptureFromFile(filename);
|
||||
}else{
|
||||
cap = cvCaptureFromCAM(cam_index);
|
||||
}
|
||||
|
||||
if(!cap) error("Couldn't connect to webcam.\n");
|
||||
cvNamedWindow("Regressor", CV_WINDOW_NORMAL);
|
||||
cvResizeWindow("Regressor", 512, 512);
|
||||
float fps = 0;
|
||||
|
||||
while(1){
|
||||
struct timeval tval_before, tval_after, tval_result;
|
||||
gettimeofday(&tval_before, NULL);
|
||||
|
||||
image in = get_image_from_stream(cap);
|
||||
image in_s = letterbox_image(in, net.w, net.h);
|
||||
show_image(in, "Regressor");
|
||||
|
||||
float *predictions = network_predict(net, in_s.data);
|
||||
|
||||
printf("\033[2J");
|
||||
printf("\033[1;1H");
|
||||
printf("\nFPS:%.0f\n",fps);
|
||||
|
||||
printf("People: %f\n", predictions[0]);
|
||||
|
||||
free_image(in_s);
|
||||
free_image(in);
|
||||
|
||||
cvWaitKey(10);
|
||||
|
||||
gettimeofday(&tval_after, NULL);
|
||||
timersub(&tval_after, &tval_before, &tval_result);
|
||||
float curr = 1000000.f/((long int)tval_result.tv_usec);
|
||||
fps = .9*fps + .1*curr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void run_segmenter(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
|
||||
int *gpus = 0;
|
||||
int gpu = 0;
|
||||
int ngpus = 0;
|
||||
if(gpu_list){
|
||||
printf("%s\n", gpu_list);
|
||||
int len = strlen(gpu_list);
|
||||
ngpus = 1;
|
||||
int i;
|
||||
for(i = 0; i < len; ++i){
|
||||
if (gpu_list[i] == ',') ++ngpus;
|
||||
}
|
||||
gpus = calloc(ngpus, sizeof(int));
|
||||
for(i = 0; i < ngpus; ++i){
|
||||
gpus[i] = atoi(gpu_list);
|
||||
gpu_list = strchr(gpu_list, ',')+1;
|
||||
}
|
||||
} else {
|
||||
gpu = gpu_index;
|
||||
gpus = &gpu;
|
||||
ngpus = 1;
|
||||
}
|
||||
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
char *data = argv[3];
|
||||
char *cfg = argv[4];
|
||||
char *weights = (argc > 5) ? argv[5] : 0;
|
||||
char *filename = (argc > 6) ? argv[6]: 0;
|
||||
if(0==strcmp(argv[2], "test")) predict_segmenter(data, cfg, weights, filename);
|
||||
else if(0==strcmp(argv[2], "train")) train_segmenter(data, cfg, weights, gpus, ngpus, clear);
|
||||
else if(0==strcmp(argv[2], "demo")) demo_segmenter(data, cfg, weights, cam_index, filename);
|
||||
}
|
||||
|
||||
|
129
examples/super.c
Normal file
129
examples/super.c
Normal file
@ -0,0 +1,129 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
void train_super(char *cfgfile, char *weightfile, int clear)
|
||||
{
|
||||
char *train_images = "/data/imagenet/imagenet1k.train.list";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
if(clear) *net.seen = 0;
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
data train, buffer;
|
||||
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.scale = 4;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.d = &buffer;
|
||||
args.type = SUPER_DATA;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
clock_t time;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void test_super(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, 0, 0);
|
||||
resize_network(&net, im.w, im.h);
|
||||
printf("%d %d\n", im.w, im.h);
|
||||
|
||||
float *X = im.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
image out = get_network_image(net);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
save_image(out, "out");
|
||||
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void run_super(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5] : 0;
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
if(0==strcmp(argv[2], "train")) train_super(cfg, weights, clear);
|
||||
else if(0==strcmp(argv[2], "test")) test_super(cfg, weights, filename);
|
||||
/*
|
||||
else if(0==strcmp(argv[2], "valid")) validate_super(cfg, weights);
|
||||
*/
|
||||
}
|
87
examples/swag.c
Normal file
87
examples/swag.c
Normal file
@ -0,0 +1,87 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/detection_layer.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/box.h"
|
||||
|
||||
void train_swag(char *cfgfile, char *weightfile)
|
||||
{
|
||||
char *train_images = "data/voc.0712.trainval";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
data train, buffer;
|
||||
|
||||
layer l = net.layers[net.n - 1];
|
||||
|
||||
int side = l.side;
|
||||
int classes = l.classes;
|
||||
float jitter = l.jitter;
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.classes = classes;
|
||||
args.jitter = jitter;
|
||||
args.num_boxes = side;
|
||||
args.d = &buffer;
|
||||
args.type = REGION_DATA;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
clock_t time;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0 || i == 600){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void run_swag(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_swag(cfg, weights);
|
||||
}
|
149
examples/tag.c
Normal file
149
examples/tag.c
Normal file
@ -0,0 +1,149 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
void train_tag(char *cfgfile, char *weightfile, int clear)
|
||||
{
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
if(clear) *net.seen = 0;
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = 1024;
|
||||
list *plist = get_paths("/home/pjreddie/tag/train.list");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
printf("%d\n", plist->size);
|
||||
int N = plist->size;
|
||||
clock_t time;
|
||||
pthread_t load_thread;
|
||||
data train;
|
||||
data buffer;
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
|
||||
args.min = net.w;
|
||||
args.max = net.max_crop;
|
||||
args.size = net.w;
|
||||
|
||||
args.paths = paths;
|
||||
args.classes = net.outputs;
|
||||
args.n = imgs;
|
||||
args.m = N;
|
||||
args.d = &buffer;
|
||||
args.type = TAG_DATA;
|
||||
|
||||
args.angle = net.angle;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
|
||||
fprintf(stderr, "%d classes\n", net.outputs);
|
||||
|
||||
load_thread = load_data_in_thread(args);
|
||||
int epoch = (*net.seen)/N;
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
|
||||
load_thread = load_data_in_thread(args);
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup",backup_directory,base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
|
||||
pthread_join(load_thread, 0);
|
||||
free_data(buffer);
|
||||
free_network(net);
|
||||
free_ptrs((void**)paths, plist->size);
|
||||
free_list(plist);
|
||||
free(base);
|
||||
}
|
||||
|
||||
void test_tag(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
int i = 0;
|
||||
char **names = get_labels("data/tags.txt");
|
||||
clock_t time;
|
||||
int indexes[10];
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int size = net.w;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, 0, 0);
|
||||
image r = resize_min(im, size);
|
||||
resize_network(&net, r.w, r.h);
|
||||
printf("%d %d\n", r.w, r.h);
|
||||
|
||||
float *X = r.data;
|
||||
time=clock();
|
||||
float *predictions = network_predict(net, X);
|
||||
top_predictions(net, 10, indexes);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
for(i = 0; i < 10; ++i){
|
||||
int index = indexes[i];
|
||||
printf("%.1f%%: %s\n", predictions[index]*100, names[index]);
|
||||
}
|
||||
if(r.data != im.data) free_image(r);
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void run_tag(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
int clear = find_arg(argc, argv, "-clear");
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_tag(cfg, weights, clear);
|
||||
else if(0==strcmp(argv[2], "test")) test_tag(cfg, weights, filename);
|
||||
}
|
||||
|
164
examples/voxel.c
Normal file
164
examples/voxel.c
Normal file
@ -0,0 +1,164 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
void extract_voxel(char *lfile, char *rfile, char *prefix)
|
||||
{
|
||||
#ifdef OPENCV
|
||||
int w = 1920;
|
||||
int h = 1080;
|
||||
int shift = 0;
|
||||
int count = 0;
|
||||
CvCapture *lcap = cvCaptureFromFile(lfile);
|
||||
CvCapture *rcap = cvCaptureFromFile(rfile);
|
||||
while(1){
|
||||
image l = get_image_from_stream(lcap);
|
||||
image r = get_image_from_stream(rcap);
|
||||
if(!l.w || !r.w) break;
|
||||
if(count%100 == 0) {
|
||||
shift = best_3d_shift_r(l, r, -l.h/100, l.h/100);
|
||||
printf("%d\n", shift);
|
||||
}
|
||||
image ls = crop_image(l, (l.w - w)/2, (l.h - h)/2, w, h);
|
||||
image rs = crop_image(r, 105 + (r.w - w)/2, (r.h - h)/2 + shift, w, h);
|
||||
char buff[256];
|
||||
sprintf(buff, "%s_%05d_l", prefix, count);
|
||||
save_image(ls, buff);
|
||||
sprintf(buff, "%s_%05d_r", prefix, count);
|
||||
save_image(rs, buff);
|
||||
free_image(l);
|
||||
free_image(r);
|
||||
free_image(ls);
|
||||
free_image(rs);
|
||||
++count;
|
||||
}
|
||||
|
||||
#else
|
||||
printf("need OpenCV for extraction\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void train_voxel(char *cfgfile, char *weightfile)
|
||||
{
|
||||
char *train_images = "/data/imagenet/imagenet1k.train.list";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
data train, buffer;
|
||||
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.scale = 4;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.d = &buffer;
|
||||
args.type = SUPER_DATA;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
clock_t time;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(i%100==0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s.backup", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void test_voxel(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input, 0, 0);
|
||||
resize_network(&net, im.w, im.h);
|
||||
printf("%d %d\n", im.w, im.h);
|
||||
|
||||
float *X = im.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
image out = get_network_image(net);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
save_image(out, "out");
|
||||
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void run_voxel(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_voxel(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "test")) test_voxel(cfg, weights, filename);
|
||||
else if(0==strcmp(argv[2], "extract")) extract_voxel(argv[3], argv[4], argv[5]);
|
||||
/*
|
||||
else if(0==strcmp(argv[2], "valid")) validate_voxel(cfg, weights);
|
||||
*/
|
||||
}
|
146
examples/writing.c
Normal file
146
examples/writing.c
Normal file
@ -0,0 +1,146 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
|
||||
void train_writing(char *cfgfile, char *weightfile)
|
||||
{
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
float avg_loss = -1;
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
list *plist = get_paths("figures.list");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
clock_t time;
|
||||
int N = plist->size;
|
||||
printf("N: %d\n", N);
|
||||
image out = get_network_image(net);
|
||||
|
||||
data train, buffer;
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.out_w = out.w;
|
||||
args.out_h = out.h;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = N;
|
||||
args.d = &buffer;
|
||||
args.type = WRITING_DATA;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
int epoch = (*net.seen)/N;
|
||||
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
printf("Loaded %lf seconds\n",sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
|
||||
/*
|
||||
image pred = float_to_image(64, 64, 1, out);
|
||||
print_image(pred);
|
||||
*/
|
||||
|
||||
/*
|
||||
image im = float_to_image(256, 256, 3, train.X.vals[0]);
|
||||
image lab = float_to_image(64, 64, 1, train.y.vals[0]);
|
||||
image pred = float_to_image(64, 64, 1, out);
|
||||
show_image(im, "image");
|
||||
show_image(lab, "label");
|
||||
print_image(lab);
|
||||
show_image(pred, "pred");
|
||||
cvWaitKey(0);
|
||||
*/
|
||||
|
||||
if(avg_loss == -1) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
|
||||
free_data(train);
|
||||
if(get_current_batch(net)%100 == 0){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_batch_%d.weights", backup_directory, base, get_current_batch(net));
|
||||
save_weights(net, buff);
|
||||
}
|
||||
if(*net.seen/N > epoch){
|
||||
epoch = *net.seen/N;
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void test_writing(char *cfgfile, char *weightfile, char *filename)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
}else{
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
|
||||
image im = load_image_color(input, 0, 0);
|
||||
resize_network(&net, im.w, im.h);
|
||||
printf("%d %d %d\n", im.h, im.w, im.c);
|
||||
float *X = im.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
image pred = get_network_image(net);
|
||||
|
||||
image upsampled = resize_image(pred, im.w, im.h);
|
||||
image thresh = threshold_image(upsampled, .5);
|
||||
pred = thresh;
|
||||
|
||||
show_image(pred, "prediction");
|
||||
show_image(im, "orig");
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(0);
|
||||
cvDestroyAllWindows();
|
||||
#endif
|
||||
|
||||
free_image(upsampled);
|
||||
free_image(thresh);
|
||||
free_image(im);
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void run_writing(int argc, char **argv)
|
||||
{
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5] : 0;
|
||||
if(0==strcmp(argv[2], "train")) train_writing(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "test")) test_writing(cfg, weights, filename);
|
||||
}
|
||||
|
352
examples/yolo.c
Normal file
352
examples/yolo.c
Normal file
@ -0,0 +1,352 @@
|
||||
#include "darknet/network.h"
|
||||
#include "darknet/detection_layer.h"
|
||||
#include "darknet/cost_layer.h"
|
||||
#include "darknet/utils.h"
|
||||
#include "darknet/parser.h"
|
||||
#include "darknet/box.h"
|
||||
#include "darknet/demo.h"
|
||||
|
||||
char *voc_names[] = {"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"};
|
||||
|
||||
void train_yolo(char *cfgfile, char *weightfile)
|
||||
{
|
||||
char *train_images = "/data/voc/train.txt";
|
||||
char *backup_directory = "/home/pjreddie/backup/";
|
||||
srand(time(0));
|
||||
char *base = basecfg(cfgfile);
|
||||
printf("%s\n", base);
|
||||
float avg_loss = -1;
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
int imgs = net.batch*net.subdivisions;
|
||||
int i = *net.seen/imgs;
|
||||
data train, buffer;
|
||||
|
||||
|
||||
layer l = net.layers[net.n - 1];
|
||||
|
||||
int side = l.side;
|
||||
int classes = l.classes;
|
||||
float jitter = l.jitter;
|
||||
|
||||
list *plist = get_paths(train_images);
|
||||
//int N = plist->size;
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.paths = paths;
|
||||
args.n = imgs;
|
||||
args.m = plist->size;
|
||||
args.classes = classes;
|
||||
args.jitter = jitter;
|
||||
args.num_boxes = side;
|
||||
args.d = &buffer;
|
||||
args.type = REGION_DATA;
|
||||
|
||||
args.angle = net.angle;
|
||||
args.exposure = net.exposure;
|
||||
args.saturation = net.saturation;
|
||||
args.hue = net.hue;
|
||||
|
||||
pthread_t load_thread = load_data_in_thread(args);
|
||||
clock_t time;
|
||||
//while(i*imgs < N*120){
|
||||
while(get_current_batch(net) < net.max_batches){
|
||||
i += 1;
|
||||
time=clock();
|
||||
pthread_join(load_thread, 0);
|
||||
train = buffer;
|
||||
load_thread = load_data_in_thread(args);
|
||||
|
||||
printf("Loaded: %lf seconds\n", sec(clock()-time));
|
||||
|
||||
time=clock();
|
||||
float loss = train_network(net, train);
|
||||
if (avg_loss < 0) avg_loss = loss;
|
||||
avg_loss = avg_loss*.9 + loss*.1;
|
||||
|
||||
printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
|
||||
if(i%1000==0 || (i < 1000 && i%100 == 0)){
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
free_data(train);
|
||||
}
|
||||
char buff[256];
|
||||
sprintf(buff, "%s/%s_final.weights", backup_directory, base);
|
||||
save_weights(net, buff);
|
||||
}
|
||||
|
||||
void print_yolo_detections(FILE **fps, char *id, box *boxes, float **probs, int total, int classes, int w, int h)
|
||||
{
|
||||
int i, j;
|
||||
for(i = 0; i < total; ++i){
|
||||
float xmin = boxes[i].x - boxes[i].w/2.;
|
||||
float xmax = boxes[i].x + boxes[i].w/2.;
|
||||
float ymin = boxes[i].y - boxes[i].h/2.;
|
||||
float ymax = boxes[i].y + boxes[i].h/2.;
|
||||
|
||||
if (xmin < 0) xmin = 0;
|
||||
if (ymin < 0) ymin = 0;
|
||||
if (xmax > w) xmax = w;
|
||||
if (ymax > h) ymax = h;
|
||||
|
||||
for(j = 0; j < classes; ++j){
|
||||
if (probs[i][j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, probs[i][j],
|
||||
xmin, ymin, xmax, ymax);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void validate_yolo(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
char *base = "results/comp4_det_test_";
|
||||
//list *plist = get_paths("data/voc.2007.test");
|
||||
list *plist = get_paths("/home/pjreddie/data/voc/2007_test.txt");
|
||||
//list *plist = get_paths("data/voc.2012.test");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
|
||||
int j;
|
||||
FILE **fps = calloc(classes, sizeof(FILE *));
|
||||
for(j = 0; j < classes; ++j){
|
||||
char buff[1024];
|
||||
snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]);
|
||||
fps[j] = fopen(buff, "w");
|
||||
}
|
||||
box *boxes = calloc(l.side*l.side*l.n, sizeof(box));
|
||||
float **probs = calloc(l.side*l.side*l.n, sizeof(float *));
|
||||
for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
int t;
|
||||
|
||||
float thresh = .001;
|
||||
int nms = 1;
|
||||
float iou_thresh = .5;
|
||||
|
||||
int nthreads = 8;
|
||||
image *val = calloc(nthreads, sizeof(image));
|
||||
image *val_resized = calloc(nthreads, sizeof(image));
|
||||
image *buf = calloc(nthreads, sizeof(image));
|
||||
image *buf_resized = calloc(nthreads, sizeof(image));
|
||||
pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
|
||||
|
||||
load_args args = {0};
|
||||
args.w = net.w;
|
||||
args.h = net.h;
|
||||
args.type = IMAGE_DATA;
|
||||
|
||||
for(t = 0; t < nthreads; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
time_t start = time(0);
|
||||
for(i = nthreads; i < m+nthreads; i += nthreads){
|
||||
fprintf(stderr, "%d\n", i);
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
pthread_join(thr[t], 0);
|
||||
val[t] = buf[t];
|
||||
val_resized[t] = buf_resized[t];
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t < m; ++t){
|
||||
args.path = paths[i+t];
|
||||
args.im = &buf[t];
|
||||
args.resized = &buf_resized[t];
|
||||
thr[t] = load_data_in_thread(args);
|
||||
}
|
||||
for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
|
||||
char *path = paths[i+t-nthreads];
|
||||
char *id = basecfg(path);
|
||||
float *X = val_resized[t].data;
|
||||
network_predict(net, X);
|
||||
int w = val[t].w;
|
||||
int h = val[t].h;
|
||||
get_detection_boxes(l, w, h, thresh, probs, boxes, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, classes, iou_thresh);
|
||||
print_yolo_detections(fps, id, boxes, probs, l.side*l.side*l.n, classes, w, h);
|
||||
free(id);
|
||||
free_image(val[t]);
|
||||
free_image(val_resized[t]);
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start));
|
||||
}
|
||||
|
||||
void validate_yolo_recall(char *cfgfile, char *weightfile)
|
||||
{
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
set_batch_network(&net, 1);
|
||||
fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
|
||||
srand(time(0));
|
||||
|
||||
char *base = "results/comp4_det_test_";
|
||||
list *plist = get_paths("data/voc.2007.test");
|
||||
char **paths = (char **)list_to_array(plist);
|
||||
|
||||
layer l = net.layers[net.n-1];
|
||||
int classes = l.classes;
|
||||
int side = l.side;
|
||||
|
||||
int j, k;
|
||||
FILE **fps = calloc(classes, sizeof(FILE *));
|
||||
for(j = 0; j < classes; ++j){
|
||||
char buff[1024];
|
||||
snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]);
|
||||
fps[j] = fopen(buff, "w");
|
||||
}
|
||||
box *boxes = calloc(side*side*l.n, sizeof(box));
|
||||
float **probs = calloc(side*side*l.n, sizeof(float *));
|
||||
for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
||||
|
||||
int m = plist->size;
|
||||
int i=0;
|
||||
|
||||
float thresh = .001;
|
||||
float iou_thresh = .5;
|
||||
float nms = 0;
|
||||
|
||||
int total = 0;
|
||||
int correct = 0;
|
||||
int proposals = 0;
|
||||
float avg_iou = 0;
|
||||
|
||||
for(i = 0; i < m; ++i){
|
||||
char *path = paths[i];
|
||||
image orig = load_image_color(path, 0, 0);
|
||||
image sized = resize_image(orig, net.w, net.h);
|
||||
char *id = basecfg(path);
|
||||
network_predict(net, sized.data);
|
||||
get_detection_boxes(l, orig.w, orig.h, thresh, probs, boxes, 1);
|
||||
if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms);
|
||||
|
||||
char labelpath[4096];
|
||||
find_replace(path, "images", "labels", labelpath);
|
||||
find_replace(labelpath, "JPEGImages", "labels", labelpath);
|
||||
find_replace(labelpath, ".jpg", ".txt", labelpath);
|
||||
find_replace(labelpath, ".JPEG", ".txt", labelpath);
|
||||
|
||||
int num_labels = 0;
|
||||
box_label *truth = read_boxes(labelpath, &num_labels);
|
||||
for(k = 0; k < side*side*l.n; ++k){
|
||||
if(probs[k][0] > thresh){
|
||||
++proposals;
|
||||
}
|
||||
}
|
||||
for (j = 0; j < num_labels; ++j) {
|
||||
++total;
|
||||
box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
|
||||
float best_iou = 0;
|
||||
for(k = 0; k < side*side*l.n; ++k){
|
||||
float iou = box_iou(boxes[k], t);
|
||||
if(probs[k][0] > thresh && iou > best_iou){
|
||||
best_iou = iou;
|
||||
}
|
||||
}
|
||||
avg_iou += best_iou;
|
||||
if(best_iou > iou_thresh){
|
||||
++correct;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
|
||||
free(id);
|
||||
free_image(orig);
|
||||
free_image(sized);
|
||||
}
|
||||
}
|
||||
|
||||
void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh)
|
||||
{
|
||||
image **alphabet = load_alphabet();
|
||||
network net = parse_network_cfg(cfgfile);
|
||||
if(weightfile){
|
||||
load_weights(&net, weightfile);
|
||||
}
|
||||
detection_layer l = net.layers[net.n-1];
|
||||
set_batch_network(&net, 1);
|
||||
srand(2222222);
|
||||
clock_t time;
|
||||
char buff[256];
|
||||
char *input = buff;
|
||||
int j;
|
||||
float nms=.4;
|
||||
box *boxes = calloc(l.side*l.side*l.n, sizeof(box));
|
||||
float **probs = calloc(l.side*l.side*l.n, sizeof(float *));
|
||||
for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *));
|
||||
while(1){
|
||||
if(filename){
|
||||
strncpy(input, filename, 256);
|
||||
} else {
|
||||
printf("Enter Image Path: ");
|
||||
fflush(stdout);
|
||||
input = fgets(input, 256, stdin);
|
||||
if(!input) return;
|
||||
strtok(input, "\n");
|
||||
}
|
||||
image im = load_image_color(input,0,0);
|
||||
image sized = resize_image(im, net.w, net.h);
|
||||
float *X = sized.data;
|
||||
time=clock();
|
||||
network_predict(net, X);
|
||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||
get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0);
|
||||
if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms);
|
||||
//draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20);
|
||||
draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20);
|
||||
save_image(im, "predictions");
|
||||
show_image(im, "predictions");
|
||||
|
||||
free_image(im);
|
||||
free_image(sized);
|
||||
#ifdef OPENCV
|
||||
cvWaitKey(0);
|
||||
cvDestroyAllWindows();
|
||||
#endif
|
||||
if (filename) break;
|
||||
}
|
||||
}
|
||||
|
||||
void run_yolo(int argc, char **argv)
|
||||
{
|
||||
char *prefix = find_char_arg(argc, argv, "-prefix", 0);
|
||||
float thresh = find_float_arg(argc, argv, "-thresh", .2);
|
||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||
int frame_skip = find_int_arg(argc, argv, "-s", 0);
|
||||
if(argc < 4){
|
||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
int avg = find_int_arg(argc, argv, "-avg", 1);
|
||||
char *cfg = argv[3];
|
||||
char *weights = (argc > 4) ? argv[4] : 0;
|
||||
char *filename = (argc > 5) ? argv[5]: 0;
|
||||
if(0==strcmp(argv[2], "test")) test_yolo(cfg, weights, filename, thresh);
|
||||
else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights);
|
||||
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, avg, .5, 0,0,0,0);
|
||||
}
|
Reference in New Issue
Block a user