当前位置: 首页 > news >正文

用 tensorflow.js 做了一个动漫分类的功能(二)

前言:

前面已经通过采集拿到了图片,并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最后就可以实现在采集中对图片进行自动分类了。

这种功能在应用场景里就比较多了,比如图标素材站点,用户通过上传一个图标,系统会自动匹配出相似的图标,还有二手平台,用户通过上传闲置物品图片,平台自动给出分类等,这些也都是前期对海量图片进行了标注训练而得到一个损失率极低的模型。下面就通过简答的代码实现一个小的动漫分类。

环境:

Node

Http-Server

Parcel

Tensorflow

编码:

1. 训练模型

1.1. 创建项目,安装依赖包

npm install @tensorflow/tfjs --legacy-peer-deps
npm install @tensorflow/tfjs-node-gpu --legacy-peer-deps

1.2. 全局安装 Http-Server

npm install i http-server

1.3. 下载 mobileNet 模型文件 (网上有下载)

1.4. 根目录下启动 Http 服务 (开启跨域),用于 mobileNet 和训练结果的模型可访问

http-server--cors-p8080

1.5. 创建训练执行脚本 run.js

const tf = require('@tensorflow/tfjs-node-gpu');const getData = require('./data');
const TRAIN_PATH = './动漫分类/train';
const OUT_PUT = 'output';
const MOBILENET_URL = 'http://127.0.0.1:8080/data/mobilenet/web_model/model.json';(async () => {const { ds, classes } = await getData(TRAIN_PATH, OUT_PUT);console.log(ds, classes);//引入别人训练好的模型const mobilenet = await tf.loadLayersModel(MOBILENET_URL);//查看模型结构mobilenet.summary();const model = tf.sequential();//截断模型,复用了86个层for (let i = 0; i < 86; ++i) {const layer = mobilenet.layers[i];layer.trainable = false;model.add(layer);}//降维,摊平数据model.add(tf.layers.flatten());//设置全连接层model.add(tf.layers.dense({units: 10,activation: 'relu'//设置激活函数,用于处理非线性问题}));model.add(tf.layers.dense({units: classes.length,activation: 'softmax'//用于多分类问题}));//设置损失函数,优化器model.compile({loss: 'sparseCategoricalCrossentropy',optimizer: tf.train.adam(),metrics:['acc']});//训练模型await model.fitDataset(ds, { epochs: 20 });//保存模型await model.save(`file://${process.cwd()}/${OUT_PUT}`);
})();

1.6. 创建图片与 Tensor 转换库 data.js

const fs = require('fs');
const tf = require("@tensorflow/tfjs-node-gpu");const img2x = (imgPath) => {const buffer = fs.readFileSync(imgPath);//清除数据return tf.tidy(() => {//把图片转成tensorconst imgt = tf.node.decodeImage(newUint8Array(buffer), 3);//调整图片大小const imgResize = tf.image.resizeBilinear(imgt, [224, 224]);//归一化return imgResize.toFloat().sub(255 / 2).div(255 / 2).reshape([1, 224, 224, 3]);});
}const getData = async (traindir, output) => {let classes = fs.readdirSync(traindir, 'utf-8');fs.writeFileSync(`./${output}/classes.json`, JSON.stringify(classes));const data = [];classes.forEach((dir, dirIndex) => {fs.readdirSync(`${traindir}/${dir}`).filter(n => n.match(/jpg$/)).slice(0, 1000).forEach(filename => {const imgPath = `${traindir}/${dir}/${filename}`;data.push({ imgPath, dirIndex });});});console.log(data);//打乱训练顺序,提高准确度tf.util.shuffle(data);const ds = tf.data.generator(function* () {const count = data.length;const batchSize = 32;for (let start = 0; start < count; start += batchSize) {const end = Math.min(start + batchSize, count);console.log('当前批次', start);yield tf.tidy(() => {const inputs = [];const labels = [];for (let j = start; j < end; ++j) {const { imgPath, dirIndex } = data[j];const x = img2x(imgPath);inputs.push(x);labels.push(dirIndex);}const xs = tf.concat(inputs);const ys = tf.tensor(labels);return { xs, ys };});}});return { ds, classes };
}module.exports = getData;

