Spaces:
Running
Running
| import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/[email protected]'; | |
| // Reference the elements that we will need | |
| const status = document.getElementById('status'); | |
| const fileUpload = document.getElementById('upload'); | |
| const imageContainer = document.getElementById('container'); | |
| const example = document.getElementById('example'); | |
| const EXAMPLE_URL = 'https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/city-streets.jpg'; | |
| import http from 'http'; | |
| import querystring from 'querystring'; | |
| import url from 'url'; | |
| import { pipeline, env } from '@xenova/transformers'; | |
| class MyClassificationPipeline { | |
| static task = 'text-classification'; | |
| static model = 'databoyface/distilbert-base-cased-ome-v4.2'; | |
| static instance = null; | |
| static async getInstance(progress_callback = null) { | |
| if (this.instance === null) { | |
| // NOTE: Uncomment this to change the cache directory | |
| // env.cacheDir = './.cache'; | |
| this.instance = pipeline(this.task, this.model, { progress_callback }); | |
| } | |
| return this.instance; | |
| } | |
| } | |
| // Comment out this line if you don't want to start loading the model as soon as the server starts. | |
| // If commented out, the model will be loaded when the first request is received (i.e,. lazily). | |
| MyClassificationPipeline.getInstance(); | |
| // Define the HTTP server | |
| const server = http.createServer(); | |
| const hostname = '127.0.0.1'; | |
| const port = 3000; | |
| // Listen for requests made to the server | |
| server.on('request', async (req, res) => { | |
| // Parse the request URL | |
| const parsedUrl = url.parse(req.url); | |
| // Extract the query parameters | |
| const { text } = querystring.parse(parsedUrl.query); | |
| // Set the response headers | |
| res.setHeader('Content-Type', 'application/json'); | |
| let response; | |
| if (parsedUrl.pathname === '/classify' && text) { | |
| const classifier = await MyClassificationPipeline.getInstance(); | |
| response = await classifier(text); | |
| res.statusCode = 200; | |
| } else { | |
| response = { 'error': 'Bad request' } | |
| res.statusCode = 400; | |
| } | |
| // Send the JSON response | |
| res.end(JSON.stringify(response)); | |
| }); | |
| server.listen(port, hostname, () => { | |
| console.log(`Server running at http://${hostname}:${port}/`); | |
| }); | |
| // Render a bounding box and label on the image | |
| function renderBox({ box, label }) { | |
| const { xmax, xmin, ymax, ymin } = box; | |
| // Generate a random color for the box | |
| const color = '#' + Math.floor(Math.random() * 0xFFFFFF).toString(16).padStart(6, 0); | |
| // Draw the box | |
| const boxElement = document.createElement('div'); | |
| boxElement.className = 'bounding-box'; | |
| Object.assign(boxElement.style, { | |
| borderColor: color, | |
| left: 100 * xmin + '%', | |
| top: 100 * ymin + '%', | |
| width: 100 * (xmax - xmin) + '%', | |
| height: 100 * (ymax - ymin) + '%', | |
| }) | |
| // Draw label | |
| const labelElement = document.createElement('span'); | |
| labelElement.textContent = label; | |
| labelElement.className = 'bounding-box-label'; | |
| labelElement.style.backgroundColor = color; | |
| boxElement.appendChild(labelElement); | |
| imageContainer.appendChild(boxElement); | |
| } | |