智能技术引领未来:自动图像标注的创新应用与发展

🍑个人主页:Jupiter.
🚀 所属专栏:传知代码
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

  • 概述
  • 算法原理
  • 核心逻辑
  • 效果演示
  • 使用方式
  • 参考文献


参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址

概述

本文基于论文 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.

参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言-排序

常见的排序算法分为以下四种,插入排序,选择排序,交换排序,归并排序。 一、插入排序 (一)直接插入排序 直接插入排序,将一段数组看做被分成已排序序列和未排序序列,排序过程是从未排序序列的元素开始&…

【Java笔记】LinkedList 底层结构

一、LinkedList 的全面说明 LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 二、LinkedList 的底层操作机制 三、LinkedList的增删改查案例 public class LinkedListCRUD { public stati…

网管平台(基础篇):路由器的介绍与管理

路由器简介 路由器(Router)是一种计算机网络设备,它的主要作用是将数据通过打包,并按照一定的路径选择算法,将网络传送至目的地。路由器能够连接两个或更多个网络,并根据信道的情况自动选择和设定路由&…

排序算法(2):选择排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 选择排序 选择排序每次从待排序序列中选出最小(或最大)的元素,将其放到序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素…

Tongweb8命令行使用收集(by lqw)

文章目录 声明对应版本修改thanos用户密码部署应用到默认实例节点相关操作新增节点(一般一个服务器ip只能装一个节点)启动节点(需确认节点没有运行)停止节点删除节点节点新增应用节点查看应用节点启动应用节点停止应用节点卸载应用(谨慎操作,卸载后应用就没有了,建议备份后…

Artec Leo3D扫描仪在重型机械设备定制中的应用【沪敖3D】

挑战:一家加拿大制造商需要有效的方法,为富于变化且难度较高的逆向工程,快速、安全、准确地完成重型机械几何采集。 解决方案:Artec Leo, Artec Studio, Geomagic for SOLIDWORKS 效果:Artec Leo三维扫描代替过去的手动…

Nginx 限制只能白名单 uri 请求的配置

实际生产项目中,大多数时候我们会将后端的 http 接口通过前置 nginx 进行反向代理,对互联网用户提供服务。往往我们后端服务所能提供的接口服务是大于互联网用户侧的实际请求的接口地址数量的(例如后端服务一共有100个api接口,经过…

题海拾贝:力扣 141.环形链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Vite快速构建Vue教程

步骤 1: 初始化项目目录 创建一个名为 projects 的文件夹&#xff0c;作为存放所有 Vite 项目的根目录。这个文件夹将容纳多个独立的 Vite 项目。 步骤 2: 创建 Vite 项目 右键点击 projects 文件夹并选择“在此处打开终端”或使用您偏好的代码编辑器&#xff08;如 VSCode&…

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下&#xff0c;在固定宽度的盒子中的中文会自动换行。但是&#xff0c;当遇到非常长的英文单词或者很长的 URL 时&#xff0c;文本可能就不会自动换行&#xff0c;而会溢出所在容器。幸运的是&#xff0c;CSS 为我们提供了一些和文本换行相关的属性&#xff1b;今…

【NumPy进阶】:内存视图、性能优化与高级线性代数

目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图&#xff08;View&#xff09;1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝&#xff08;Copy&#xff09;1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…

HarmonyOS 5.0应用开发——属性动画

【高心星出品】 文章目录 属性动画animateTo属性动画animation属性动画 属性动画 属性接口&#xff08;以下简称属性&#xff09;包含尺寸属性、布局属性、位置属性等多种类型&#xff0c;用于控制组件的行为。针对当前界面上的组件&#xff0c;其部分属性&#xff08;如位置属…

机器学习支持向量机(SVM)算法

一、引言 在当今数据驱动的时代&#xff0c;机器学习算法在各个领域发挥着至关重要的作用。支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;作为一种强大的监督学习算法&#xff0c;以其在分类和回归任务中的卓越性能而备受瞩目。SVM 具有良好的泛化…

介绍一款docker ui 管理工具

http://vm01:18999/main.html 管理员登陆账号 jinghan/123456 ui启动命令所在文件夹目录 /work/docker/docker-ui 参考链接 DockerUI&#xff1a;一款功能强大的中文Docker可视化管理工具_docker ui-CSDN博客

Motrix WebExtension 使用教程

Motrix WebExtension 使用教程 项目地址:https://gitcode.com/gh_mirrors/mo/motrix-webextension 项目介绍 Motrix WebExtension 是一个浏览器扩展,用于与 Motrix 下载管理器集成。该扩展允许用户通过 Motrix 下载管理器自动下载文件,而不是使用浏览器的原生下载管理器。…

前端(四)css选择器、css的三大特性

css选择器、css的三大特性 文章目录 css选择器、css的三大特性一、css介绍二、css选择器2.1 基本选择器2.2 组合选择器2.3 交集并集选择器2.4序列选择器2.5属性选择器2.6伪类选择器2.7伪元素选择器 三、css三大特性3.1 继承性3.2 层叠性3.3 优先级 一、css介绍 CSS全称为Casca…

《探索视频数字人:开启未来视界的钥匙》

一、引言 1.1视频数字人技术的崛起 在当今科技飞速发展的时代&#xff0c;视频数字人技术如一颗璀璨的新星&#xff0c;正逐渐成为各领域瞩目的焦点。它的出现&#xff0c;犹如一场科技风暴&#xff0c;彻底改变了传统的视频制作方式&#xff0c;为各个行业带来了前所未有的机…

【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法

在分布式系统中&#xff0c;etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce 是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程&#xff0c;帮助读者更好地理解 etcd 的内部实现。 方法源码 …

免费下载 | 2024算网融合技术与产业白皮书

《2024算网融合技术与产业白皮书&#xff08;2023年&#xff09;》的核心内容概括如下&#xff1a; 算网融合发展概述&#xff1a; 各国细化算网战略&#xff0c;指引行业应用创新升级。 算网融合市场快速增长&#xff0c;算力互联成为投资新热点。 算网融合产业模式逐渐成型…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…