circe 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/circe.cpp +110 -82
- data/ext/yolo.cpp +124 -58
- data/ext/yolo.h +9 -5
- data/lib/circe/version.rb +1 -1
- data/lib/circe.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 046e41e59ccb0202ad32729da191ba2f003a9e3a0370f4454996fdd544f47103
|
4
|
+
data.tar.gz: 1d3d18f2bcacfc6ae6e8ff816d166b43f53686841e510fbf722a5a2c85f80080
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17a645694b3ac252fe68048a58e63cbfe4d580a45ed8b3bdfda6cc0ff94e0ab821536a4bed63aff1a42b7ceba3637c889b0a767c9e51ab3e2f5bf4d4c193db53
|
7
|
+
data.tar.gz: 5fcffb7041bcd9f53f379576847748a5579d77b681b71e0eae810f3ce090aca5d83644c6bba442bfc06f3fd4e8bfb6c5550dd6ae172f9636bdf263822a94446e
|
data/ext/circe.cpp
CHANGED
@@ -119,6 +119,9 @@ static ID id_class;
|
|
119
119
|
static ID id_png;
|
120
120
|
static ID id_jpg;
|
121
121
|
|
122
|
+
static ID id_label;
|
123
|
+
static ID id_thickness;
|
124
|
+
static ID id_color;
|
122
125
|
|
123
126
|
static Yolo *yolo;
|
124
127
|
static YuNet *yunet;
|
@@ -143,18 +146,88 @@ draw_label(cv::Mat& img, string label, Point& origin,
|
|
143
146
|
}
|
144
147
|
|
145
148
|
static void
|
146
|
-
|
147
|
-
|
148
|
-
int thickness = 1) {
|
149
|
+
draw_box(cv::Mat& img, Rect& box,
|
150
|
+
Scalar& framecolor = BLUE, int thickness = 1) {
|
149
151
|
|
150
152
|
Point a = { box.x, box.y };
|
151
153
|
Point b = { box.x + box.width, box.y + box.height };
|
152
154
|
|
153
155
|
cv::rectangle(img, a, b, framecolor, thickness);
|
154
|
-
draw_label(img, label, a, textcolor, framecolor);
|
155
156
|
}
|
156
157
|
|
158
|
+
static void
|
159
|
+
draw_labelbox(cv::Mat& img, string label, Rect& box,
|
160
|
+
Scalar& framecolor = BLUE, Scalar& textcolor = BLACK,
|
161
|
+
int thickness = 1) {
|
162
|
+
|
163
|
+
Point o = { box.x, box.y };
|
164
|
+
|
165
|
+
draw_box(img, box, framecolor, thickness);
|
166
|
+
draw_label(img, label, o, textcolor, framecolor);
|
167
|
+
}
|
168
|
+
|
169
|
+
|
170
|
+
VALUE
|
171
|
+
circe_annotate(Mat& img, Rect& box, VALUE v_annotation, int *state) {
|
172
|
+
if (img.empty() || NIL_P(v_annotation))
|
173
|
+
return Qnil;
|
174
|
+
|
175
|
+
VALUE v_label = Qnil;
|
176
|
+
VALUE v_color = ULONG2NUM(0x0000ff);
|
177
|
+
VALUE v_thickness = INT2NUM(1);
|
178
|
+
|
179
|
+
VALUE s_label = rb_id2sym(id_label);
|
180
|
+
VALUE s_color = rb_id2sym(id_color);
|
181
|
+
VALUE s_thickness = rb_id2sym(id_thickness);
|
182
|
+
|
183
|
+
switch (TYPE(v_annotation)) {
|
184
|
+
case T_NIL:
|
185
|
+
break;
|
186
|
+
case T_HASH:
|
187
|
+
v_thickness = rb_hash_aref(v_annotation, s_thickness);
|
188
|
+
v_color = rb_hash_aref(v_annotation, s_color);
|
189
|
+
v_label = rb_hash_aref(v_annotation, s_label);
|
190
|
+
break;
|
191
|
+
case T_ARRAY:
|
192
|
+
switch(RARRAY_LENINT(v_annotation)) {
|
193
|
+
default:
|
194
|
+
case 3: v_thickness = RARRAY_AREF(v_annotation, 2);
|
195
|
+
case 2: v_color = RARRAY_AREF(v_annotation, 1);
|
196
|
+
case 1: v_label = RARRAY_AREF(v_annotation, 0);
|
197
|
+
case 0: break;
|
198
|
+
}
|
199
|
+
break;
|
200
|
+
case T_STRING:
|
201
|
+
v_label = v_annotation;
|
202
|
+
break;
|
203
|
+
}
|
204
|
+
|
205
|
+
// No color, no rendering
|
206
|
+
if (NIL_P(v_color))
|
207
|
+
return Qnil;
|
208
|
+
|
209
|
+
long rgb = NUM2ULONG(v_color);
|
210
|
+
Scalar color = cv::Scalar((rgb >> 0) & 0xFF,
|
211
|
+
(rgb >> 8) & 0xFF,
|
212
|
+
(rgb >> 16) & 0xFF);
|
213
|
+
|
214
|
+
if (! NIL_P(v_thickness)) {
|
215
|
+
int thickness = NUM2INT(v_thickness);
|
216
|
+
draw_box(img, box, color, thickness);
|
217
|
+
}
|
218
|
+
if (! NIL_P(v_label)) {
|
219
|
+
string label = StringValueCStr(v_label);
|
220
|
+
Point o = { box.x, box.y };
|
221
|
+
draw_label(img, label, o, BLACK, color);
|
222
|
+
}
|
157
223
|
|
224
|
+
// Return normalized parameters
|
225
|
+
VALUE r = rb_hash_new();
|
226
|
+
rb_hash_aset(r, s_label, v_label );
|
227
|
+
rb_hash_aset(r, s_color, v_color );
|
228
|
+
rb_hash_aset(r, s_thickness, v_thickness);
|
229
|
+
return r;
|
230
|
+
}
|
158
231
|
|
159
232
|
|
160
233
|
|
@@ -186,40 +259,11 @@ yunet_process_features(vector<YuNet::Face>& faces,
|
|
186
259
|
rb_ary_push(v_features, v_feature);
|
187
260
|
|
188
261
|
if (!img.empty() && rb_block_given_p()) {
|
189
|
-
VALUE v_annotation= rb_yield_splat(v_feature);
|
190
|
-
VALUE
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
switch (TYPE(v_annotation)) {
|
195
|
-
case T_NIL:
|
196
|
-
break;
|
197
|
-
case T_HASH:
|
198
|
-
break;
|
199
|
-
case T_ARRAY:
|
200
|
-
switch(RARRAY_LENINT(v_annotation)) {
|
201
|
-
default:
|
202
|
-
case 3: v_thickness = RARRAY_AREF(v_annotation, 2);
|
203
|
-
case 2: v_color = RARRAY_AREF(v_annotation, 1);
|
204
|
-
case 1: v_label = RARRAY_AREF(v_annotation, 0);
|
205
|
-
case 0: break;
|
206
|
-
}
|
207
|
-
break;
|
208
|
-
case T_STRING:
|
209
|
-
v_label = v_annotation;
|
210
|
-
break;
|
211
|
-
}
|
212
|
-
|
213
|
-
if (! NIL_P(v_label)) {
|
214
|
-
string label = StringValueCStr(v_label);
|
215
|
-
long rgb = NUM2ULONG(v_color);
|
216
|
-
int thickness = NUM2INT(v_thickness);
|
217
|
-
Scalar color = cv::Scalar((rgb >> 0) & 0xFF,
|
218
|
-
(rgb >> 8) & 0xFF,
|
219
|
-
(rgb >> 16) & 0xFF);
|
220
|
-
draw_labelbox(img, label, box, color, BLACK, thickness);
|
221
|
-
|
222
|
-
for (const auto& p : lmark) {
|
262
|
+
VALUE v_annotation = rb_yield_splat(v_feature);
|
263
|
+
VALUE cfg = circe_annotate(img, box, v_annotation, state);
|
264
|
+
|
265
|
+
if (! NIL_P(cfg)) {
|
266
|
+
for (const auto& p : lmark) {
|
223
267
|
cv::circle(img, p, 3, cv::Scalar(255, 0, 0), 2);
|
224
268
|
}
|
225
269
|
}
|
@@ -248,41 +292,9 @@ yolo_process_features(vector<Yolo::Item>& items,
|
|
248
292
|
v_name, v_confidence);
|
249
293
|
rb_ary_push(v_features, v_feature);
|
250
294
|
|
251
|
-
if (rb_block_given_p()) {
|
295
|
+
if (!img.empty() && rb_block_given_p()) {
|
252
296
|
VALUE v_annotation = rb_yield_splat(v_feature);
|
253
|
-
|
254
|
-
VALUE v_label = Qnil;
|
255
|
-
VALUE v_color = ULONG2NUM(0x0000ff);
|
256
|
-
VALUE v_thickness = INT2NUM(1);
|
257
|
-
|
258
|
-
switch (TYPE(v_annotation)) {
|
259
|
-
case T_NIL:
|
260
|
-
break;
|
261
|
-
case T_HASH:
|
262
|
-
break;
|
263
|
-
case T_ARRAY:
|
264
|
-
switch(RARRAY_LENINT(v_annotation)) {
|
265
|
-
default:
|
266
|
-
case 3: v_thickness = RARRAY_AREF(v_annotation, 2);
|
267
|
-
case 2: v_color = RARRAY_AREF(v_annotation, 1);
|
268
|
-
case 1: v_label = RARRAY_AREF(v_annotation, 0);
|
269
|
-
case 0: break;
|
270
|
-
}
|
271
|
-
break;
|
272
|
-
case T_STRING:
|
273
|
-
v_label = v_annotation;
|
274
|
-
break;
|
275
|
-
}
|
276
|
-
|
277
|
-
if (! NIL_P(v_label)) {
|
278
|
-
string label = StringValueCStr(v_label);
|
279
|
-
long rgb = NUM2ULONG(v_color);
|
280
|
-
int thickness = NUM2INT(v_thickness);
|
281
|
-
Scalar color = cv::Scalar((rgb >> 0) & 0xFF,
|
282
|
-
(rgb >> 8) & 0xFF,
|
283
|
-
(rgb >> 16) & 0xFF);
|
284
|
-
draw_labelbox(img, label, box, color, BLACK, thickness);
|
285
|
-
}
|
297
|
+
circe_annotate(img, box, v_annotation, state);
|
286
298
|
}
|
287
299
|
}
|
288
300
|
}
|
@@ -364,6 +376,10 @@ circe_m_analyze(int argc, VALUE* argv, VALUE self) {
|
|
364
376
|
cv::imencode(format, o_img, buf);
|
365
377
|
v_image = rb_str_new(reinterpret_cast<char*>(buf.data()), buf.size());
|
366
378
|
}
|
379
|
+
|
380
|
+
i_img.release();
|
381
|
+
o_img.release();
|
382
|
+
|
367
383
|
return rb_ary_new_from_args(2, v_features, v_image);
|
368
384
|
|
369
385
|
exception:
|
@@ -382,22 +398,34 @@ void Init_core(void) {
|
|
382
398
|
eCirceError = rb_define_class_under(cCirce, "Error", rb_eStandardError);
|
383
399
|
// myclass = rb_const_get(mymodule, sym_myclass);
|
384
400
|
|
385
|
-
VALUE v_onnx_yolo
|
386
|
-
VALUE
|
401
|
+
VALUE v_onnx_yolo = rb_const_get(cCirce, rb_intern("ONNX_YOLO"));
|
402
|
+
VALUE v_yolo_path = RARRAY_AREF(v_onnx_yolo, 0);
|
403
|
+
VALUE v_yolo_height = RARRAY_AREF(v_onnx_yolo, 1);
|
404
|
+
VALUE v_yolo_width = RARRAY_AREF(v_onnx_yolo, 2);
|
405
|
+
|
406
|
+
VALUE v_onnx_yunet = rb_const_get(cCirce, rb_intern("ONNX_YUNET"));
|
407
|
+
VALUE v_yunet_path = RARRAY_AREF(v_onnx_yunet, 0);
|
387
408
|
|
388
|
-
|
389
|
-
|
409
|
+
|
410
|
+
|
411
|
+
static Yolo _yolo = { StringValueCStr(v_yolo_path ),
|
412
|
+
{ NUM2INT(v_yolo_width),
|
413
|
+
NUM2INT(v_yolo_height) }};
|
414
|
+
static YuNet _yunet = { StringValueCStr(v_yunet_path) };
|
390
415
|
|
391
416
|
yolo = &_yolo;
|
392
417
|
yunet = &_yunet;
|
393
418
|
|
394
419
|
|
395
|
-
id_debug = rb_intern_const("debug"
|
396
|
-
id_face = rb_intern_const("face"
|
397
|
-
id_classify = rb_intern_const("classify");
|
398
|
-
id_class = rb_intern_const("class"
|
399
|
-
id_png = rb_intern_const("png"
|
400
|
-
id_jpg = rb_intern_const("jpg"
|
420
|
+
id_debug = rb_intern_const("debug" );
|
421
|
+
id_face = rb_intern_const("face" );
|
422
|
+
id_classify = rb_intern_const("classify" );
|
423
|
+
id_class = rb_intern_const("class" );
|
424
|
+
id_png = rb_intern_const("png" );
|
425
|
+
id_jpg = rb_intern_const("jpg" );
|
426
|
+
id_label = rb_intern_const("label" );
|
427
|
+
id_thickness = rb_intern_const("thickness");
|
428
|
+
id_color = rb_intern_const("color" );
|
401
429
|
|
402
430
|
|
403
431
|
rb_define_method(cCirce, "analyze", circe_m_analyze, -1);
|
data/ext/yolo.cpp
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
/*
|
2
|
+
* https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-CPP-Inference/inference.cpp
|
3
|
+
* https://github.com/opencv/opencv/blob/4.x/samples/dnn/yolo_detector.cpp
|
4
|
+
*
|
5
|
+
* yolov5 has an output of shape:
|
6
|
+
* (batchSize, 25200, 85) (Num classes + box[x,y,w,h] + confidence[c])
|
7
|
+
* yolov8 has an output of shape:
|
8
|
+
* (batchSize, 84, 8400) (Num classes + box[x,y,w,h])
|
9
|
+
*
|
10
|
+
* yolo export model=yolov8s.pt imgsz=480,640 format=onnx opset=12
|
11
|
+
*/
|
1
12
|
#include <tuple>
|
2
13
|
#include <string>
|
3
14
|
#include <opencv2/imgproc.hpp>
|
@@ -6,89 +17,144 @@
|
|
6
17
|
#include "yolo.h"
|
7
18
|
|
8
19
|
|
9
|
-
Yolo::Yolo(const std::string& model) {
|
10
|
-
net
|
20
|
+
Yolo::Yolo(const std::string& model, cv::Size size) {
|
21
|
+
this->net = cv::dnn::readNetFromONNX(model);
|
22
|
+
this->size = size;
|
11
23
|
}
|
12
24
|
|
13
25
|
|
14
26
|
void Yolo::process(cv::Mat &img, std::vector<Yolo::Item> &items) {
|
27
|
+
int version = 5;
|
15
28
|
|
29
|
+
cv::Mat input = img;
|
30
|
+
if (letterBoxForSquare && size.width == size.height)
|
31
|
+
input = formatToSquare(input);
|
32
|
+
|
16
33
|
// Pre-process
|
17
34
|
cv::Mat blob;
|
18
|
-
|
19
|
-
|
20
|
-
cv::dnn::blobFromImage(img, blob, 1./255.,
|
21
|
-
cv::Size(INPUT_WIDTH, INPUT_HEIGHT),
|
22
|
-
cv::Scalar(), true, false);
|
35
|
+
cv::dnn::blobFromImage(input, blob, 1./255.,
|
36
|
+
this->size, cv::Scalar(), true, false);
|
23
37
|
|
24
38
|
// Process
|
39
|
+
std::vector<cv::Mat> outputs;
|
25
40
|
net.setInput(blob);
|
26
41
|
net.forward(outputs, net.getUnconnectedOutLayersNames());
|
27
42
|
|
28
|
-
//
|
29
|
-
|
30
|
-
|
31
|
-
|
43
|
+
// Output
|
44
|
+
int rows = outputs[0].size[1];
|
45
|
+
int dimensions = outputs[0].size[2];
|
46
|
+
|
47
|
+
// Infer yolo version
|
48
|
+
// -> Check if the shape[2] is more than shape[1] (yolov8)
|
49
|
+
if (dimensions > rows) {
|
50
|
+
version = 8;
|
51
|
+
}
|
52
|
+
|
53
|
+
// Adjust according to version
|
54
|
+
if (version == 8) {
|
55
|
+
// cv::transposeND(outs[0], {0, 2, 1}, outs[0]);
|
56
|
+
rows = outputs[0].size[2];
|
57
|
+
dimensions = outputs[0].size[1];
|
58
|
+
outputs[0] = outputs[0].reshape(1, dimensions);
|
59
|
+
cv::transpose(outputs[0], outputs[0]);
|
60
|
+
}
|
61
|
+
|
62
|
+
// Output
|
63
|
+
float *data = (float *)outputs[0].data;
|
32
64
|
|
33
65
|
// Resizing factor.
|
34
|
-
float x_factor =
|
35
|
-
float y_factor =
|
66
|
+
float x_factor = input.cols / size.width;
|
67
|
+
float y_factor = input.rows / size.height;
|
36
68
|
|
37
|
-
|
38
|
-
|
69
|
+
// Post-process
|
70
|
+
std::vector<int> class_ids;
|
71
|
+
std::vector<float> confidences;
|
72
|
+
std::vector<cv::Rect> boxes;
|
39
73
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
|
75
|
+
if (version == 5) {
|
76
|
+
for (int i = 0; i < rows; ++i) {
|
77
|
+
float confidence = data[4];
|
78
|
+
|
79
|
+
if (confidence >= CONFIDENCE_THRESHOLD) {
|
80
|
+
float *classes_scores = data + 5;
|
81
|
+
|
82
|
+
cv::Mat scores(1, classes.size(), CV_32FC1, classes_scores);
|
83
|
+
cv::Point class_id;
|
84
|
+
double max_class_score;
|
85
|
+
|
86
|
+
minMaxLoc(scores, 0, &max_class_score, 0, &class_id);
|
87
|
+
|
88
|
+
if (max_class_score > SCORE_THRESHOLD) {
|
89
|
+
confidences.push_back(confidence);
|
90
|
+
class_ids.push_back(class_id.x);
|
91
|
+
|
92
|
+
float x = data[0];
|
93
|
+
float y = data[1];
|
94
|
+
float w = data[2];
|
95
|
+
float h = data[3];
|
96
|
+
|
97
|
+
int left = int((x - 0.5 * w) * x_factor);
|
98
|
+
int top = int((y - 0.5 * h) * y_factor);
|
99
|
+
int width = int(w * x_factor);
|
100
|
+
int height = int(h * y_factor);
|
101
|
+
|
102
|
+
boxes.push_back(cv::Rect(left, top, width, height));
|
103
|
+
}
|
104
|
+
}
|
105
|
+
data += dimensions;
|
106
|
+
}
|
107
|
+
} else if (version == 8) {
|
108
|
+
for (int i = 0; i < rows; ++i) {
|
109
|
+
float *classes_scores = data + 4;
|
110
|
+
|
111
|
+
cv::Mat scores(1, classes.size(), CV_32FC1, classes_scores);
|
112
|
+
cv::Point class_id;
|
113
|
+
double maxClassScore;
|
114
|
+
|
115
|
+
minMaxLoc(scores, 0, &maxClassScore, 0, &class_id);
|
116
|
+
|
117
|
+
if (maxClassScore > SCORE_THRESHOLD) {
|
118
|
+
confidences.push_back(maxClassScore);
|
75
119
|
class_ids.push_back(class_id.x);
|
120
|
+
|
121
|
+
float x = data[0];
|
122
|
+
float y = data[1];
|
123
|
+
float w = data[2];
|
124
|
+
float h = data[3];
|
125
|
+
|
126
|
+
int left = int((x - 0.5 * w) * x_factor);
|
127
|
+
int top = int((y - 0.5 * h) * y_factor);
|
128
|
+
int width = int(w * x_factor);
|
129
|
+
int height = int(h * y_factor);
|
130
|
+
|
76
131
|
boxes.push_back(cv::Rect(left, top, width, height));
|
77
132
|
}
|
78
|
-
|
79
|
-
|
80
|
-
data += 85;
|
133
|
+
data += dimensions;
|
134
|
+
}
|
81
135
|
}
|
136
|
+
|
82
137
|
|
83
138
|
// Perform Non-Maximum Suppression and draw predictions.
|
84
|
-
std::vector<int>
|
139
|
+
std::vector<int> nms_result;
|
85
140
|
cv::dnn::NMSBoxes(boxes, confidences,
|
86
|
-
SCORE_THRESHOLD, NMS_THRESHOLD,
|
141
|
+
SCORE_THRESHOLD, NMS_THRESHOLD, nms_result);
|
87
142
|
|
88
143
|
items.clear();
|
89
144
|
|
90
|
-
for (int i = 0; i <
|
91
|
-
int idx =
|
92
|
-
items.push_back({
|
145
|
+
for (int i = 0; i < nms_result.size(); i++) {
|
146
|
+
int idx = nms_result[i];
|
147
|
+
items.push_back({ classes[class_ids[idx]],confidences[idx],boxes[idx] });
|
93
148
|
}
|
94
149
|
}
|
150
|
+
|
151
|
+
|
152
|
+
cv::Mat Yolo::formatToSquare(const cv::Mat &source)
|
153
|
+
{
|
154
|
+
int col = source.cols;
|
155
|
+
int row = source.rows;
|
156
|
+
int _max = MAX(col, row);
|
157
|
+
cv::Mat result = cv::Mat::zeros(_max, _max, CV_8UC3);
|
158
|
+
source.copyTo(result(cv::Rect(0, 0, col, row)));
|
159
|
+
return result;
|
160
|
+
}
|
data/ext/yolo.h
CHANGED
@@ -16,12 +16,14 @@ public:
|
|
16
16
|
private:
|
17
17
|
static constexpr float INPUT_WIDTH = 640.0;
|
18
18
|
static constexpr float INPUT_HEIGHT = 640.0;
|
19
|
-
static constexpr float
|
20
|
-
static constexpr float
|
21
|
-
static constexpr float
|
19
|
+
static constexpr float CONFIDENCE_THRESHOLD = 0.25;
|
20
|
+
static constexpr float SCORE_THRESHOLD = 0.45;
|
21
|
+
static constexpr float NMS_THRESHOLD = 0.50;
|
22
22
|
|
23
|
+
bool letterBoxForSquare = true;
|
24
|
+
|
23
25
|
public:
|
24
|
-
const std::vector<std::string>
|
26
|
+
const std::vector<std::string> classes = {
|
25
27
|
"person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train",
|
26
28
|
"truck", "boat", "traffic light", "fire hydrant", "stop sign",
|
27
29
|
"parking meter", "bench", "bird", "cat", "dog", "horse", "sheep",
|
@@ -38,11 +40,13 @@ private:
|
|
38
40
|
};
|
39
41
|
|
40
42
|
public:
|
41
|
-
Yolo(const std::string& model);
|
43
|
+
Yolo(const std::string& model, cv::Size size);
|
42
44
|
void process(cv::Mat &img, std::vector<Item> &items);
|
43
45
|
|
44
46
|
private:
|
45
47
|
cv::dnn::Net net;
|
48
|
+
cv::Size size;
|
49
|
+
cv::Mat formatToSquare(const cv::Mat &source);
|
46
50
|
};
|
47
51
|
|
48
52
|
#endif
|
data/lib/circe/version.rb
CHANGED
data/lib/circe.rb
CHANGED
@@ -4,8 +4,8 @@ class Circe
|
|
4
4
|
|
5
5
|
# Don't know how to do it inside the c extension
|
6
6
|
DATA_DIR = File.join(__dir__, '..', 'data').freeze
|
7
|
-
ONNX_YOLO = File.join(DATA_DIR, 'yolov5s.onnx')
|
8
|
-
ONNX_YUNET = File.join(DATA_DIR, 'face_detection_yunet_2022mar.onnx')
|
7
|
+
ONNX_YOLO = [ File.join(DATA_DIR, 'yolov5s.onnx'), 640, 640 ]
|
8
|
+
ONNX_YUNET = [ File.join(DATA_DIR, 'face_detection_yunet_2022mar.onnx') ]
|
9
9
|
|
10
10
|
end
|
11
11
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stéphane D'Alu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2+
|
14
14
|
|
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
|
-
rubygems_version: 3.4.
|
55
|
+
rubygems_version: 3.4.20
|
56
56
|
signing_key:
|
57
57
|
specification_version: 4
|
58
58
|
summary: Face and object recognition
|