@avatune/hair-length-predictor
Browser-based hair length prediction using TensorFlow.js. Classifies hair into 3 categories: short, medium, long.
Source:
packages/hair-length-predictor/README.md
Browser-based hair length prediction using TensorFlow.js. Classifies hair into 3 categories: short, medium, long.
Lightweight model (~2.3MB) with fast loading and inference in the browser.
Installation
npm install @avatune/hair-length-predictor @tensorflow/tfjsUsage
import { createHairLengthPredictor } from '@avatune/hair-length-predictor'
// Uses jsDelivr CDN by default - no setup required!
const predictor = createHairLengthPredictor()
await predictor.loadModel()
const result = await predictor.predictFromImage(imageElement)
console.log(result)
// {
// length: 'medium',
// confidence: 0.91,
// probabilities: { short: 0.04, medium: 0.91, long: 0.05 },
// faceDetected: true
// }Model Files
By default, models are loaded from jsDelivr CDN (https://cdn.jsdelivr.net/npm/@avatune/hair-length-predictor@1.2.2/dist/model). No setup required!
Self-hosting (Optional)
If you prefer to self-host the model files, copy them from dist/model/ to your public directory:
model.json- Model architecture and weights manifestclasses.json- Class labelsgroup1-shard1of1.bin- Model weights
Then pass the path to the predictor:
const predictor = createHairLengthPredictor('/models/hair-length')Setup with Vite (Optional)
import { copyFileSync, mkdirSync, readdirSync } from 'node:fs'
import { join } from 'node:path'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
name: 'copy-tfjs-models',
buildStart() {
const srcDir = join(__dirname, 'node_modules', '@avatune', 'hair-length-predictor', 'dist', 'model')
const destDir = join(__dirname, 'public', 'models', 'hair-length')
mkdirSync(destDir, { recursive: true })
copyFileSync(join(srcDir, 'model.json'), join(destDir, 'model.json'))
copyFileSync(join(srcDir, 'classes.json'), join(destDir, 'classes.json'))
const files = readdirSync(srcDir)
for (const file of files) {
if (file.endsWith('.bin')) {
copyFileSync(join(srcDir, file), join(destDir, file))
}
}
console.log('✓ Copied hair-length model to public/models')
},
},
],
})API
Structure
createHairLengthPredictor(modelDir?: string)Parameters:
modelDir(optional) - Path to directory containing model files. Defaults to jsDelivr CDN
Functions
loadModel(): Promise<void>
Loads the TFJS model and class labels. Call this once before making predictions.
predict(imageTensor: tf.Tensor3D): Promise<HairLengthResult>
Predicts hair length from an image tensor.
Parameters:
imageTensor- Normalized RGB image tensor [H, W, 3] with values in range [0, 1]
Returns:
{
length: string // Predicted class: 'short' | 'medium' | 'long'
confidence: number // Confidence score [0, 1]
probabilities: Record<string, number> // Scores for all classes
}predictFromImage(image): Promise<HairLengthResult>
Predicts hair length from an image element. Automatically detects and crops the face for better accuracy.
Parameters:
image-HTMLImageElement,HTMLVideoElement, orHTMLCanvasElement
Returns: Same as predict(), plus faceDetected: boolean
Model Details
- Architecture: MobileNetV2-based CNN
- Input: 128x128 RGB images
- Classes: 3 (short, medium, long)
- Training: CelebAMask-HQ dataset
- Accuracy: ~82%
- Model size: ~2.3MB (uint8 quantized)
- Format: TensorFlow.js with uint8 quantization
License
See LICENSE.md for license information.