From 564366e190b5a5b22f21f0719b1bad32da4bed92 Mon Sep 17 00:00:00 2001 From: Keith Ito Date: Mon, 10 Aug 2020 15:54:23 -0700 Subject: [PATCH] Add SwiftMaskDetection library --- .gitignore | 31 + Converter/convert.py | 38 + Converter/evaluate.py | 192 + Converter/requirements.txt | 3 + Example/Podfile | 7 + Example/Podfile.lock | 23 + .../project.pbxproj | 550 ++ .../contents.xcworkspacedata | 7 + .../SwiftMaskDetection-Example.xcscheme | 117 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Example/SwiftMaskDetection/AppDelegate.swift | 15 + .../Base.lproj/LaunchScreen.xib | 33 + Example/SwiftMaskDetection/BoundingBox.swift | 57 + .../AppIcon.appiconset/Contents.json | 53 + Example/SwiftMaskDetection/Info.plist | 38 + Example/SwiftMaskDetection/PreviewView.swift | 51 + .../SwiftMaskDetection/ViewController.swift | 124 + Example/Tests/Info.plist | 24 + Example/Tests/Tests.swift | 19 + LICENSE | 19 + README.md | 45 +- SwiftMaskDetection.podspec | 17 + .../Classes/MaskDetectionVideoHelper.swift | 66 + SwiftMaskDetection/Classes/MaskDetector.swift | 211 + SwiftMaskDetection/Classes/MaskModel.mlmodel | Bin 0 -> 4073991 bytes SwiftMaskDetection/Classes/anchors.json | 5973 +++++++++++++++++ _Pods.xcodeproj | 1 + 28 files changed, 7731 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Converter/convert.py create mode 100644 Converter/evaluate.py create mode 100644 Converter/requirements.txt create mode 100644 Example/Podfile create mode 100644 Example/Podfile.lock create mode 100644 Example/SwiftMaskDetection.xcodeproj/project.pbxproj create mode 100644 Example/SwiftMaskDetection.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/SwiftMaskDetection.xcodeproj/xcshareddata/xcschemes/SwiftMaskDetection-Example.xcscheme create mode 100644 Example/SwiftMaskDetection.xcworkspace/contents.xcworkspacedata create mode 100644 Example/SwiftMaskDetection.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example/SwiftMaskDetection/AppDelegate.swift create mode 100644 Example/SwiftMaskDetection/Base.lproj/LaunchScreen.xib create mode 100644 Example/SwiftMaskDetection/BoundingBox.swift create mode 100644 Example/SwiftMaskDetection/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example/SwiftMaskDetection/Info.plist create mode 100644 Example/SwiftMaskDetection/PreviewView.swift create mode 100644 Example/SwiftMaskDetection/ViewController.swift create mode 100644 Example/Tests/Info.plist create mode 100644 Example/Tests/Tests.swift create mode 100644 LICENSE create mode 100644 SwiftMaskDetection.podspec create mode 100644 SwiftMaskDetection/Classes/MaskDetectionVideoHelper.swift create mode 100644 SwiftMaskDetection/Classes/MaskDetector.swift create mode 100644 SwiftMaskDetection/Classes/MaskModel.mlmodel create mode 100644 SwiftMaskDetection/Classes/anchors.json create mode 120000 _Pods.xcodeproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e8d3ee9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Xcode +build/ +DerivedData/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +.DS_Store +*.xccheckout +*.xcscmblueprint +*.ipa +*.dSYM.zip +*.dSYM + +# Swift Package Manager +Packages/ +Package.pins +.build/ + +# CocoaPods +Pods/ + +# Python +__pycache__/ +.cache/ +*.pyc diff --git a/Converter/convert.py b/Converter/convert.py new file mode 100644 index 0000000..41beb91 --- /dev/null +++ b/Converter/convert.py @@ -0,0 +1,38 @@ +import argparse +import coremltools as ct +from coremltools.models import MLModel +import tensorflow as tf + + +# Converts the AIZOO face mask detector (https://github.com/AIZOOTech/FaceMaskDetection) to CoreML +def convert(args): + print('Loading model: %s' % args.model) + with open(args.model) as f: + keras_model = tf.keras.models.model_from_json(f.read()) + + print('Loading weights: %s' % args.weights) + keras_model.load_weights(args.weights) + + print('Converting to coreml') + mlmodel = ct.convert(keras_model, + inputs=[ct.ImageType(scale=1/255)], + minimum_deployment_target=ct.target.iOS13) + + print('Renaming outputs') + spec = mlmodel.get_spec() + ct.models.utils.rename_feature(spec, 'Identity', 'output_scores') + ct.models.utils.rename_feature(spec, 'Identity_1', 'output_bounds') + + out_path = args.output if args.output else '/tmp/MaskModel.mlmodel' + print('Saving to: %s' % out_path) + ct.models.utils.save_spec(spec, out_path) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--model', required=True, + help='Path to the Keras model file, e.g. face_mask_detection.json') + parser.add_argument('--weights', required=True, + help='Path to the Keras weights file, e.g. face_mask_detection.hdf5') + parser.add_argument('--output', help='Path to write the CoreML model to') + convert(parser.parse_args()) diff --git a/Converter/evaluate.py b/Converter/evaluate.py new file mode 100644 index 0000000..286086c --- /dev/null +++ b/Converter/evaluate.py @@ -0,0 +1,192 @@ +import argparse +import coremltools as ct +from coremltools.models import MLModel +import json +import numpy as np +from pathlib import Path +from PIL import Image, ImageDraw + + +# Copied from: https://github.com/AIZOOTech/FaceMaskDetection/blob/master/utils/anchor_generator.py +def generate_anchors(feature_map_sizes, anchor_sizes, anchor_ratios, offset=0.5): + ''' + generate anchors. + :param feature_map_sizes: list of list, for example: [[40,40], [20,20]] + :param anchor_sizes: list of list, for example: [[0.05, 0.075], [0.1, 0.15]] + :param anchor_ratios: list of list, for example: [[1, 0.5], [1, 0.5]] + :param offset: default to 0.5 + ''' + anchor_bboxes = [] + for idx, feature_size in enumerate(feature_map_sizes): + cx = (np.linspace(0, feature_size[0] - 1, feature_size[0]) + 0.5) / feature_size[0] + cy = (np.linspace(0, feature_size[1] - 1, feature_size[1]) + 0.5) / feature_size[1] + cx_grid, cy_grid = np.meshgrid(cx, cy) + cx_grid_expend = np.expand_dims(cx_grid, axis=-1) + cy_grid_expend = np.expand_dims(cy_grid, axis=-1) + center = np.concatenate((cx_grid_expend, cy_grid_expend), axis=-1) + + num_anchors = len(anchor_sizes[idx]) + len(anchor_ratios[idx]) - 1 + center_tiled = np.tile(center, (1, 1, 2* num_anchors)) + anchor_width_heights = [] + + # different scales with the first aspect ratio + for scale in anchor_sizes[idx]: + ratio = anchor_ratios[idx][0] # select the first ratio + width = scale * np.sqrt(ratio) + height = scale / np.sqrt(ratio) + anchor_width_heights.extend([-width / 2.0, -height / 2.0, width / 2.0, height / 2.0]) + + # the first scale, with different aspect ratios (except the first one) + for ratio in anchor_ratios[idx][1:]: + s1 = anchor_sizes[idx][0] # select the first scale + width = s1 * np.sqrt(ratio) + height = s1 / np.sqrt(ratio) + anchor_width_heights.extend([-width / 2.0, -height / 2.0, width / 2.0, height / 2.0]) + + bbox_coords = center_tiled + np.array(anchor_width_heights) + bbox_coords_reshape = bbox_coords.reshape((-1, 4)) + anchor_bboxes.append(bbox_coords_reshape) + return np.concatenate(anchor_bboxes, axis=0) + + +# Copied from https://github.com/AIZOOTech/FaceMaskDetection/blob/master/utils/anchor_decode.py +def decode_bbox(anchors, raw_outputs, variances=[0.1, 0.1, 0.2, 0.2]): + ''' + Decode the actual bbox according to the anchors. + the anchor value order is:[xmin,ymin, xmax, ymax] + :param anchors: numpy array with shape [batch, num_anchors, 4] + :param raw_outputs: numpy array with the same shape with anchors + :param variances: list of float, default=[0.1, 0.1, 0.2, 0.2] + ''' + anchor_centers_x = (anchors[:,0:1] + anchors[:,2:3]) / 2 + anchor_centers_y = (anchors[:,1:2] + anchors[:,3:]) / 2 + anchors_w = anchors[:,2:3] - anchors[:,0:1] + anchors_h = anchors[:,3:] - anchors[:,1:2] + raw_outputs_rescale = raw_outputs * np.array(variances) + predict_center_x = raw_outputs_rescale[:,0:1] * anchors_w + anchor_centers_x + predict_center_y = raw_outputs_rescale[:,1:2] * anchors_h + anchor_centers_y + predict_w = np.exp(raw_outputs_rescale[:,2:3]) * anchors_w + predict_h = np.exp(raw_outputs_rescale[:,3:]) * anchors_h + predict_xmin = predict_center_x - predict_w / 2 + predict_ymin = predict_center_y - predict_h / 2 + predict_xmax = predict_center_x + predict_w / 2 + predict_ymax = predict_center_y + predict_h / 2 + return np.concatenate([predict_xmin, predict_ymin, predict_xmax, predict_ymax], axis=-1) + + +# Copied from https://github.com/AIZOOTech/FaceMaskDetection/blob/master/utils/nms.py +def single_class_non_max_suppression(bboxes, confidences, conf_thresh=0.2, iou_thresh=0.5, keep_top_k=-1): + ''' + do nms on single class. + Hint: for the specific class, given the bbox and its confidence, + 1) sort the bbox according to the confidence from top to down, we call this a set + 2) select the bbox with the highest confidence, remove it from set, and do IOU calculate with the rest bbox + 3) remove the bbox whose IOU is higher than the iou_thresh from the set, + 4) loop step 2 and 3, util the set is empty. + :param bboxes: numpy array of 2D, [num_bboxes, 4] + :param confidences: numpy array of 1D. [num_bboxes] + ''' + if len(bboxes) == 0: return [] + + conf_keep_idx = np.where(confidences > conf_thresh)[0] + + bboxes = bboxes[conf_keep_idx] + confidences = confidences[conf_keep_idx] + + pick = [] + xmin = bboxes[:, 0] + ymin = bboxes[:, 1] + xmax = bboxes[:, 2] + ymax = bboxes[:, 3] + + area = (xmax - xmin + 1e-3) * (ymax - ymin + 1e-3) + idxs = np.argsort(confidences) + + while len(idxs) > 0: + last = len(idxs) - 1 + i = idxs[last] + pick.append(i) + + # keep top k + if keep_top_k != -1: + if len(pick) >= keep_top_k: + break + + overlap_xmin = np.maximum(xmin[i], xmin[idxs[:last]]) + overlap_ymin = np.maximum(ymin[i], ymin[idxs[:last]]) + overlap_xmax = np.minimum(xmax[i], xmax[idxs[:last]]) + overlap_ymax = np.minimum(ymax[i], ymax[idxs[:last]]) + overlap_w = np.maximum(0, overlap_xmax - overlap_xmin) + overlap_h = np.maximum(0, overlap_ymax - overlap_ymin) + overlap_area = overlap_w * overlap_h + overlap_ratio = overlap_area / (area[idxs[:last]] + area[i] - overlap_area) + + need_to_be_deleted_idx = np.concatenate(([last], np.where(overlap_ratio > iou_thresh)[0])) + idxs = np.delete(idxs, need_to_be_deleted_idx) + return conf_keep_idx[pick] + + +# Dumps anchors to JSON, which can be +def dump_anchors(anchors, filename): + array = [] + for anchor in anchors: + array.append([round(x, 5) for x in anchor]) + s = json.dumps({'anchors': array}, separators=(',',':')) + s = s.replace('[[', '[\n[').replace('],', '],\n') + with open(filename, 'w') as out: + out.write(s) + print('Wrote %d anchors to: %s' % (len(array), filename)) + + +# Anchor configuration. +# Copied from: https://github.com/AIZOOTech/FaceMaskDetection/blob/master/keras_infer.py +feature_map_sizes = [[33, 33], [17, 17], [9, 9], [5, 5], [3, 3]] +anchor_sizes = [[0.04, 0.056], [0.08, 0.11], [0.16, 0.22], [0.32, 0.45], [0.64, 0.72]] +anchor_ratios = [[1, 0.62, 0.42]] * 5 +anchors = generate_anchors(feature_map_sizes, anchor_sizes, anchor_ratios) + + +def evaluate(args): + print('Loading model: %s' % args.model) + mlmodel = ct.models.MLModel(args.model) + image = Image.open(args.image) + result = mlmodel.predict({'data': image.resize((260, 260))}) + bboxes = decode_bbox(anchors, result['output_bounds'][0]) + max_labels = np.argmax(result['output_scores'][0], axis=1) + max_scores = np.max(result['output_scores'][0], axis=1) + keep_idxs = single_class_non_max_suppression( + bboxes, max_scores, conf_thresh=args.conf_threshold, iou_thresh=args.iou_threshold) + + # Print the bounding boxes, labels, and scores + label_names = {0: 'Mask', 1: 'No Mask'} + colors = {0: 'green', 1: 'red'} + for i in keep_idxs: + print('%s %s %.3f' % (bboxes[i], label_names[max_labels[i]], max_scores[i])) + + # Draw predictions into the image + draw = ImageDraw.Draw(image) + for i in keep_idxs: + x0, y0, x1, y1 = bboxes[i] + x0 = max(0, x0 * image.width) + y0 = max(0, y0 * image.height) + x1 = min(image.width, x1 * image.width) + y1 = min(image.height, y1 * image.height) + color = 'gray' + if max_scores[i] > 0.4: + color = colors[max_labels[i]] + draw.rectangle([x0, y0, x1, y1], outline=color, width=2) + print('Writing to: /tmp/predictions.png') + image.save('/tmp/predictions.png') + + if args.dump_anchors: + dump_anchors(anchors, '/tmp/anchors.json') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('image', help='The image to evaluate') + parser.add_argument('--model', required=True, help='Path to the mlmodel to evaluate') + parser.add_argument('--conf_threshold', type=float, default=0.5) + parser.add_argument('--iou_threshold', type=float, default=0.4) + parser.add_argument('--dump_anchors', action='store_true', help='Write anchors to a JSON file') + evaluate(parser.parse_args()) diff --git a/Converter/requirements.txt b/Converter/requirements.txt new file mode 100644 index 0000000..416ddca --- /dev/null +++ b/Converter/requirements.txt @@ -0,0 +1,3 @@ +coremltools==4.0b2 +numpy==1.19.1 +Pillow==7.2.0 diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..0488b0a --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,7 @@ +platform :ios, '13.0' +use_frameworks! + +target 'SwiftMaskDetection_Example' do + pod 'SwiftMaskDetection', :path => '../' + pod 'SnapKit' +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..bacee18 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,23 @@ +PODS: + - SnapKit (5.0.1) + - SwiftMaskDetection (0.1.0) + +DEPENDENCIES: + - SnapKit + - SwiftMaskDetection (from `../`) + +SPEC REPOS: + trunk: + - SnapKit + +EXTERNAL SOURCES: + SwiftMaskDetection: + :path: "../" + +SPEC CHECKSUMS: + SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb + SwiftMaskDetection: 1eceb2bce23ac99f892c9be49921cc494d3e7dc8 + +PODFILE CHECKSUM: 72d1c8eb42c5f3f47cc41f64736fb07d2e2b00d4 + +COCOAPODS: 1.9.3 diff --git a/Example/SwiftMaskDetection.xcodeproj/project.pbxproj b/Example/SwiftMaskDetection.xcodeproj/project.pbxproj new file mode 100644 index 0000000..158db79 --- /dev/null +++ b/Example/SwiftMaskDetection.xcodeproj/project.pbxproj @@ -0,0 +1,550 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 4034420C24E21FD900DE132F /* PreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4034420B24E21FD900DE132F /* PreviewView.swift */; }; + 4034420E24E21FE500DE132F /* BoundingBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4034420D24E21FE500DE132F /* BoundingBox.swift */; }; + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; + F11F977A318B643BE8BD0E8C /* Pods_SwiftMaskDetection_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 636EF8584BF9F9C2F1C3B735 /* Pods_SwiftMaskDetection_Example.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 607FACCF1AFB9204008FA782; + remoteInfo = SwiftMaskDetection; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0622D0E45043FC3AA72EA647 /* Pods-SwiftMaskDetection_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftMaskDetection_Example.release.xcconfig"; path = "Target Support Files/Pods-SwiftMaskDetection_Example/Pods-SwiftMaskDetection_Example.release.xcconfig"; sourceTree = ""; }; + 4034420B24E21FD900DE132F /* PreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewView.swift; sourceTree = ""; }; + 4034420D24E21FE500DE132F /* BoundingBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoundingBox.swift; sourceTree = ""; }; + 527C9F81626A74FDB2C3D9D4 /* Pods-SwiftMaskDetection_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftMaskDetection_Example.debug.xcconfig"; path = "Target Support Files/Pods-SwiftMaskDetection_Example/Pods-SwiftMaskDetection_Example.debug.xcconfig"; sourceTree = ""; }; + 607FACD01AFB9204008FA782 /* SwiftMaskDetection_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftMaskDetection_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* SwiftMaskDetection_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftMaskDetection_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; + 636EF8584BF9F9C2F1C3B735 /* Pods_SwiftMaskDetection_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftMaskDetection_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BF16B655544258389CE71B39 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + CFB4890496D0BF84AD605700 /* SwiftMaskDetection.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = SwiftMaskDetection.podspec; path = ../SwiftMaskDetection.podspec; sourceTree = ""; }; + E750506330C14A13760E148C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACCD1AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F11F977A318B643BE8BD0E8C /* Pods_SwiftMaskDetection_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACD21AFB9204008FA782 /* Example */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + AB5E4FC23C3D25E4FA2E2E91 /* Pods */, + 7A03877A1B2441D17609B96B /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACD01AFB9204008FA782 /* SwiftMaskDetection_Example.app */, + 607FACE51AFB9204008FA782 /* SwiftMaskDetection_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 607FACD21AFB9204008FA782 /* Example */ = { + isa = PBXGroup; + children = ( + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 4034420D24E21FE500DE132F /* BoundingBox.swift */, + 4034420B24E21FD900DE132F /* PreviewView.swift */, + 607FACD71AFB9204008FA782 /* ViewController.swift */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 607FACD31AFB9204008FA782 /* Supporting Files */, + ); + name = Example; + path = SwiftMaskDetection; + sourceTree = ""; + }; + 607FACD31AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACD41AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 607FACEB1AFB9204008FA782 /* Tests.swift */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + CFB4890496D0BF84AD605700 /* SwiftMaskDetection.podspec */, + E750506330C14A13760E148C /* README.md */, + BF16B655544258389CE71B39 /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + 7A03877A1B2441D17609B96B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 636EF8584BF9F9C2F1C3B735 /* Pods_SwiftMaskDetection_Example.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + AB5E4FC23C3D25E4FA2E2E91 /* Pods */ = { + isa = PBXGroup; + children = ( + 527C9F81626A74FDB2C3D9D4 /* Pods-SwiftMaskDetection_Example.debug.xcconfig */, + 0622D0E45043FC3AA72EA647 /* Pods-SwiftMaskDetection_Example.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACCF1AFB9204008FA782 /* SwiftMaskDetection_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SwiftMaskDetection_Example" */; + buildPhases = ( + 7735EB0E8A80DF9DE4EF0A62 /* [CP] Check Pods Manifest.lock */, + 607FACCC1AFB9204008FA782 /* Sources */, + 607FACCD1AFB9204008FA782 /* Frameworks */, + 607FACCE1AFB9204008FA782 /* Resources */, + 999062651A70C20643E05427 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwiftMaskDetection_Example; + productName = SwiftMaskDetection; + productReference = 607FACD01AFB9204008FA782 /* SwiftMaskDetection_Example.app */; + productType = "com.apple.product-type.application"; + }; + 607FACE41AFB9204008FA782 /* SwiftMaskDetection_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SwiftMaskDetection_Tests" */; + buildPhases = ( + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 607FACE71AFB9204008FA782 /* PBXTargetDependency */, + ); + name = SwiftMaskDetection_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* SwiftMaskDetection_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SwiftMaskDetection" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACCF1AFB9204008FA782 /* SwiftMaskDetection_Example */, + 607FACE41AFB9204008FA782 /* SwiftMaskDetection_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACCE1AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 7735EB0E8A80DF9DE4EF0A62 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-SwiftMaskDetection_Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 999062651A70C20643E05427 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SwiftMaskDetection_Example/Pods-SwiftMaskDetection_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", + "${BUILT_PRODUCTS_DIR}/SwiftMaskDetection/SwiftMaskDetection.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftMaskDetection.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SwiftMaskDetection_Example/Pods-SwiftMaskDetection_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACCC1AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 4034420C24E21FD900DE132F /* PreviewView.swift in Sources */, + 4034420E24E21FE500DE132F /* BoundingBox.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 607FACCF1AFB9204008FA782 /* SwiftMaskDetection_Example */; + targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 607FACDF1AFB9204008FA782 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF01AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 527C9F81626A74FDB2C3D9D4 /* Pods-SwiftMaskDetection_Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = SwiftMaskDetection/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.SwiftMaskDetection${DEVELOPMENT_TEAM}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 607FACF11AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0622D0E45043FC3AA72EA647 /* Pods-SwiftMaskDetection_Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = SwiftMaskDetection/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.SwiftMaskDetection${DEVELOPMENT_TEAM}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftMaskDetection_Example.app/SwiftMaskDetection_Example"; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftMaskDetection_Example.app/SwiftMaskDetection_Example"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SwiftMaskDetection" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SwiftMaskDetection_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF01AFB9204008FA782 /* Debug */, + 607FACF11AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SwiftMaskDetection_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/Example/SwiftMaskDetection.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/SwiftMaskDetection.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2dc2131 --- /dev/null +++ b/Example/SwiftMaskDetection.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/SwiftMaskDetection.xcodeproj/xcshareddata/xcschemes/SwiftMaskDetection-Example.xcscheme b/Example/SwiftMaskDetection.xcodeproj/xcshareddata/xcschemes/SwiftMaskDetection-Example.xcscheme new file mode 100644 index 0000000..349e696 --- /dev/null +++ b/Example/SwiftMaskDetection.xcodeproj/xcshareddata/xcschemes/SwiftMaskDetection-Example.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/SwiftMaskDetection.xcworkspace/contents.xcworkspacedata b/Example/SwiftMaskDetection.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..79650d4 --- /dev/null +++ b/Example/SwiftMaskDetection.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/SwiftMaskDetection.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/SwiftMaskDetection.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/SwiftMaskDetection.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/SwiftMaskDetection/AppDelegate.swift b/Example/SwiftMaskDetection/AppDelegate.swift new file mode 100644 index 0000000..0c29e90 --- /dev/null +++ b/Example/SwiftMaskDetection/AppDelegate.swift @@ -0,0 +1,15 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application(_ app: UIApplication, + didFinishLaunchingWithOptions opts: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + window!.rootViewController = ViewController() + window!.makeKeyAndVisible() + return true + } +} + diff --git a/Example/SwiftMaskDetection/Base.lproj/LaunchScreen.xib b/Example/SwiftMaskDetection/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..67b97f1 --- /dev/null +++ b/Example/SwiftMaskDetection/Base.lproj/LaunchScreen.xib @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/SwiftMaskDetection/BoundingBox.swift b/Example/SwiftMaskDetection/BoundingBox.swift new file mode 100644 index 0000000..c2676f8 --- /dev/null +++ b/Example/SwiftMaskDetection/BoundingBox.swift @@ -0,0 +1,57 @@ +// Copied from https://github.com/hollance/YOLO-CoreML-MPSNNGraph (MIT License) +import Foundation +import UIKit + + +class BoundingBox { + let shapeLayer: CAShapeLayer + let textLayer: CATextLayer + + init() { + shapeLayer = CAShapeLayer() + shapeLayer.fillColor = UIColor.clear.cgColor + shapeLayer.lineWidth = 4 + shapeLayer.isHidden = true + + textLayer = CATextLayer() + textLayer.foregroundColor = UIColor.black.cgColor + textLayer.isHidden = true + textLayer.contentsScale = UIScreen.main.scale + textLayer.fontSize = 14 + textLayer.font = UIFont(name: "Avenir", size: textLayer.fontSize) + } + + func addToLayer(_ parent: CALayer) { + parent.addSublayer(shapeLayer) + parent.addSublayer(textLayer) + } + + func show(frame: CGRect, label: String, color: UIColor) { + CATransaction.setDisableActions(true) + + let path = UIBezierPath(rect: frame) + shapeLayer.path = path.cgPath + shapeLayer.strokeColor = color.cgColor + shapeLayer.isHidden = false + + textLayer.string = label + textLayer.backgroundColor = color.cgColor + textLayer.isHidden = false + + let attributes = [ + NSAttributedString.Key.font: textLayer.font as Any + ] + + let textRect = label.boundingRect(with: CGSize(width: 400, height: 100), + options: .truncatesLastVisibleLine, + attributes: attributes, context: nil) + let textSize = CGSize(width: textRect.width + 12, height: textRect.height) + let textOrigin = CGPoint(x: frame.origin.x - 2, y: frame.origin.y - textSize.height) + textLayer.frame = CGRect(origin: textOrigin, size: textSize) + } + + func hide() { + shapeLayer.isHidden = true + textLayer.isHidden = true + } +} diff --git a/Example/SwiftMaskDetection/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/SwiftMaskDetection/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..7006c9e --- /dev/null +++ b/Example/SwiftMaskDetection/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Example/SwiftMaskDetection/Info.plist b/Example/SwiftMaskDetection/Info.plist new file mode 100644 index 0000000..85531a8 --- /dev/null +++ b/Example/SwiftMaskDetection/Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSCameraUsageDescription + To perform face mask detection on live video. + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/Example/SwiftMaskDetection/PreviewView.swift b/Example/SwiftMaskDetection/PreviewView.swift new file mode 100644 index 0000000..9368d68 --- /dev/null +++ b/Example/SwiftMaskDetection/PreviewView.swift @@ -0,0 +1,51 @@ +// Copyright © 2020 Toolbox AI. All rights reserved. +import AVFoundation +import UIKit + + +class PreviewView: UIView { + var previewLayer: AVCaptureVideoPreviewLayer { + return layer as! AVCaptureVideoPreviewLayer + } + + init() { + super.init(frame: .zero) + previewLayer.videoGravity = .resizeAspectFill + } + + required init?(coder: NSCoder) { + fatalError() + } + + override class var layerClass: AnyClass { + return AVCaptureVideoPreviewLayer.self + } + + /// Converts normalized image coordinates to coordinates in this view, taking into account that + /// some of the image may be cropped due to .resizeAspectFill gravity. + func toViewCoords(_ rect: CGRect, mirrored: Bool) -> CGRect { + var bound = rect + if mirrored { + // Flip x-axis + bound = bound + .applying(CGAffineTransform(scaleX: -1, y: 1)) + .applying(CGAffineTransform(translationX: 1, y: 0)) + } + + // Adjust to match the aspect ratio of the preview + let inputAspect: CGFloat = 9 / 16 + let viewAspect = bounds.width / bounds.height + if inputAspect >= viewAspect { + bound = bound + .applying(CGAffineTransform(scaleX: inputAspect / viewAspect, y: 1)) + .applying(CGAffineTransform(translationX: 0.5 * (1 - inputAspect / viewAspect), y: 0)) + } else { + bound = bound + .applying(CGAffineTransform(scaleX: 1, y: viewAspect / inputAspect)) + .applying(CGAffineTransform(translationX: 0, y: 0.5 * (1 - viewAspect / inputAspect))) + } + + // Scale to view size + return bound.applying(CGAffineTransform(scaleX: bounds.width, y: bounds.height)) + } +} diff --git a/Example/SwiftMaskDetection/ViewController.swift b/Example/SwiftMaskDetection/ViewController.swift new file mode 100644 index 0000000..6bd6983 --- /dev/null +++ b/Example/SwiftMaskDetection/ViewController.swift @@ -0,0 +1,124 @@ +import AVFoundation +import SnapKit +import SwiftMaskDetection +import UIKit + + +class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { + // Change this to .back to use the back camera: + let camera: AVCaptureDevice.Position = .front + + let maxFaces = 8 + let session = AVCaptureSession() + let output = AVCaptureVideoDataOutput() + let sessionQueue = DispatchQueue(label: "capture_session") + let detectionQueue = DispatchQueue(label: "detection", qos: .userInitiated, + attributes: [], autoreleaseFrequency: .workItem) + let previewView = PreviewView() + var boxes: [BoundingBox] = [] + var detector: MaskDetectionVideoHelper! + + override func viewDidLoad() { + super.viewDidLoad() + detector = MaskDetectionVideoHelper(maskDetector: MaskDetector(), resizeMode: .centerCrop) + view.backgroundColor = .white + configureCaptureSession() + configureUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + startCaptureSession() + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + stopCaptureSession() + } + + // MARK: AVCaptureVideoDataOutputSampleBufferDelegate + + func captureOutput(_ output: AVCaptureOutput, + didOutput buffer: CMSampleBuffer, + from connection: AVCaptureConnection) { + if let results = try? detector.detectInFrame(buffer) { + DispatchQueue.main.async { + self.showResults(results) + } + } + } + + // MARK: UI + + private func configureUI() { + view.addSubview(previewView) + previewView.previewLayer.session = session + for _ in 0.. + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift new file mode 100644 index 0000000..d5a39d3 --- /dev/null +++ b/Example/Tests/Tests.swift @@ -0,0 +1,19 @@ +import XCTest + +class Tests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cc74be9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 Keith Ito + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md index a693d0f..c156a03 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,45 @@ # SwiftMaskDetection -iOS face mask detection library + +[![CI Status](https://img.shields.io/travis/keithito/SwiftMaskDetection.svg?style=flat)](https://travis-ci.org/keithito/SwiftMaskDetection) +[![Version](https://img.shields.io/cocoapods/v/SwiftMaskDetection.svg?style=flat)](https://cocoapods.org/pods/SwiftMaskDetection) +[![License](https://img.shields.io/cocoapods/l/SwiftMaskDetection.svg?style=flat)](https://cocoapods.org/pods/SwiftMaskDetection) +[![Platform](https://img.shields.io/cocoapods/p/SwiftMaskDetection.svg?style=flat)](https://cocoapods.org/pods/SwiftMaskDetection) + +SwiftMaskDetection is a face mask detection library written in Swift. + +It provides provides an interface to [AIZOO's FaceMaskDetection model](https://github.com/AIZOOTech/FaceMaskDetection). +so that face mask detection can easily be run in iPhone and iPad apps. + +The model has been converted to CoreML using [coremltools](https://apple.github.io/coremltools/), and +runs at > 30fps on recent iPhones and iPads. + + +## Requirements + * iOS 13 or later + + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory. + + +## Installation + +SwiftMaskDetection is available through [CocoaPods](https://cocoapods.org). To install +it, add the following line to your Podfile: + +```ruby +pod 'SwiftMaskDetection' +``` + +## Usage + +TODO + + +## License + +SwiftMaskDetection is available under the MIT license. See the LICENSE file for more info. + +The face mask detection model is (c) 2020 AIZOOTech and is also available under the +[MIT License](https://github.com/AIZOOTech/FaceMaskDetection/blob/6068769c7a6/LICENSE). diff --git a/SwiftMaskDetection.podspec b/SwiftMaskDetection.podspec new file mode 100644 index 0000000..5fcda33 --- /dev/null +++ b/SwiftMaskDetection.podspec @@ -0,0 +1,17 @@ +Pod::Spec.new do |s| + s.name = 'SwiftMaskDetection' + s.version = '0.1.0' + s.summary = 'A face mask detection library written in Swift.' + s.homepage = 'https://github.com/keithito/SwiftMaskDetection' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'Keith Ito' => 'kito@kito.us' } + s.source = { :git => 'https://github.com/Keith Ito/SwiftMaskDetection.git', :tag => s.version.to_s } + s.source_files = 'SwiftMaskDetection/Classes/**/*.{swift,mlmodel}' + s.resources = 'SwiftMaskDetection/Classes/**/*.json' + s.pod_target_xcconfig = { 'COREML_CODEGEN_LANGUAGE' => 'Swift' } + s.ios.deployment_target = '10.0' + s.description = <<-END +SwiftMaskDetection is a port of the AIZOO FaceMaskDetection model to CoreML, with a Swift interface. +It is capable of running in real-time on the iPhone and iPad. + END +end diff --git a/SwiftMaskDetection/Classes/MaskDetectionVideoHelper.swift b/SwiftMaskDetection/Classes/MaskDetectionVideoHelper.swift new file mode 100644 index 0000000..a8d6142 --- /dev/null +++ b/SwiftMaskDetection/Classes/MaskDetectionVideoHelper.swift @@ -0,0 +1,66 @@ +// Copyright © 2020 Keith Ito. MIT License. +import AVFoundation +import CoreImage + + +/// Helper to assist with real-time detection in a video stream. You can call this from the +/// captureOutput function in a AVCaptureVideoDataOutputSampleBufferDelegate to feed frames +/// to the MaskDetector. See the Example for usage. +@available(iOS 13.0, *) +public class MaskDetectionVideoHelper { + /// How input images are made square if they are not alraedy. The model requires square images. + public enum ResizeMode { + /// Images are cropped along the longer dimension, with equal amounts removed from each side. + /// This does not distort the image, but portions of the image will trigger the detector. + case centerCrop + /// Images are stretched to be square. Recognition can take place in the entire image, but + /// there will be distortion, which may affect model performance. + case stretch + } + + private let resizeMode: ResizeMode + private let maskDetector: MaskDetector + + /// - Parameters: + /// - maskDetector: the MaskDetector to use for detection + /// - resizeMode: controls how input images are made square if they are not already + public init(maskDetector: MaskDetector, resizeMode: ResizeMode = .centerCrop) { + self.maskDetector = maskDetector + self.resizeMode = resizeMode + } + + /// Runs the detector on the given CMSampleBuffer. + /// This blocks while detection is being performed and should not be called on the main thread. + public func detectInFrame(_ buffer: CMSampleBuffer) throws -> [MaskDetector.Result] { + // Center crop and scale to 260x260. Squeezing seems to degrade model performance. + guard let image = CMSampleBufferGetImageBuffer(buffer) else { return [] } + let width = CVPixelBufferGetWidth(image) + let height = CVPixelBufferGetHeight(image) + let transform: CGAffineTransform + if resizeMode == .centerCrop { + let scale = CGFloat(MaskDetector.InputImageSize) / CGFloat(min(width, height)) + transform = CGAffineTransform(scaleX: scale, y: scale) + } else { + let scaleX = CGFloat(MaskDetector.InputImageSize) / CGFloat(width) + let scaleY = CGFloat(MaskDetector.InputImageSize) / CGFloat(height) + transform = CGAffineTransform(scaleX: scaleX, y: scaleY) + } + + let ciImage = CIImage(cvPixelBuffer: image) + .transformed(by: transform, highQualityDownsample: true) + let results = try maskDetector.detectMasks(ciImage: ciImage) + + if resizeMode == .centerCrop { + // Transform bounding box coordinates back to the input image + let inputAspect = CGFloat(width) / CGFloat(height) + return results.map { res in + let bound = res.bound + .applying(CGAffineTransform(scaleX: 1, y: inputAspect)) + .applying(CGAffineTransform(translationX: 0, y: 0.5 * (1 - inputAspect))) + return MaskDetector.Result(status: res.status, bound: bound, confidence: res.confidence) + } + } else { + return results + } + } +} diff --git a/SwiftMaskDetection/Classes/MaskDetector.swift b/SwiftMaskDetection/Classes/MaskDetector.swift new file mode 100644 index 0000000..eee3615 --- /dev/null +++ b/SwiftMaskDetection/Classes/MaskDetector.swift @@ -0,0 +1,211 @@ +// Copyright © 2020 Keith Ito. MIT License. +// Portions based on https://github.com/AIZOOTech/FaceMaskDetection under the MIT License. +import AVFoundation +import CoreImage +import Vision + + +/// Detects faces in an image and whether or not the face has a mask on it. +@available(iOS 13.0, *) +public class MaskDetector { + public enum Status { + /// The person is wearing a mask + case mask + /// The person is not wearing a mask + case noMask + } + + /// A face mask detection result + public struct Result { + /// The status of the detection (e.g. mask/noMask) + public let status: Status + + /// The bounding box of the face in normalized coordinates (the top-left corner of the image + /// is [0, 0], and the bottom-right corner is [1, 1]). + public let bound: CGRect + + /// Value between 0 and 1 representing the confidence in the result + public let confidence: Float + } + + /// Images sent to the model must have a height and width equal to this. + public static let InputImageSize = 260 + + private let minConfidence: Float + private let iouThreshold: Float + private let maxResults: Int + // Don't return a result unless the best class confidence is a factor of this better than the + // other class confidence. TODO: Consider making this a parameter to init? + private let margin: Float = 5 + private let mlModel = MaskModel() + private let model: VNCoreMLModel + private let anchors = loadAnchors() + + /// - Parameters: + /// - minConfidence: minimum confidence for returned results + /// - iouThreshold: intersection over union threshold for non-max suppression + /// - maxResults: maximum number of results to return + public init(minConfidence: Float=0.8, maxResults: Int=10, iouThreshold: Float=0.2) { + self.minConfidence = minConfidence + self.maxResults = maxResults + self.iouThreshold = iouThreshold + model = try! VNCoreMLModel(for: mlModel.model) + } + + /// Detects faces with masks or not in the input image. This blocks while detection is + /// being performed and should not be called on the main thread. + /// - Parameters: + /// - cvPixelBuffer: A 260x260 CVPixelBuffer + /// - orientation: The orientation of the input image (default .up) + /// - Returns: An array of detection results, one for each face + public func detectMasks(cvPixelBuffer: CVPixelBuffer, + orientation: CGImagePropertyOrientation = .up) throws -> [Result] { + return try detectMasks(handler: VNImageRequestHandler(cvPixelBuffer: cvPixelBuffer, + orientation: orientation)) + } + + /// Detects faces with masks or not in the input image. This blocks while detection is + /// being performed and should not be called on the main thread. + /// - Parameters: + /// - cgImage: A 260x260 CGImage + /// - orientation: The orientation of the input image (default .up) + /// - Returns: An array of detection results, one for each face + public func detectMasks(cgImage: CGImage, + orientation: CGImagePropertyOrientation = .up) throws -> [Result] { + return try detectMasks(handler: VNImageRequestHandler(cgImage: cgImage, + orientation: orientation)) + } + + /// Detects faces with masks or not in the input image. This blocks while detection is + /// being performed and should not be called on the main thread. + /// - Parameters: + /// - cgImage: A 260x260 CGImage + /// - orientation: The orientation of the input image (default .up) + /// - Returns: An array of detection results, one for each face + public func detectMasks(ciImage: CIImage, + orientation: CGImagePropertyOrientation = .up) throws -> [Result] { + return try detectMasks(handler: VNImageRequestHandler(ciImage: ciImage, + orientation: orientation)) + } + + private func detectMasks(handler: VNImageRequestHandler) throws -> [Result] { + let request = VNCoreMLRequest(model: model) + try handler.perform([request]) + guard let results = request.results as? [VNCoreMLFeatureValueObservation], + results.count == 2, + results[0].featureName == "output_bounds", + results[1].featureName == "output_scores", + let boundOutputs = results[0].featureValue.multiArrayValue, + let confOutputs = results[1].featureValue.multiArrayValue, + confOutputs.dataType == .float32, + boundOutputs.dataType == .float32, + confOutputs.shape == [1, NSNumber(value: anchors.count), 2], + boundOutputs.shape == [1, NSNumber(value: anchors.count), 4] else { + print("Unexpected result from CoreML!") + return [] + } + + // Model has 2 outputs: + // 1. Confidences [1,5972,2]: confidence for each anchor for each class (mask, no_mask) + // 2. Bounds [1,5972,4]: encoded bounding boxes for each anchor (see decodeBound) + let confPtr = UnsafeMutablePointer(OpaquePointer(confOutputs.dataPointer)) + let boundPtr = UnsafeMutablePointer(OpaquePointer(boundOutputs.dataPointer)) + let confStrides = confOutputs.strides.map { $0.intValue } + let boundStrides = boundOutputs.strides.map { $0.intValue } + var detections: [Result] = [] + for i in 0.. minConfidence { + let offset = i * boundStrides[1] + let rawBound: [Float] = [ + boundPtr[offset], + boundPtr[offset + 1 * boundStrides[2]], + boundPtr[offset + 2 * boundStrides[2]], + boundPtr[offset + 3 * boundStrides[2]], + ] + let bound = decodeBound(anchor: anchors[i], rawBound: rawBound) + if maskConf > noMaskConf * margin { + detections.append(Result(status: .mask, bound: bound, confidence: maskConf)) + } else if noMaskConf > maskConf * margin { + detections.append(Result(status: .noMask, bound: bound, confidence: noMaskConf)) + } + } + } + return nonMaxSuppression(inputs: detections, + iouThreshold: iouThreshold, + maxResults: maxResults) + } +} + +// Anchor bounds as generated by the python code in evaluate.py. These must match the anchors that +// the model was trained with. We dump them from the python code and load them here. +@available(iOS 13.0, *) +private func loadAnchors() -> [[Double]] { + let path = Bundle(for: MaskDetector.self).path(forResource: "anchors", ofType: "json")! + let data = try! Data(contentsOf: URL(fileURLWithPath: path)) + let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] + return json["anchors"] as! [[Double]] +} + +// Decodes the bound output from the model based on the anchor it is for. The model output is a +// 4D vector where the first 2 components are the delta from the anchor center to the bound center +// and the last 2 are the log of the ratio of the bound size to the anchor size. +private func decodeBound(anchor: [Double], rawBound: [Float]) -> CGRect { + let anchorW = anchor[2] - anchor[0] + let anchorH = anchor[3] - anchor[1] + let anchorCenterX = anchor[0] + 0.5 * anchorW + let anchorCenterY = anchor[1] + 0.5 * anchorH + let cx = Double(rawBound[0]) * 0.1 * anchorW + anchorCenterX + let cy = Double(rawBound[1]) * 0.1 * anchorH + anchorCenterY + let w = exp(Double(rawBound[2]) * 0.2) * anchorW + let h = exp(Double(rawBound[3]) * 0.2) * anchorH + return CGRect(x: CGFloat(cx - w / 2), + y: CGFloat(cy - h / 2), + width: CGFloat(w), + height: CGFloat(h)) +} + + +// Performs non-max supression with a configurable overlap threshold. +@available(iOS 13.0, *) +private func nonMaxSuppression(inputs: [MaskDetector.Result], + iouThreshold: Float, + maxResults: Int) -> [MaskDetector.Result] { + var outputs: [MaskDetector.Result] = [] + let inputsByConfidenceDesc = inputs.sorted { $0.confidence > $1.confidence } + for result in inputsByConfidenceDesc { + if !hasOverlap(result, with: outputs, iouThreshold: iouThreshold) { + outputs.append(result) + if outputs.count >= maxResults { + break + } + } + } + return outputs; +} + +@available(iOS 13.0, *) +private func hasOverlap(_ result: MaskDetector.Result, + with others: [MaskDetector.Result], + iouThreshold: Float) -> Bool { + let resultArea = result.bound.width * result.bound.height + for other in others { + let intersection = areaOfIntersection(result.bound, other.bound) + if intersection > 0 { + let union = resultArea + other.bound.width * other.bound.height - intersection + if Float(intersection / union) >= iouThreshold { + return true + } + } + } + return false +} + +private func areaOfIntersection(_ a: CGRect, _ b: CGRect) -> CGFloat { + let maxMinX = max(a.minX, b.minX) + let minMaxX = min(a.maxX, b.maxX) + let maxMinY = max(a.minY, b.minY) + let minMaxY = min(a.maxY, b.maxY) + return max(0, minMaxX - maxMinX) * max(0, minMaxY - maxMinY) +} diff --git a/SwiftMaskDetection/Classes/MaskModel.mlmodel b/SwiftMaskDetection/Classes/MaskModel.mlmodel new file mode 100644 index 0000000000000000000000000000000000000000..42ea524eb2cf896fa5ed171c757f763b5aeb335f GIT binary patch literal 4073991 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