Clemylia commited on
Commit
d422ed4
·
verified ·
1 Parent(s): 92ecca5

Create script.js

Browse files
Files changed (1) hide show
  1. script.js +139 -0
script.js ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const catImages = [
2
+ 'chat.jpeg', 'Chat_europeen_573af6e71d.jpeg', 'images_(10).jpeg', 'comment-punir-son-chat-91.jpeg', 'ragdoll-cat-small-kitten-at-home-1024x707.jpg',
3
+ 'images_(11)_1.jpeg', 'images_(12)_1.jpeg', 'images_(13)_1.jpeg', 'images_(14)_1.jpeg', 'images_(15).jpeg', 'images_(10)_1.jpeg', 'images_(13)_2.jpeg', 'images_(14)_2.jpeg', '5bec27af5afec.jpeg', 'images_(13)_3.jpeg', 'L21lZGlhLXBhL1dBMTcvNS85L1dBMTc1OTI1MTQzXzEuanBlZz8yMDI1MDcxNTE1NTIwNA_rct.jpeg', 'images_(14)_3.jpeg'
4
+ ];
5
+ const dogImages = [
6
+ 'chien1.jpg', 'chien2.jpeg', 'mon-chien-est-agressif-que-faire_520x500_a2b8b85b-8d3d-4b26-a389-edce0c8753b3_1024x1024.png', 'images_(11).jpeg', 'images_(12).jpeg',
7
+ 'Carlin_chien_mignon_480x480.jpg', 'goldent-retriever-chien-mignon.jpg', 'Race_de_chien_Chow_Chow_1_large.jpg', 'images_(13).jpeg', 'images_(14).jpeg', 'images_(9).jpeg', 'images_(11)_2.jpeg', 'images_(12)_2.jpeg', 'images_(9)_1.jpeg', 'images_(10)_2.jpeg', 'images_(11)_3.jpeg', 'images_(12)_3.jpeg', 'quelle-est-esperance-vie-chiens-13.jpeg', 'langage-chien-(2)-151744.jpg'
8
+ ];
9
+
10
+ let model;
11
+
12
+ // Prétraitement de l’image
13
+ async function loadImage(url) {
14
+ return new Promise((resolve, reject) => {
15
+ const img = new window.Image();
16
+ img.crossOrigin = 'anonymous';
17
+ img.src = url;
18
+ img.onload = () => {
19
+ const canvas = document.createElement('canvas');
20
+ const ctx = canvas.getContext('2d');
21
+ canvas.width = 64;
22
+ canvas.height = 64;
23
+ ctx.drawImage(img, 0, 0, 64, 64);
24
+ const imageData = ctx.getImageData(0, 0, 64, 64);
25
+ resolve(tf.browser.fromPixels(imageData).toFloat().div(255));
26
+ };
27
+ img.onerror = () => {
28
+ reject(new Error(`Failed to load image at URL: ${url}`));
29
+ };
30
+ });
31
+ }
32
+
33
+ // Construction du dataset
34
+ async function createDataset() {
35
+ const images = [];
36
+ const labels = [];
37
+ try {
38
+ for (const image of catImages) {
39
+ images.push(await loadImage(image));
40
+ labels.push([1, 0]); // Chat
41
+ }
42
+ for (const image of dogImages) {
43
+ images.push(await loadImage(image));
44
+ labels.push([0, 1]); // Chien
45
+ }
46
+ return {
47
+ xs: tf.stack(images),
48
+ ys: tf.tensor2d(labels)
49
+ };
50
+ } catch (error) {
51
+ console.error('Erreur lors de la création du dataset:', error);
52
+ document.getElementById('result').innerText = 'Erreur lors du chargement des images.';
53
+ }
54
+ }
55
+
56
+ function createModel() {
57
+ const model = tf.sequential();
58
+ model.add(tf.layers.conv2d({
59
+ inputShape: [64, 64, 3],
60
+ filters: 8,
61
+ kernelSize: 3,
62
+ activation: 'relu'
63
+ }));
64
+ model.add(tf.layers.maxPooling2d({
65
+ poolSize: 2
66
+ }));
67
+ model.add(tf.layers.flatten());
68
+ model.add(tf.layers.dense({
69
+ units: 16,
70
+ activation: 'relu'
71
+ }));
72
+ model.add(tf.layers.dense({
73
+ units: 2,
74
+ activation: 'softmax'
75
+ }));
76
+ model.compile({
77
+ optimizer: 'adam',
78
+ loss: 'categoricalCrossentropy',
79
+ metrics: ['accuracy']
80
+ });
81
+ return model;
82
+ }
83
+ async function trainModel() {
84
+ document.getElementById('result').innerText = 'Entraînement de Detia en cours... 🧠';
85
+ const dataset = await createDataset();
86
+ if (dataset) {
87
+ model = createModel();
88
+ await model.fit(dataset.xs, dataset.ys, {
89
+ epochs: 30,
90
+ callbacks: {
91
+ onEpochEnd: (epoch, logs) =>
92
+ console.log(`Epoch ${epoch + 1}: loss=${logs.loss.toFixed(4)} accuracy=${(logs.acc * 100).toFixed(2)}%`)
93
+ }
94
+ });
95
+ document.getElementById('result').innerText = "Detia est prête ! ✨";
96
+ }
97
+ }
98
+ async function predictImage() {
99
+ const fileInput = document.getElementById('image-upload');
100
+ if (!fileInput || !fileInput.files[0]) {
101
+ return alert('Sélectionnez une image !');
102
+ }
103
+
104
+ const resultElement = document.getElementById('result');
105
+ resultElement.innerText = 'Analyse de l’image en cours... 🧐';
106
+
107
+ const reader = new FileReader();
108
+ reader.onload = async (e) => {
109
+ try {
110
+ const img = new Image();
111
+ img.src = e.target.result;
112
+ img.onload = async () => {
113
+ const canvas = document.createElement('canvas');
114
+ const ctx = canvas.getContext('2d');
115
+ canvas.width = 64;
116
+ canvas.height = 64;
117
+ ctx.drawImage(img, 0, 0, 64, 64);
118
+
119
+ const imageData = ctx.getImageData(0, 0, 64, 64);
120
+ const input = tf.browser.fromPixels(imageData).toFloat().div(255).expandDims();
121
+ const prediction = model.predict(input);
122
+ const labelIndex = prediction.as1D().argMax().dataSync()[0];
123
+ const label = labelIndex === 0 ? 'Chat 🐱' : 'Chien 🐶';
124
+ resultElement.innerHTML = `<h2>Detia pense que c’est : <span>${label}</span></h2>`;
125
+ };
126
+ } catch (error) {
127
+ console.error('Erreur lors de la prédiction:', error);
128
+ resultElement.innerText = 'Une erreur est survenue lors de la prédiction.';
129
+ }
130
+ };
131
+ reader.readAsDataURL(fileInput.files[0]);
132
+ }
133
+ document.addEventListener('DOMContentLoaded', async () => {
134
+ await trainModel();
135
+ const predictButton = document.getElementById('predict-button');
136
+ if (predictButton) {
137
+ predictButton.addEventListener('click', predictImage);
138
+ }
139
+ });