1. 程式人生 > >DarkNet,Visual Studio 2015工程配置

DarkNet,Visual Studio 2015工程配置

1. 前言

最近使用DarkNet做yolo目標檢測,為了方便梳理程式碼的結構,理順其內部的實現過程,這裡將DarkNet的原始碼提出來,融合到Visual Studio工程中去,這裡將這個過程記錄下來。
PS:這裡使用的系統是Win10 x64,Visual Studio 2015,Win32控制檯應用程式

2. 整合過程

2.1 配置Pthread庫

下載Windows版本的Pthread庫,將編譯好的.lib與.dll提供出來給DarkNet使用。之後便是配置Pthread庫,其配置過程與配置Opencv的過程類似,這裡就不多說了(網上很多opencv配置的文章,貫通一下就好)。需要注意的是需要將bin目錄新增到系統的環境變數,並且重啟電腦。

2.2 配置DarkNet

將Git clone下來檔案解壓並開啟,得到下圖,並且將下圖中紅框圈中的資料夾複製到工程目錄
這裡寫圖片描述
(1)將include目錄新增到工程包含目錄
(2)將src中的程式碼新增到工程中去,移除compare.c、demo.c、demo.h

2.3 修改程式碼

由於DarkNet是在Linux環境下開發編譯的,移植到windows上難免會有問題,因而首先第一步便是註釋掉

#include <unistd.h>
#include <sys/time.h>

再來修改utils.c檔案中的what_time_is_it_now()函式

double what_time_is_it_now()
{
    clock_t start;
    start = clock();
    return (double)(start);
}

其實這一部分就是一個計時函式,我這裡用clock()函式代替了,其他的計時函式請參考下面連線:【C/C++】計時函式比較

2.4 新增main函式

這裡我目前主要用測試函式,所以main函式只有測試功能,其它功能各位閱讀原始碼自行新增吧。
PS:由於DarkNet是純C語言編寫的庫,所以要是你新增main函式選成了CPP檔案那就GG了,而且也不能包含C++的庫。還是改成c檔案吧。這裡我給大家一個main函式的demo

// DarkNet.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include "include\darknet.h"
#include <stdio.h>
#include <stdlib.h>

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 = load_network(cfgfile, weightfile, 0);
    set_batch_network(net, 1);
    srand(2222222);
    double time;
    char buff[256];
    char *input = buff;
    float nms = .45;
    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];


        float *X = sized.data;
        time = what_time_is_it_now();
        network_predict(net, X);
        printf("%s: Predicted in %f seconds.\n", input, (what_time_is_it_now() – time)*1.0/1000.0);
        int nboxes = 0;
        detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
        //printf("%d\n", nboxes);
        //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
        if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
        draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
        free_detections(dets, nboxes);
        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", 0);
#endif
        }

        free_image(im);
        free_image(sized);
        if (filename) break;
    }
}

//主函式
int main()
{
    char* datacfg = "./cfg/voc.data";
    char* cfg = "./cfg/yolov3-spp.cfg";
    char* weights = "yolov3-spp_40000.weights";
    char* filename = "./test_case/test1.jpg";
    float thresh = 0.5;
    float hier_thresh = 0.5;
    char *outfile = "detection_out.png";
    int fullscreen=0;
    test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);
    return 0;
}

在此之外還可以參考:Darknet windows移植(YOLO v2)

3. 執行結果

這裡寫圖片描述