YOLO_V3_MFC_CUSTOM - 8BitsCoding/RobotMentor GitHub Wiki


Darknet์˜ DEMO ํ”„๋กœ์ ํŠธ๋ฅผ MFC๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ ๋ถ„๋ช…ํžˆ ์ด ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ž„

์ดํ›„์— ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ ์—…๋กœ๋“œ ์˜ˆ์ •...


MFC ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์ƒ์„ฑ์€ ๋Œ€ํ™”์ƒ์ž ๊ธฐ๋ฐ˜, ์ƒ์„ฑํ•˜๋Š”๊ฑฐ ์ž์ฒด๋Š” ์‰ฝ๊ธฐ์— ์ƒ๋žต

Darknet์ด Debug ๋ชจ๋“œ๊ฐ€ ์•ˆ๋˜๊ธฐ์— ์—ญ์‹œ Debug ๋ชจ๋“œ์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. Release๋กœ ๋นŒ๋“œํ•˜์ž.

์ด๋ฏธ์ง€

๋นŒ๋“œ๋ชจ๋“œ๋ฅผ Release/x64๋กœ ์„ค์ •

1. C/C++ -> ์ผ๋ฐ˜ -> ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ

$(OpenCV)\build\include
$(Darknet)\3rdparty\stb\include
$(Darknet)\3rdparty\pthreads\include
$(CudaToolkitIncludeDir)
$(cudnn)\include
%(AdditionalIncludeDirectories)

2. C/C++ -> ์ผ๋ฐ˜ -> ์ „์ฒ˜๋ฆฌ๊ธฐ

_WINDOWS
NDEBUG
OPENCV
_TIMESPEC_DEFINED
_CRT_SECURE_NO_WARNINGS
_CRT_RAND_S
WIN32
_CONSOLE
_LIB
GPU

3. C/C++ -> ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋” -> ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋” ์‚ฌ์šฉ ์•ˆ ํ•จ

ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์ข…์†์„ฑ -> CUDA ##.## ์„ ํƒ

์ด๋ฏธ์ง€

4. CUDA C/C++ -> Common -> Target Machine Platform -> 64-bit(--machin 64)

5. CUDA C/C++ -> Common -> Generate GPU Debug Information -> ์•„๋‹ˆ์š”

6. ๋ง์ปค -> ์ผ๋ฐ˜ -> ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””๋ ‰ํ„ฐ๋ฆฌ

$(OpenCV)\build\x64\vc14\lib
$(CUDA_PATH)\lib\$(PlatformName)
$(cudnn)\lib\x64

7. ๋ง์ปค -> ์ž…๋ ฅ -> ์ถ”๊ฐ€ ์ข…์†์„ฑ

$(Darknet)\3rdparty\pthreads\lib\pthreadVC2.lib
cublas.lib
curand.lib
cudart.lib
cudnn.lib

8. ์†Œ์ŠคํŒŒ์ผ ์šฐํด๋ฆญ -> ์ถ”๊ฐ€ -> ๊ธฐ์กด ํ•ญ๋ชฉ

Darknet/src ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ

Darknet/include์˜ ๋ชจ๋“  ํŒŒ์ผ

์ด๋ฏธ์ง€


์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ •

Dlg.cpp/OnInitDialog() ์—์„œ Darknet์˜ mainํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ์˜ˆ์ •

extern "C" int start_main(int argc, char **argv);
// OnInitDialog()
HANDLE h_thread;
h_thread = CreateThread(NULL, 0, MLThread, this, 0, NULL);

if (h_thread != NULL) {
    // Thread ์ƒ์„ฑ

}

argc, argv๋ฅผ ์ค„ ์ˆ˜ ์—†๊ธฐ์— ์ง์ ‘ ์ž…๋ ฅ

์ฃผ์˜ํ•  ์ ์€ ๋ณธ๋ž˜ darknet์—์„œ๋Š” strip_args๋ฅผ ํ†ตํ•ด์„œ arg๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์ง€๋งŒ ๋ณธ ์†Œ์Šค์ฝ”๋“œ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ์ˆœ์„œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งž์ถ”์–ด ์ฃผ์–ด์•ผํ•œ๋‹ค.

DWORD WINAPI MLThread(void* ap_data)
{
	int argc = 12;
	char* argv[12];

	argv[0] = "darknet.exe";
	argv[1] = "detector";
	argv[2] = "test";
	argv[3] = "cfg/coco.data";
	argv[4] = "yolov3.cfg";
	argv[5] = "yolov3.weights";
	argv[6] = "dog.jpg";
	argv[7] = "-ext_output";
	argv[8] = "-i";
	argv[9] = "0";
	argv[10] = "-thresh";
	argv[11] = "0.25";
	

	start_main(argc, argv);

    return 0;
}

darknet.c๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •

int start_main(int argc, char **argv)
{
#ifdef _DEBUG
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

	/*
	int i;
	for (i = 0; i < argc; ++i) {
		if (!argv[i]) continue;
		strip_args(argv[i]);
	}
	*/
	

    //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);
	gpu_index = 0;

	/*
    if(find_arg(argc, argv, "-nogpu")) {
        gpu_index = -1;
        printf("\n Currently Darknet doesn't support -nogpu flag. If you want to use CPU - please compile Darknet with GPU=0 in the Makefile, or compile darknet_no_gpu.sln on Windows.\n");
        exit(-1);
    }
	*/
	

#ifndef GPU
    gpu_index = -1;
#else
    if(gpu_index >= 0){
        cuda_set_device(gpu_index);
        CHECK_CUDA(cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync));
    }
#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], "detector")){
        run_detector(argc, argv);
    } else if (0 == strcmp(argv[1], "detect")){
        float thresh = find_float_arg(argc, argv, "-thresh", .24);
		int ext_output = find_arg(argc, argv, "-ext_output");
        char *filename = (argc > 4) ? argv[4]: 0;
        test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, 0.5, 0, ext_output, 0, NULL, 0);
    } 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], "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], "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], "imtest")){
        test_resize(argv[2]);
    } else {
        fprintf(stderr, "Not an option: %s\n", argv[1]);
    }
    return 0;
}

dllํŒŒ์ผ ๋„ฃ๊ธฐ

pthreadVC2.dll, opencv_world340.dll์„ ๋„ฃ๋Š”๋‹ค.


๋นŒ๋“œํ…Œ์ŠคํŠธ

cfg, data ํด๋”

dog.jpg, yolov3.cfg, yolov3.weights์ด ์žˆ์Œ์„ ๊ผญ ํ™•์ธํ•˜์ž.

์ด๋ฏธ์ง€

โš ๏ธ **GitHub.com Fallback** โš ๏ธ