diff --git a/.gitignore b/.gitignore index bbfed659..1bd67d08 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,8 @@ convnet/ decaf/ submission/ cfg/ -darknet +build/darknet/* +!build/darknet/YoloWrapper.cs .fuse* # OS Generated # diff --git a/build/darknet/YoloWrapper.cs b/build/darknet/YoloWrapper.cs new file mode 100644 index 00000000..ade00597 --- /dev/null +++ b/build/darknet/YoloWrapper.cs @@ -0,0 +1,83 @@ +using System; +using System.Runtime.InteropServices; + +namespace Darknet +{ + public class YoloWrapper : IDisposable + { + private const string YoloLibraryName = "yolo_cpp_dll.dll"; + + [DllImport(YoloLibraryName, EntryPoint = "init")] + public static extern int InitializeYolo(string configurationFilename, string weightsFilename, int gpu); + + [DllImport(YoloLibraryName, EntryPoint = "detect_image")] + public static extern int DetectImage(string filename, ref BboxContainer container); + + [DllImport(YoloLibraryName, EntryPoint = "detect_mat")] + public static extern int DetectImage(IntPtr pArray, int nSize, ref BboxContainer container); + + [DllImport(YoloLibraryName, EntryPoint = "dispose")] + public static extern int DisposeYolo(); + + [StructLayout(LayoutKind.Sequential)] + public struct bbox_t + { + public UInt32 x, y, w, h; // (x,y) - top-left corner, (w, h) - width & height of bounded box + public float prob; // confidence - probability that the object was found correctly + public UInt32 obj_id; // class of object - from range [0, classes-1] + public UInt32 track_id; // tracking id for video (0 - untracked, 1 - inf - tracked object) + public UInt32 frames_counter; + }; + + [StructLayout(LayoutKind.Sequential, Size = 10)] + public struct BboxContainer + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public bbox_t[] candidates; + } + + public YoloWrapper(string configurationFilename, string weightsFilename, int gpu) + { + InitializeYolo(configurationFilename, weightsFilename, gpu); + } + + public void Dispose() + { + DisposeYolo(); + } + + public bbox_t[] Detect(string filename) + { + var container = new BboxContainer(); + var count = DetectImage(filename, ref container); + + return container.candidates; + } + + public bbox_t[] Detect(byte[] imageData) + { + var container = new BboxContainer(); + + var size = Marshal.SizeOf(imageData[0]) * imageData.Length; + var pnt = Marshal.AllocHGlobal(size); + + try + { + // Copy the array to unmanaged memory. + Marshal.Copy(imageData, 0, pnt, imageData.Length); + DetectImage(pnt, imageData.Length, ref container); + } + catch (Exception exception) + { + return null; + } + finally + { + // Free the unmanaged memory. + Marshal.FreeHGlobal(pnt); + } + + return container.candidates; + } + } +} diff --git a/src/yolo_v2_class.hpp b/src/yolo_v2_class.hpp index 2715ce39..98758783 100644 --- a/src/yolo_v2_class.hpp +++ b/src/yolo_v2_class.hpp @@ -45,11 +45,11 @@ struct bbox_t_container { #include "opencv2/imgproc/imgproc_c.h" // C #endif // OPENCV -extern "C" __declspec(dllexport) int max_objects(); -extern "C" __declspec(dllexport) int init(const char *configurationFilename, const char *weightsFilename, int gpu); -extern "C" __declspec(dllexport) int detect_image(const char *filename, bbox_t_container &container); -extern "C" __declspec(dllexport) int detect_mat(const uint8_t* data, const size_t data_length, bbox_t_container &container); -extern "C" __declspec(dllexport) int dispose(); +extern "C" YOLODLL_API int max_objects(); +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(); class Detector { std::shared_ptr detector_gpu_ptr;