YOLO_V3_MFC_CUSTOM - 8BitsCoding/RobotMentor GitHub Wiki
Darknet์ DEMO ํ๋ก์ ํธ๋ฅผ MFC๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ ๋ถ๋ช ํ ์ด ๋ฐฉ๋ฒ๋ณด๋ค ์ข์ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์
์ดํ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๊ตฌํ ๊ฐ๋ฅํ๋ฉด ๊ทธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ก๋ ์์ ...
MFC ํ๋ก์ ํธ ์์ฑ
์์ฑ์ ๋ํ์์ ๊ธฐ๋ฐ, ์์ฑํ๋๊ฑฐ ์์ฒด๋ ์ฝ๊ธฐ์ ์๋ต
Darknet์ด Debug ๋ชจ๋๊ฐ ์๋๊ธฐ์ ์ญ์ Debug ๋ชจ๋์์ ๋์ํ์ง ์๋๋ค. Release๋ก ๋น๋ํ์.
๋น๋๋ชจ๋๋ฅผ Release/x64๋ก ์ค์
$(OpenCV)\build\include
$(Darknet)\3rdparty\stb\include
$(Darknet)\3rdparty\pthreads\include
$(CudaToolkitIncludeDir)
$(cudnn)\include
%(AdditionalIncludeDirectories)
_WINDOWS
NDEBUG
OPENCV
_TIMESPEC_DEFINED
_CRT_SECURE_NO_WARNINGS
_CRT_RAND_S
WIN32
_CONSOLE
_LIB
GPU
ํ๋ก์ ํธ ๋น๋์ข ์์ฑ -> CUDA ##.## ์ ํ
$(OpenCV)\build\x64\vc14\lib
$(CUDA_PATH)\lib\$(PlatformName)
$(cudnn)\lib\x64
$(Darknet)\3rdparty\pthreads\lib\pthreadVC2.lib
cublas.lib
curand.lib
cudart.lib
cudnn.lib
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;
}
pthreadVC2.dll, opencv_world340.dll์ ๋ฃ๋๋ค.
cfg, data ํด๋
dog.jpg, yolov3.cfg, yolov3.weights์ด ์์์ ๊ผญ ํ์ธํ์.