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

自动图像标注可体验


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

算法原理

核心逻辑

效果演示

使用方式

参考文献


  本文所有资源均可在该地址处获取。

概述

本文基于论文 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×33×3 的小卷积核,步长为 11,填充为 11。这种设计通过堆叠多个小卷积核来增加网络的非线性表达能力,且相比使用较大的卷积核,能减少参数数量。在若干卷积层后,VGG-Net 使用 2×22×2 的最大池化层,步长为 22。池化层用于减少特征图的尺寸,并保留主要的特征。在最后的卷积层之后,VGG-Net 通过三个全连接层对特征进行进一步处理,最后输出分类结果。在每个卷积层和全连接层之后,VGG-Net 使用 ReLU (Rectified Linear Unit) 激活函数,以增加网络的非线性。

图2:模型结构

本文使用一个线性层和 Sigmoid 函数构建模型的分类器,并利用二元交叉熵损失(Binary Cross-Entropy, BCE)进行训练。

Sigmoid(x)=11+e−xSigmoid(x)=1+e−x1​

BCE(y,y^)=−1N∑i=1N[yilog⁡(y^i)+(1−yi)log⁡(1−y^i)]BCE(y,y^​)=−N1​i=1∑N​[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]

图3:训练过程(精准度、召回率、F1-score)

核心逻辑

程序的核心代码如下所示:

 # transform
    transform = 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]),
    ])
    
    # device
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    
    # dataset
    train_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)

    # model
    model = 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'])

    # log
    loss_epoch = []
    precise_epoch = []
    recall_epoch = []
    f1_epoch = []
    
    # train & test
    for epoch_id in range(configs['epochs']):
        current_loss = 0
        # train
        model.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()
        # test
        model.eval()
        TT_num = 0
        FT_num = 0
        FF_num = 0
        with 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 model
        torch.save(model.state_dict(), configs['checkpoint'])

以上代码仅作展示,更详细的代码文件请参见附件。

效果演示

配置环境并运行 main.py脚本,效果如图4所示。

图5:程序运行结果

此外,网站还提供了在线体验功能。用户只需要输入一张大小不超过 1MB 的 JPG 图像,网站就会自动为图像打上标记并展示词云,如图5所示。

图6:在线体验结果

使用方式

  • 解压附件压缩包并进入工作目录。如果是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.kler.cn/a/444797.html

相关文章:

  • ios 混合开发应用白屏问题
  • DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services
  • 算法-Z-order算法
  • 笔记本重装系统教程【详细教程】
  • 【前端】深入探讨 JavaScript 的 reduce() 方法
  • 谁说C比C++快?
  • day24文件操作--标准IO
  • 前端项目发布后打开报错Uncaught SyntaxError: Unexpected token ‘<‘ (at chunk-vendors)
  • 微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用
  • [创业之路-199]:《华为战略管理法-DSTE实战体系》- 3 - 价值转移理论与利润区理论
  • 基于Spring Boot的校园车辆管理系统
  • 鸿蒙NEXT游戏|Cocos参展2024华为开发者年度盛典
  • 【时时三省】(C语言基础)通讯录1
  • 理解支持向量机
  • FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持
  • STM32之HAL例程-FreeRTOS任务调度流程
  • 罗德与施瓦茨ZN-Z129E网络分析仪校准套件具体参数
  • Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器
  • OpenEuler 22.03 安装 flink-1.17.2 集群
  • 相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
  • Kafka集群篇
  • python paddle实现语音识别、语音合成
  • 《深入浅出Apache Spark》系列⑤:Spark SQL的表达式优化
  • F5中获取客户端ip地址(client ip)
  • ASP.NET Core 与 Blazor:现代 Web 开发技术的全新视角
  • 方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现