智能技术引领未来:自动图像标注的创新应用与发展
目录
- 概述
- 算法原理
- 核心逻辑
- 效果演示
- 使用方式
- 参考文献
参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:
地址
概述
本文基于论文 Multi-Label Classification using Deep Convolutional Neural Network[1] 实现图像自动标注程序。
计算机技术的进步和互联网产业的不断发展导致了网络图像数量的爆炸式增长,如何管理种类繁多的海量图像成为了一个重要问题。自动图像标注(Automatic Image Tagging)作为一项重要的图像管理技术,可以利用计算机自动为每张图像打上与其内容有关的标签,从而帮助用户更好地搜索和访问图像。
图1:图像自动标注任务
近年来,随着深度学习技术的发展,深度神经网络能够捕捉到更多且更加复杂的图像特征,这使得图像标注算法的性能也随之受益。图像标注与图像多标签分类有着天然的紧密连系,后者会根据内容将一张图像归纳到多个类别中。综上,本文基于目前先进的深度神经网络 VGG-Net[2] 和大规模图像多标签分类数据集 MS-COCO-2017[3] 训练自动图像标注模型。
算法原理
VGG-Net 是一种经典的卷积神经网络 (Convolutional Neural Network) 架构,其核心思想是通过更深的网络结构以及使用较小的卷积核来提取更丰富的图像特征。VGG-Net 通过堆叠多个卷积层来加深网络,且卷积层全部采用大小为 3×3 的小卷积核,步长为 1,填充为 1。这种设计通过堆叠多个小卷积核来增加网络的非线性表达能力,且相比使用较大的卷积核,能减少参数数量。在若干卷积层后,VGG-Net 使用 2×2 的最大池化层,步长为 2。池化层用于减少特征图的尺寸,并保留主要的特征。在最后的卷积层之后,VGG-Net 通过三个全连接层对特征进行进一步处理,最后输出分类结果。在每个卷积层和全连接层之后,VGG-Net 使用 ReLU (Rectified Linear Unit) 激活函数,以增加网络的非线性。
本文使用一个线性层和 Sigmoid 函数构建模型的分类器,并利用二元交叉熵损失(Binary Cross-Entropy, BCE)进行训练。
Sigmoid(x)=11+e−x
核心逻辑
程序的核心代码如下所示:
# transformtransform = v2.Compose([v2.Resize(256),v2.CenterCrop(224),v2.RandomHorizontalFlip(),v2.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),v2.ToImage(),v2.ToDtype(torch.float32, scale=True),v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])# devicedevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# datasettrain_dataset = COCO_Dataset(configs['train_annotations_path'], configs['train_images_dir'], transform)train_dataloader = DataLoader(train_dataset, batch_size = configs['batch_size'], shuffle = True, num_workers=8, pin_memory=True)test_dataset = COCO_Dataset(configs['test_annotations_path'], configs['test_images_dir'], transform)test_dataloader = DataLoader(test_dataset, batch_size = configs['batch_size'], shuffle = False, num_workers=8, pin_memory=True)# modelmodel = ImageTaggingModel().to(device)optimizer = optim.Adam(model.parameters(), lr=configs['learning_rate'], weight_decay=configs['weight_decay'])lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=configs['lr_decay_step'], gamma=configs['lr_decay_rate'])# logloss_epoch = []precise_epoch = []recall_epoch = []f1_epoch = []# train & testfor epoch_id in range(configs['epochs']):current_loss = 0# trainmodel.train()for batch in tqdm(train_dataloader, desc='Training(Epoch %d)' % epoch_id, ascii=' 123456789#'):optimizer.zero_grad()images = batch['images'].to(device)labels = batch['labels'].to(device)logits = model(images)loss = F.binary_cross_entropy_with_logits(logits, labels)current_loss += loss.item()loss.backward()optimizer.step()lr_scheduler.step()current_loss /= len(train_dataloader)print('Current Average Loss:', current_loss)loss_epoch.append(current_loss)plt.plot(loss_epoch)plt.xlabel('Epoch')plt.ylabel('Loss')plt.title('Loss-Epoch')plt.savefig(os.path.join(configs['logs_dir'], "Loss.png"), dpi=300)plt.clf()# testmodel.eval()TT_num = 0FT_num = 0FF_num = 0with torch.no_grad():for batch in tqdm(test_dataloader, desc='Testing(Epoch %d)' % epoch_id, ascii=' 123456789#'):images = batch['images'].to(device)labels = batch['labels'].to(device)logits = model(images)probs = F.sigmoid(logits)predictions = (probs > configs['threshold']).to(labels.dtype)TT_num += torch.sum(predictions * labels).item()FT_num += torch.sum(predictions * (1 - labels)).item()FF_num += torch.sum((1 - predictions) * labels).item()precise = TT_num / (TT_num + FT_num)recall = TT_num / (TT_num + FF_num)f1_score = 2 * precise * recall / (precise + recall)precise_epoch.append(precise)recall_epoch.append(recall)f1_epoch.append(f1_score)print("Precise = %.2f, Recall = %.2f, F1-score = %.2f" % (precise, recall, f1_score))plt.plot(precise_epoch, label='Precise')plt.plot(recall_epoch, label='Recall')plt.plot(f1_epoch, label='F1-score')plt.xlabel('Epoch')plt.ylabel('Value')plt.title('Result')plt.legend()plt.savefig(os.path.join(configs['logs_dir'], "Result.png"), dpi=300)plt.clf()# save modeltorch.save(model.state_dict(), configs['checkpoint'])
以上代码仅作展示,更详细的代码文件请参见附件。
效果演示
配置环境并运行 main.py脚本,效果如图4所示。
此外,网站还提供了在线体验功能。用户只需要输入一张大小不超过 1MB 的 JPG 图像,网站就会自动为图像打上标记并展示词云,如图5所示。
使用方式
解压附件压缩包并进入工作目录。如果是Linux系统,请使用如下命令:
unzip ImageCaptioning.zip
cd ImageCaptioning
代码的运行环境可通过如下命令进行配置:
pip install -r requirements.txt
如果在本地测试自动图像标注程序,请运行如下命令:
python main.py
如果希望在线部署,请运行如下命令:
python main-flask.py
参考文献
-
[1] Lydia A A, Francis F S. Multi-label classification using deep convolutional neural network[C]//2020 international conference on innovative trends in information technology (ICITIIT). IEEE, 2020: 1-6.
-
[2] Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.
-
[3] Lin T Y, Maire M, Belongie S, et al. Microsoft coco: Common objects in context[C]//Computer Vision–ECCV 2014: 13th European Conference, Zurich, Switzerland, September 6-12, 2014, Proceedings, Part V 13. Springer International Publishing, 2014: 740-755.
参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:
地址
相关文章:
智能技术引领未来:自动图像标注的创新应用与发展
🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 概述算法原理核心逻辑效果演示使用方式参考文献 参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获…...
深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式
数据库 深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式一、SQLite 数据库全方位解析(一)创建与基本操作(二)数据存储与表结构设计(三)数据操作:增删改查(四)与 C 语言联合使用(五)防止 SQL 注入二、Redis 数据库深度剖析(一)数据存储类型与独特结构(…...
内网是如何访问到互联网的(华为源NAT)
私网地址如何能够访问到公网的? 在上一篇中,我们用任意一个内网的终端都能访问到百度的服务器,但是这是我们在互联网设备上面做了回程路由才实现的,在实际中,之前也说过运营商是不会写任何路由过来的,那对于…...
华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)
华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理,我们需要统一把局域网内的所有AP上线到AC,由AC做集中式管理部署。这里我们需要理解CAPWAP协议,该协议分为两种报文:1、管理报文 2、数据报文。管理报文实际在抓包过程…...
奖励模池化
奖励模池化 奖励模型概述 奖励模型(Reward Model)在机器学习,特别是强化学习领域中被广泛使用。它的主要作用是**对智能体(Agent)的行为进行评估并给予奖励。**例如,在训练一个机器人执行任务时,当机器人的动作符合预期目标(如成功抓取物品、按照正确路线行走等),奖励…...
基于django协同过滤的音乐推荐系统的设计与实现
一、摘要 随着现代音乐的快速发展,协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…...
Tiptap,: 富文本编辑器入门与案例分析
Tiptap 是一个现代的富文本编辑器,基于 ProseMirror 打造,旨在提供一个灵活且功能强大的文本编辑解决方案。它具有开箱即用的能力,同时也允许开发者根据业务需求进行高度定制化扩展。与传统的富文本编辑器相比,Tiptap 提供了更精细…...
使用Linux的logrotate工具切割日志:Tomcat、NGINX(journal文件清理)
文章目录 引言I Tomcat日志切割配置轮转参数验证码II NGINX访问文件的配置和切割access.log 访问日志的配置使用Linux的logrotate工具切割日志验证文件切割III /run/log/journaljournalctl文件清理引言 journal文件清理: 只保留过去两天,清理之前的文件 journalctl --vacuu…...
CSS系列(11)-- 滤镜与混合模式详解
前端技术探索系列:CSS 滤镜与混合模式详解 🎨 致读者:探索视觉效果的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 滤镜与混合模式,学习如何创建独特的视觉效果。 滤镜效果详解 🚀 基础滤…...
linux - 存储管理
1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来,主要以机械磁盘为例(更具代表性,在linux系统层面,无论是机械磁盘还是固态硬盘,文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…...
在 Kibana 中为 Vega Sankey 可视化添加过滤功能
作者:来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗?了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中,我们将了解如何启用 Vega Sankey 可视…...
styled-components 库的用法介绍和实践总结
styled-components 库的实践用法总结 前言 前段时间开发了一个 NiceTab 浏览器插件,并写了一篇介绍文章,新开发了一款浏览器Tab管理插件,OneTab 的升级替代品, 欢迎品尝!。 在插件中用到了 styled-components 这个库,于是做一个基本的介绍和分享。 在开发 NiceTab 插件…...
SSE(Server-Sent Events)主动推送消息
说明 使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回。有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式。 SSE(Server-Sent Events) SSE 是一种允许服务器单向发送事…...
pandas.core.frame.DataFrame怎么进行对象内容的读写
在 Python 中,pandas.core.frame.DataFrame 是 Pandas 数据库的核心数据结构,可以方便地读取和操作表格数据。以下是几种常见的读取内容的方法: 读取特定列 通过列名获取数据。 # 假设 df 是一个 DataFrame data df["列名"] # …...
短作业优先调度算法
一、实验目的 了解并掌握作业调度的功能,熟悉并掌握各种作业调度算法。 二、实验内容 模拟实现SJF调度。 设置作业体:作业名,作业的到达时间,服务时间,作业状态(W——等待,R——运行,F——完成)…...
SpringBoot 应用并发处理请求数的深入解析
SpringBoot 应用并发处理请求数的深入解析 一、引言 在现代Web开发中,了解一个应用程序可以同时处理多少个并发请求是至关重要的。 对于基于Spring Boot构建的应用程序来说,这个问题的答案并非绝对,而是取决于多个因素,包括但不…...
MetaGPT中的教程助手:TutorialAssistant
1. 提示词 COMMON_PROMPT """ You are now a seasoned technical professional in the field of the internet. We need you to write a technical tutorial with the topic "{topic}". """DIRECTORY_PROMPT (COMMON_PROMPT "…...
介绍一款docker ui 管理工具
http://vm01:18999/main.html 管理员登陆账号 jinghan/123456 ui启动命令所在文件夹目录 /work/docker/docker-ui 参考链接 DockerUI:一款功能强大的中文Docker可视化管理工具_docker ui-CSDN博客...
0022 基于SpringBoot的婚纱摄影线上预约系统的设计与实现
电子商城系统 1.项目描述2. 绪论2.1 研究背景2.2 目的及意义2.3 国内外研究现状 3.需求分析4.界面展示5.源码获取 1.项目描述 摘 要 本文旨在研究并开发一套基于Spring Boot框架的婚纱摄影线上预约系统,以满足现代婚纱摄影行业对高效、便捷、个性化服务的需求。该系…...
uni-app在image上绘制点位并回显
在 Uni-app 中绘制多边形可以通过使用 Canvas API 来实现。Uni-app 是一个使用 Vue.js 开发所有前端应用的框架,同时支持编译为 H5、小程序等多个平台。由于 Canvas 是 H5 和小程序中都支持的 API,所以通过 Canvas 绘制多边形是一个比较通用的方法。 1.…...
Comparator.comparing 排序注意
1. 对数字型字符串排序 List<String> values new ArrayList<>();values.add("10");values.add("6");values.add("20");values.add("30");values.add("50");//方法1 (正确的排序方法)//倒…...
PPO系列3 - PPO原理
On Policy: 采集数据的模型,和训练的模型,是同一个。缺点:慢,生成一批样本数据,训练一次,又要重新生成下一批。 Off Policy: 采集数据的模型,和训练的模型,不是同一个。有点…...
.idea
.idea/ 文件夹下的文件和目录主要用于存储 JetBrains IDE(如 PyCharm、IntelliJ IDEA 等)的项目配置。下面是一些常见文件和目录及其作用的详细介绍: 1. workspace.xml 用户界面布局:保存了IDE窗口布局,包括打开的文…...
单片机:实现呼吸灯(附带源码)
单片机实现呼吸灯详细解读 呼吸灯是一种常见的灯光效果,广泛应用于电子产品、汽车、家居照明等领域。其基本特性是通过逐渐增亮和减弱的方式,使得灯光呈现出“呼吸”的效果,给人一种平缓、舒适的视觉感受。在嵌入式系统中,呼吸灯…...
PostgreSQL数据库序列信息查询
PostgreSQL序列信息查询 说明: 在PostgreSQL数据库中序列和表都是序列的对象。 数据库中不应该存在孤儿序列,序列应该和表对应的字段绑定起来。绑定后删除表或表对应的字段后,序列会自动被删除。 创建测试表和序列 create table test_t(…...
【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
Linux驱动开发(12):中断子系统–按键中断实验
本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…...
代码随想录-算法训练营-番外(图论02:岛屿数量,岛屿的最大面积)
day02 图论part02 今日任务:岛屿数量,岛屿的最大面积 都是一个模子套出来的 https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html#思路往日任务: day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercar…...
20 go语言(golang) - gin框架安装及使用(一)
一、简介 Gin是一个用Go语言编写的高性能Web框架,专注于构建快速、可靠的HTTP服务。它以其速度和简洁性而闻名,非常适合用于开发RESTful API。 高性能:Gin使用了httprouter进行路由管理,这是一个轻量级且非常快速的HTTP请求路由器…...
重生之我在学Vue--第3天 Vue 3 模板语法与指令
重生之我在学Vue–第3天 Vue 3 模板语法与指令 文章目录 重生之我在学Vue--第3天 Vue 3 模板语法与指令前言一、数据绑定1.1 单向绑定1.2 双向绑定 二、常用指令2.1 v-bind2.2 v-model2.3 v-if2.4 v-show2.5 v-for2.6 v-on 三、事件处理与表单绑定3.1 事件处理3.2 表单绑定 前言…...
wordpress中如何添加面包屑/百度seo插件
**前言**在过去的十多年里,我在多所大学学习并讲授了一系列GIS课程。正是这样一段经历,促使我撰写了这本书。在所有的课程中,有一课是“小代码,大用处”。 在DOS系统时代,熟悉DOS的人能使用命令行处理一些基本的任务。…...
搬瓦工wordpress建站/刚刚发生了一件大事
目录1.题目2.总体分析3.详细设计4.源码1.题目 设计一个学生管理系统,要求如下: 学生来自英语系,数学系、计算机系,每个学生的公共信息部包括:学号、姓名、年龄、系别,高数成绩、英语成绩、体育成绩&#…...
wordpress 新浪微博插件/网页制作教程步骤
编程语言流行指数(PYPL)排行榜近日公布了2019年7月份榜单。 在最新一期榜单上, Python的份额高达28.08%,再次蝉联第一,并且增长4.7%,同时成为增长势头较好的语言。而被挤到第二蝉联Java,同比下跌1.8个百分…...
低价网站建设怎么样/百度官网
前些日子完成了一个extension for nf_conntrack底层基础设施,后来写了一个测试代码,将:1.一个数据流两个方向的路由结果;2.如果数据流目的地是本机,则和该流关联的socket; 缓存在了conntrack的extension中。…...
长春网站建设网诚传媒/潍坊seo推广
/**用来测试STL hash_map *简单例子2008.5.5 */ #include <cstdlib> #include <iostream> #include <string> #include <hash_map.h>/*因为hash_map暂不为CPP标准所以没办法写为<hash_map>*/ /*-------------------------------------------…...
建设银行网站用户名更改/互联网广告销售好做吗
html网页制作里设置字体和大小的语句有吗?是什么?HTML Table这是size 5的文字大小这是标楷体的文字字型呈现结果诚如第一段所说,若要符合最新的HTML5网页设计标准,表格内的文字大小与字型就必须使用css来设计,范例二就提供这样的设计方式&…...