-
Notifications
You must be signed in to change notification settings - Fork 0
/
sketch.js
147 lines (119 loc) · 3.69 KB
/
sketch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
let video;
const knnClassifier = ml5.KNNClassifier(); // Create a KNN classifiers
let featureExtractor;
function setup() {
featureExtractor = ml5.featureExtractor('MobileNet', modelReady);
noCanvas();
video = createCapture(VIDEO);
video.size(360, 240);
video.parent('videoContainer');
// Create the UI buttons
createButtons();
}
function modelReady(){
select('#status').html('FeatureExtractor(mobileNet model) Loaded')
}
// Add the current frame from the video to the classifier
function addExample(label) {
// Get the features of the input video
const features = featureExtractor.infer(video);
// Add an example with a label to the classifier
knnClassifier.addExample(features, label);
updateCounts();
}
// Predict the current frame.
function classify() {
// Get the total number of labels from knnClassifier
const numLabels = knnClassifier.getNumLabels();
if (numLabels <= 0) {
console.error('There is no examples in any label');
return;
}
// Get the features of the input video
const features = featureExtractor.infer(video);
knnClassifier.classify(features, gotResults);
}
// A util function to create UI buttons
function createButtons() {
buttonA = select('#addClassRock');
buttonA.mousePressed(function() {
addExample('Thor');
});
buttonB = select('#addClassPaper');
buttonB.mousePressed(function() {
addExample('Loki');
});
buttonC = select('#addClassScissor');
buttonC.mousePressed(function() {
addExample('Odin');
});
// Reset buttons
resetBtnA = select('#resetRock');
resetBtnA.mousePressed(function() {
clearLabel('Thor');
});
resetBtnB = select('#resetPaper');
resetBtnB.mousePressed(function() {
clearLabel('Loki');
});
resetBtnC = select('#resetScissor');
resetBtnC.mousePressed(function() {
clearLabel('Odin');
});
// Predict button
buttonPredict = select('#buttonPredict');
buttonPredict.mousePressed(classify);
// Clear all classes button
buttonClearAll = select('#clearAll');
buttonClearAll.mousePressed(clearAllLabels);
// Load saved classifier dataset
buttonSetData = select('#load');
buttonSetData.mousePressed(loadMyKNN);
// Get classifier dataset
buttonGetData = select('#save');
buttonGetData.mousePressed(saveMyKNN);
}
// Show the results
function gotResults(err, result) {
// Display any error
if (err) {
console.error(err);
}
if (result.confidencesByLabel) {
const confidences = result.confidencesByLabel;
// result.label is the label that has the highest confidence
if (result.label) {
select('#result').html(result.label);
select('#confidence').html(`${confidences[result.label] * 100} %`);
}
select('#confidenceRock').html(`${confidences['Thor'] ? confidences['Thor'] * 100 : 0} %`);
select('#confidencePaper').html(`${confidences['Loki'] ? confidences['Loki'] * 100 : 0} %`);
select('#confidenceScissor').html(`${confidences['Odin'] ? confidences['Odin'] * 100 : 0} %`);
}
classify();
}
// Update the example count for each label
function updateCounts() {
const counts = knnClassifier.getCountByLabel();
select('#exampleRock').html(counts['Thor'] || 0);
select('#examplePaper').html(counts['Loki'] || 0);
select('#exampleScissor').html(counts['Odin'] || 0);
}
// Clear the examples in one label
function clearLabel(label) {
knnClassifier.clearLabel(label);
updateCounts();
}
// Clear all the examples in all labels
function clearAllLabels() {
knnClassifier.clearAllLabels();
updateCounts();
}
// Save dataset as myKNNDataset.json
function saveMyKNN() {
knnClassifier.save('myKNNDataset');
}
// Load dataset to the classifier
function loadMyKNN() {
knnClassifier.load('./myKNNDataset.json', updateCounts);
}