Commit 9b8db88d974fff3c74b9d155f9b51bff595c8bfd

Authored by Josh Klontz
1 parent 780b1296

removed dlib

openbr/plugins/classification/dlib.cpp deleted
1 -#include <opencv2/imgproc/imgproc.hpp>  
2 -#include <dlib/image_processing/frontal_face_detector.h>  
3 -#include <dlib/image_processing.h>  
4 -#include <dlib/opencv.h>  
5 -  
6 -#include "openbr/plugins/openbr_internal.h"  
7 -  
8 -#include <QTemporaryFile>  
9 -  
10 -using namespace std;  
11 -using namespace dlib;  
12 -  
13 -namespace br  
14 -{  
15 -  
16 -/*!  
17 - * \ingroup transforms  
18 - * \brief Wrapper to dlib's landmarker.  
19 - * \author Scott Klum \cite sklum  
20 - */  
21 -class DLibShapeResourceMaker : public ResourceMaker<shape_predictor>  
22 -{  
23 -  
24 -private:  
25 - shape_predictor *make() const  
26 - {  
27 - shape_predictor *sp = new shape_predictor();  
28 - dlib::deserialize(qPrintable(Globals->sdkPath + "/share/openbr/models/dlib/shape_predictor_68_face_landmarks.dat")) >> *sp;  
29 - return sp;  
30 - }  
31 -};  
32 -  
33 -class DLandmarkerTransform : public UntrainableTransform  
34 -{  
35 - Q_OBJECT  
36 -  
37 -private:  
38 - Resource<shape_predictor> shapeResource;  
39 -  
40 - void init()  
41 - {  
42 - shapeResource.setResourceMaker(new DLibShapeResourceMaker());  
43 - shapeResource.release(shapeResource.acquire()); // Pre-load one instance of the model  
44 - }  
45 -  
46 - QPointF averagePoints(const QList<QPointF> &points, int rangeBegin, int rangeEnd) const  
47 - {  
48 - QPointF point;  
49 - for (int i=rangeBegin; i<rangeEnd; i++)  
50 - point += points[i];  
51 - point /= (rangeEnd-rangeBegin);  
52 - return point;  
53 - }  
54 -  
55 - void setFacePoints(Template &dst) const  
56 - {  
57 - const QList<QPointF> points = dst.file.points();  
58 - dst.file.set("RightEye", averagePoints(points, 36, 42));  
59 - dst.file.set("LeftEye" , averagePoints(points, 42, 48));  
60 - dst.file.set("Chin", points[8]);  
61 - }  
62 -  
63 - void project(const Template &src, Template &dst) const  
64 - {  
65 - dst = src;  
66 -  
67 - shape_predictor *const sp = shapeResource.acquire();  
68 -  
69 - cv::Mat cvImage = src.m();  
70 - if (cvImage.channels() == 3)  
71 - cv::cvtColor(cvImage, cvImage, CV_BGR2GRAY);  
72 -  
73 - cv_image<unsigned char> cimg(cvImage);  
74 - array2d<unsigned char> image;  
75 - assign_image(image,cimg);  
76 -  
77 - rectangle r;  
78 - if (src.file.rects().isEmpty()) { // If the image has no rects assume the whole image is a face  
79 - r = rectangle(0, 0, cvImage.cols, cvImage.rows);  
80 - } else { // Crop the image on the first rect  
81 - const QRectF rect = src.file.rects().first();  
82 - r = rectangle(rect.left(), rect.top(), rect.right(), rect.bottom());  
83 - }  
84 -  
85 - full_object_detection shape = (*sp)(image, r);  
86 - QList<QPointF> points;  
87 - for (size_t i=0; i<shape.num_parts(); i++)  
88 - points.append(QPointF(shape.part(i)(0), shape.part(i)(1)));  
89 - dst.file.setPoints(points);  
90 - setFacePoints(dst);  
91 -  
92 - shapeResource.release(sp);  
93 - }  
94 -};  
95 -  
96 -BR_REGISTER(Transform, DLandmarkerTransform)  
97 -  
98 -/*!  
99 - * \ingroup transforms  
100 - * \brief Wrapper to dlib's trainable object detector.  
101 - * \author Scott Klum \cite sklum  
102 - */  
103 -class DObjectDetectorTransform : public Transform  
104 -{  
105 - Q_OBJECT  
106 -  
107 - Q_PROPERTY(int winSize READ get_winSize WRITE set_winSize RESET reset_winSize STORED true)  
108 - Q_PROPERTY(float C READ get_C WRITE set_C RESET reset_C STORED true)  
109 - Q_PROPERTY(float epsilon READ get_epsilon WRITE set_epsilon RESET reset_epsilon STORED true)  
110 - BR_PROPERTY(int, winSize, 80)  
111 - BR_PROPERTY(float, C, 1)  
112 - BR_PROPERTY(float, epsilon, .01)  
113 -  
114 -private:  
115 - typedef scan_fhog_pyramid<pyramid_down<6> > image_scanner_type;  
116 - mutable object_detector<image_scanner_type> detector;  
117 - mutable QMutex mutex;  
118 -  
119 - void train(const TemplateList &data)  
120 - {  
121 - dlib::array<array2d<unsigned char> > samples;  
122 - std::vector<std::vector<rectangle> > boxes;  
123 -  
124 - foreach (const Template &t, data) {  
125 - if (!t.file.rects().isEmpty()) {  
126 - cv_image<unsigned char> cimg(t.m());  
127 -  
128 - array2d<unsigned char> image;  
129 - assign_image(image,cimg);  
130 -  
131 - samples.push_back(image);  
132 -  
133 - std::vector<rectangle> b;  
134 - foreach (const QRectF &r, t.file.rects())  
135 - b.push_back(rectangle(r.left(),r.top(),r.right(),r.bottom()));  
136 -  
137 - boxes.push_back(b);  
138 - }  
139 - }  
140 -  
141 - if (samples.size() == 0)  
142 - qFatal("Training data has no bounding boxes.");  
143 -  
144 - image_scanner_type scanner;  
145 -  
146 - scanner.set_detection_window_size(winSize, winSize);  
147 - structural_object_detection_trainer<image_scanner_type> trainer(scanner);  
148 - trainer.set_num_threads(max(1,QThread::idealThreadCount()));  
149 - trainer.set_c(C);  
150 - trainer.set_epsilon(epsilon);  
151 -  
152 - if (Globals->verbose)  
153 - trainer.be_verbose();  
154 -  
155 - detector = trainer.train(samples, boxes);  
156 - }  
157 -  
158 - void project(const Template &src, Template &dst) const  
159 - {  
160 - dst = src;  
161 - cv_image<unsigned char> cimg(src.m());  
162 - array2d<unsigned char> image;  
163 - assign_image(image,cimg);  
164 -  
165 - QMutexLocker locker(&mutex);  
166 - std::vector<rectangle> dets = detector(image);  
167 - locker.unlock();  
168 -  
169 - for (size_t i=0; i<dets.size(); i++)  
170 - dst.file.appendRect(QRectF(QPointF(dets[i].left(),dets[i].top()),QPointF(dets[i].right(),dets[i].bottom())));  
171 - }  
172 -  
173 - void store(QDataStream &stream) const  
174 - {  
175 - // Create local file  
176 - QTemporaryFile tempFile;  
177 - tempFile.open();  
178 - tempFile.close();  
179 -  
180 - dlib::serialize(qPrintable(tempFile.fileName())) << detector;  
181 -  
182 - // Copy local file contents to stream  
183 - tempFile.open();  
184 - QByteArray data = tempFile.readAll();  
185 - tempFile.close();  
186 - stream << data;  
187 - }  
188 -  
189 - void load(QDataStream &stream)  
190 - {  
191 - // Copy local file contents from stream  
192 - QByteArray data;  
193 - stream >> data;  
194 -  
195 - // Create local file  
196 - QTemporaryFile tempFile(QDir::tempPath()+"/model");  
197 - tempFile.open();  
198 - tempFile.write(data);  
199 - tempFile.close();  
200 -  
201 - // Load MLP from local file  
202 - dlib::deserialize(qPrintable(tempFile.fileName())) >> detector;  
203 - }  
204 -};  
205 -  
206 -BR_REGISTER(Transform, DObjectDetectorTransform)  
207 -  
208 -} // namespace br  
209 -  
210 -#include "dlib.moc"  
openbr/plugins/classification/dlib_source.cpp deleted
1 -#define DLIB_NO_GUI_SUPPORT  
2 -#include <dlib/all/source.cpp>  
openbr/plugins/cmake/dlib.cmake deleted
1 -set(BR_WITH_DLIB OFF CACHE BOOL "Build with DLib")  
2 -  
3 -if(${BR_WITH_DLIB})  
4 - ExternalProject_Add(dlib  
5 - URL http://downloads.sourceforge.net/project/dclib/dlib/v18.16/dlib-18.16.tar.bz2  
6 - URL_MD5 e9e5449bc25370afce2d254327afac99  
7 - SOURCE_DIR "${PROJECT_SOURCE_DIR}/3rdparty/dlib-18.16"  
8 - CONFIGURE_COMMAND ""  
9 - BUILD_COMMAND ""  
10 - INSTALL_COMMAND "")  
11 - include_directories("${PROJECT_SOURCE_DIR}/3rdparty/dlib-18.16")  
12 -else()  
13 - set(BR_EXCLUDED_PLUGINS ${BR_EXCLUDED_PLUGINS} plugins/classification/dlib.cpp plugins/classification/dlib_source.cpp)  
14 -endif()