1.7. 运行执行文件

noderun.js

2. 调用模型

2.1. 全局安装 parcel

npminstall i parcel

2.2. 创建页面 index.html

<scriptsrc="script.js"></script><inputtype="file"onchange="predict(this.files[0])"><br>

2.3. 创建模型调用预测脚本 script.js

import * as tf from'@tensorflow/tfjs';
import { img2x, file2img } from'./utils';const MODEL_PATH = 'http://127.0.0.1:8080/t7';
const CLASSES = ["假面骑士","奥特曼","海贼王","火影忍者","龙珠"];window.onload = async () => {const model = await tf.loadLayersModel(MODEL_PATH + '/output/model.json');window.predict = async (file) => {const img = await file2img(file);document.body.appendChild(img);const pred = tf.tidy(() => {const x = img2x(img);return model.predict(x);});const index = pred.argMax(1).dataSync()[0];console.log(pred.argMax(1).dataSync());let predictStr = "";if (typeof CLASSES[index] == 'undefined') {predictStr = BRAND_CLASSES[index];} else {predictStr = CLASSES[index];}setTimeout(() => {alert(`预测结果:${predictStr}`);}, 0);};
};

2.4. 创建图片 tensor 格式转换库 utils.js

import * as tf from'@tensorflow/tfjs';exportfunctionimg2x(imgEl){return tf.tidy(() => {const input = tf.browser.fromPixels(imgEl).toFloat().sub(255 / 2).div(255 / 2).reshape([1, 224, 224, 3]);return input;});
}exportfunctionfile2img(f) {returnnewPromise(resolve => {const reader = new FileReader();reader.readAsDataURL(f);reader.onload = (e) => {const img = document.createElement('img');img.src = e.target.result;img.width = 224;img.height = 224;img.onload = () => resolve(img);};});
}

2.5. 打包项目并运行

parcelindex.html

2.6. 运行效果

注意:

1. 模型训练过程报错

Input to reshape is a tensor with 50176 values, but the requested shape has 150528

1.1. 原因

张量 reshape 不对,实际输入元素个数与所需矩阵元素个数不一致,就是采集过来的图片有多种图片格式,而不同格式的通道不同 (jpg3 通道,png4 通道,灰色图片 1 通道),在将图片转换 tensor 时与代码里的张量形状不匹配。

1.2. 解决方法

一种方法是删除灰色或 png 图片,其二是修改代码 tf.node.decodeImage (new Uint8Array (buffer), 3)

相关文章:

用 tensorflow.js 做了一个动漫分类的功能(二)

前言&#xff1a;前面已经通过采集拿到了图片&#xff0c;并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型&#xff0c;最后就可以实现在采集中对图片进行自动分类了。这种功能在应用场景里就比较多了&#xff0c;比如图标素材站点&#xff0…...

小林coding

一、图解网络 问大家&#xff0c;为什么要有TCP/Ip网络模型&#xff1f; 对于同一台设备上的进程通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;对于不同设备上的进程通信&#xff0c;就需要有网络通信&#xff0c;而设备是…...

操作系统真相还原_第6章:完善内核

文章目录6.1 函数调用约定简介6.2 汇编语言和C语言混合编程汇编调用CC调用汇编6.3 实现打印函数流程程序编译并写入硬盘执行6.4 内联汇编简介汇编语言AT&T语法基本内联汇编扩展内联汇编6.1 函数调用约定简介 调用约定&#xff1a; calling conventions 调用函数时的一套约…...

SmoothNLP新词发现算法的改进实现

SmoothNLP新词发现算法的改进实现 背景介绍 新词发现也叫未登录词提取&#xff0c;依据 《统计自然语言处理》(宗成庆)&#xff0c;中文分词有98%的错误来自"未登录词"。即便早就火遍大江南北的Bert也不能解决"未登录词"的Encoding问题&#xff0c;便索性…...

实时渲染为什么快,能不能局域网部署点量云

提到渲染很多有相关从业经验的人员可能会想起&#xff0c;自己曾经在电脑上渲染一个模型半天或者更长的 时间才能完成的经历。尤其是在项目比较着急的时候&#xff0c;这种煎熬更是难受。但现在随着实时渲染和云渲染行业的发展&#xff0c;通过很多方式可以提升渲染的时间和效率…...

