mirror of
https://github.com/pjreddie/darknet.git
synced 2023-08-10 21:13:14 +03:00
Added include/darknet.h
This commit is contained in:
18
Makefile
18
Makefile
@ -47,7 +47,7 @@ EXEC=darknet
|
||||
OBJDIR=./obj/
|
||||
|
||||
ifeq ($(LIBSO), 1)
|
||||
LIBNAMESO=darknet.so
|
||||
LIBNAMESO=libdarknet.so
|
||||
APPNAMESO=uselib
|
||||
endif
|
||||
|
||||
@ -56,7 +56,7 @@ CPP=g++
|
||||
NVCC=nvcc
|
||||
OPTS=-Ofast
|
||||
LDFLAGS= -lm -pthread
|
||||
COMMON=
|
||||
COMMON= -Iinclude/
|
||||
CFLAGS=-Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
@ -115,18 +115,18 @@ OBJ+=convolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernel
|
||||
endif
|
||||
|
||||
OBJS = $(addprefix $(OBJDIR), $(OBJ))
|
||||
DEPS = $(wildcard src/*.h) Makefile
|
||||
DEPS = $(wildcard src/*.h) Makefile include/darknet.h
|
||||
|
||||
all: obj backup results $(EXEC) $(LIBNAMESO) $(APPNAMESO)
|
||||
all: obj backup results setchmod $(EXEC) $(LIBNAMESO) $(APPNAMESO)
|
||||
|
||||
ifeq ($(LIBSO), 1)
|
||||
CFLAGS+= -fPIC
|
||||
|
||||
$(LIBNAMESO): $(OBJS) src/yolo_v2_class.hpp src/yolo_v2_class.cpp
|
||||
$(CPP) -shared -std=c++11 -fvisibility=hidden -DYOLODLL_EXPORTS $(COMMON) $(CFLAGS) $(OBJS) src/yolo_v2_class.cpp -o $@ $(LDFLAGS)
|
||||
$(LIBNAMESO): $(OBJS) include/yolo_v2_class.hpp src/yolo_v2_class.cpp
|
||||
$(CPP) -shared -std=c++11 -fvisibility=hidden -DLIB_EXPORTS $(COMMON) $(CFLAGS) $(OBJS) src/yolo_v2_class.cpp -o $@ $(LDFLAGS)
|
||||
|
||||
$(APPNAMESO): $(LIBNAMESO) src/yolo_v2_class.hpp src/yolo_console_dll.cpp
|
||||
$(CPP) -std=c++11 $(COMMON) $(CFLAGS) -o $@ src/yolo_console_dll.cpp $(LDFLAGS) -L ./ $(LIBNAMESO)
|
||||
$(APPNAMESO): $(LIBNAMESO) include/yolo_v2_class.hpp src/yolo_console_dll.cpp
|
||||
$(CPP) -std=c++11 $(COMMON) $(CFLAGS) -o $@ src/yolo_console_dll.cpp $(LDFLAGS) -L ./ -l:$(LIBNAMESO)
|
||||
endif
|
||||
|
||||
$(EXEC): $(OBJS)
|
||||
@ -147,6 +147,8 @@ backup:
|
||||
mkdir -p backup
|
||||
results:
|
||||
mkdir -p results
|
||||
setchmod:
|
||||
chmod +x *.sh
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
|
@ -88,7 +88,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>CUDNN;_CRTDBG_MAP_ALLOC;_MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>OPENCV;</UndefinePreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
@ -132,7 +132,7 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>OPENCV;CUDNN;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<CLanguageStandard>c11</CLanguageStandard>
|
||||
<CppLanguageStandard>c++1y</CppLanguageStandard>
|
||||
@ -236,6 +236,7 @@
|
||||
<ClCompile Include="..\..\src\yolo_layer.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\darknet.h" />
|
||||
<ClInclude Include="..\..\src\activations.h" />
|
||||
<ClInclude Include="..\..\src\activation_layer.h" />
|
||||
<ClInclude Include="..\..\src\avgpool_layer.h" />
|
||||
|
@ -78,7 +78,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRTDBG_MAP_ALLOC;_MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>OPENCV;</UndefinePreprocessorDefinitions>
|
||||
<ForcedIncludeFiles>stdlib.h;crtdbg.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
|
||||
@ -94,7 +94,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>OPENCV;CUDNN</UndefinePreprocessorDefinitions>
|
||||
<OpenMPSupport>true</OpenMPSupport>
|
||||
@ -118,7 +118,7 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>
|
||||
</UndefinePreprocessorDefinitions>
|
||||
@ -138,7 +138,7 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>OPENCV;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<CLanguageStandard>c11</CLanguageStandard>
|
||||
<CppLanguageStandard>c++1y</CppLanguageStandard>
|
||||
@ -241,6 +241,7 @@
|
||||
<ClCompile Include="..\..\src\yolo_layer.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\darknet.h" />
|
||||
<ClInclude Include="..\..\src\activations.h" />
|
||||
<ClInclude Include="..\..\src\activation_layer.h" />
|
||||
<ClInclude Include="..\..\src\avgpool_layer.h" />
|
||||
|
@ -75,7 +75,7 @@ class METADATA(Structure):
|
||||
|
||||
|
||||
#lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)
|
||||
#lib = CDLL("darknet.so", RTLD_GLOBAL)
|
||||
#lib = CDLL("libdarknet.so", RTLD_GLOBAL)
|
||||
hasGPU = True
|
||||
if os.name == "nt":
|
||||
cwd = os.path.dirname(__file__)
|
||||
@ -119,7 +119,7 @@ if os.name == "nt":
|
||||
lib = CDLL(winGPUdll, RTLD_GLOBAL)
|
||||
print("Environment variables indicated a CPU run, but we didn't find `"+winNoGPUdll+"`. Trying a GPU run anyway.")
|
||||
else:
|
||||
lib = CDLL("./darknet.so", RTLD_GLOBAL)
|
||||
lib = CDLL("./libdarknet.so", RTLD_GLOBAL)
|
||||
lib.network_width.argtypes = [c_void_p]
|
||||
lib.network_width.restype = c_int
|
||||
lib.network_height.argtypes = [c_void_p]
|
||||
|
5
build/darknet/x64/darknet_video.cmd
Normal file
5
build/darknet/x64/darknet_video.cmd
Normal file
@ -0,0 +1,5 @@
|
||||
rem C:\Users\Alex\AppData\Local\Programs\Python\Python36\python.exe darknet_video.py
|
||||
|
||||
C:\Python27\python.exe darknet_video.py
|
||||
|
||||
pause
|
320
build/darknet/x64/darknet_video.py
Normal file
320
build/darknet/x64/darknet_video.py
Normal file
@ -0,0 +1,320 @@
|
||||
from ctypes import *
|
||||
import math
|
||||
import random
|
||||
import os
|
||||
import cv2
|
||||
import numpy as np
|
||||
import time
|
||||
|
||||
|
||||
def sample(probs):
|
||||
s = sum(probs)
|
||||
probs = [a/s for a in probs]
|
||||
r = random.uniform(0, 1)
|
||||
for i in range(len(probs)):
|
||||
r = r - probs[i]
|
||||
if r <= 0:
|
||||
return i
|
||||
return len(probs)-1
|
||||
|
||||
|
||||
def c_array(ctype, values):
|
||||
arr = (ctype*len(values))()
|
||||
arr[:] = values
|
||||
return arr
|
||||
|
||||
|
||||
class BOX(Structure):
|
||||
_fields_ = [("x", c_float),
|
||||
("y", c_float),
|
||||
("w", c_float),
|
||||
("h", c_float)]
|
||||
|
||||
|
||||
class DETECTION(Structure):
|
||||
_fields_ = [("bbox", BOX),
|
||||
("classes", c_int),
|
||||
("prob", POINTER(c_float)),
|
||||
("mask", POINTER(c_float)),
|
||||
("objectness", c_float),
|
||||
("sort_class", c_int)]
|
||||
|
||||
|
||||
class IMAGE(Structure):
|
||||
_fields_ = [("w", c_int),
|
||||
("h", c_int),
|
||||
("c", c_int),
|
||||
("data", POINTER(c_float))]
|
||||
|
||||
|
||||
class METADATA(Structure):
|
||||
_fields_ = [("classes", c_int),
|
||||
("names", POINTER(c_char_p))]
|
||||
|
||||
|
||||
hasGPU = True
|
||||
|
||||
lib = CDLL("yolo_cpp_dll.dll", RTLD_GLOBAL)
|
||||
lib.network_width.argtypes = [c_void_p]
|
||||
lib.network_width.restype = c_int
|
||||
lib.network_height.argtypes = [c_void_p]
|
||||
lib.network_height.restype = c_int
|
||||
|
||||
predict = lib.network_predict
|
||||
predict.argtypes = [c_void_p, POINTER(c_float)]
|
||||
predict.restype = POINTER(c_float)
|
||||
|
||||
if hasGPU:
|
||||
set_gpu = lib.cuda_set_device
|
||||
set_gpu.argtypes = [c_int]
|
||||
|
||||
make_image = lib.make_image
|
||||
make_image.argtypes = [c_int, c_int, c_int]
|
||||
make_image.restype = IMAGE
|
||||
|
||||
get_network_boxes = lib.get_network_boxes
|
||||
get_network_boxes.argtypes = \
|
||||
[c_void_p, c_int, c_int, c_float, c_float, POINTER(
|
||||
c_int), c_int, POINTER(c_int), c_int]
|
||||
get_network_boxes.restype = POINTER(DETECTION)
|
||||
|
||||
make_network_boxes = lib.make_network_boxes
|
||||
make_network_boxes.argtypes = [c_void_p]
|
||||
make_network_boxes.restype = POINTER(DETECTION)
|
||||
|
||||
free_detections = lib.free_detections
|
||||
free_detections.argtypes = [POINTER(DETECTION), c_int]
|
||||
|
||||
free_ptrs = lib.free_ptrs
|
||||
free_ptrs.argtypes = [POINTER(c_void_p), c_int]
|
||||
|
||||
network_predict = lib.network_predict
|
||||
network_predict.argtypes = [c_void_p, POINTER(c_float)]
|
||||
|
||||
reset_rnn = lib.reset_rnn
|
||||
reset_rnn.argtypes = [c_void_p]
|
||||
|
||||
load_net = lib.load_network
|
||||
load_net.argtypes = [c_char_p, c_char_p, c_int]
|
||||
load_net.restype = c_void_p
|
||||
|
||||
load_net_custom = lib.load_network_custom
|
||||
load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int]
|
||||
load_net_custom.restype = c_void_p
|
||||
|
||||
do_nms_obj = lib.do_nms_obj
|
||||
do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
||||
|
||||
do_nms_sort = lib.do_nms_sort
|
||||
do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
||||
|
||||
free_image = lib.free_image
|
||||
free_image.argtypes = [IMAGE]
|
||||
|
||||
letterbox_image = lib.letterbox_image
|
||||
letterbox_image.argtypes = [IMAGE, c_int, c_int]
|
||||
letterbox_image.restype = IMAGE
|
||||
|
||||
load_meta = lib.get_metadata
|
||||
lib.get_metadata.argtypes = [c_char_p]
|
||||
lib.get_metadata.restype = METADATA
|
||||
|
||||
load_image = lib.load_image_color
|
||||
load_image.argtypes = [c_char_p, c_int, c_int]
|
||||
load_image.restype = IMAGE
|
||||
|
||||
rgbgr_image = lib.rgbgr_image
|
||||
rgbgr_image.argtypes = [IMAGE]
|
||||
|
||||
predict_image = lib.network_predict_image
|
||||
predict_image.argtypes = [c_void_p, IMAGE]
|
||||
predict_image.restype = POINTER(c_float)
|
||||
|
||||
|
||||
def array_to_image(arr):
|
||||
import numpy as np
|
||||
arr = arr.transpose(2, 0, 1)
|
||||
c = arr.shape[0]
|
||||
h = arr.shape[1]
|
||||
w = arr.shape[2]
|
||||
arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0
|
||||
data = arr.ctypes.data_as(POINTER(c_float))
|
||||
im = IMAGE(w, h, c, data)
|
||||
return im, arr
|
||||
|
||||
|
||||
def classify(net, meta, im):
|
||||
out = predict_image(net, im)
|
||||
res = []
|
||||
for i in range(meta.classes):
|
||||
if altNames is None:
|
||||
nameTag = meta.names[i]
|
||||
else:
|
||||
nameTag = altNames[i]
|
||||
res.append((nameTag, out[i]))
|
||||
res = sorted(res, key=lambda x: -x[1])
|
||||
return res
|
||||
|
||||
|
||||
def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45, debug=False):
|
||||
im, arr = array_to_image(image)
|
||||
if debug:
|
||||
print("Loaded image")
|
||||
num = c_int(0)
|
||||
if debug:
|
||||
print("Assigned num")
|
||||
pnum = pointer(num)
|
||||
if debug:
|
||||
print("Assigned pnum")
|
||||
predict_image(net, im)
|
||||
if debug:
|
||||
print("did prediction")
|
||||
# dets = get_network_boxes(
|
||||
# net, image.shape[1], image.shape[0],
|
||||
# thresh, hier_thresh,
|
||||
# None, 0, pnum, 0) # OpenCV
|
||||
dets = get_network_boxes(net, im.w, im.h,
|
||||
thresh, hier_thresh, None, 0, pnum, 0)
|
||||
if debug:
|
||||
print("Got dets")
|
||||
num = pnum[0]
|
||||
if debug:
|
||||
print("got zeroth index of pnum")
|
||||
if nms:
|
||||
do_nms_sort(dets, num, meta.classes, nms)
|
||||
if debug:
|
||||
print("did sort")
|
||||
res = []
|
||||
if debug:
|
||||
print("about to range")
|
||||
for j in range(num):
|
||||
if debug:
|
||||
print("Ranging on "+str(j)+" of "+str(num))
|
||||
if debug:
|
||||
print("Classes: "+str(meta), meta.classes, meta.names)
|
||||
for i in range(meta.classes):
|
||||
if debug:
|
||||
print("Class-ranging on "+str(i)+" of " +
|
||||
str(meta.classes)+"= "+str(dets[j].prob[i]))
|
||||
if dets[j].prob[i] > 0:
|
||||
b = dets[j].bbox
|
||||
if altNames is None:
|
||||
nameTag = meta.names[i]
|
||||
else:
|
||||
nameTag = altNames[i]
|
||||
if debug:
|
||||
print("Got bbox", b)
|
||||
print(nameTag)
|
||||
print(dets[j].prob[i])
|
||||
print((b.x, b.y, b.w, b.h))
|
||||
res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
|
||||
if debug:
|
||||
print("did range")
|
||||
res = sorted(res, key=lambda x: -x[1])
|
||||
if debug:
|
||||
print("did sort")
|
||||
# free_image(im)
|
||||
if debug:
|
||||
print("freed image")
|
||||
free_detections(dets, num)
|
||||
if debug:
|
||||
print("freed detections")
|
||||
return res
|
||||
|
||||
|
||||
def convertBack(x, y, w, h):
|
||||
xmin = int(round(x - (w / 2)))
|
||||
xmax = int(round(x + (w / 2)))
|
||||
ymin = int(round(y - (h / 2)))
|
||||
ymax = int(round(y + (h / 2)))
|
||||
return xmin, ymin, xmax, ymax
|
||||
|
||||
|
||||
def cvDrawBoxes(detections, img):
|
||||
for detection in detections:
|
||||
x, y, w, h = detection[2][0],\
|
||||
detection[2][1],\
|
||||
detection[2][2],\
|
||||
detection[2][3]
|
||||
xmin, ymin, xmax, ymax = convertBack(
|
||||
float(x), float(y), float(w), float(h))
|
||||
pt1 = (xmin, ymin)
|
||||
pt2 = (xmax, ymax)
|
||||
cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2)
|
||||
cv2.putText(img,
|
||||
detection[0].decode() +
|
||||
" [" + str(round(detection[1] * 100, 2)) + "]",
|
||||
(pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1,
|
||||
[0, 255, 0], 4)
|
||||
return img
|
||||
|
||||
|
||||
netMain = None
|
||||
metaMain = None
|
||||
altNames = None
|
||||
|
||||
|
||||
def YOLO():
|
||||
global metaMain, netMain, altNames
|
||||
configPath = "./cfg/yolov3.cfg"
|
||||
weightPath = "./yolov3.weights"
|
||||
metaPath = "./cfg/coco.data"
|
||||
if not os.path.exists(configPath):
|
||||
raise ValueError("Invalid config path `" +
|
||||
os.path.abspath(configPath)+"`")
|
||||
if not os.path.exists(weightPath):
|
||||
raise ValueError("Invalid weight path `" +
|
||||
os.path.abspath(weightPath)+"`")
|
||||
if not os.path.exists(metaPath):
|
||||
raise ValueError("Invalid data file path `" +
|
||||
os.path.abspath(metaPath)+"`")
|
||||
if netMain is None:
|
||||
netMain = load_net_custom(configPath.encode(
|
||||
"ascii"), weightPath.encode("ascii"), 0, 1) # batch size = 1
|
||||
if metaMain is None:
|
||||
metaMain = load_meta(metaPath.encode("ascii"))
|
||||
if altNames is None:
|
||||
try:
|
||||
with open(metaPath) as metaFH:
|
||||
metaContents = metaFH.read()
|
||||
import re
|
||||
match = re.search("names *= *(.*)$", metaContents,
|
||||
re.IGNORECASE | re.MULTILINE)
|
||||
if match:
|
||||
result = match.group(1)
|
||||
else:
|
||||
result = None
|
||||
try:
|
||||
if os.path.exists(result):
|
||||
with open(result) as namesFH:
|
||||
namesList = namesFH.read().strip().split("\n")
|
||||
altNames = [x.strip() for x in namesList]
|
||||
except TypeError:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
#cap = cv2.VideoCapture(0)
|
||||
cap = cv2.VideoCapture("test.mp4")
|
||||
cap.set(3, 1280)
|
||||
cap.set(4, 720)
|
||||
out = cv2.VideoWriter(
|
||||
"output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
|
||||
(lib.network_width(netMain), lib.network_height(netMain)))
|
||||
print("Starting the YOLO loop...")
|
||||
while True:
|
||||
prev_time = time.time()
|
||||
ret, frame_read = cap.read()
|
||||
frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
|
||||
frame_resized = cv2.resize(frame_rgb,
|
||||
(lib.network_width(netMain),
|
||||
lib.network_height(netMain)),
|
||||
interpolation=cv2.INTER_LINEAR)
|
||||
detections = detect(netMain, metaMain, frame_resized, thresh=0.25)
|
||||
image = cvDrawBoxes(detections, frame_resized)
|
||||
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||||
print(1/(time.time()-prev_time))
|
||||
cap.release()
|
||||
out.release()
|
||||
|
||||
if __name__ == "__main__":
|
||||
YOLO()
|
@ -80,6 +80,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\include;</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@ -87,7 +88,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\include;C:\opencv_3.0\opencv\build\include</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
@ -102,6 +103,7 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\include;</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
@ -115,7 +117,7 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_source\opencv\bin\install\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\include;C:\opencv_source\opencv\bin\install\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Async</ExceptionHandling>
|
||||
<OpenMPSupport>true</OpenMPSupport>
|
||||
@ -132,6 +134,9 @@
|
||||
<ItemGroup>
|
||||
<Library Include="x64\yolo_cpp_dll.lib" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\yolo_v2_class.hpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
@ -80,6 +80,8 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>LIB_EXPORTS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@ -90,8 +92,8 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_MBCS;YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_MBCS;LIB_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>CUDNN</UndefinePreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
@ -114,8 +116,8 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_2.4.9\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\opencv_2.4.9\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>LIB_EXPORTS;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@ -133,8 +135,8 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>CUDNN;GPU;YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>CUDNN;GPU;LIB_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<CLanguageStandard>c11</CLanguageStandard>
|
||||
<CppLanguageStandard>c++1y</CppLanguageStandard>
|
||||
<PrecompiledHeaderCompileAs>CompileAsCpp</PrecompiledHeaderCompileAs>
|
||||
@ -236,9 +238,10 @@
|
||||
<ClCompile Include="..\..\src\yolo.c" />
|
||||
<ClCompile Include="..\..\src\yolo_layer.c" />
|
||||
<ClCompile Include="..\..\src\yolo_v2_class.cpp" />
|
||||
<ClCompile Include="..\..\src\yolo_v2_class.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\darknet.h" />
|
||||
<ClInclude Include="..\..\include\yolo_v2_class.hpp" />
|
||||
<ClInclude Include="..\..\src\activations.h" />
|
||||
<ClInclude Include="..\..\src\activation_layer.h" />
|
||||
<ClInclude Include="..\..\src\avgpool_layer.h" />
|
||||
|
@ -77,6 +77,8 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\include;</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>LIB_EXPORTS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@ -87,16 +89,17 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_MBCS;YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_MBCS;LIB_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UndefinePreprocessorDefinitions>CUDNN</UndefinePreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<ForcedIncludeFiles>stdlib.h;crtdbg.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName);$(cudnn)\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<OutputFile>$(OutDir)\$(TargetName)$(TargetExt)</OutputFile>
|
||||
<AdditionalDependencies>..\..\3rdparty\lib\x64\pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>..\..\3rdparty\lib\x64\pthreadVC2.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AssemblyDebug>true</AssemblyDebug>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
@ -111,16 +114,16 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_2.4.9\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\opencv_2.4.9\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>LIB_EXPORTS;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>C:\opencv_2.4.9\opencv\build\x86\vc14\lib;C:\opencv_2.4.9\opencv\build\x86\vc12\lib;$(CUDA_PATH)lib\$(PlatformName);$(cudnn)\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>..\..\3rdparty\lib\x86\pthreadVC2.lib;cudart.lib;cublas.lib;curand.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>C:\opencv_2.4.9\opencv\build\x86\vc14\lib;C:\opencv_2.4.9\opencv\build\x86\vc12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>..\..\3rdparty\lib\x86\pthreadVC2.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@ -130,8 +133,8 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>YOLODLL_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>LIB_EXPORTS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<CLanguageStandard>c11</CLanguageStandard>
|
||||
<CppLanguageStandard>c++1y</CppLanguageStandard>
|
||||
<PrecompiledHeaderCompileAs>CompileAsCpp</PrecompiledHeaderCompileAs>
|
||||
@ -221,9 +224,10 @@
|
||||
<ClCompile Include="..\..\src\yolo.c" />
|
||||
<ClCompile Include="..\..\src\yolo_layer.c" />
|
||||
<ClCompile Include="..\..\src\yolo_v2_class.cpp" />
|
||||
<ClCompile Include="..\..\src\yolo_v2_class.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\darknet.h" />
|
||||
<ClInclude Include="..\..\include\yolo_v2_class.hpp" />
|
||||
<ClInclude Include="..\..\src\activations.h" />
|
||||
<ClInclude Include="..\..\src\activation_layer.h" />
|
||||
<ClInclude Include="..\..\src\avgpool_layer.h" />
|
||||
|
@ -75,7 +75,7 @@ class METADATA(Structure):
|
||||
|
||||
|
||||
#lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)
|
||||
#lib = CDLL("darknet.so", RTLD_GLOBAL)
|
||||
#lib = CDLL("libdarknet.so", RTLD_GLOBAL)
|
||||
hasGPU = True
|
||||
if os.name == "nt":
|
||||
cwd = os.path.dirname(__file__)
|
||||
@ -119,7 +119,7 @@ if os.name == "nt":
|
||||
lib = CDLL(winGPUdll, RTLD_GLOBAL)
|
||||
print("Environment variables indicated a CPU run, but we didn't find `"+winNoGPUdll+"`. Trying a GPU run anyway.")
|
||||
else:
|
||||
lib = CDLL("./darknet.so", RTLD_GLOBAL)
|
||||
lib = CDLL("./libdarknet.so", RTLD_GLOBAL)
|
||||
lib.network_width.argtypes = [c_void_p]
|
||||
lib.network_width.restype = c_int
|
||||
lib.network_height.argtypes = [c_void_p]
|
||||
|
320
darknet_video.py
Normal file
320
darknet_video.py
Normal file
@ -0,0 +1,320 @@
|
||||
from ctypes import *
|
||||
import math
|
||||
import random
|
||||
import os
|
||||
import cv2
|
||||
import numpy as np
|
||||
import time
|
||||
|
||||
|
||||
def sample(probs):
|
||||
s = sum(probs)
|
||||
probs = [a/s for a in probs]
|
||||
r = random.uniform(0, 1)
|
||||
for i in range(len(probs)):
|
||||
r = r - probs[i]
|
||||
if r <= 0:
|
||||
return i
|
||||
return len(probs)-1
|
||||
|
||||
|
||||
def c_array(ctype, values):
|
||||
arr = (ctype*len(values))()
|
||||
arr[:] = values
|
||||
return arr
|
||||
|
||||
|
||||
class BOX(Structure):
|
||||
_fields_ = [("x", c_float),
|
||||
("y", c_float),
|
||||
("w", c_float),
|
||||
("h", c_float)]
|
||||
|
||||
|
||||
class DETECTION(Structure):
|
||||
_fields_ = [("bbox", BOX),
|
||||
("classes", c_int),
|
||||
("prob", POINTER(c_float)),
|
||||
("mask", POINTER(c_float)),
|
||||
("objectness", c_float),
|
||||
("sort_class", c_int)]
|
||||
|
||||
|
||||
class IMAGE(Structure):
|
||||
_fields_ = [("w", c_int),
|
||||
("h", c_int),
|
||||
("c", c_int),
|
||||
("data", POINTER(c_float))]
|
||||
|
||||
|
||||
class METADATA(Structure):
|
||||
_fields_ = [("classes", c_int),
|
||||
("names", POINTER(c_char_p))]
|
||||
|
||||
|
||||
hasGPU = True
|
||||
|
||||
lib = CDLL("./libdarknet.so", RTLD_GLOBAL)
|
||||
lib.network_width.argtypes = [c_void_p]
|
||||
lib.network_width.restype = c_int
|
||||
lib.network_height.argtypes = [c_void_p]
|
||||
lib.network_height.restype = c_int
|
||||
|
||||
predict = lib.network_predict
|
||||
predict.argtypes = [c_void_p, POINTER(c_float)]
|
||||
predict.restype = POINTER(c_float)
|
||||
|
||||
if hasGPU:
|
||||
set_gpu = lib.cuda_set_device
|
||||
set_gpu.argtypes = [c_int]
|
||||
|
||||
make_image = lib.make_image
|
||||
make_image.argtypes = [c_int, c_int, c_int]
|
||||
make_image.restype = IMAGE
|
||||
|
||||
get_network_boxes = lib.get_network_boxes
|
||||
get_network_boxes.argtypes = \
|
||||
[c_void_p, c_int, c_int, c_float, c_float, POINTER(
|
||||
c_int), c_int, POINTER(c_int), c_int]
|
||||
get_network_boxes.restype = POINTER(DETECTION)
|
||||
|
||||
make_network_boxes = lib.make_network_boxes
|
||||
make_network_boxes.argtypes = [c_void_p]
|
||||
make_network_boxes.restype = POINTER(DETECTION)
|
||||
|
||||
free_detections = lib.free_detections
|
||||
free_detections.argtypes = [POINTER(DETECTION), c_int]
|
||||
|
||||
free_ptrs = lib.free_ptrs
|
||||
free_ptrs.argtypes = [POINTER(c_void_p), c_int]
|
||||
|
||||
network_predict = lib.network_predict
|
||||
network_predict.argtypes = [c_void_p, POINTER(c_float)]
|
||||
|
||||
reset_rnn = lib.reset_rnn
|
||||
reset_rnn.argtypes = [c_void_p]
|
||||
|
||||
load_net = lib.load_network
|
||||
load_net.argtypes = [c_char_p, c_char_p, c_int]
|
||||
load_net.restype = c_void_p
|
||||
|
||||
load_net_custom = lib.load_network_custom
|
||||
load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int]
|
||||
load_net_custom.restype = c_void_p
|
||||
|
||||
do_nms_obj = lib.do_nms_obj
|
||||
do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
||||
|
||||
do_nms_sort = lib.do_nms_sort
|
||||
do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
||||
|
||||
free_image = lib.free_image
|
||||
free_image.argtypes = [IMAGE]
|
||||
|
||||
letterbox_image = lib.letterbox_image
|
||||
letterbox_image.argtypes = [IMAGE, c_int, c_int]
|
||||
letterbox_image.restype = IMAGE
|
||||
|
||||
load_meta = lib.get_metadata
|
||||
lib.get_metadata.argtypes = [c_char_p]
|
||||
lib.get_metadata.restype = METADATA
|
||||
|
||||
load_image = lib.load_image_color
|
||||
load_image.argtypes = [c_char_p, c_int, c_int]
|
||||
load_image.restype = IMAGE
|
||||
|
||||
rgbgr_image = lib.rgbgr_image
|
||||
rgbgr_image.argtypes = [IMAGE]
|
||||
|
||||
predict_image = lib.network_predict_image
|
||||
predict_image.argtypes = [c_void_p, IMAGE]
|
||||
predict_image.restype = POINTER(c_float)
|
||||
|
||||
|
||||
def array_to_image(arr):
|
||||
import numpy as np
|
||||
arr = arr.transpose(2, 0, 1)
|
||||
c = arr.shape[0]
|
||||
h = arr.shape[1]
|
||||
w = arr.shape[2]
|
||||
arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0
|
||||
data = arr.ctypes.data_as(POINTER(c_float))
|
||||
im = IMAGE(w, h, c, data)
|
||||
return im, arr
|
||||
|
||||
|
||||
def classify(net, meta, im):
|
||||
out = predict_image(net, im)
|
||||
res = []
|
||||
for i in range(meta.classes):
|
||||
if altNames is None:
|
||||
nameTag = meta.names[i]
|
||||
else:
|
||||
nameTag = altNames[i]
|
||||
res.append((nameTag, out[i]))
|
||||
res = sorted(res, key=lambda x: -x[1])
|
||||
return res
|
||||
|
||||
|
||||
def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45, debug=False):
|
||||
im, arr = array_to_image(image)
|
||||
if debug:
|
||||
print("Loaded image")
|
||||
num = c_int(0)
|
||||
if debug:
|
||||
print("Assigned num")
|
||||
pnum = pointer(num)
|
||||
if debug:
|
||||
print("Assigned pnum")
|
||||
predict_image(net, im)
|
||||
if debug:
|
||||
print("did prediction")
|
||||
# dets = get_network_boxes(
|
||||
# net, image.shape[1], image.shape[0],
|
||||
# thresh, hier_thresh,
|
||||
# None, 0, pnum, 0) # OpenCV
|
||||
dets = get_network_boxes(net, im.w, im.h,
|
||||
thresh, hier_thresh, None, 0, pnum, 0)
|
||||
if debug:
|
||||
print("Got dets")
|
||||
num = pnum[0]
|
||||
if debug:
|
||||
print("got zeroth index of pnum")
|
||||
if nms:
|
||||
do_nms_sort(dets, num, meta.classes, nms)
|
||||
if debug:
|
||||
print("did sort")
|
||||
res = []
|
||||
if debug:
|
||||
print("about to range")
|
||||
for j in range(num):
|
||||
if debug:
|
||||
print("Ranging on "+str(j)+" of "+str(num))
|
||||
if debug:
|
||||
print("Classes: "+str(meta), meta.classes, meta.names)
|
||||
for i in range(meta.classes):
|
||||
if debug:
|
||||
print("Class-ranging on "+str(i)+" of " +
|
||||
str(meta.classes)+"= "+str(dets[j].prob[i]))
|
||||
if dets[j].prob[i] > 0:
|
||||
b = dets[j].bbox
|
||||
if altNames is None:
|
||||
nameTag = meta.names[i]
|
||||
else:
|
||||
nameTag = altNames[i]
|
||||
if debug:
|
||||
print("Got bbox", b)
|
||||
print(nameTag)
|
||||
print(dets[j].prob[i])
|
||||
print((b.x, b.y, b.w, b.h))
|
||||
res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
|
||||
if debug:
|
||||
print("did range")
|
||||
res = sorted(res, key=lambda x: -x[1])
|
||||
if debug:
|
||||
print("did sort")
|
||||
# free_image(im)
|
||||
if debug:
|
||||
print("freed image")
|
||||
free_detections(dets, num)
|
||||
if debug:
|
||||
print("freed detections")
|
||||
return res
|
||||
|
||||
|
||||
def convertBack(x, y, w, h):
|
||||
xmin = int(round(x - (w / 2)))
|
||||
xmax = int(round(x + (w / 2)))
|
||||
ymin = int(round(y - (h / 2)))
|
||||
ymax = int(round(y + (h / 2)))
|
||||
return xmin, ymin, xmax, ymax
|
||||
|
||||
|
||||
def cvDrawBoxes(detections, img):
|
||||
for detection in detections:
|
||||
x, y, w, h = detection[2][0],\
|
||||
detection[2][1],\
|
||||
detection[2][2],\
|
||||
detection[2][3]
|
||||
xmin, ymin, xmax, ymax = convertBack(
|
||||
float(x), float(y), float(w), float(h))
|
||||
pt1 = (xmin, ymin)
|
||||
pt2 = (xmax, ymax)
|
||||
cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2)
|
||||
cv2.putText(img,
|
||||
detection[0].decode() +
|
||||
" [" + str(round(detection[1] * 100, 2)) + "]",
|
||||
(pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1,
|
||||
[0, 255, 0], 4)
|
||||
return img
|
||||
|
||||
|
||||
netMain = None
|
||||
metaMain = None
|
||||
altNames = None
|
||||
|
||||
|
||||
def YOLO():
|
||||
global metaMain, netMain, altNames
|
||||
configPath = "./cfg/yolov3.cfg"
|
||||
weightPath = "./yolov3.weights"
|
||||
metaPath = "./cfg/coco.data"
|
||||
if not os.path.exists(configPath):
|
||||
raise ValueError("Invalid config path `" +
|
||||
os.path.abspath(configPath)+"`")
|
||||
if not os.path.exists(weightPath):
|
||||
raise ValueError("Invalid weight path `" +
|
||||
os.path.abspath(weightPath)+"`")
|
||||
if not os.path.exists(metaPath):
|
||||
raise ValueError("Invalid data file path `" +
|
||||
os.path.abspath(metaPath)+"`")
|
||||
if netMain is None:
|
||||
netMain = load_net_custom(configPath.encode(
|
||||
"ascii"), weightPath.encode("ascii"), 0, 1) # batch size = 1
|
||||
if metaMain is None:
|
||||
metaMain = load_meta(metaPath.encode("ascii"))
|
||||
if altNames is None:
|
||||
try:
|
||||
with open(metaPath) as metaFH:
|
||||
metaContents = metaFH.read()
|
||||
import re
|
||||
match = re.search("names *= *(.*)$", metaContents,
|
||||
re.IGNORECASE | re.MULTILINE)
|
||||
if match:
|
||||
result = match.group(1)
|
||||
else:
|
||||
result = None
|
||||
try:
|
||||
if os.path.exists(result):
|
||||
with open(result) as namesFH:
|
||||
namesList = namesFH.read().strip().split("\n")
|
||||
altNames = [x.strip() for x in namesList]
|
||||
except TypeError:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
#cap = cv2.VideoCapture(0)
|
||||
cap = cv2.VideoCapture("test.mp4")
|
||||
cap.set(3, 1280)
|
||||
cap.set(4, 720)
|
||||
out = cv2.VideoWriter(
|
||||
"output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
|
||||
(lib.network_width(netMain), lib.network_height(netMain)))
|
||||
print("Starting the YOLO loop...")
|
||||
while True:
|
||||
prev_time = time.time()
|
||||
ret, frame_read = cap.read()
|
||||
frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
|
||||
frame_resized = cv2.resize(frame_rgb,
|
||||
(lib.network_width(netMain),
|
||||
lib.network_height(netMain)),
|
||||
interpolation=cv2.INTER_LINEAR)
|
||||
detections = detect(netMain, metaMain, frame_resized, thresh=0.25)
|
||||
image = cvDrawBoxes(detections, frame_resized)
|
||||
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||||
print(1/(time.time()-prev_time))
|
||||
cap.release()
|
||||
out.release()
|
||||
|
||||
if __name__ == "__main__":
|
||||
YOLO()
|
793
include/darknet.h
Normal file
793
include/darknet.h
Normal file
@ -0,0 +1,793 @@
|
||||
#ifndef DARKNET_API
|
||||
#define DARKNET_API
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef LIB_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define LIB_API __declspec(dllexport)
|
||||
#else
|
||||
#define LIB_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define LIB_API
|
||||
#else
|
||||
#define LIB_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef GPU
|
||||
#define BLOCK 512
|
||||
|
||||
#include "cuda_runtime.h"
|
||||
#include "curand.h"
|
||||
#include "cublas_v2.h"
|
||||
|
||||
#ifdef CUDNN
|
||||
#include "cudnn.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct network;
|
||||
typedef struct network network;
|
||||
|
||||
struct network_state;
|
||||
typedef struct network_state;
|
||||
|
||||
struct layer;
|
||||
typedef struct layer layer;
|
||||
|
||||
struct image;
|
||||
typedef struct image image;
|
||||
|
||||
struct detection;
|
||||
typedef struct detection detection;
|
||||
|
||||
struct load_args;
|
||||
typedef struct load_args load_args;
|
||||
|
||||
struct data;
|
||||
typedef struct data data;
|
||||
|
||||
struct metadata;
|
||||
typedef struct metadata metadata;
|
||||
|
||||
struct tree;
|
||||
typedef struct tree tree;
|
||||
|
||||
|
||||
#define SECRET_NUM -1234
|
||||
extern int gpu_index;
|
||||
|
||||
// option_list.h
|
||||
typedef struct metadata {
|
||||
int classes;
|
||||
char **names;
|
||||
} metadata;
|
||||
|
||||
|
||||
// tree.h
|
||||
typedef struct tree {
|
||||
int *leaf;
|
||||
int n;
|
||||
int *parent;
|
||||
int *child;
|
||||
int *group;
|
||||
char **name;
|
||||
|
||||
int groups;
|
||||
int *group_size;
|
||||
int *group_offset;
|
||||
} tree;
|
||||
|
||||
|
||||
// activations.h
|
||||
typedef enum {
|
||||
LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU
|
||||
}ACTIVATION;
|
||||
|
||||
// image.h
|
||||
typedef enum{
|
||||
PNG, BMP, TGA, JPG
|
||||
} IMTYPE;
|
||||
|
||||
// activations.h
|
||||
typedef enum{
|
||||
MULT, ADD, SUB, DIV
|
||||
} BINARY_ACTIVATION;
|
||||
|
||||
// layer.h
|
||||
typedef enum {
|
||||
CONVOLUTIONAL,
|
||||
DECONVOLUTIONAL,
|
||||
CONNECTED,
|
||||
MAXPOOL,
|
||||
SOFTMAX,
|
||||
DETECTION,
|
||||
DROPOUT,
|
||||
CROP,
|
||||
ROUTE,
|
||||
COST,
|
||||
NORMALIZATION,
|
||||
AVGPOOL,
|
||||
LOCAL,
|
||||
SHORTCUT,
|
||||
ACTIVE,
|
||||
RNN,
|
||||
GRU,
|
||||
LSTM,
|
||||
CRNN,
|
||||
BATCHNORM,
|
||||
NETWORK,
|
||||
XNOR,
|
||||
REGION,
|
||||
YOLO,
|
||||
ISEG,
|
||||
REORG,
|
||||
REORG_OLD,
|
||||
UPSAMPLE,
|
||||
LOGXENT,
|
||||
L2NORM,
|
||||
BLANK
|
||||
} LAYER_TYPE;
|
||||
|
||||
// layer.h
|
||||
typedef enum{
|
||||
SSE, MASKED, L1, SEG, SMOOTH,WGAN
|
||||
} COST_TYPE;
|
||||
|
||||
// layer.h
|
||||
typedef struct update_args {
|
||||
int batch;
|
||||
float learning_rate;
|
||||
float momentum;
|
||||
float decay;
|
||||
int adam;
|
||||
float B1;
|
||||
float B2;
|
||||
float eps;
|
||||
int t;
|
||||
} update_args;
|
||||
|
||||
// layer.h
|
||||
struct layer {
|
||||
LAYER_TYPE type;
|
||||
ACTIVATION activation;
|
||||
COST_TYPE cost_type;
|
||||
void(*forward) (struct layer, struct network_state);
|
||||
void(*backward) (struct layer, struct network_state);
|
||||
void(*update) (struct layer, int, float, float, float);
|
||||
void(*forward_gpu) (struct layer, struct network_state);
|
||||
void(*backward_gpu) (struct layer, struct network_state);
|
||||
void(*update_gpu) (struct layer, int, float, float, float);
|
||||
int batch_normalize;
|
||||
int shortcut;
|
||||
int batch;
|
||||
int forced;
|
||||
int flipped;
|
||||
int inputs;
|
||||
int outputs;
|
||||
int nweights;
|
||||
int nbiases;
|
||||
int extra;
|
||||
int truths;
|
||||
int h, w, c;
|
||||
int out_h, out_w, out_c;
|
||||
int n;
|
||||
int max_boxes;
|
||||
int groups;
|
||||
int size;
|
||||
int side;
|
||||
int stride;
|
||||
int reverse;
|
||||
int flatten;
|
||||
int spatial;
|
||||
int pad;
|
||||
int sqrt;
|
||||
int flip;
|
||||
int index;
|
||||
int binary;
|
||||
int xnor;
|
||||
int use_bin_output;
|
||||
int steps;
|
||||
int hidden;
|
||||
int truth;
|
||||
float smooth;
|
||||
float dot;
|
||||
float angle;
|
||||
float jitter;
|
||||
float saturation;
|
||||
float exposure;
|
||||
float shift;
|
||||
float ratio;
|
||||
float learning_rate_scale;
|
||||
float clip;
|
||||
int focal_loss;
|
||||
int noloss;
|
||||
int softmax;
|
||||
int classes;
|
||||
int coords;
|
||||
int background;
|
||||
int rescore;
|
||||
int objectness;
|
||||
int does_cost;
|
||||
int joint;
|
||||
int noadjust;
|
||||
int reorg;
|
||||
int log;
|
||||
int tanh;
|
||||
int *mask;
|
||||
int total;
|
||||
float bflops;
|
||||
|
||||
int adam;
|
||||
float B1;
|
||||
float B2;
|
||||
float eps;
|
||||
|
||||
int t;
|
||||
|
||||
float alpha;
|
||||
float beta;
|
||||
float kappa;
|
||||
|
||||
float coord_scale;
|
||||
float object_scale;
|
||||
float noobject_scale;
|
||||
float mask_scale;
|
||||
float class_scale;
|
||||
int bias_match;
|
||||
int random;
|
||||
float ignore_thresh;
|
||||
float truth_thresh;
|
||||
float thresh;
|
||||
float focus;
|
||||
int classfix;
|
||||
int absolute;
|
||||
|
||||
int onlyforward;
|
||||
int stopbackward;
|
||||
int dontload;
|
||||
int dontsave;
|
||||
int dontloadscales;
|
||||
int numload;
|
||||
|
||||
float temperature;
|
||||
float probability;
|
||||
float scale;
|
||||
|
||||
char * cweights;
|
||||
int * indexes;
|
||||
int * input_layers;
|
||||
int * input_sizes;
|
||||
int * map;
|
||||
int * counts;
|
||||
float ** sums;
|
||||
float * rand;
|
||||
float * cost;
|
||||
float * state;
|
||||
float * prev_state;
|
||||
float * forgot_state;
|
||||
float * forgot_delta;
|
||||
float * state_delta;
|
||||
float * combine_cpu;
|
||||
float * combine_delta_cpu;
|
||||
|
||||
float *concat;
|
||||
float *concat_delta;
|
||||
|
||||
float *binary_weights;
|
||||
|
||||
float *biases;
|
||||
float *bias_updates;
|
||||
|
||||
float *scales;
|
||||
float *scale_updates;
|
||||
|
||||
float *weights;
|
||||
float *weight_updates;
|
||||
|
||||
char *align_bit_weights_gpu;
|
||||
float *mean_arr_gpu;
|
||||
float *align_workspace_gpu;
|
||||
float *transposed_align_workspace_gpu;
|
||||
int align_workspace_size;
|
||||
|
||||
char *align_bit_weights;
|
||||
float *mean_arr;
|
||||
int align_bit_weights_size;
|
||||
int lda_align;
|
||||
int new_lda;
|
||||
int bit_align;
|
||||
|
||||
float *col_image;
|
||||
float * delta;
|
||||
float * output;
|
||||
float * loss;
|
||||
float * squared;
|
||||
float * norms;
|
||||
|
||||
float * spatial_mean;
|
||||
float * mean;
|
||||
float * variance;
|
||||
|
||||
float * mean_delta;
|
||||
float * variance_delta;
|
||||
|
||||
float * rolling_mean;
|
||||
float * rolling_variance;
|
||||
|
||||
float * x;
|
||||
float * x_norm;
|
||||
|
||||
float * m;
|
||||
float * v;
|
||||
|
||||
float * bias_m;
|
||||
float * bias_v;
|
||||
float * scale_m;
|
||||
float * scale_v;
|
||||
|
||||
|
||||
float *z_cpu;
|
||||
float *r_cpu;
|
||||
float *h_cpu;
|
||||
float * prev_state_cpu;
|
||||
|
||||
float *temp_cpu;
|
||||
float *temp2_cpu;
|
||||
float *temp3_cpu;
|
||||
|
||||
float *dh_cpu;
|
||||
float *hh_cpu;
|
||||
float *prev_cell_cpu;
|
||||
float *cell_cpu;
|
||||
float *f_cpu;
|
||||
float *i_cpu;
|
||||
float *g_cpu;
|
||||
float *o_cpu;
|
||||
float *c_cpu;
|
||||
float *dc_cpu;
|
||||
|
||||
float * binary_input;
|
||||
|
||||
struct layer *input_layer;
|
||||
struct layer *self_layer;
|
||||
struct layer *output_layer;
|
||||
|
||||
struct layer *reset_layer;
|
||||
struct layer *update_layer;
|
||||
struct layer *state_layer;
|
||||
|
||||
struct layer *input_gate_layer;
|
||||
struct layer *state_gate_layer;
|
||||
struct layer *input_save_layer;
|
||||
struct layer *state_save_layer;
|
||||
struct layer *input_state_layer;
|
||||
struct layer *state_state_layer;
|
||||
|
||||
struct layer *input_z_layer;
|
||||
struct layer *state_z_layer;
|
||||
|
||||
struct layer *input_r_layer;
|
||||
struct layer *state_r_layer;
|
||||
|
||||
struct layer *input_h_layer;
|
||||
struct layer *state_h_layer;
|
||||
|
||||
struct layer *wz;
|
||||
struct layer *uz;
|
||||
struct layer *wr;
|
||||
struct layer *ur;
|
||||
struct layer *wh;
|
||||
struct layer *uh;
|
||||
struct layer *uo;
|
||||
struct layer *wo;
|
||||
struct layer *uf;
|
||||
struct layer *wf;
|
||||
struct layer *ui;
|
||||
struct layer *wi;
|
||||
struct layer *ug;
|
||||
struct layer *wg;
|
||||
|
||||
tree *softmax_tree;
|
||||
|
||||
size_t workspace_size;
|
||||
|
||||
#ifdef GPU
|
||||
int *indexes_gpu;
|
||||
|
||||
float *z_gpu;
|
||||
float *r_gpu;
|
||||
float *h_gpu;
|
||||
|
||||
float *temp_gpu;
|
||||
float *temp2_gpu;
|
||||
float *temp3_gpu;
|
||||
|
||||
float *dh_gpu;
|
||||
float *hh_gpu;
|
||||
float *prev_cell_gpu;
|
||||
float *cell_gpu;
|
||||
float *f_gpu;
|
||||
float *i_gpu;
|
||||
float *g_gpu;
|
||||
float *o_gpu;
|
||||
float *c_gpu;
|
||||
float *dc_gpu;
|
||||
|
||||
// adam
|
||||
float *m_gpu;
|
||||
float *v_gpu;
|
||||
float *bias_m_gpu;
|
||||
float *scale_m_gpu;
|
||||
float *bias_v_gpu;
|
||||
float *scale_v_gpu;
|
||||
|
||||
float * combine_gpu;
|
||||
float * combine_delta_gpu;
|
||||
|
||||
float * prev_state_gpu;
|
||||
float * forgot_state_gpu;
|
||||
float * forgot_delta_gpu;
|
||||
float * state_gpu;
|
||||
float * state_delta_gpu;
|
||||
float * gate_gpu;
|
||||
float * gate_delta_gpu;
|
||||
float * save_gpu;
|
||||
float * save_delta_gpu;
|
||||
float * concat_gpu;
|
||||
float * concat_delta_gpu;
|
||||
|
||||
float *binary_input_gpu;
|
||||
float *binary_weights_gpu;
|
||||
|
||||
float * mean_gpu;
|
||||
float * variance_gpu;
|
||||
|
||||
float * rolling_mean_gpu;
|
||||
float * rolling_variance_gpu;
|
||||
|
||||
float * variance_delta_gpu;
|
||||
float * mean_delta_gpu;
|
||||
|
||||
float * col_image_gpu;
|
||||
|
||||
float * x_gpu;
|
||||
float * x_norm_gpu;
|
||||
float * weights_gpu;
|
||||
float * weight_updates_gpu;
|
||||
float * weight_change_gpu;
|
||||
|
||||
float * weights_gpu16;
|
||||
float * weight_updates_gpu16;
|
||||
|
||||
float * biases_gpu;
|
||||
float * bias_updates_gpu;
|
||||
float * bias_change_gpu;
|
||||
|
||||
float * scales_gpu;
|
||||
float * scale_updates_gpu;
|
||||
float * scale_change_gpu;
|
||||
|
||||
float * output_gpu;
|
||||
float * loss_gpu;
|
||||
float * delta_gpu;
|
||||
float * rand_gpu;
|
||||
float * squared_gpu;
|
||||
float * norms_gpu;
|
||||
#ifdef CUDNN
|
||||
cudnnTensorDescriptor_t srcTensorDesc, dstTensorDesc;
|
||||
cudnnTensorDescriptor_t srcTensorDesc16, dstTensorDesc16;
|
||||
cudnnTensorDescriptor_t dsrcTensorDesc, ddstTensorDesc;
|
||||
cudnnTensorDescriptor_t dsrcTensorDesc16, ddstTensorDesc16;
|
||||
cudnnTensorDescriptor_t normTensorDesc, normDstTensorDesc, normDstTensorDescF16;
|
||||
cudnnFilterDescriptor_t weightDesc, weightDesc16;
|
||||
cudnnFilterDescriptor_t dweightDesc, dweightDesc16;
|
||||
cudnnConvolutionDescriptor_t convDesc;
|
||||
cudnnConvolutionFwdAlgo_t fw_algo, fw_algo16;
|
||||
cudnnConvolutionBwdDataAlgo_t bd_algo, bd_algo16;
|
||||
cudnnConvolutionBwdFilterAlgo_t bf_algo, bf_algo16;
|
||||
cudnnPoolingDescriptor_t poolingDesc;
|
||||
#endif // CUDNN
|
||||
#endif // GPU
|
||||
};
|
||||
|
||||
|
||||
// network.h
|
||||
typedef enum {
|
||||
CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
|
||||
} learning_rate_policy;
|
||||
|
||||
// network.h
|
||||
typedef struct network {
|
||||
int n;
|
||||
int batch;
|
||||
uint64_t *seen;
|
||||
int *t;
|
||||
float epoch;
|
||||
int subdivisions;
|
||||
layer *layers;
|
||||
float *output;
|
||||
learning_rate_policy policy;
|
||||
|
||||
float learning_rate;
|
||||
float momentum;
|
||||
float decay;
|
||||
float gamma;
|
||||
float scale;
|
||||
float power;
|
||||
int time_steps;
|
||||
int step;
|
||||
int max_batches;
|
||||
float *scales;
|
||||
int *steps;
|
||||
int num_steps;
|
||||
int burn_in;
|
||||
int cudnn_half;
|
||||
|
||||
int adam;
|
||||
float B1;
|
||||
float B2;
|
||||
float eps;
|
||||
|
||||
int inputs;
|
||||
int outputs;
|
||||
int truths;
|
||||
int notruth;
|
||||
int h, w, c;
|
||||
int max_crop;
|
||||
int min_crop;
|
||||
float max_ratio;
|
||||
float min_ratio;
|
||||
int center;
|
||||
int flip; // horizontal flip 50% probability augmentaiont for classifier training (default = 1)
|
||||
float angle;
|
||||
float aspect;
|
||||
float exposure;
|
||||
float saturation;
|
||||
float hue;
|
||||
int random;
|
||||
int small_object;
|
||||
|
||||
int gpu_index;
|
||||
tree *hierarchy;
|
||||
|
||||
float *input;
|
||||
float *truth;
|
||||
float *delta;
|
||||
float *workspace;
|
||||
int train;
|
||||
int index;
|
||||
float *cost;
|
||||
float clip;
|
||||
|
||||
#ifdef GPU
|
||||
//float *input_gpu;
|
||||
//float *truth_gpu;
|
||||
float *delta_gpu;
|
||||
float *output_gpu;
|
||||
|
||||
float *input_state_gpu;
|
||||
|
||||
float **input_gpu;
|
||||
float **truth_gpu;
|
||||
float **input16_gpu;
|
||||
float **output16_gpu;
|
||||
size_t *max_input16_size;
|
||||
size_t *max_output16_size;
|
||||
int wait_stream;
|
||||
#endif
|
||||
} network;
|
||||
|
||||
// network.h
|
||||
typedef struct network_state {
|
||||
float *truth;
|
||||
float *input;
|
||||
float *delta;
|
||||
float *workspace;
|
||||
int train;
|
||||
int index;
|
||||
network net;
|
||||
} network_state;
|
||||
|
||||
//typedef struct {
|
||||
// int w;
|
||||
// int h;
|
||||
// float scale;
|
||||
// float rad;
|
||||
// float dx;
|
||||
// float dy;
|
||||
// float aspect;
|
||||
//} augment_args;
|
||||
|
||||
// image.h
|
||||
typedef struct image {
|
||||
int w;
|
||||
int h;
|
||||
int c;
|
||||
float *data;
|
||||
} image;
|
||||
|
||||
//typedef struct {
|
||||
// int w;
|
||||
// int h;
|
||||
// int c;
|
||||
// float *data;
|
||||
//} image;
|
||||
|
||||
// box.h
|
||||
typedef struct box {
|
||||
float x, y, w, h;
|
||||
} box;
|
||||
|
||||
// box.h
|
||||
typedef struct detection{
|
||||
box bbox;
|
||||
int classes;
|
||||
float *prob;
|
||||
float *mask;
|
||||
float objectness;
|
||||
int sort_class;
|
||||
} detection;
|
||||
|
||||
// matrix.h
|
||||
typedef struct matrix {
|
||||
int rows, cols;
|
||||
float **vals;
|
||||
} matrix;
|
||||
|
||||
// data.h
|
||||
typedef struct data {
|
||||
int w, h;
|
||||
matrix X;
|
||||
matrix y;
|
||||
int shallow;
|
||||
int *num_boxes;
|
||||
box **boxes;
|
||||
} data;
|
||||
|
||||
// data.h
|
||||
typedef enum {
|
||||
CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA, INSTANCE_DATA, ISEG_DATA
|
||||
} data_type;
|
||||
|
||||
// data.h
|
||||
typedef struct load_args {
|
||||
int threads;
|
||||
char **paths;
|
||||
char *path;
|
||||
int n;
|
||||
int m;
|
||||
char **labels;
|
||||
int h;
|
||||
int w;
|
||||
int c; // color depth
|
||||
int out_w;
|
||||
int out_h;
|
||||
int nh;
|
||||
int nw;
|
||||
int num_boxes;
|
||||
int min, max, size;
|
||||
int classes;
|
||||
int background;
|
||||
int scale;
|
||||
int center;
|
||||
int coords;
|
||||
int small_object;
|
||||
float jitter;
|
||||
int flip;
|
||||
float angle;
|
||||
float aspect;
|
||||
float saturation;
|
||||
float exposure;
|
||||
float hue;
|
||||
data *d;
|
||||
image *im;
|
||||
image *resized;
|
||||
data_type type;
|
||||
tree *hierarchy;
|
||||
} load_args;
|
||||
|
||||
// data.h
|
||||
typedef struct box_label {
|
||||
int id;
|
||||
float x, y, w, h;
|
||||
float left, right, top, bottom;
|
||||
} box_label;
|
||||
|
||||
// list.h
|
||||
//typedef struct node {
|
||||
// void *val;
|
||||
// struct node *next;
|
||||
// struct node *prev;
|
||||
//} node;
|
||||
|
||||
// list.h
|
||||
//typedef struct list {
|
||||
// int size;
|
||||
// node *front;
|
||||
// node *back;
|
||||
//} list;
|
||||
|
||||
// -----------------------------------------------------
|
||||
|
||||
|
||||
// parser.c
|
||||
LIB_API network *load_network(char *cfg, char *weights, int clear);
|
||||
LIB_API network *load_network_custom(char *cfg, char *weights, int clear, int batch);
|
||||
LIB_API network *load_network(char *cfg, char *weights, int clear);
|
||||
|
||||
// network.c
|
||||
LIB_API load_args get_base_args(network *net);
|
||||
|
||||
// box.h
|
||||
LIB_API void do_nms_sort(detection *dets, int total, int classes, float thresh);
|
||||
LIB_API void do_nms_obj(detection *dets, int total, int classes, float thresh);
|
||||
|
||||
// network.h
|
||||
LIB_API float *network_predict(network net, float *input);
|
||||
LIB_API detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num, int letter);
|
||||
LIB_API void free_detections(detection *dets, int n);
|
||||
LIB_API void fuse_conv_batchnorm(network net);
|
||||
LIB_API void calculate_binary_weights(network net);
|
||||
|
||||
LIB_API layer* get_network_layer(network* net, int i);
|
||||
LIB_API detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num, int letter);
|
||||
LIB_API detection *make_network_boxes(network *net, float thresh, int *num);
|
||||
LIB_API void reset_rnn(network *net);
|
||||
LIB_API float *network_predict_image(network *net, image im);
|
||||
LIB_API float validate_detector_map(char *datacfg, char *cfgfile, char *weightfile, float thresh_calc_avg_iou, const float iou_thresh, network *existing_net);
|
||||
LIB_API void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map);
|
||||
LIB_API int network_width(network *net);
|
||||
LIB_API int network_height(network *net);
|
||||
LIB_API void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm);
|
||||
|
||||
// image.h
|
||||
LIB_API image resize_image(image im, int w, int h);
|
||||
LIB_API image letterbox_image(image im, int w, int h);
|
||||
LIB_API void rgbgr_image(image im);
|
||||
LIB_API image make_image(int w, int h, int c);
|
||||
LIB_API image load_image_color(char *filename, int w, int h);
|
||||
LIB_API void free_image(image m);
|
||||
|
||||
// layer.h
|
||||
LIB_API void free_layer(layer);
|
||||
|
||||
// data.c
|
||||
LIB_API void free_data(data d);
|
||||
LIB_API pthread_t load_data(load_args args);
|
||||
LIB_API pthread_t load_data_in_thread(load_args args);
|
||||
|
||||
// cuda.h
|
||||
LIB_API void cuda_pull_array(float *x_gpu, float *x, size_t n);
|
||||
LIB_API void cuda_set_device(int n);
|
||||
|
||||
// utils.h
|
||||
LIB_API void free_ptrs(void **ptrs, int n);
|
||||
LIB_API void top_k(float *a, int n, int k, int *index);
|
||||
|
||||
// tree.h
|
||||
LIB_API tree *read_tree(char *filename);
|
||||
|
||||
// option_list.h
|
||||
LIB_API metadata get_metadata(char *file);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
#endif // DARKNET_API
|
@ -1,15 +1,15 @@
|
||||
#pragma once
|
||||
#ifdef YOLODLL_EXPORTS
|
||||
#ifdef LIB_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllexport)
|
||||
#define LIB_EXPORTS __declspec(dllexport)
|
||||
#else
|
||||
#define YOLODLL_API __attribute__((visibility("default")))
|
||||
#define LIB_EXPORTS __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllimport)
|
||||
#define LIB_EXPORTS __declspec(dllimport)
|
||||
#else
|
||||
#define YOLODLL_API
|
||||
#define LIB_EXPORTS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -45,12 +45,12 @@ struct bbox_t_container {
|
||||
#include "opencv2/imgproc/imgproc_c.h" // C
|
||||
#endif // OPENCV
|
||||
|
||||
extern "C" YOLODLL_API int init(const char *configurationFilename, const char *weightsFilename, int gpu);
|
||||
extern "C" YOLODLL_API int detect_image(const char *filename, bbox_t_container &container);
|
||||
extern "C" YOLODLL_API int detect_mat(const uint8_t* data, const size_t data_length, bbox_t_container &container);
|
||||
extern "C" YOLODLL_API int dispose();
|
||||
extern "C" YOLODLL_API int get_device_count();
|
||||
extern "C" YOLODLL_API int get_device_name(int gpu, char* deviceName);
|
||||
extern "C" LIB_EXPORTS int init(const char *configurationFilename, const char *weightsFilename, int gpu);
|
||||
extern "C" LIB_EXPORTS int detect_image(const char *filename, bbox_t_container &container);
|
||||
extern "C" LIB_EXPORTS int detect_mat(const uint8_t* data, const size_t data_length, bbox_t_container &container);
|
||||
extern "C" LIB_EXPORTS int dispose();
|
||||
extern "C" LIB_EXPORTS int get_device_count();
|
||||
extern "C" LIB_EXPORTS int get_device_name(int gpu, char* deviceName);
|
||||
|
||||
class Detector {
|
||||
std::shared_ptr<void> detector_gpu_ptr;
|
||||
@ -60,18 +60,18 @@ public:
|
||||
float nms = .4;
|
||||
bool wait_stream;
|
||||
|
||||
YOLODLL_API Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
|
||||
YOLODLL_API ~Detector();
|
||||
LIB_EXPORTS Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
|
||||
LIB_EXPORTS ~Detector();
|
||||
|
||||
YOLODLL_API std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
|
||||
YOLODLL_API std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
|
||||
static YOLODLL_API image_t load_image(std::string image_filename);
|
||||
static YOLODLL_API void free_image(image_t m);
|
||||
YOLODLL_API int get_net_width() const;
|
||||
YOLODLL_API int get_net_height() const;
|
||||
YOLODLL_API int get_net_color_depth() const;
|
||||
LIB_EXPORTS std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
|
||||
LIB_EXPORTS std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
|
||||
static LIB_EXPORTS image_t load_image(std::string image_filename);
|
||||
static LIB_EXPORTS void free_image(image_t m);
|
||||
LIB_EXPORTS int get_net_width() const;
|
||||
LIB_EXPORTS int get_net_height() const;
|
||||
LIB_EXPORTS int get_net_color_depth() const;
|
||||
|
||||
YOLODLL_API std::vector<bbox_t> tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history = true,
|
||||
LIB_EXPORTS std::vector<bbox_t> tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history = true,
|
||||
int const frames_story = 10, int const max_dist = 150);
|
||||
|
||||
std::vector<bbox_t> detect_resized(image_t img, int init_w, int init_h, float thresh = 0.2, bool use_mean = false)
|
||||
@ -613,13 +613,13 @@ public:
|
||||
|
||||
/*
|
||||
// C - wrappers
|
||||
YOLODLL_API void create_detector(char const* cfg_filename, char const* weight_filename, int gpu_id);
|
||||
YOLODLL_API void delete_detector();
|
||||
YOLODLL_API bbox_t* detect_custom(image_t img, float thresh, bool use_mean, int *result_size);
|
||||
YOLODLL_API bbox_t* detect_resized(image_t img, int init_w, int init_h, float thresh, bool use_mean, int *result_size);
|
||||
YOLODLL_API bbox_t* detect(image_t img, int *result_size);
|
||||
YOLODLL_API image_t load_img(char *image_filename);
|
||||
YOLODLL_API void free_img(image_t m);
|
||||
LIB_EXPORTS void create_detector(char const* cfg_filename, char const* weight_filename, int gpu_id);
|
||||
LIB_EXPORTS void delete_detector();
|
||||
LIB_EXPORTS bbox_t* detect_custom(image_t img, float thresh, bool use_mean, int *result_size);
|
||||
LIB_EXPORTS bbox_t* detect_resized(image_t img, int init_w, int init_h, float thresh, bool use_mean, int *result_size);
|
||||
LIB_EXPORTS bbox_t* detect(image_t img, int *result_size);
|
||||
LIB_EXPORTS image_t load_img(char *image_filename);
|
||||
LIB_EXPORTS void free_img(image_t m);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
@ -628,7 +628,7 @@ static std::shared_ptr<void> c_detector_ptr;
|
||||
static std::vector<bbox_t> c_result_vec;
|
||||
|
||||
void create_detector(char const* cfg_filename, char const* weight_filename, int gpu_id) {
|
||||
c_detector_ptr = std::make_shared<YOLODLL_API Detector>(cfg_filename, weight_filename, gpu_id);
|
||||
c_detector_ptr = std::make_shared<LIB_EXPORTS Detector>(cfg_filename, weight_filename, gpu_id);
|
||||
}
|
||||
|
||||
void delete_detector() { c_detector_ptr.reset(); }
|
@ -1,3 +1,4 @@
|
||||
#include "darknet.h"
|
||||
#include "cuda_runtime.h"
|
||||
#include "curand.h"
|
||||
#include "cublas_v2.h"
|
||||
@ -113,39 +114,74 @@ __device__ float activate_kernel(float x, ACTIVATION a)
|
||||
|
||||
__device__ float gradient_kernel(float x, ACTIVATION a)
|
||||
{
|
||||
switch(a){
|
||||
case LINEAR:
|
||||
return linear_gradient_kernel(x);
|
||||
case LOGISTIC:
|
||||
return logistic_gradient_kernel(x);
|
||||
case LOGGY:
|
||||
return loggy_gradient_kernel(x);
|
||||
case RELU:
|
||||
return relu_gradient_kernel(x);
|
||||
case ELU:
|
||||
return elu_gradient_kernel(x);
|
||||
case SELU:
|
||||
return selu_gradient_kernel(x);
|
||||
case RELIE:
|
||||
return relie_gradient_kernel(x);
|
||||
case RAMP:
|
||||
return ramp_gradient_kernel(x);
|
||||
case LEAKY:
|
||||
return leaky_gradient_kernel(x);
|
||||
case TANH:
|
||||
return tanh_gradient_kernel(x);
|
||||
case PLSE:
|
||||
return plse_gradient_kernel(x);
|
||||
case STAIR:
|
||||
return stair_gradient_kernel(x);
|
||||
case HARDTAN:
|
||||
return hardtan_gradient_kernel(x);
|
||||
case LHTAN:
|
||||
return lhtan_gradient_kernel(x);
|
||||
switch (a) {
|
||||
case LINEAR:
|
||||
return linear_gradient_kernel(x);
|
||||
case LOGISTIC:
|
||||
return logistic_gradient_kernel(x);
|
||||
case LOGGY:
|
||||
return loggy_gradient_kernel(x);
|
||||
case RELU:
|
||||
return relu_gradient_kernel(x);
|
||||
case ELU:
|
||||
return elu_gradient_kernel(x);
|
||||
case SELU:
|
||||
return selu_gradient_kernel(x);
|
||||
case RELIE:
|
||||
return relie_gradient_kernel(x);
|
||||
case RAMP:
|
||||
return ramp_gradient_kernel(x);
|
||||
case LEAKY:
|
||||
return leaky_gradient_kernel(x);
|
||||
case TANH:
|
||||
return tanh_gradient_kernel(x);
|
||||
case PLSE:
|
||||
return plse_gradient_kernel(x);
|
||||
case STAIR:
|
||||
return stair_gradient_kernel(x);
|
||||
case HARDTAN:
|
||||
return hardtan_gradient_kernel(x);
|
||||
case LHTAN:
|
||||
return lhtan_gradient_kernel(x);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
__global__ void binary_gradient_array_kernel(float *x, float *dy, int n, int s, BINARY_ACTIVATION a, float *dx)
|
||||
{
|
||||
int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;
|
||||
int i = id % s;
|
||||
int b = id / s;
|
||||
float x1 = x[b*s + i];
|
||||
float x2 = x[b*s + s / 2 + i];
|
||||
if (id < n) {
|
||||
float de = dy[id];
|
||||
dx[b*s + i] = x2*de;
|
||||
dx[b*s + s / 2 + i] = x1*de;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void binary_gradient_array_gpu(float *x, float *dx, int n, int size, BINARY_ACTIVATION a, float *y)
|
||||
{
|
||||
binary_gradient_array_kernel << <cuda_gridsize(n / 2), BLOCK >> >(x, dx, n / 2, size, a, y);
|
||||
check_error(cudaPeekAtLastError());
|
||||
}
|
||||
__global__ void binary_activate_array_kernel(float *x, int n, int s, BINARY_ACTIVATION a, float *y)
|
||||
{
|
||||
int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;
|
||||
int i = id % s;
|
||||
int b = id / s;
|
||||
float x1 = x[b*s + i];
|
||||
float x2 = x[b*s + s / 2 + i];
|
||||
if (id < n) y[id] = x1*x2;
|
||||
}
|
||||
|
||||
extern "C" void binary_activate_array_gpu(float *x, int n, int size, BINARY_ACTIVATION a, float *y)
|
||||
{
|
||||
binary_activate_array_kernel << <cuda_gridsize(n / 2), BLOCK >> >(x, n / 2, size, a, y);
|
||||
check_error(cudaPeekAtLastError());
|
||||
}
|
||||
|
||||
__global__ void activate_array_kernel(float *x, int n, ACTIVATION a)
|
||||
{
|
||||
int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;
|
||||
|
@ -1,11 +1,12 @@
|
||||
#ifndef ACTIVATIONS_H
|
||||
#define ACTIVATIONS_H
|
||||
#include "darknet.h"
|
||||
#include "cuda.h"
|
||||
#include "math.h"
|
||||
|
||||
typedef enum{
|
||||
LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU
|
||||
}ACTIVATION;
|
||||
//typedef enum{
|
||||
// LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU
|
||||
//}ACTIVATION;
|
||||
|
||||
ACTIVATION get_activation(char *s);
|
||||
|
||||
|
40
src/box.h
40
src/box.h
@ -1,36 +1,24 @@
|
||||
#ifndef BOX_H
|
||||
#define BOX_H
|
||||
|
||||
#ifdef YOLODLL_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllexport)
|
||||
#else
|
||||
#define YOLODLL_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API
|
||||
#else
|
||||
#define YOLODLL_API
|
||||
#endif
|
||||
#endif
|
||||
#include "darknet.h"
|
||||
|
||||
typedef struct{
|
||||
float x, y, w, h;
|
||||
} box;
|
||||
//typedef struct{
|
||||
// float x, y, w, h;
|
||||
//} box;
|
||||
|
||||
typedef struct{
|
||||
float dx, dy, dw, dh;
|
||||
} dbox;
|
||||
|
||||
typedef struct detection {
|
||||
box bbox;
|
||||
int classes;
|
||||
float *prob;
|
||||
float *mask;
|
||||
float objectness;
|
||||
int sort_class;
|
||||
} detection;
|
||||
//typedef struct detection {
|
||||
// box bbox;
|
||||
// int classes;
|
||||
// float *prob;
|
||||
// float *mask;
|
||||
// float objectness;
|
||||
// int sort_class;
|
||||
//} detection;
|
||||
|
||||
typedef struct detection_with_class {
|
||||
detection det;
|
||||
@ -45,8 +33,8 @@ float box_rmse(box a, box b);
|
||||
dbox diou(box a, box b);
|
||||
void do_nms(box *boxes, float **probs, int total, int classes, float thresh);
|
||||
void do_nms_sort_v2(box *boxes, float **probs, int total, int classes, float thresh);
|
||||
YOLODLL_API void do_nms_sort(detection *dets, int total, int classes, float thresh);
|
||||
YOLODLL_API void do_nms_obj(detection *dets, int total, int classes, float thresh);
|
||||
//LIB_API void do_nms_sort(detection *dets, int total, int classes, float thresh);
|
||||
//LIB_API void do_nms_obj(detection *dets, int total, int classes, float thresh);
|
||||
box decode_box(box b, box anchor);
|
||||
box encode_box(box b, box anchor);
|
||||
|
||||
|
21
src/cuda.h
21
src/cuda.h
@ -1,24 +1,11 @@
|
||||
#ifndef CUDA_H
|
||||
#define CUDA_H
|
||||
#include "darknet.h"
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
#ifdef YOLODLL_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllexport)
|
||||
#else
|
||||
#define YOLODLL_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API
|
||||
#else
|
||||
#define YOLODLL_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern int gpu_index;
|
||||
|
||||
#ifdef GPU
|
||||
@ -42,8 +29,8 @@ extern "C" {
|
||||
int *cuda_make_int_array(size_t n);
|
||||
int *cuda_make_int_array_new_api(int *x, size_t n);
|
||||
void cuda_push_array(float *x_gpu, float *x, size_t n);
|
||||
YOLODLL_API void cuda_pull_array(float *x_gpu, float *x, size_t n);
|
||||
YOLODLL_API void cuda_set_device(int n);
|
||||
//LIB_API void cuda_pull_array(float *x_gpu, float *x, size_t n);
|
||||
//LIB_API void cuda_set_device(int n);
|
||||
int cuda_get_device();
|
||||
void cuda_free(float *x_gpu);
|
||||
void cuda_random(float *x_gpu, size_t n);
|
||||
@ -60,6 +47,6 @@ enum {cudnn_fastest, cudnn_smallest};
|
||||
#endif
|
||||
|
||||
#else // GPU
|
||||
YOLODLL_API void cuda_set_device(int n);
|
||||
//LIB_API void cuda_set_device(int n);
|
||||
#endif // GPU
|
||||
#endif // CUDA_H
|
||||
|
27
src/data.h
27
src/data.h
@ -6,6 +6,7 @@
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
#include "darknet.h"
|
||||
#include "matrix.h"
|
||||
#include "list.h"
|
||||
#include "image.h"
|
||||
@ -22,19 +23,19 @@ static inline float distance_from_edge(int x, int max)
|
||||
return dist;
|
||||
}
|
||||
|
||||
typedef struct{
|
||||
int w, h;
|
||||
matrix X;
|
||||
matrix y;
|
||||
int shallow;
|
||||
int *num_boxes;
|
||||
box **boxes;
|
||||
} data;
|
||||
|
||||
typedef enum {
|
||||
CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, LETTERBOX_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA
|
||||
} data_type;
|
||||
//typedef struct{
|
||||
// int w, h;
|
||||
// matrix X;
|
||||
// matrix y;
|
||||
// int shallow;
|
||||
// int *num_boxes;
|
||||
// box **boxes;
|
||||
//} data;
|
||||
|
||||
//typedef enum {
|
||||
// CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, LETTERBOX_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA
|
||||
//} data_type;
|
||||
/*
|
||||
typedef struct load_args{
|
||||
int threads;
|
||||
char **paths;
|
||||
@ -80,7 +81,7 @@ void free_data(data d);
|
||||
pthread_t load_data(load_args args);
|
||||
|
||||
pthread_t load_data_in_thread(load_args args);
|
||||
|
||||
*/
|
||||
void print_letters(float *pred, int n);
|
||||
data load_data_captcha(char **paths, int n, int m, int k, int w, int h);
|
||||
data load_data_captcha_encode(char **paths, int n, int m, int w, int h);
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#ifndef HTTP_STREAM_H
|
||||
#define HTTP_STREAM_H
|
||||
#include "darknet.h"
|
||||
|
||||
#ifdef OPENCV
|
||||
#include "opencv2/highgui/highgui_c.h"
|
||||
|
32
src/image.c
32
src/image.c
@ -1,3 +1,4 @@
|
||||
#include "darknet.h"
|
||||
#include "image.h"
|
||||
#include "utils.h"
|
||||
#include "blas.h"
|
||||
@ -1246,13 +1247,34 @@ void save_image_png(image im, const char *name)
|
||||
if(!success) fprintf(stderr, "Failed to write image %s\n", buff);
|
||||
}
|
||||
|
||||
void save_image_options(image im, const char *name, IMTYPE f, int quality)
|
||||
{
|
||||
char buff[256];
|
||||
//sprintf(buff, "%s (%d)", name, windows);
|
||||
if (f == PNG) sprintf(buff, "%s.png", name);
|
||||
else if (f == BMP) sprintf(buff, "%s.bmp", name);
|
||||
else if (f == TGA) sprintf(buff, "%s.tga", name);
|
||||
else if (f == JPG) sprintf(buff, "%s.jpg", name);
|
||||
else 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 = 0;
|
||||
if (f == PNG) success = stbi_write_png(buff, im.w, im.h, im.c, data, im.w*im.c);
|
||||
else if (f == BMP) success = stbi_write_bmp(buff, im.w, im.h, im.c, data);
|
||||
else if (f == TGA) success = stbi_write_tga(buff, im.w, im.h, im.c, data);
|
||||
else if (f == JPG) success = stbi_write_jpg(buff, im.w, im.h, im.c, data, quality);
|
||||
free(data);
|
||||
if (!success) fprintf(stderr, "Failed to write image %s\n", buff);
|
||||
}
|
||||
|
||||
void save_image(image im, const char *name)
|
||||
{
|
||||
#ifdef OPENCV
|
||||
save_image_jpg(im, name);
|
||||
#else
|
||||
save_image_png(im, name);
|
||||
#endif
|
||||
save_image_options(im, name, JPG, 80);
|
||||
}
|
||||
|
||||
|
||||
|
20
src/image.h
20
src/image.h
@ -1,5 +1,6 @@
|
||||
#ifndef IMAGE_H
|
||||
#define IMAGE_H
|
||||
#include "darknet.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@ -8,13 +9,14 @@
|
||||
#include <math.h>
|
||||
#include "box.h"
|
||||
|
||||
/*
|
||||
typedef struct {
|
||||
int w;
|
||||
int h;
|
||||
int w;
|
||||
int h;
|
||||
int c;
|
||||
float *data;
|
||||
} image;
|
||||
|
||||
*/
|
||||
float get_color(int c, int x, int max);
|
||||
void flip_image(image a);
|
||||
void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b);
|
||||
@ -30,10 +32,10 @@ image crop_image(image im, int dx, int dy, int w, int h);
|
||||
image random_crop_image(image im, int w, int h);
|
||||
image random_augment_image(image im, float angle, float aspect, int low, int high, int size);
|
||||
void random_distort_image(image im, float hue, float saturation, float exposure);
|
||||
YOLODLL_API image resize_image(image im, int w, int h);
|
||||
//LIB_EXPORTS image resize_image(image im, int w, int h);
|
||||
void fill_image(image m, float s);
|
||||
void letterbox_image_into(image im, int w, int h, image boxed);
|
||||
YOLODLL_API image letterbox_image(image im, int w, int h);
|
||||
//LIB_EXPORTS image letterbox_image(image im, int w, int h);
|
||||
image resize_min(image im, int min);
|
||||
image resize_max(image im, int max);
|
||||
void translate_image(image m, float s);
|
||||
@ -46,7 +48,7 @@ void exposure_image(image im, float sat);
|
||||
void distort_image(image im, float hue, float sat, float val);
|
||||
void saturate_exposure_image(image im, float sat, float exposure);
|
||||
void hsv_to_rgb(image im);
|
||||
YOLODLL_API void rgbgr_image(image im);
|
||||
//LIB_EXPORTS void rgbgr_image(image im);
|
||||
void constrain_image(image im);
|
||||
void composite_3d(char *f1, char *f2, char *out, int delta);
|
||||
int best_3d_shift_r(image a, image b, int min, int max);
|
||||
@ -68,13 +70,13 @@ void show_image_collapsed(image p, char *name);
|
||||
|
||||
void print_image(image m);
|
||||
|
||||
YOLODLL_API image make_image(int w, int h, int c);
|
||||
//LIB_EXPORTS image make_image(int w, int h, int c);
|
||||
image make_random_image(int w, int h, int c);
|
||||
image make_empty_image(int w, int h, int c);
|
||||
image float_to_image(int w, int h, int c, float *data);
|
||||
image copy_image(image p);
|
||||
image load_image(char *filename, int w, int h, int c);
|
||||
YOLODLL_API image load_image_color(char *filename, int w, int h);
|
||||
//LIB_EXPORTS image load_image_color(char *filename, int w, int h);
|
||||
image **load_alphabet();
|
||||
|
||||
//float get_pixel(image m, int x, int y, int c);
|
||||
@ -85,7 +87,7 @@ float bilinear_interpolate(image im, float x, float y, int c);
|
||||
|
||||
image get_image_layer(image m, int l);
|
||||
|
||||
YOLODLL_API void free_image(image m);
|
||||
//LIB_EXPORTS void free_image(image m);
|
||||
void test_resize(char *filename);
|
||||
#endif
|
||||
|
||||
|
98
src/layer.h
98
src/layer.h
@ -1,61 +1,63 @@
|
||||
#ifndef BASE_LAYER_H
|
||||
#define BASE_LAYER_H
|
||||
|
||||
#include "darknet.h"
|
||||
#include "activations.h"
|
||||
#include "stddef.h"
|
||||
#include "tree.h"
|
||||
|
||||
struct network_state;
|
||||
//struct network_state;
|
||||
|
||||
struct layer;
|
||||
typedef struct layer layer;
|
||||
//struct layer;
|
||||
//typedef struct layer layer;
|
||||
|
||||
typedef enum {
|
||||
CONVOLUTIONAL,
|
||||
DECONVOLUTIONAL,
|
||||
CONNECTED,
|
||||
MAXPOOL,
|
||||
SOFTMAX,
|
||||
DETECTION,
|
||||
DROPOUT,
|
||||
CROP,
|
||||
ROUTE,
|
||||
COST,
|
||||
NORMALIZATION,
|
||||
AVGPOOL,
|
||||
LOCAL,
|
||||
SHORTCUT,
|
||||
ACTIVE,
|
||||
RNN,
|
||||
GRU,
|
||||
CRNN,
|
||||
BATCHNORM,
|
||||
NETWORK,
|
||||
XNOR,
|
||||
REGION,
|
||||
YOLO,
|
||||
REORG,
|
||||
UPSAMPLE,
|
||||
REORG_OLD,
|
||||
BLANK
|
||||
} LAYER_TYPE;
|
||||
//typedef enum {
|
||||
// CONVOLUTIONAL,
|
||||
// DECONVOLUTIONAL,
|
||||
// CONNECTED,
|
||||
// MAXPOOL,
|
||||
// SOFTMAX,
|
||||
// DETECTION,
|
||||
// DROPOUT,
|
||||
// CROP,
|
||||
// ROUTE,
|
||||
// COST,
|
||||
// NORMALIZATION,
|
||||
// AVGPOOL,
|
||||
// LOCAL,
|
||||
// SHORTCUT,
|
||||
// ACTIVE,
|
||||
// RNN,
|
||||
// GRU,
|
||||
// CRNN,
|
||||
// BATCHNORM,
|
||||
// NETWORK,
|
||||
// XNOR,
|
||||
// REGION,
|
||||
// YOLO,
|
||||
// REORG,
|
||||
// UPSAMPLE,
|
||||
// REORG_OLD,
|
||||
// BLANK
|
||||
//} LAYER_TYPE;
|
||||
|
||||
typedef enum{
|
||||
SSE, MASKED, SMOOTH
|
||||
} COST_TYPE;
|
||||
//typedef enum{
|
||||
// SSE, MASKED, SMOOTH
|
||||
//} COST_TYPE;
|
||||
|
||||
typedef struct {
|
||||
int batch;
|
||||
float learning_rate;
|
||||
float momentum;
|
||||
float decay;
|
||||
int adam;
|
||||
float B1;
|
||||
float B2;
|
||||
float eps;
|
||||
int t;
|
||||
} update_args;
|
||||
//typedef struct {
|
||||
// int batch;
|
||||
// float learning_rate;
|
||||
// float momentum;
|
||||
// float decay;
|
||||
// int adam;
|
||||
// float B1;
|
||||
// float B2;
|
||||
// float eps;
|
||||
// int t;
|
||||
//} update_args;
|
||||
|
||||
/*
|
||||
struct layer{
|
||||
LAYER_TYPE type;
|
||||
ACTIVATION activation;
|
||||
@ -325,7 +327,7 @@ struct layer{
|
||||
#endif // CUDNN
|
||||
#endif // GPU
|
||||
};
|
||||
|
||||
void free_layer(layer);
|
||||
*/
|
||||
//void free_layer(layer);
|
||||
|
||||
#endif
|
||||
|
10
src/matrix.h
10
src/matrix.h
@ -1,9 +1,11 @@
|
||||
#ifndef MATRIX_H
|
||||
#define MATRIX_H
|
||||
typedef struct matrix{
|
||||
int rows, cols;
|
||||
float **vals;
|
||||
} matrix;
|
||||
#include "darknet.h"
|
||||
|
||||
//typedef struct matrix{
|
||||
// int rows, cols;
|
||||
// float **vals;
|
||||
//} matrix;
|
||||
|
||||
typedef struct {
|
||||
int *assignments;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
#include "darknet.h"
|
||||
#include "network.h"
|
||||
#include "image.h"
|
||||
#include "data.h"
|
||||
@ -31,21 +32,22 @@
|
||||
#include "upsample_layer.h"
|
||||
#include "parser.h"
|
||||
|
||||
network *load_network_custom(char *cfg, char *weights, int clear, int batch)
|
||||
load_args get_base_args(network *net)
|
||||
{
|
||||
printf(" Try to load cfg: %s, weights: %s, clear = %d \n", cfg, weights, clear);
|
||||
network *net = calloc(1, sizeof(network));
|
||||
*net = parse_network_cfg_custom(cfg, batch);
|
||||
if (weights && weights[0] != 0) {
|
||||
load_weights(net, weights);
|
||||
}
|
||||
if (clear) (*net->seen) = 0;
|
||||
return net;
|
||||
}
|
||||
load_args args = { 0 };
|
||||
args.w = net->w;
|
||||
args.h = net->h;
|
||||
args.size = net->w;
|
||||
|
||||
network *load_network(char *cfg, char *weights, int clear)
|
||||
{
|
||||
return load_network_custom(cfg, weights, clear, 0);
|
||||
args.min = net->min_crop;
|
||||
args.max = net->max_crop;
|
||||
args.angle = net->angle;
|
||||
args.aspect = net->aspect;
|
||||
args.exposure = net->exposure;
|
||||
args.center = net->center;
|
||||
args.saturation = net->saturation;
|
||||
args.hue = net->hue;
|
||||
return args;
|
||||
}
|
||||
|
||||
int get_current_batch(network net)
|
||||
|
@ -1,6 +1,7 @@
|
||||
// Oh boy, why am I about to do this....
|
||||
#ifndef NETWORK_H
|
||||
#define NETWORK_H
|
||||
#include "darknet.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include "layer.h"
|
||||
@ -13,6 +14,7 @@ extern "C" {
|
||||
#include "data.h"
|
||||
#include "tree.h"
|
||||
|
||||
/*
|
||||
typedef enum {
|
||||
CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
|
||||
} learning_rate_policy;
|
||||
@ -77,6 +79,7 @@ typedef struct network{
|
||||
#endif
|
||||
} network;
|
||||
|
||||
|
||||
typedef struct network_state {
|
||||
float *truth;
|
||||
float *input;
|
||||
@ -86,6 +89,7 @@ typedef struct network_state {
|
||||
int index;
|
||||
network net;
|
||||
} network_state;
|
||||
*/
|
||||
|
||||
#ifdef GPU
|
||||
float train_networks(network *nets, int n, data d, int interval);
|
||||
@ -117,7 +121,7 @@ float train_network_sgd(network net, data d, int n);
|
||||
float train_network_datum(network net, float *x, float *y);
|
||||
|
||||
matrix network_predict_data(network net, data test);
|
||||
YOLODLL_API float *network_predict(network net, float *input);
|
||||
//LIB_API float *network_predict(network net, float *input);
|
||||
float network_accuracy(network net, data d);
|
||||
float *network_accuracies(network net, data d, int n);
|
||||
float network_accuracy_multi(network net, data d, int n);
|
||||
@ -137,25 +141,24 @@ int resize_network(network *net, int w, int h);
|
||||
void set_batch_network(network *net, int b);
|
||||
int get_network_input_size(network net);
|
||||
float get_network_cost(network net);
|
||||
YOLODLL_API layer* get_network_layer(network* net, int i);
|
||||
YOLODLL_API detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num, int letter);
|
||||
YOLODLL_API detection *make_network_boxes(network *net, float thresh, int *num);
|
||||
YOLODLL_API void free_detections(detection *dets, int n);
|
||||
YOLODLL_API void reset_rnn(network *net);
|
||||
YOLODLL_API network *load_network_custom(char *cfg, char *weights, int clear, int batch);
|
||||
YOLODLL_API network *load_network(char *cfg, char *weights, int clear);
|
||||
YOLODLL_API float *network_predict_image(network *net, image im);
|
||||
YOLODLL_API float validate_detector_map(char *datacfg, char *cfgfile, char *weightfile, float thresh_calc_avg_iou, const float iou_thresh, network *existing_net);
|
||||
YOLODLL_API void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map);
|
||||
YOLODLL_API int network_width(network *net);
|
||||
YOLODLL_API int network_height(network *net);
|
||||
|
||||
YOLODLL_API void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm);
|
||||
//LIB_API layer* get_network_layer(network* net, int i);
|
||||
//LIB_API detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num, int letter);
|
||||
//LIB_API detection *make_network_boxes(network *net, float thresh, int *num);
|
||||
//LIB_API void free_detections(detection *dets, int n);
|
||||
//LIB_API void reset_rnn(network *net);
|
||||
//LIB_API network *load_network_custom(char *cfg, char *weights, int clear, int batch);
|
||||
//LIB_API network *load_network(char *cfg, char *weights, int clear);
|
||||
//LIB_API float *network_predict_image(network *net, image im);
|
||||
//LIB_API float validate_detector_map(char *datacfg, char *cfgfile, char *weightfile, float thresh_calc_avg_iou, const float iou_thresh, network *existing_net);
|
||||
//LIB_API void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map);
|
||||
//LIB_API int network_width(network *net);
|
||||
//LIB_API int network_height(network *net);
|
||||
//LIB_API void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm);
|
||||
|
||||
int get_network_nuisance(network net);
|
||||
int get_network_background(network net);
|
||||
YOLODLL_API void fuse_conv_batchnorm(network net);
|
||||
YOLODLL_API void calculate_binary_weights(network net);
|
||||
//LIB_API void fuse_conv_batchnorm(network net);
|
||||
//LIB_API void calculate_binary_weights(network net);
|
||||
network combine_train_valid_networks(network net_train, network net_map);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,20 +1,7 @@
|
||||
#ifndef OPTION_LIST_H
|
||||
#define OPTION_LIST_H
|
||||
#include "list.h"
|
||||
|
||||
#ifdef YOLODLL_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllexport)
|
||||
#else
|
||||
#define YOLODLL_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API
|
||||
#else
|
||||
#define YOLODLL_API
|
||||
#endif
|
||||
#endif
|
||||
#include "darknet.h"
|
||||
|
||||
typedef struct{
|
||||
char *key;
|
||||
@ -34,11 +21,11 @@ float option_find_float(list *l, char *key, float def);
|
||||
float option_find_float_quiet(list *l, char *key, float def);
|
||||
void option_unused(list *l);
|
||||
|
||||
typedef struct {
|
||||
int classes;
|
||||
char **names;
|
||||
} metadata;
|
||||
//typedef struct {
|
||||
// int classes;
|
||||
// char **names;
|
||||
//} metadata;
|
||||
|
||||
YOLODLL_API metadata get_metadata(char *file);
|
||||
//LIB_API metadata get_metadata(char *file);
|
||||
|
||||
#endif
|
||||
|
25
src/parser.c
25
src/parser.c
@ -1249,3 +1249,28 @@ void load_weights(network *net, char *filename)
|
||||
load_weights_upto(net, filename, net->n);
|
||||
}
|
||||
|
||||
// load network & force - set batch size
|
||||
network *load_network_custom(char *cfg, char *weights, int clear, int batch)
|
||||
{
|
||||
printf(" Try to load cfg: %s, weights: %s, clear = %d \n", cfg, weights, clear);
|
||||
network *net = calloc(1, sizeof(network));
|
||||
*net = parse_network_cfg_custom(cfg, batch);
|
||||
if (weights && weights[0] != 0) {
|
||||
load_weights(net, weights);
|
||||
}
|
||||
if (clear) (*net->seen) = 0;
|
||||
return net;
|
||||
}
|
||||
|
||||
// load network & get batch size from cfg-file
|
||||
network *load_network(char *cfg, char *weights, int clear)
|
||||
{
|
||||
printf(" Try to load cfg: %s, weights: %s, clear = %d \n", cfg, weights, clear);
|
||||
network *net = calloc(1, sizeof(network));
|
||||
*net = parse_network_cfg(cfg);
|
||||
if (weights && weights[0] != 0) {
|
||||
load_weights(net, weights);
|
||||
}
|
||||
if (clear) (*net->seen) = 0;
|
||||
return net;
|
||||
}
|
27
src/tree.h
27
src/tree.h
@ -1,20 +1,21 @@
|
||||
#ifndef TREE_H
|
||||
#define TREE_H
|
||||
#include "darknet.h"
|
||||
|
||||
typedef struct{
|
||||
int *leaf;
|
||||
int n;
|
||||
int *parent;
|
||||
int *child;
|
||||
int *group;
|
||||
char **name;
|
||||
//typedef struct{
|
||||
// int *leaf;
|
||||
// int n;
|
||||
// int *parent;
|
||||
// int *child;
|
||||
// int *group;
|
||||
// char **name;
|
||||
//
|
||||
// int groups;
|
||||
// int *group_size;
|
||||
// int *group_offset;
|
||||
//} tree;
|
||||
|
||||
int groups;
|
||||
int *group_size;
|
||||
int *group_offset;
|
||||
} tree;
|
||||
|
||||
tree *read_tree(char *filename);
|
||||
//tree *read_tree(char *filename);
|
||||
int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride);
|
||||
void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves);
|
||||
void change_leaves(tree *t, char *leaf_list);
|
||||
|
15
src/utils.h
15
src/utils.h
@ -11,25 +11,27 @@
|
||||
#define SECRET_NUM -1234
|
||||
#define TWO_PI 6.2831853071795864769252866
|
||||
|
||||
#ifdef YOLODLL_EXPORTS
|
||||
#ifdef LIB_EXPORTS
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API __declspec(dllexport)
|
||||
#define LIB_API __declspec(dllexport)
|
||||
#else
|
||||
#define YOLODLL_API __attribute__((visibility("default")))
|
||||
#define LIB_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
#else
|
||||
#if defined(_MSC_VER)
|
||||
#define YOLODLL_API
|
||||
#define LIB_API
|
||||
#else
|
||||
#define YOLODLL_API
|
||||
#define LIB_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
LIB_API void free_ptrs(void **ptrs, int n);
|
||||
LIB_API void top_k(float *a, int n, int k, int *index);
|
||||
|
||||
double what_time_is_it_now();
|
||||
int *read_map(char *filename);
|
||||
void shuffle(void *arr, size_t n, size_t size);
|
||||
void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections);
|
||||
YOLODLL_API void free_ptrs(void **ptrs, int n);
|
||||
char *basecfg(char *cfgfile);
|
||||
int alphanum_to_int(char c);
|
||||
char int_to_alphanum(int i);
|
||||
@ -47,7 +49,6 @@ void file_error(char *s);
|
||||
void strip(char *s);
|
||||
void strip_args(char *s);
|
||||
void strip_char(char *s, char bad);
|
||||
YOLODLL_API void top_k(float *a, int n, int k, int *index);
|
||||
list *split_str(char *s, char delim);
|
||||
char *fgetl(FILE *fp);
|
||||
list *parse_csv_line(char *line);
|
||||
|
@ -25,13 +25,13 @@ extern "C" {
|
||||
//static Detector* detector = NULL;
|
||||
static std::unique_ptr<Detector> detector;
|
||||
|
||||
int init(const char *configurationFilename, const char *weightsFilename, int gpu)
|
||||
int init(const char *configurationFilename, const char *weightsFilename, int gpu)
|
||||
{
|
||||
detector.reset(new Detector(configurationFilename, weightsFilename, gpu));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int detect_image(const char *filename, bbox_t_container &container)
|
||||
int detect_image(const char *filename, bbox_t_container &container)
|
||||
{
|
||||
std::vector<bbox_t> detection = detector->detect(filename);
|
||||
for (size_t i = 0; i < detection.size() && i < C_SHARP_MAX_OBJECTS; ++i)
|
||||
@ -100,7 +100,7 @@ struct detector_gpu_t {
|
||||
unsigned int *track_id;
|
||||
};
|
||||
|
||||
YOLODLL_API Detector::Detector(std::string cfg_filename, std::string weight_filename, int gpu_id) : cur_gpu_id(gpu_id)
|
||||
LIB_EXPORTS Detector::Detector(std::string cfg_filename, std::string weight_filename, int gpu_id) : cur_gpu_id(gpu_id)
|
||||
{
|
||||
wait_stream = 0;
|
||||
int old_gpu_index;
|
||||
@ -119,7 +119,7 @@ YOLODLL_API Detector::Detector(std::string cfg_filename, std::string weight_file
|
||||
network &net = detector_gpu.net;
|
||||
net.gpu_index = cur_gpu_id;
|
||||
//gpu_index = i;
|
||||
|
||||
|
||||
char *cfgfile = const_cast<char *>(cfg_filename.data());
|
||||
char *weightfile = const_cast<char *>(weight_filename.data());
|
||||
|
||||
@ -147,7 +147,7 @@ YOLODLL_API Detector::Detector(std::string cfg_filename, std::string weight_file
|
||||
}
|
||||
|
||||
|
||||
YOLODLL_API Detector::~Detector()
|
||||
LIB_EXPORTS Detector::~Detector()
|
||||
{
|
||||
detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
layer l = detector_gpu.net.layers[detector_gpu.net.n - 1];
|
||||
@ -171,21 +171,21 @@ YOLODLL_API Detector::~Detector()
|
||||
#endif
|
||||
}
|
||||
|
||||
YOLODLL_API int Detector::get_net_width() const {
|
||||
LIB_EXPORTS int Detector::get_net_width() const {
|
||||
detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
return detector_gpu.net.w;
|
||||
}
|
||||
YOLODLL_API int Detector::get_net_height() const {
|
||||
LIB_EXPORTS int Detector::get_net_height() const {
|
||||
detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
return detector_gpu.net.h;
|
||||
}
|
||||
YOLODLL_API int Detector::get_net_color_depth() const {
|
||||
LIB_EXPORTS int Detector::get_net_color_depth() const {
|
||||
detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
return detector_gpu.net.c;
|
||||
}
|
||||
|
||||
|
||||
YOLODLL_API std::vector<bbox_t> Detector::detect(std::string image_filename, float thresh, bool use_mean)
|
||||
LIB_EXPORTS std::vector<bbox_t> Detector::detect(std::string image_filename, float thresh, bool use_mean)
|
||||
{
|
||||
std::shared_ptr<image_t> image_ptr(new image_t, [](image_t *img) { if (img->data) free(img->data); delete img; });
|
||||
*image_ptr = load_image(image_filename);
|
||||
@ -196,7 +196,7 @@ static image load_image_stb(char *filename, int channels)
|
||||
{
|
||||
int w, h, c;
|
||||
unsigned char *data = stbi_load(filename, &w, &h, &c, channels);
|
||||
if (!data)
|
||||
if (!data)
|
||||
throw std::runtime_error("file not found");
|
||||
if (channels) c = channels;
|
||||
int i, j, k;
|
||||
@ -214,7 +214,7 @@ static image load_image_stb(char *filename, int channels)
|
||||
return im;
|
||||
}
|
||||
|
||||
YOLODLL_API image_t Detector::load_image(std::string image_filename)
|
||||
LIB_EXPORTS image_t Detector::load_image(std::string image_filename)
|
||||
{
|
||||
char *input = const_cast<char *>(image_filename.data());
|
||||
image im = load_image_stb(input, 3);
|
||||
@ -229,14 +229,14 @@ YOLODLL_API image_t Detector::load_image(std::string image_filename)
|
||||
}
|
||||
|
||||
|
||||
YOLODLL_API void Detector::free_image(image_t m)
|
||||
LIB_EXPORTS void Detector::free_image(image_t m)
|
||||
{
|
||||
if (m.data) {
|
||||
free(m.data);
|
||||
}
|
||||
}
|
||||
|
||||
YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool use_mean)
|
||||
LIB_EXPORTS std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool use_mean)
|
||||
{
|
||||
detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
network &net = detector_gpu.net;
|
||||
@ -259,7 +259,7 @@ YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool
|
||||
im.w = img.w;
|
||||
|
||||
image sized;
|
||||
|
||||
|
||||
if (net.w == im.w && net.h == im.h) {
|
||||
sized = make_image(im.w, im.h, im.c);
|
||||
memcpy(sized.data, im.data, im.w*im.h*im.c * sizeof(float));
|
||||
@ -294,8 +294,8 @@ YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool
|
||||
box b = dets[i].bbox;
|
||||
int const obj_id = max_index(dets[i].prob, l.classes);
|
||||
float const prob = dets[i].prob[obj_id];
|
||||
|
||||
if (prob > thresh)
|
||||
|
||||
if (prob > thresh)
|
||||
{
|
||||
bbox_t bbox;
|
||||
bbox.x = std::max((double)0, (b.x - b.w / 2.)*im.w);
|
||||
@ -322,7 +322,7 @@ YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool
|
||||
return bbox_vec;
|
||||
}
|
||||
|
||||
YOLODLL_API std::vector<bbox_t> Detector::tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history,
|
||||
LIB_EXPORTS std::vector<bbox_t> Detector::tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history,
|
||||
int const frames_story, int const max_dist)
|
||||
{
|
||||
detector_gpu_t &det_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());
|
||||
@ -357,7 +357,7 @@ YOLODLL_API std::vector<bbox_t> Detector::tracking_id(std::vector<bbox_t> cur_bb
|
||||
}
|
||||
}
|
||||
|
||||
bool track_id_absent = !std::any_of(cur_bbox_vec.begin(), cur_bbox_vec.end(),
|
||||
bool track_id_absent = !std::any_of(cur_bbox_vec.begin(), cur_bbox_vec.end(),
|
||||
[&i](bbox_t const& b) { return b.track_id == i.track_id && b.obj_id == i.obj_id; });
|
||||
|
||||
if (cur_index >= 0 && track_id_absent){
|
||||
|
Reference in New Issue
Block a user