simple_object_detector_py.h 6.26 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Copyright (C) 2014  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#ifndef DLIB_SIMPLE_OBJECT_DETECTOR_PY_H__
#define DLIB_SIMPLE_OBJECT_DETECTOR_PY_H__

#include <dlib/python.h>
#include <dlib/matrix.h>
#include <boost/python/args.hpp>
#include <dlib/geometry.h>
#include <dlib/image_processing/frontal_face_detector.h>

namespace dlib
{
    typedef object_detector<scan_fhog_pyramid<pyramid_down<6> > > simple_object_detector;

16
17
18
19
    inline void split_rect_detections (
        std::vector<rect_detection>& rect_detections,
        std::vector<rectangle>& rectangles,
        std::vector<double>& detection_confidences,
20
        std::vector<double>& weight_indices
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    )
    {
        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);
        }
    }

Jack Culpepper's avatar
Jack Culpepper committed
35
36

    inline std::vector<dlib::rectangle> run_detector_with_upscale1 (
37
38
        dlib::simple_object_detector& detector,
        boost::python::object img,
39
        const unsigned int upsampling_amount,
40
        const double adjust_threshold,
41
        std::vector<double>& detection_confidences,
42
        std::vector<double>& weight_indices
43
44
45
46
    )
    {
        pyramid_down<2> pyr;

47
48
49
        std::vector<rectangle> rectangles;
        std::vector<rect_detection> rect_detections;

50
51
52
53
54
        if (is_gray_python_image(img))
        {
            array2d<unsigned char> temp;
            if (upsampling_amount == 0)
            {
55
                detector(numpy_gray_image(img), rect_detections, adjust_threshold);
56
57
58
                split_rect_detections(rect_detections, rectangles,
                                      detection_confidences, weight_indices);
                return rectangles;
59
60
61
62
63
64
65
66
67
68
69
            }
            else
            {
                pyramid_up(numpy_gray_image(img), temp, pyr);
                unsigned int levels = upsampling_amount-1;
                while (levels > 0)
                {
                    levels--;
                    pyramid_up(temp);
                }

70
                detector(temp, rect_detections, adjust_threshold);
71
72
73
74
75
76
77
                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;
78
79
80
81
82
83
84
            }
        }
        else if (is_rgb_python_image(img))
        {
            array2d<rgb_pixel> temp;
            if (upsampling_amount == 0)
            {
85
                detector(numpy_rgb_image(img), rect_detections, adjust_threshold);
86
87
88
                split_rect_detections(rect_detections, rectangles,
                                      detection_confidences, weight_indices);
                return rectangles;
89
90
91
92
93
94
95
96
97
98
99
            }
            else
            {
                pyramid_up(numpy_rgb_image(img), temp, pyr);
                unsigned int levels = upsampling_amount-1;
                while (levels > 0)
                {
                    levels--;
                    pyramid_up(temp);
                }

100
                detector(temp, rect_detections, adjust_threshold);
101
102
103
104
105
106
107
                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;
108
109
110
111
112
113
114
115
            }
        }
        else
        {
            throw dlib::error("Unsupported image type, must be 8bit gray or RGB image.");
        }
    }

Jack Culpepper's avatar
Jack Culpepper committed
116
117
118
119
    inline std::vector<dlib::rectangle> run_detector_with_upscale2 (
        dlib::simple_object_detector& detector,
        boost::python::object img,
        const unsigned int upsampling_amount
120

Jack Culpepper's avatar
Jack Culpepper committed
121
122
123
124
    )
    {
        std::vector<double> detection_confidences;
        std::vector<double> weight_indices;
125
        const double adjust_threshold = 0.0;
Jack Culpepper's avatar
Jack Culpepper committed
126
127

        return run_detector_with_upscale1(detector, img, upsampling_amount,
128
                                          adjust_threshold,
Jack Culpepper's avatar
Jack Culpepper committed
129
130
131
                                          detection_confidences, weight_indices);
    }

132
    inline boost::python::tuple run_rect_detector (
Jack Culpepper's avatar
Jack Culpepper committed
133
134
        dlib::simple_object_detector& detector,
        boost::python::object img,
135
136
        const unsigned int upsampling_amount,
        const double adjust_threshold)
137
138
139
140
141
142
143
    {
        boost::python::tuple t;

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

Jack Culpepper's avatar
Jack Culpepper committed
144
        rectangles = run_detector_with_upscale1(detector, img, upsampling_amount,
145
                                                adjust_threshold,
Jack Culpepper's avatar
Jack Culpepper committed
146
                                                detection_confidences, weight_indices);
147
148
149
150
151

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

152
153
154
155
156
157
158
159
160
    struct simple_object_detector_py
    {
        simple_object_detector detector;
        unsigned int upsampling_amount;

        simple_object_detector_py() {}
        simple_object_detector_py(simple_object_detector& _detector, unsigned int _upsampling_amount) :
            detector(_detector), upsampling_amount(_upsampling_amount) {}

161
162
163
        std::vector<dlib::rectangle> run_detector1 (boost::python::object img,
                                                    const unsigned int upsampling_amount_)
        {
Jack Culpepper's avatar
Jack Culpepper committed
164
            return run_detector_with_upscale2(detector, img, upsampling_amount_);
165
        }
166
167

        std::vector<dlib::rectangle> run_detector2 (boost::python::object img)
168
        {
Jack Culpepper's avatar
Jack Culpepper committed
169
            return run_detector_with_upscale2(detector, img, upsampling_amount);
170
171
172
        }


173
174
175
176
    };
}

#endif // DLIB_SIMPLE_OBJECT_DETECTOR_PY_H__