网络游戏该如何防护ddos/cc攻击

现在做网络游戏的企业都知道服务器的安全对于我们来说很重要&#xff01;互联网上面的 DDoS 攻击和 CC 攻击等等无处不在&#xff0c;而游戏服务器对服务器的防御能力和处理能力要求更高&#xff0c;普通的服务器则是比较注重各方面能力的均衡。随着游戏行业的壮大&#xff0c;…...

项目管理体系1-4练习题1-10答案

题目1 每周一次的项目会议上&#xff0c;一位团队成员表示在修订一项可交付成果时&#xff0c;一名销售经理对客户服务过程想出一项变更讨论&#xff0c;影响到整个项目&#xff0c;项目经理对销售参与到项目可交付成果感到吃惊&#xff0c;经理事先应该怎么做去阻止这些情况&…...

sHMIctrl智能屏幕使用记录

手上有个案子&#xff0c;“按压机器人”&#xff0c;功能是恒定一个力按下一定时间。 屏幕选型使用“sHMIctrl”&#xff0c;一下记录使用过程中遇到的问题以及解决方法。 目录 问题1&#xff1a;按键控件做定时触发&#xff0c;模拟运行时触发不了。 问题2&#xff1a;厂家…...

2.20 crm day01 配置路由router less使用 axios二次封装

需求&#xff1a; 目录 1.配置路由 2.less使用 vue2使用以下版本 3.axios二次封装 1.配置路由 1.1.1 官方链接&#xff1a;安装 | Vue Router npm i vue-router3.6.5 注意&#xff1a;vue2项目不能用vue-router四版本以上 1.2.1.创建router/index.js 在该文件中 //1.引…...

【LeetCode】剑指 Offer 10- I. 斐波那契数列 p74 -- Java Version

题目链接&#xff1a; 1. 题目介绍&#xff08;&#xff09; 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xff09;。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1F(N) F(N - 1) F…...

论文笔记:DropMessage: Unifying Random Dropping for Graph Neural Networks

&#xff08;AAAI 23 优秀论文&#xff09; 1 intro GNN的一个普遍思路是&#xff0c;每一层卷积层中&#xff0c;从邻居处聚合信息 尽管GNN有显著的进步&#xff0c;但是在大规模图中训练GNN会遇到各种问题&#xff1a; 过拟合 过拟合之后&#xff0c;GNN的泛化能力就被限制…...

木鱼cms系统审计小结

MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。 ​​ ‍ 环境搭建 我们利用 phpstudy 来搭建环境&#xff0c;选择 Apache2.4.39 MySQL5.7.26 php5.6.9 &#xff0c;同时利用 PhpStorm 来实现对项目的调试 ​…...

软件测试面试-一线大厂必问的测试思维面试题

五、测试思维5.1 打电话功能怎么去测&#xff1f;我们会从几个方面去测试&#xff1a;界面、功能、兼容性、易用性、安全、性能、异常。1&#xff09;界面我们会测试下是否跟界面原型图一致&#xff0c;考虑浏览器不同显示比例&#xff0c;屏幕分辨率。2&#xff09;功能&#…...

企业级分布式应用服务 EDAS

什么是企业级分布式应用服务EDAS企业级分布式应用服务EDAS&#xff08;Enterprise Distributed Application Service&#xff09;是一个应用托管和微服务管理的云原生PaaS平台&#xff0c;提供应用开发、部署、监控、运维等全栈式解决方案&#xff0c;同时支持Spring Cloud和Ap…...

弄懂 Websocket 你得知道的这 3 点

1. WebSocket原理 WebSocket同HTTP一样也是应用层的协议&#xff0c;但是它是一种双向通信协议&#xff0c;是建立在TCP之上的。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简…...

Appium构架及工作原理

一、appium结构简单来说appium充当一个中间服务器的功能&#xff0c;接收来自我们代码的请求&#xff0c;然后发送到手机上进行执行。二、初步认识appium工作过程1.appium是c/s模式的2.appium是基于webdriver协议添加对移动设备自动化api扩展而成的&#xff0c;所以具有和webdr…...

软件架构中“弹性”的多种含义

在软件架构领域的中文文档、书籍中&#xff0c;经常可以看到“弹性”这个专业术语&#xff0c;但在不同的语境下含义可能会不同。 在英语中&#xff0c;elastic 和 resilient 两个单词都可以翻译为“弹性的”&#xff0c;但是它们在软件架构中代表的含义却完全不同&#xff0c…...

JAVA练习57- 罗马数字转整数、位1的个数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目1-罗马数字转整数 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 二、题目2-位1的个数 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 …...

C#把图片放到picturebox上的指定位置,PointToClient与PointToScreen解读

1、C#中如何把图片放到picturebox上的指定位置 构造一个跟picturebox1一样大小的Bitmap&#xff0c; 设置给picturebox1&#xff0c; 然后在上面画图 Bitmap image new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height); Graphics device Graphics.FromImage(imag…...

【论文笔记】Manhattan-SDF==ZJU==CVPR‘2022 Oral

Neural 3D Scene Reconstruction with the Manhattan-world Assumption 本文工作&#xff1a;基于曼哈顿世界假设&#xff0c;重建室内场景三维模型。 1.1 曼哈顿世界假设 参考阅读文献&#xff1a;Structure-SLAM: Low-Drift Monocular SLAM in Indoor EnvironmentsIEEE IR…...

Topit:macOS窗口置顶神器,让多任务处理效率翻倍

Topit&#xff1a;macOS窗口置顶神器&#xff0c;让多任务处理效率翻倍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个任务时…...

从‘文件夹’到对象列表:手把手教你用MinIO Java Client实现灵活的文件查询与过滤

从‘文件夹’到对象列表&#xff1a;手把手教你用MinIO Java Client实现灵活的文件查询与过滤在当今数据驱动的时代&#xff0c;对象存储已成为现代应用架构中不可或缺的一部分。MinIO作为高性能、兼容S3协议的开源对象存储解决方案&#xff0c;凭借其轻量级和易用性赢得了众多…...

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析

高性能Windows流媒体服务器部署&#xff1a;5大核心技术与3种实战架构深度解析 【免费下载链接】srs-windows 项目地址: https://gitcode.com/gh_mirrors/sr/srs-windows 在Windows平台上构建专业级流媒体服务系统&#xff0c;需要综合考虑协议兼容性、性能优化和部署架…...

Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo 2提示词编写最佳实践总览 Veo 2 是 Google 推出的高性能视频生成模型&#xff0c;其对提示词&#xff08;prompt&#xff09;的语义精度、结构清晰度和上下文控制能力高度敏感。高质量提示词并非简单堆砌关…...

百度文心一言开发者如何通过Taotoken低成本接入多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心一言开发者如何通过Taotoken低成本接入多模型API 对于已经熟悉并正在使用百度文心一言等国产大模型API的开发者而言&#…...

<背包问题>

背包问题是一类组合优化问题&#xff0c;其基本形式是给定一组物品&#xff0c;每个物品都有一个重量和一个价值&#xff0c;以及一个有限的背包容量&#xff0c;目标是在不超过背包容量的前提下&#xff0c;选择物品使得背包中的物品价值最大化。动态规划是解决背包问题的常用…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段&#xff0c;全面扎根企业实际业务场景&#xff0c;成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道&#xff0c;行业心态也从初期观望试探&#xff0c;彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错&#xff1a;手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时&#xff0c;是否遇到过启动失败却无从下手的困境&#xff1f;作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos在微服务架构中扮演着重要角色。然而&am…...

render_async嵌套渲染:构建复杂异步界面的完整解决方案

render_async嵌套渲染&#xff1a;构建复杂异步界面的完整解决方案 【免费下载链接】render_async render_async lets you include pages asynchronously with AJAX 项目地址: https://gitcode.com/gh_mirrors/re/render_async 在现代Web开发中&#xff0c;页面加载速度…...

Driver Store Explorer终极指南:轻松管理Windows驱动存储区,释放宝贵磁盘空间

Driver Store Explorer终极指南&#xff1a;轻松管理Windows驱动存储区&#xff0c;释放宝贵磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统越来越慢而烦…...