yolo的检测没有采用caffe结构,而是一个看上去似乎很简单的结构。
里面的检测速度就运行感觉而言,确实比spp-net要快很多。
不过里面写到因为没有带opencv来编译darknet,所以不能直接显示检测后的图片,而是把它保存在predictions.png文件中,可以打开这个文件查看。
整个图像生成的过程:
1. 在\src\darknet.c
Line 16: extern void run_yolo(int argc, char **argv);
Line 250: run_yolo(argc, argv);
2. src/yolo.c中的 void run_yolo(int argc, char **argv)中
if(0==strcmp(argv[2], "test")) test_yolo(cfg, weights, filename, thresh);
void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh)中
draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, voc_labels, 20);
show_image(im, "predictions");
save_image(im, "predictions");
2.draw_detections()、show_image()和save_image()都是在src/image.c实现
void show_image(image p, const char *name)
{
#ifdef OPENCV
show_image_cv(p, name);
#else
fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name);
save_image(p, name);
#endif
}
void save_image(image im, const char *name)
{
char buff[256];
//sprintf(buff, "%s (%d)", name, windows);
sprintf(buff, "%s.png", name);
unsigned char *data = calloc(im.w*im.h*im.c, sizeof(char));
int i,k;
for(k = 0; k < im.c; ++k){
for(i = 0; i < im.w*im.h; ++i){
data[i*im.c+k] = (unsigned char) (255*im.data[i + k*im.w*im.h]);
}
}
int success = stbi_write_png(buff, im.w, im.h, im.c, data, im.w*im.c);
free(data);
if(!success) fprintf(stderr, "Failed to write image %s\n", buff);
}