diff --git a/README.md b/README.md index caf306f..f2ff5ba 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ # Multi-object trackers in Python Easy to use implementation of various multi-object tracking algorithms. -[](https://zenodo.org/badge/latestdoi/148338463) +[](https://zenodo.org/badge/latestdoi/148338463) + `YOLOv3 + CentroidTracker` | `TF-MobileNetSSD + CentroidTracker` @@ -12,22 +13,20 @@ Easy to use implementation of various multi-object tracking algorithms. ![Cars with YOLO][cars-yolo-output] | ![Cows with tf-SSD][cows-tf-ssd-output] Video source: [link](https://flic.kr/p/L6qyxj) | Video source: [link](https://flic.kr/p/26WeEWy) + ## Available Multi Object Trackers -``` -CentroidTracker -IOUTracker -CentroidKF_Tracker -SORT -``` +- CentroidTracker +- IOUTracker +- CentroidKF_Tracker +- SORT + ## Available OpenCV-based object detectors: -``` -detector.TF_SSDMobileNetV2 -detector.Caffe_SSDMobileNet -detector.YOLOv3 -``` +- detector.TF_SSDMobileNetV2 +- detector.Caffe_SSDMobileNet +- detector.YOLOv3 ## Installation diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle index b1a8c64..fefc416 100644 Binary files a/docs/.doctrees/environment.pickle and b/docs/.doctrees/environment.pickle differ diff --git a/docs/.doctrees/includeme/apidocuments.doctree b/docs/.doctrees/includeme/apidocuments.doctree index 714579b..9cd3e6b 100644 Binary files a/docs/.doctrees/includeme/apidocuments.doctree and b/docs/.doctrees/includeme/apidocuments.doctree differ diff --git a/docs/.doctrees/includeme/readmefile.doctree b/docs/.doctrees/includeme/readmefile.doctree index 449260a..3a8ad9b 100644 Binary files a/docs/.doctrees/includeme/readmefile.doctree and b/docs/.doctrees/includeme/readmefile.doctree differ diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree index 4f2c699..262f3cc 100644 Binary files a/docs/.doctrees/index.doctree and b/docs/.doctrees/index.doctree differ diff --git a/docs/_modules/motrackers/centroid_kf_tracker.html b/docs/_modules/motrackers/centroid_kf_tracker.html index 84b6c9d..34c3b99 100644 --- a/docs/_modules/motrackers/centroid_kf_tracker.html +++ b/docs/_modules/motrackers/centroid_kf_tracker.html @@ -87,7 +87,7 @@
[docs]def assign_tracks2detection_centroid_distances(bbox_tracks, bbox_detections, distance_threshold=10.): - """ + """ Assigns detected bounding boxes to tracked bounding boxes using IoU as a distance metric. Args: @@ -149,7 +149,7 @@
[docs]class CentroidKF_Tracker(Tracker): - """ + """ Kalman filter based tracking of multiple detected objects. Args: diff --git a/docs/_modules/motrackers/detectors/caffe.html b/docs/_modules/motrackers/detectors/caffe.html index b139259..3615e62 100644 --- a/docs/_modules/motrackers/detectors/caffe.html +++ b/docs/_modules/motrackers/detectors/caffe.html @@ -83,7 +83,7 @@
[docs]class Caffe_SSDMobileNet(Detector):
- """
+ """
Caffe SSD MobileNet model for Object Detection.
Args:
diff --git a/docs/_modules/motrackers/detectors/detector.html b/docs/_modules/motrackers/detectors/detector.html
index 3fcc901..db8662d 100644
--- a/docs/_modules/motrackers/detectors/detector.html
+++ b/docs/_modules/motrackers/detectors/detector.html
@@ -83,7 +83,7 @@ Source code for motrackers.detectors.detector
[docs]class Detector:
- """
+ """
Abstract class for detector.
Args:
@@ -105,7 +105,7 @@ Source code for motrackers.detectors.detector
self.bbox_colors = {key: np.random.randint(0, 255, size=(3,)).tolist() for key in self.object_names.keys()}
[docs] def forward(self, image):
- """
+ """
Forward pass for the detector with input image.
Args:
@@ -117,7 +117,7 @@ Source code for motrackers.detectors.detector
raise NotImplemented
[docs] def detect(self, image):
- """
+ """
Detect objects in the input image.
Args:
@@ -157,7 +157,7 @@ Source code for motrackers.detectors.detector
return np.array([]), np.array([]), np.array([])
[docs] def draw_bboxes(self, image, bboxes, confidences, class_ids):
- """
+ """
Draw the bounding boxes about detected objects in the image.
Args:
diff --git a/docs/_modules/motrackers/detectors/tf.html b/docs/_modules/motrackers/detectors/tf.html
index c514ebf..957ff0d 100644
--- a/docs/_modules/motrackers/detectors/tf.html
+++ b/docs/_modules/motrackers/detectors/tf.html
@@ -83,7 +83,7 @@ Source code for motrackers.detectors.tf
[docs]class TF_SSDMobileNetV2(Detector):
- """
+ """
Tensorflow SSD MobileNetv2 model for Object Detection.
Args:
diff --git a/docs/_modules/motrackers/detectors/yolo.html b/docs/_modules/motrackers/detectors/yolo.html
index a8487bf..477e818 100644
--- a/docs/_modules/motrackers/detectors/yolo.html
+++ b/docs/_modules/motrackers/detectors/yolo.html
@@ -84,7 +84,7 @@ Source code for motrackers.detectors.yolo
[docs]class YOLOv3(Detector):
- """
+ """
YOLOv3 Object Detector Module.
Args:
diff --git a/docs/_modules/motrackers/iou_tracker.html b/docs/_modules/motrackers/iou_tracker.html
index 6947fb1..08e07fe 100644
--- a/docs/_modules/motrackers/iou_tracker.html
+++ b/docs/_modules/motrackers/iou_tracker.html
@@ -82,7 +82,7 @@ Source code for motrackers.iou_tracker
[docs]class IOUTracker(Tracker):
- """
+ """
Intersection over Union Tracker.
References
diff --git a/docs/_modules/motrackers/kalman_tracker.html b/docs/_modules/motrackers/kalman_tracker.html
index 107e490..80e36b6 100644
--- a/docs/_modules/motrackers/kalman_tracker.html
+++ b/docs/_modules/motrackers/kalman_tracker.html
@@ -81,7 +81,7 @@ Source code for motrackers.kalman_tracker
[docs]class KalmanFilter:
- """
+ """
Kalman Filter Implementation.
Args:
@@ -124,7 +124,7 @@ Source code for motrackers.kalman_tracker
self.x = np.zeros((self.state_size, 1)) if initial_state is None else initial_state
[docs] def predict(self, u=0):
- """
+ """
Prediction step of Kalman Filter.
Args:
@@ -143,7 +143,7 @@ Source code for motrackers.kalman_tracker
return self.x
[docs] def update(self, z):
- """
+ """
Measurement update of Kalman Filter.
Args:
@@ -169,7 +169,7 @@ Source code for motrackers.kalman_tracker
def get_process_covariance_matrix(dt):
- """
+ """
Generates a process noise covariance matrix for constant acceleration motion.
Args:
@@ -193,7 +193,7 @@ Source code for motrackers.kalman_tracker
def get_transition_matrix(dt):
- """
+ """
Generate the transition matrix for constant acceleration motion.
Args:
@@ -207,7 +207,7 @@ Source code for motrackers.kalman_tracker
[docs]class KFTrackerConstantAcceleration(KalmanFilter):
- """
+ """
Kalman Filter with constant acceleration kinematic model.
Args:
@@ -279,7 +279,7 @@ Source code for motrackers.kalman_tracker
[docs]class KFTrackerSORT(KalmanFilter):
- """
+ """
Kalman filter for ``SORT``.
Args:
diff --git a/docs/_modules/motrackers/sort_tracker.html b/docs/_modules/motrackers/sort_tracker.html
index 9609236..96fe385 100644
--- a/docs/_modules/motrackers/sort_tracker.html
+++ b/docs/_modules/motrackers/sort_tracker.html
@@ -85,7 +85,7 @@ Source code for motrackers.sort_tracker
[docs]def assign_tracks2detection_iou(bbox_tracks, bbox_detections, iou_threshold=0.3):
- """
+ """
Assigns detected bounding boxes to tracked bounding boxes using IoU as a distance metric.
Args:
@@ -142,7 +142,7 @@ Source code for motrackers.sort_tracker
[docs]class SORT(CentroidKF_Tracker):
- """
+ """
SORT - Multi object tracker.
Args:
diff --git a/docs/_modules/motrackers/track.html b/docs/_modules/motrackers/track.html
index b6e6f3f..11c685d 100644
--- a/docs/_modules/motrackers/track.html
+++ b/docs/_modules/motrackers/track.html
@@ -82,7 +82,7 @@ Source code for motrackers.track
[docs]class Track:
- """
+ """
Track containing attributes to track various objects.
Args:
@@ -135,7 +135,7 @@ Source code for motrackers.track
raise NotImplementedError
[docs] def update(self, frame_id, bbox, detection_confidence, class_id=None, lost=0, iou_score=0., **kwargs):
- """
+ """
Update the track.
Args:
@@ -167,7 +167,7 @@ Source code for motrackers.track
@property
def centroid(self):
- """
+ """
Return the centroid of the bounding box.
Returns:
@@ -177,7 +177,7 @@ Source code for motrackers.track
return np.array((self.bbox[0]+0.5*self.bbox[2], self.bbox[1]+0.5*self.bbox[3]))
[docs] def get_mot_challenge_format(self):
- """
+ """
Get the tracker data in MOT challenge format as a tuple of elements containing
`(frame, id, bb_left, bb_top, bb_width, bb_height, conf, x, y, z)`
@@ -195,7 +195,7 @@ Source code for motrackers.track
return mot_tuple
[docs] def get_vis_drone_format(self):
- """
+ """
Track data output in VISDRONE Challenge format with tuple as
`(frame_index, target_id, bbox_left, bbox_top, bbox_width, bbox_height, score, object_category,
truncation, occlusion)`.
@@ -217,7 +217,7 @@ Source code for motrackers.track
return mot_tuple
[docs] def predict(self):
- """
+ """
Implement to prediction the next estimate of track.
"""
raise NotImplemented
@@ -228,7 +228,7 @@ Source code for motrackers.track
[docs]class KFTrackSORT(Track):
- """
+ """
Track based on Kalman filter tracker used for SORT MOT-Algorithm.
Args:
@@ -254,7 +254,7 @@ Source code for motrackers.track
iou_score=iou_score, data_output_format=data_output_format, **kwargs)
[docs] def predict(self):
- """
+ """
Predicts the next estimate of the bounding box of the track.
Returns:
@@ -282,7 +282,7 @@ Source code for motrackers.track
[docs]class KFTrack4DSORT(Track):
- """
+ """
Track based on Kalman filter tracker used for SORT MOT-Algorithm.
Args:
@@ -321,7 +321,7 @@ Source code for motrackers.track
[docs]class KFTrackCentroid(Track):
- """
+ """
Track based on Kalman filter used for Centroid Tracking of bounding box in MOT.
Args:
@@ -346,7 +346,7 @@ Source code for motrackers.track
iou_score=iou_score, data_output_format=data_output_format, **kwargs)
[docs] def predict(self):
- """
+ """
Predicts the next estimate of the bounding box of the track.
Returns:
diff --git a/docs/_modules/motrackers/tracker.html b/docs/_modules/motrackers/tracker.html
index f39a119..78459d0 100644
--- a/docs/_modules/motrackers/tracker.html
+++ b/docs/_modules/motrackers/tracker.html
@@ -85,7 +85,7 @@ Source code for motrackers.tracker
[docs]class Tracker:
- """
+ """
Greedy Tracker with tracking based on ``centroid`` location of the bounding box of the object.
This tracker is also referred as ``CentroidTracker`` in this repository.
@@ -102,7 +102,7 @@ Source code for motrackers.tracker
self.tracker_output_format = tracker_output_format
def _add_track(self, frame_id, bbox, detection_confidence, class_id, **kwargs):
- """
+ """
Add a newly detected object to the queue.
Args:
@@ -121,7 +121,7 @@ Source code for motrackers.tracker
self.next_track_id += 1
def _remove_track(self, track_id):
- """
+ """
Remove tracker data after object is lost.
Args:
@@ -131,7 +131,7 @@ Source code for motrackers.tracker
del self.tracks[track_id]
def _update_track(self, track_id, frame_id, bbox, detection_confidence, class_id, lost=0, iou_score=0., **kwargs):
- """
+ """
Update track state.
Args:
@@ -151,7 +151,7 @@ Source code for motrackers.tracker
@staticmethod
def _get_tracks(tracks):
- """
+ """
Output the information of tracks.
Args:
@@ -169,7 +169,7 @@ Source code for motrackers.tracker
[docs] @staticmethod
def preprocess_input(bboxes, class_ids, detection_scores):
- """
+ """
Preprocess the input data.
Args:
@@ -189,7 +189,7 @@ Source code for motrackers.tracker
return new_detections
[docs] def update(self, bboxes, detection_scores, class_ids):
- """
+ """
Update the tracker based on the new bounding boxes.
Args:
diff --git a/docs/_modules/motrackers/utils/misc.html b/docs/_modules/motrackers/utils/misc.html
index c2ad073..cffbab8 100644
--- a/docs/_modules/motrackers/utils/misc.html
+++ b/docs/_modules/motrackers/utils/misc.html
@@ -82,7 +82,7 @@ Source code for motrackers.utils.misc
[docs]def get_centroid(bboxes):
- """
+ """
Calculate centroids for multiple bounding boxes.
Args:
@@ -114,7 +114,7 @@ Source code for motrackers.utils.misc
[docs]def iou(bbox1, bbox2):
- """
+ """
Calculates the intersection-over-union of two bounding boxes.
Source: https://github.com/bochinski/iou-tracker/blob/master/util.py
@@ -155,7 +155,7 @@ Source code for motrackers.utils.misc
[docs]def iou_xywh(bbox1, bbox2):
- """
+ """
Calculates the intersection-over-union of two bounding boxes.
Source: https://github.com/bochinski/iou-tracker/blob/master/util.py
@@ -175,7 +175,7 @@ Source code for motrackers.utils.misc
[docs]def xyxy2xywh(xyxy):
- """
+ """
Convert bounding box coordinates from (xmin, ymin, xmax, ymax) format to (xmin, ymin, width, height).
Args:
@@ -200,7 +200,7 @@ Source code for motrackers.utils.misc
[docs]def xywh2xyxy(xywh):
- """
+ """
Convert bounding box coordinates from (xmin, ymin, width, height) to (xmin, ymin, xmax, ymax) format.
Args:
@@ -224,7 +224,7 @@ Source code for motrackers.utils.misc
[docs]def midwh2xywh(midwh):
- """
+ """
Convert bounding box coordinates from (xmid, ymid, width, height) to (xmin, ymin, width, height) format.
Args:
@@ -246,7 +246,7 @@ Source code for motrackers.utils.misc
[docs]def intersection_complement_indices(big_set_indices, small_set_indices):
- """
+ """
Get the complement of intersection of two sets of indices.
Args:
@@ -265,7 +265,7 @@ Source code for motrackers.utils.misc
[docs]def nms(boxes, scores, overlapThresh, classes=None):
- """
+ """
Non-maximum suppression. based on Malisiewicz et al.
Args:
@@ -323,7 +323,7 @@ Source code for motrackers.utils.misc
[docs]def draw_tracks(image, tracks):
- """
+ """
Draw on input image.
Args:
diff --git a/docs/_static/basic.css b/docs/_static/basic.css
index 4e9a9f1..eeb0519 100644
--- a/docs/_static/basic.css
+++ b/docs/_static/basic.css
@@ -236,6 +236,16 @@ div.body p, div.body dd, div.body li, div.body blockquote {
a.headerlink {
visibility: hidden;
}
+a.brackets:before,
+span.brackets > a:before{
+ content: "[";
+}
+
+a.brackets:after,
+span.brackets > a:after {
+ content: "]";
+}
+
h1:hover > a.headerlink,
h2:hover > a.headerlink,
@@ -324,15 +334,11 @@ aside.sidebar {
p.sidebar-title {
font-weight: bold;
}
-nav.contents,
-aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
-nav.contents,
-aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
@@ -371,8 +377,6 @@ div.body p.centered {
div.sidebar > :last-child,
aside.sidebar > :last-child,
-nav.contents > :last-child,
-aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
@@ -380,8 +384,6 @@ div.admonition > :last-child {
div.sidebar::after,
aside.sidebar::after,
-nav.contents::after,
-aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
@@ -606,26 +608,19 @@ ol.simple p,
ul.simple p {
margin-bottom: 0;
}
-aside.footnote > span,
-div.citation > span {
+dl.footnote > dt,
+dl.citation > dt {
float: left;
+ margin-right: 0.5em;
}
-aside.footnote > span:last-of-type,
-div.citation > span:last-of-type {
- padding-right: 0.5em;
-}
-aside.footnote > p {
- margin-left: 2em;
-}
-div.citation > p {
- margin-left: 4em;
-}
-aside.footnote > p:last-of-type,
-div.citation > p:last-of-type {
+
+dl.footnote > dd,
+dl.citation > dd {
margin-bottom: 0em;
}
-aside.footnote > p:last-of-type:after,
-div.citation > p:last-of-type:after {
+
+dl.footnote > dd:after,
+dl.citation > dd:after {
content: "";
clear: both;
}
@@ -641,6 +636,10 @@ dl.field-list > dt {
padding-left: 0.5em;
padding-right: 5px;
}
+dl.field-list > dt:after {
+ content: ":";
+}
+
dl.field-list > dd {
padding-left: 0.5em;
diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js
index c3db08d..527b876 100644
--- a/docs/_static/doctools.js
+++ b/docs/_static/doctools.js
@@ -10,6 +10,13 @@
*/
"use strict";
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
@@ -18,73 +25,11 @@ const _ready = (callback) => {
}
};
-/**
- * highlight a given string on a node by wrapping it in
- * span elements with the given class name.
- */
-const _highlight = (node, addItems, text, className) => {
- if (node.nodeType === Node.TEXT_NODE) {
- const val = node.nodeValue;
- const parent = node.parentNode;
- const pos = val.toLowerCase().indexOf(text);
- if (
- pos >= 0 &&
- !parent.classList.contains(className) &&
- !parent.classList.contains("nohighlight")
- ) {
- let span;
-
- const closestNode = parent.closest("body, svg, foreignObject");
- const isInSVG = closestNode && closestNode.matches("svg");
- if (isInSVG) {
- span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
- } else {
- span = document.createElement("span");
- span.classList.add(className);
- }
-
- span.appendChild(document.createTextNode(val.substr(pos, text.length)));
- parent.insertBefore(
- span,
- parent.insertBefore(
- document.createTextNode(val.substr(pos + text.length)),
- node.nextSibling
- )
- );
- node.nodeValue = val.substr(0, pos);
-
- if (isInSVG) {
- const rect = document.createElementNS(
- "http://www.w3.org/2000/svg",
- "rect"
- );
- const bbox = parent.getBBox();
- rect.x.baseVal.value = bbox.x;
- rect.y.baseVal.value = bbox.y;
- rect.width.baseVal.value = bbox.width;
- rect.height.baseVal.value = bbox.height;
- rect.setAttribute("class", className);
- addItems.push({ parent: parent, target: rect });
- }
- }
- } else if (node.matches && !node.matches("button, select, textarea")) {
- node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
- }
-};
-const _highlightText = (thisNode, text, className) => {
- let addItems = [];
- _highlight(thisNode, addItems, text, className);
- addItems.forEach((obj) =>
- obj.parent.insertAdjacentElement("beforebegin", obj.target)
- );
-};
-
/**
* Small JavaScript module for the documentation.
*/
const Documentation = {
init: () => {
- Documentation.highlightSearchWords();
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
@@ -126,51 +71,6 @@ const Documentation = {
Documentation.LOCALE = catalog.locale;
},
- /**
- * highlight the search words provided in the url in the text
- */
- highlightSearchWords: () => {
- const highlight =
- new URLSearchParams(window.location.search).get("highlight") || "";
- const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
- if (terms.length === 0) return; // nothing to do
-
- // There should never be more than one element matching "div.body"
- const divBody = document.querySelectorAll("div.body");
- const body = divBody.length ? divBody[0] : document.querySelector("body");
- window.setTimeout(() => {
- terms.forEach((term) => _highlightText(body, term, "highlighted"));
- }, 10);
-
- const searchBox = document.getElementById("searchbox");
- if (searchBox === null) return;
- searchBox.appendChild(
- document
- .createRange()
- .createContextualFragment(
- '' +
- '' +
- Documentation.gettext("Hide Search Matches") +
- "
"
- )
- );
- },
-
- /**
- * helper function to hide the search marks again
- */
- hideSearchWords: () => {
- document
- .querySelectorAll("#searchbox .highlight-link")
- .forEach((el) => el.remove());
- document
- .querySelectorAll("span.highlighted")
- .forEach((el) => el.classList.remove("highlighted"));
- const url = new URL(window.location);
- url.searchParams.delete("highlight");
- window.history.replaceState({}, "", url);
- },
-
/**
* helper function to focus on search bar
*/
@@ -210,15 +110,11 @@ const Documentation = {
)
return;
- const blacklistedElements = new Set([
- "TEXTAREA",
- "INPUT",
- "SELECT",
- "BUTTON",
- ]);
document.addEventListener("keydown", (event) => {
- if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements
- if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
@@ -240,10 +136,6 @@ const Documentation = {
event.preventDefault();
}
break;
- case "Escape":
- if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
- Documentation.hideSearchWords();
- event.preventDefault();
}
}
diff --git a/docs/_static/jquery-3.5.1.js b/docs/_static/jquery-3.5.1.js
deleted file mode 100644
index 5093733..0000000
--- a/docs/_static/jquery-3.5.1.js
+++ /dev/null
@@ -1,10872 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.5.1
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2020-05-04T22:49Z
- */
-( function( global, factory ) {
-
- "use strict";
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
-
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var flat = arr.flat ? function( array ) {
- return arr.flat.call( array );
-} : function( array ) {
- return arr.concat.apply( [], array );
-};
-
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-var isFunction = function isFunction( obj ) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML