第2章:前端AI库基础

2.1 TensorFlow.js简介

理论讲解

TensorFlow.js是Google开发的一个开源库,允许开发者在浏览器和Node.js环境中使用JavaScript进行机器学习。它提供了完整的机器学习工具链,包括:

  • 模型构建:使用JavaScript API创建和训练机器学习模型
  • 模型部署:将训练好的模型部署到浏览器或服务器
  • 预训练模型:提供多种预训练模型,如MobileNet、COCO-SSD等
  • 硬件加速:利用WebGL进行GPU加速,提高模型运行速度

TensorFlow.js支持多种编程模型:

  • Layers API:高级API,用于构建和训练神经网络
  • Core API:低级API,提供更灵活的张量操作
  • Converter API:用于将TensorFlow Python模型转换为TensorFlow.js格式

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TensorFlow.js 入门</title>
    <!-- 引入 TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.10.0/dist/tf.min.js"></script>
</head>
<body>
    <h1>TensorFlow.js 入门示例</h1>
    <div id="output"></div>

    <script>
        // 简单的 TensorFlow.js 示例:创建张量并进行运算
        async function runDemo() {
            // 创建张量
            const a = tf.tensor([1, 2, 3, 4]);
            const b = tf.tensor([5, 6, 7, 8]);
            
            // 张量运算
            const c = a.add(b);
            const d = a.mul(b);
            
            // 获取结果并显示
            const cData = await c.data();
            const dData = await d.data();
            
            document.getElementById('output').innerHTML = `
                <p>a = [1, 2, 3, 4]</p>
                <p>b = [5, 6, 7, 8]</p>
                <p>a + b = [${cData}]</p>
                <p>a * b = [${dData}]</p>
            `;
            
            // 释放张量资源
            a.dispose();
            b.dispose();
            c.dispose();
            d.dispose();
        }
        
        runDemo();
    </script>
</body>
</html>

实践练习

  1. 创建一个HTML文件,引入TensorFlow.js库
  2. 实现两个矩阵的加法和乘法运算
  3. 在页面上显示运算结果
  4. 测试并确认代码能够正常运行

2.2 ml5.js快速入门

理论讲解

ml5.js是一个基于TensorFlow.js的高级机器学习库,旨在让机器学习更加友好和易于使用。它的主要特点包括:

  • 简单的API:提供直观的函数调用,隐藏了复杂的底层实现
  • 预训练模型:内置多种预训练模型,可直接使用
  • 可视化工具:提供数据和模型可视化功能
  • 良好的文档:详细的文档和丰富的示例

ml5.js适合初学者快速上手前端AI开发,同时也支持高级用户进行自定义开发。

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ml5.js 快速入门</title>
    <!-- 引入 ml5.js -->
    <script src="https://cdn.jsdelivr.net/npm/ml5@0.12.2/dist/ml5.min.js"></script>
</head>
<body>
    <h1>ml5.js 图像分类示例</h1>
    <img id="image" src="https://picsum.photos/200/200" alt="测试图像" />
    <div id="result"></div>

    <script>
        // ml5.js 图像分类示例
        function runImageClassification() {
            // 创建图像分类器
            const classifier = ml5.imageClassifier('MobileNet', modelLoaded);
            
            // 模型加载完成后的回调函数
            function modelLoaded() {
                console.log('模型加载完成!');
                // 对图像进行分类
                classifier.classify(document.getElementById('image'), gotResult);
            }
            
            // 分类结果回调函数
            function gotResult(error, results) {
                if (error) {
                    console.error(error);
                    return;
                }
                
                // 显示分类结果
                const resultDiv = document.getElementById('result');
                resultDiv.innerHTML = `
                    <h3>分类结果:</h3>
                    <ul>
                        <li>${results[0].label}:${(results[0].confidence * 100).toFixed(2)}%</li>
                        <li>${results[1].label}:${(results[1].confidence * 100).toFixed(2)}%</li>
                        <li>${results[2].label}:${(results[2].confidence * 100).toFixed(2)}%</li>
                    </ul>
                `;
            }
        }
        
        // 页面加载完成后运行
        window.addEventListener('load', runImageClassification);
    </script>
</body>
</html>

实践练习

  1. 创建一个HTML文件,引入ml5.js库
  2. 添加一张图像到页面中
  3. 使用ml5.js的图像分类器对图像进行分类
  4. 显示前3个分类结果及其置信度
  5. 尝试更换不同的图像,观察分类结果

2.3 其他前端AI库对比

理论讲解

除了TensorFlow.js和ml5.js,还有其他一些前端AI库可供选择:

库名称 开发者 特点 适用场景
TensorFlow.js Google 完整的机器学习工具链,硬件加速,支持模型转换 复杂模型开发,生产级应用
ml5.js NYU ITP 基于TensorFlow.js,简单易用,预训练模型丰富 快速原型开发,教学示例
Brain.js Heather Arthur 轻量级,专注于神经网络,支持Node.js和浏览器 简单神经网络应用
Synaptic.js cazala 模块化设计,支持多种网络类型 自定义神经网络开发
ConvNetJS Andrej Karpathy 专注于卷积神经网络,浏览器端运行 计算机视觉应用

选择合适的库取决于项目需求、开发经验和性能要求。

代码示例

// 不同AI库的简单比较
const aiLibraries = [
  {
    name: 'TensorFlow.js',
    developer: 'Google',
    size: '较大',
    performance: '高',
    easeOfUse: '中等',
    useCase: '复杂AI应用'
  },
  {
    name: 'ml5.js',
    developer: 'NYU ITP',
    size: '中等',
    performance: '中高',
    easeOfUse: '高',
    useCase: '快速开发和教学'
  },
  {
    name: 'Brain.js',
    developer: 'Heather Arthur',
    size: '小',
    performance: '中等',
    easeOfUse: '高',
    useCase: '简单神经网络'
  }
];

console.table(aiLibraries);

实践练习

  1. 研究一个除TensorFlow.js和ml5.js之外的前端AI库
  2. 总结该库的特点、优势和适用场景
  3. 尝试编写一个简单的示例程序,使用该库实现基本功能

2.4 第一个AI程序:Hello AI

理论讲解

现在,我们将结合所学知识,创建第一个完整的AI应用程序。这个程序将使用ml5.js的图像分类功能,实现一个简单的图像识别应用。

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello AI - 图像识别应用</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        .container {
            text-align: center;
        }
        #image {
            width: 300px;
            height: 300px;
            object-fit: cover;
            border: 2px solid #ddd;
            border-radius: 8px;
            margin: 20px 0;
        }
        #result {
            background-color: #f5f5f5;
            padding: 20px;
            border-radius: 8px;
            margin-top: 20px;
        }
        button {
            background-color: #4CAF50;
            color: white;
            border: none;
            padding: 10px 20px;
            font-size: 16px;
            border-radius: 4px;
            cursor: pointer;
            margin: 10px;
        }
        button:hover {
            background-color: #45a049;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/ml5@0.12.2/dist/ml5.min.js"></script>
</head>
<body>
    <div class="container">
        <h1>Hello AI - 图像识别应用</h1>
        <p>点击按钮上传图像或使用随机图像,让AI识别图像内容</p>
        
        <input type="file" id="fileInput" accept="image/*" style="display: none;">
        <button onclick="document.getElementById('fileInput').click()">上传图像</button>
        <button onclick="useRandomImage()">使用随机图像</button>
        
        <img id="image" src="https://picsum.photos/300/300" alt="待识别图像" />
        
        <div id="result">
            <p>点击按钮开始识别...</p>
        </div>
    </div>

    <script>
        // 全局变量
        let classifier;
        const imageElement = document.getElementById('image');
        const resultElement = document.getElementById('result');
        const fileInput = document.getElementById('fileInput');
        
        // 初始化分类器
        function initClassifier() {
            classifier = ml5.imageClassifier('MobileNet', () => {
                console.log('图像分类器已加载!');
            });
        }
        
        // 对图像进行分类
        function classifyImage() {
            resultElement.innerHTML = '<p>正在识别中...</p>';
            
            classifier.classify(imageElement, (error, results) => {
                if (error) {
                    console.error(error);
                    resultElement.innerHTML = `<p>识别错误:${error}</p>`;
                    return;
                }
                
                displayResults(results);
            });
        }
        
        // 显示分类结果
        function displayResults(results) {
            let html = '<h3>识别结果:</h3><ul>';
            results.forEach((result, index) => {
                html += `<li>${index + 1}. ${result.label}:${(result.confidence * 100).toFixed(2)}%</li>`;
            });
            html += '</ul>';
            resultElement.innerHTML = html;
        }
        
        // 使用随机图像
        function useRandomImage() {
            // 使用随机种子确保每次图像不同
            const randomSeed = Math.floor(Math.random() * 1000);
            imageElement.src = `https://picsum.photos/seed/${randomSeed}/300/300`;
            
            // 图像加载完成后进行分类
            imageElement.onload = classifyImage;
        }
        
        // 处理文件上传
        fileInput.addEventListener('change', (event) => {
            const file = event.target.files[0];
            if (file) {
                const reader = new FileReader();
                reader.onload = (e) => {
                    imageElement.src = e.target.result;
                    imageElement.onload = classifyImage;
                };
                reader.readAsDataURL(file);
            }
        });
        
        // 页面加载完成后初始化
        window.addEventListener('load', () => {
            initClassifier();
            // 初始加载时进行一次分类
            setTimeout(classifyImage, 1000);
        });
    </script>
</body>
</html>

实践练习

  1. 复制上面的代码,保存为hello-ai.html文件
  2. 在浏览器中打开该文件,测试图像识别功能
  3. 尝试上传不同类型的图像,观察识别结果
  4. 修改代码,添加一个新的按钮,实现重新识别功能
  5. 优化界面样式,使其更加美观

章节总结

核心知识点回顾

  1. TensorFlow.js是Google开发的强大ML库,支持模型构建、训练和部署
  2. ml5.js是基于TensorFlow.js的高级库,简单易用,适合快速开发
  3. 其他前端AI库包括Brain.js、Synaptic.js和ConvNetJS等
  4. 实现了第一个AI应用:基于ml5.js的图像识别程序

学习收获

  • 掌握了TensorFlow.js和ml5.js的基本使用方法
  • 了解了不同前端AI库的特点和适用场景
  • 学会了如何使用预训练模型进行图像分类
  • 完成了第一个完整的AI应用程序开发

下一步学习

在下一章中,我们将学习数据处理与准备的相关知识,包括数据类型、数据收集与清洗、数据可视化等内容,为后续的模型训练打下基础。


课程分类:前端开发、AI技术开发

学习建议

  • 深入研究TensorFlow.js和ml5.js的官方文档
  • 尝试使用不同的预训练模型
  • 了解模型
« 上一篇 JavaScript与AI的融合 下一篇 » 数据处理与准备