Skip to content

Commit

Permalink
Merge branch 'py_det_conf_and_idx' of https://github.com/jackculpeppe…
Browse files Browse the repository at this point in the history
…r/dlib into jackculpepper-py_det_conf_and_idx
  • Loading branch information
davisking committed Mar 29, 2015
2 parents edb8555 + cf0d5a4 commit 216eb3f
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 16 deletions.
13 changes: 13 additions & 0 deletions python_examples/face_detector_scores_idx.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

from PIL import Image
import numpy as np
import dlib

img = np.array(Image.open('../examples/faces/2008_002506.jpg'))
detector = dlib.get_frontal_face_detector()

dets, scores, idx = detector.run(img, 1)

for i, d in enumerate(dets):
print d, scores[i], idx[i]

14 changes: 13 additions & 1 deletion tools/python/src/object_detection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,14 +342,26 @@ ensures \n\
"Loads an object detector from a file that contains the output of the \n\
train_simple_object_detector() routine or a serialized C++ object of type\n\
object_detector<scan_fhog_pyramid<pyramid_down<6>>>.")
.def("__call__", run_detector_with_upscale, (arg("image"), arg("upsample_num_times")=0),
.def("__call__", run_detector_with_upscale2, (arg("image"), arg("upsample_num_times")=0),
"requires \n\
- image is a numpy ndarray containing either an 8bit grayscale or RGB \n\
image. \n\
- upsample_num_times >= 0 \n\
ensures \n\
- This function runs the object detector on the input image and returns \n\
a list of detections. \n\
- Upsamples the image upsample_num_times before running the basic \n\
detector. If you don't know how many times you want to upsample then \n\
don't provide a value for upsample_num_times and an appropriate \n\
default will be used.")
.def("run", run_rect_detector, (arg("image"), arg("upsample_num_times")),
"requires \n\
- image is a numpy ndarray containing either an 8bit grayscale or RGB \n\
image. \n\
- upsample_num_times >= 0 \n\
ensures \n\
- This function runs the object detector on the input image and returns \n\
a tuple of (list of detections, list of scores, list of weight_indices). \n\
- Upsamples the image upsample_num_times before running the basic \n\
detector. If you don't know how many times you want to upsample then \n\
don't provide a value for upsample_num_times and an appropriate \n\
Expand Down
107 changes: 92 additions & 15 deletions tools/python/src/simple_object_detector_py.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,48 @@ namespace dlib
{
typedef object_detector<scan_fhog_pyramid<pyramid_down<6> > > simple_object_detector;

inline std::vector<dlib::rectangle> run_detector_with_upscale (
inline void split_rect_detections (
std::vector<rect_detection>& rect_detections,
std::vector<rectangle>& rectangles,
std::vector<double>& detection_confidences,
std::vector<double>& weight_indices
)
{
rectangles.clear();
detection_confidences.clear();
weight_indices.clear();

for (unsigned long i = 0; i < rect_detections.size(); ++i)
{
rectangles.push_back(rect_detections[i].rect);
detection_confidences.push_back(rect_detections[i].detection_confidence);
weight_indices.push_back(rect_detections[i].weight_index);
}
}


inline std::vector<dlib::rectangle> run_detector_with_upscale1 (
dlib::simple_object_detector& detector,
boost::python::object img,
const unsigned int upsampling_amount
const unsigned int upsampling_amount,
std::vector<double>& detection_confidences,
std::vector<double>& weight_indices
)
{
pyramid_down<2> pyr;

std::vector<rectangle> rectangles;
std::vector<rect_detection> rect_detections;

if (is_gray_python_image(img))
{
array2d<unsigned char> temp;
if (upsampling_amount == 0)
{
return detector(numpy_gray_image(img));
detector(numpy_gray_image(img), rect_detections, 0.0);
split_rect_detections(rect_detections, rectangles,
detection_confidences, weight_indices);
return rectangles;
}
else
{
Expand All @@ -38,18 +66,25 @@ namespace dlib
pyramid_up(temp);
}

std::vector<rectangle> res = detector(temp);
for (unsigned long i = 0; i < res.size(); ++i)
res[i] = pyr.rect_down(res[i], upsampling_amount);
return res;
detector(temp, rect_detections, 0.0);
for (unsigned long i = 0; i < rect_detections.size(); ++i)
rect_detections[i].rect = pyr.rect_down(rect_detections[i].rect,
upsampling_amount);
split_rect_detections(rect_detections, rectangles,
detection_confidences, weight_indices);

return rectangles;
}
}
else if (is_rgb_python_image(img))
{
array2d<rgb_pixel> temp;
if (upsampling_amount == 0)
{
return detector(numpy_rgb_image(img));
detector(numpy_rgb_image(img), rect_detections, 0.0);
split_rect_detections(rect_detections, rectangles,
detection_confidences, weight_indices);
return rectangles;
}
else
{
Expand All @@ -61,10 +96,14 @@ namespace dlib
pyramid_up(temp);
}

std::vector<rectangle> res = detector(temp);
for (unsigned long i = 0; i < res.size(); ++i)
res[i] = pyr.rect_down(res[i], upsampling_amount);
return res;
detector(temp, rect_detections, 0.0);
for (unsigned long i = 0; i < rect_detections.size(); ++i)
rect_detections[i].rect = pyr.rect_down(rect_detections[i].rect,
upsampling_amount);
split_rect_detections(rect_detections, rectangles,
detection_confidences, weight_indices);

return rectangles;
}
}
else
Expand All @@ -73,6 +112,37 @@ namespace dlib
}
}

inline std::vector<dlib::rectangle> run_detector_with_upscale2 (
dlib::simple_object_detector& detector,
boost::python::object img,
const unsigned int upsampling_amount
)
{
std::vector<double> detection_confidences;
std::vector<double> weight_indices;

return run_detector_with_upscale1(detector, img, upsampling_amount,
detection_confidences, weight_indices);
}

inline boost::python::tuple run_rect_detector (
dlib::simple_object_detector& detector,
boost::python::object img,
const unsigned int upsampling_amount)
{
boost::python::tuple t;

std::vector<double> detection_confidences;
std::vector<double> weight_indices;
std::vector<rectangle> rectangles;

rectangles = run_detector_with_upscale1(detector, img, upsampling_amount,
detection_confidences, weight_indices);

return boost::python::make_tuple(rectangles,
detection_confidences, weight_indices);
}

struct simple_object_detector_py
{
simple_object_detector detector;
Expand All @@ -82,11 +152,18 @@ namespace dlib
simple_object_detector_py(simple_object_detector& _detector, unsigned int _upsampling_amount) :
detector(_detector), upsampling_amount(_upsampling_amount) {}

std::vector<dlib::rectangle> run_detector1 (boost::python::object img, const unsigned int upsampling_amount_)
{ return run_detector_with_upscale(detector, img, upsampling_amount_); }
std::vector<dlib::rectangle> run_detector1 (boost::python::object img,
const unsigned int upsampling_amount_)
{
return run_detector_with_upscale2(detector, img, upsampling_amount_);
}

std::vector<dlib::rectangle> run_detector2 (boost::python::object img)
{ return run_detector_with_upscale(detector, img, upsampling_amount); }
{
return run_detector_with_upscale2(detector, img, upsampling_amount);
}


};
}

Expand Down

0 comments on commit 216eb3f

Please sign in to comment.