vision-camera-face-detection 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/visioncamerafacedetection/VisionCameraFaceDetectionPlugin.kt +35 -23
- package/ios/VisionCameraFaceDetectionPlugin.swift +28 -20
- package/lib/commonjs/FaceDetector.cjs.map +1 -1
- package/lib/module/FaceDetector.mjs.map +1 -1
- package/lib/typescript/src/FaceDetector.d.ts +4 -0
- package/lib/typescript/src/FaceDetector.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/FaceDetector.ts +5 -0
package/android/src/main/java/com/visioncamerafacedetection/VisionCameraFaceDetectionPlugin.kt
CHANGED
|
@@ -42,11 +42,15 @@ class VisionCameraFaceDetectionPlugin(
|
|
|
42
42
|
private var runClassifications = false
|
|
43
43
|
private var runContours = false
|
|
44
44
|
private var trackingEnabled = false
|
|
45
|
+
private var enableTensor = false
|
|
45
46
|
|
|
46
47
|
init {
|
|
47
48
|
// handle auto scaling
|
|
48
49
|
autoScale = options?.get("autoScale").toString() == "true"
|
|
49
50
|
|
|
51
|
+
// handle enable/disable tensor
|
|
52
|
+
enableTensor = options?.get("enableTensor").toString() == "true"
|
|
53
|
+
|
|
50
54
|
// initializes faceDetector on creation
|
|
51
55
|
var performanceModeValue = FaceDetectorOptions.PERFORMANCE_MODE_FAST
|
|
52
56
|
var landmarkModeValue = FaceDetectorOptions.LANDMARK_MODE_NONE
|
|
@@ -117,16 +121,19 @@ class VisionCameraFaceDetectionPlugin(
|
|
|
117
121
|
bounds["x"] = (-y + sourceWidth * scaleX) - width
|
|
118
122
|
bounds["y"] = (-x + sourceHeight * scaleY) - height
|
|
119
123
|
}
|
|
124
|
+
|
|
120
125
|
Orientation.LANDSCAPE_LEFT -> {
|
|
121
126
|
// device is portrait
|
|
122
127
|
bounds["x"] = (-x + sourceWidth * scaleX) - width
|
|
123
128
|
bounds["y"] = y
|
|
124
129
|
}
|
|
130
|
+
|
|
125
131
|
Orientation.PORTRAIT_UPSIDE_DOWN -> {
|
|
126
132
|
// device is landscape right
|
|
127
133
|
bounds["x"] = y
|
|
128
134
|
bounds["y"] = x
|
|
129
135
|
}
|
|
136
|
+
|
|
130
137
|
Orientation.LANDSCAPE_RIGHT -> {
|
|
131
138
|
// device is upside down
|
|
132
139
|
bounds["x"] = x
|
|
@@ -289,30 +296,36 @@ class VisionCameraFaceDetectionPlugin(
|
|
|
289
296
|
val task = faceDetector!!.process(image)
|
|
290
297
|
val faces = Tasks.await(task)
|
|
291
298
|
faces.forEach { face ->
|
|
292
|
-
val
|
|
293
|
-
val bmpFaceResult =
|
|
294
|
-
Bitmap.createBitmap(
|
|
295
|
-
TF_OD_API_INPUT_SIZE,
|
|
296
|
-
TF_OD_API_INPUT_SIZE,
|
|
297
|
-
Bitmap.Config.ARGB_8888
|
|
298
|
-
)
|
|
299
|
-
val faceBB = RectF(face.boundingBox)
|
|
300
|
-
val cvFace = Canvas(bmpFaceResult)
|
|
301
|
-
val sx = TF_OD_API_INPUT_SIZE.toFloat() / faceBB.width()
|
|
302
|
-
val sy = TF_OD_API_INPUT_SIZE.toFloat() / faceBB.height()
|
|
303
|
-
val matrix = Matrix()
|
|
304
|
-
matrix.postTranslate(-faceBB.left, -faceBB.top)
|
|
305
|
-
matrix.postScale(sx, sy)
|
|
306
|
-
cvFace.drawBitmap(bmpFrameResult, matrix, null)
|
|
307
|
-
val input: ByteBuffer = FaceHelper().bitmap2ByteBuffer(bmpFaceResult)
|
|
308
|
-
val output: FloatBuffer = FloatBuffer.allocate(192)
|
|
309
|
-
interpreter?.run(input, output)
|
|
310
|
-
|
|
299
|
+
val map: MutableMap<String, Any> = HashMap()
|
|
311
300
|
val arrayData: MutableList<Any> = ArrayList()
|
|
312
|
-
|
|
313
|
-
|
|
301
|
+
if (enableTensor) {
|
|
302
|
+
val bmpFrameResult = ImageConvertUtils.getInstance().getUpRightBitmap(image)
|
|
303
|
+
val bmpFaceResult =
|
|
304
|
+
Bitmap.createBitmap(
|
|
305
|
+
TF_OD_API_INPUT_SIZE,
|
|
306
|
+
TF_OD_API_INPUT_SIZE,
|
|
307
|
+
Bitmap.Config.ARGB_8888
|
|
308
|
+
)
|
|
309
|
+
val faceBB = RectF(face.boundingBox)
|
|
310
|
+
val cvFace = Canvas(bmpFaceResult)
|
|
311
|
+
val sx = TF_OD_API_INPUT_SIZE.toFloat() / faceBB.width()
|
|
312
|
+
val sy = TF_OD_API_INPUT_SIZE.toFloat() / faceBB.height()
|
|
313
|
+
val matrix = Matrix()
|
|
314
|
+
matrix.postTranslate(-faceBB.left, -faceBB.top)
|
|
315
|
+
matrix.postScale(sx, sy)
|
|
316
|
+
cvFace.drawBitmap(bmpFrameResult, matrix, null)
|
|
317
|
+
val input: ByteBuffer = FaceHelper().bitmap2ByteBuffer(bmpFaceResult)
|
|
318
|
+
val output: FloatBuffer = FloatBuffer.allocate(192)
|
|
319
|
+
interpreter?.run(input, output)
|
|
320
|
+
|
|
321
|
+
for (i: Float in output.array()) {
|
|
322
|
+
arrayData.add(i.toDouble())
|
|
323
|
+
}
|
|
324
|
+
map["data"] = arrayData
|
|
325
|
+
} else {
|
|
326
|
+
map["data"] = arrayData
|
|
314
327
|
}
|
|
315
|
-
|
|
328
|
+
|
|
316
329
|
if (runLandmarks) {
|
|
317
330
|
map["landmarks"] = processLandmarks(
|
|
318
331
|
face,
|
|
@@ -346,7 +359,6 @@ class VisionCameraFaceDetectionPlugin(
|
|
|
346
359
|
scaleX,
|
|
347
360
|
scaleY
|
|
348
361
|
)
|
|
349
|
-
map["data"] = arrayData
|
|
350
362
|
result.add(map)
|
|
351
363
|
}
|
|
352
364
|
} catch (e: Exception) {
|
|
@@ -20,6 +20,7 @@ public class VisionCameraFaceDetectionPlugin: FrameProcessorPlugin {
|
|
|
20
20
|
private var runClassifications = false
|
|
21
21
|
private var runContours = false
|
|
22
22
|
private var trackingEnabled = false
|
|
23
|
+
private var enableTensor = false
|
|
23
24
|
|
|
24
25
|
public override init(
|
|
25
26
|
proxy: VisionCameraProxyHolder,
|
|
@@ -30,6 +31,9 @@ public class VisionCameraFaceDetectionPlugin: FrameProcessorPlugin {
|
|
|
30
31
|
|
|
31
32
|
// handle auto scaling
|
|
32
33
|
autoScale = config?["autoScale"] as? Bool == true
|
|
34
|
+
|
|
35
|
+
// handle enable/disable tensor
|
|
36
|
+
enableTensor = config?["enableTensor"] as? Bool == true
|
|
33
37
|
|
|
34
38
|
// initializes faceDetector on creation
|
|
35
39
|
let minFaceSize = 0.15
|
|
@@ -268,26 +272,30 @@ public class VisionCameraFaceDetectionPlugin: FrameProcessorPlugin {
|
|
|
268
272
|
let faces: [Face] = try faceDetector!.results(in: image)
|
|
269
273
|
for face in faces {
|
|
270
274
|
var map: [String: Any] = [:]
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
275
|
+
if enableTensor {
|
|
276
|
+
guard let imageCrop = FaceHelper.getImageFaceFromBuffer(from: frame.buffer, rectImage: face.frame, orientation: orientation) else {
|
|
277
|
+
return nil
|
|
278
|
+
}
|
|
279
|
+
guard let pixelBuffer = FaceHelper.uiImageToPixelBuffer(image: imageCrop, size: inputWidth) else {
|
|
280
|
+
return nil
|
|
281
|
+
}
|
|
282
|
+
guard let rgbData = FaceHelper.rgbDataFromBuffer(
|
|
283
|
+
pixelBuffer,
|
|
284
|
+
byteCount: batchSize * inputWidth * inputHeight * inputChannels,
|
|
285
|
+
isModelQuantized: false
|
|
286
|
+
) else {
|
|
287
|
+
return nil
|
|
288
|
+
}
|
|
289
|
+
try interpreter?.copy(rgbData, toInputAt: 0)
|
|
290
|
+
try interpreter?.invoke()
|
|
291
|
+
let outputTensor: Tensor? = try interpreter?.output(at: 0)
|
|
292
|
+
|
|
293
|
+
if ((outputTensor?.data) != nil) {
|
|
294
|
+
let result: [Float] = [Float32](unsafeData: outputTensor!.data) ?? []
|
|
295
|
+
map["data"] = result
|
|
296
|
+
} else {
|
|
297
|
+
map["data"] = []
|
|
298
|
+
}
|
|
291
299
|
} else {
|
|
292
300
|
map["data"] = []
|
|
293
301
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNativeVisionCamera","createFaceDetectorPlugin","options","plugin","VisionCameraProxy","initFrameProcessorPlugin","Error","detectFaces","frame","call","useFaceDetector","useMemo"],"sourceRoot":"../../src","sources":["FaceDetector.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNativeVisionCamera","createFaceDetectorPlugin","options","plugin","VisionCameraProxy","initFrameProcessorPlugin","Error","detectFaces","frame","call","useFaceDetector","useMemo"],"sourceRoot":"../../src","sources":["FaceDetector.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AA+HA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,wBAAwBA,CAC/BC,OAA8B,EACV;EACpB,MAAMC,MAAM,GAAGC,0CAAiB,CAACC,wBAAwB,CAAC,aAAa,EAAE;IACvE,GAAGH;EACL,CAAC,CAAC;EAEF,IAAI,CAACC,MAAM,EAAE;IACX,MAAM,IAAIG,KAAK,CAAC,sDAAsD,CAAC;EACzE;EAEA,OAAO;IACLC,WAAW,EAAGC,KAAY,IAAa;MACrC,SAAS;;MACT;MACA,OAAOL,MAAM,CAACM,IAAI,CAACD,KAAK,CAAC;IAC3B;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,eAAeA,CAC7BR,OAA8B,EACV;EACpB,OAAO,IAAAS,cAAO,EAAC,MAAMV,wBAAwB,CAACC,OAAO,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;AACpE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","VisionCameraProxy","createFaceDetectorPlugin","options","plugin","initFrameProcessorPlugin","Error","detectFaces","frame","call","useFaceDetector"],"sourceRoot":"../../src","sources":["FaceDetector.ts"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,iBAAiB,QAAoB,4BAA4B;
|
|
1
|
+
{"version":3,"names":["useMemo","VisionCameraProxy","createFaceDetectorPlugin","options","plugin","initFrameProcessorPlugin","Error","detectFaces","frame","call","useFaceDetector"],"sourceRoot":"../../src","sources":["FaceDetector.ts"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,iBAAiB,QAAoB,4BAA4B;AA+H1E;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,wBAAwBA,CAC/BC,OAA8B,EACV;EACpB,MAAMC,MAAM,GAAGH,iBAAiB,CAACI,wBAAwB,CAAC,aAAa,EAAE;IACvE,GAAGF;EACL,CAAC,CAAC;EAEF,IAAI,CAACC,MAAM,EAAE;IACX,MAAM,IAAIE,KAAK,CAAC,sDAAsD,CAAC;EACzE;EAEA,OAAO;IACLC,WAAW,EAAGC,KAAY,IAAa;MACrC,SAAS;;MACT;MACA,OAAOJ,MAAM,CAACK,IAAI,CAACD,KAAK,CAAC;IAC3B;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,eAAeA,CAC7BP,OAA8B,EACV;EACpB,OAAOH,OAAO,CAAC,MAAME,wBAAwB,CAACC,OAAO,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;AACpE","ignoreList":[]}
|
|
@@ -105,6 +105,10 @@ export interface FaceDetectionOptions {
|
|
|
105
105
|
* @default false
|
|
106
106
|
*/
|
|
107
107
|
autoScale?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* for enable/disable tensorflow lite logic, just face detection
|
|
110
|
+
*/
|
|
111
|
+
enableTensor?: boolean;
|
|
108
112
|
}
|
|
109
113
|
/**
|
|
110
114
|
* Use an instance of face detector plugin.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FaceDetector.d.ts","sourceRoot":"","sources":["../../../src/FaceDetector.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAE3E,KAAK,kBAAkB,GAAG;IACxB;;;;OAIG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC;CACvC,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC7B,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,oBAAoB,EAAE,KAAK,EAAE,CAAC;IAC9B,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,SAAS,EAAE,KAAK,EAAE,CAAC;IACnB,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,KAAK,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;IACjB,WAAW,EAAE,KAAK,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAEtC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAEpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FaceDetector.d.ts","sourceRoot":"","sources":["../../../src/FaceDetector.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAE3E,KAAK,kBAAkB,GAAG;IACxB;;;;OAIG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC;CACvC,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC7B,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,oBAAoB,EAAE,KAAK,EAAE,CAAC;IAC9B,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,SAAS,EAAE,KAAK,EAAE,CAAC;IACnB,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,KAAK,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;IACjB,WAAW,EAAE,KAAK,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAEtC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAEpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA4BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,kBAAkB,CAEpB"}
|
package/package.json
CHANGED
package/src/FaceDetector.ts
CHANGED