【AI达人特训营第三期】基于PaddleClas的苹果品牌Logo识别

2023-10-08 10:40

本文主要是介绍【AI达人特训营第三期】基于PaddleClas的苹果品牌Logo识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

【赛题题目】

苹果品牌Logo识别

【赛题背景】

logo是徽标或者商标的英文说法,起到对商标拥有公司的识别和推广的作用,形象的logo可以让消费者记住公司主体和品牌文化,logo对于品牌来说非常重要,是品牌价值的重要组成部分。如果要盘点世界上最有价值的logo的话,苹果的logo肯定要位列其中。

苹果最初的Logo在1976年由创始人三人之一韦恩设计,只在生产Apple-I时使用,为牛顿坐在苹果树下看书的钢笔绘画。在1976年由乔布斯决定重新委托广告设计,并配合Apple-2的发行使用,本次Logo确定使用了彩虹色、具有一个缺口的苹果图像。

这个Logo一直使用至1998年,在iMac发布时作出修改,变更为单色系列。2007年再次变更为金属带有阴影的银灰色。事实上,该品牌最近又恢复了2000年的标识,这表明如果标识足够强大,用户仍然会认出来。

【赛题描述】

本赛题要求选手研究开发高效可靠的深度学习算法,准确识别图片中是否包含品牌logo,提升图像智能分类的准确度与效率。

【赛题任务】

允许选手下载赛题数据,设计算法并在本地完成模型训练,输出结果要求标出图片是否含苹果Logo,是则标记为1,否则标记为0;

【赛题数据】

本赛题将会提供近千张的从互联网收集的图片,图片为jpg格式,图片示例如下:

本赛题已将数据集合理划分为训练集和测试集,隐藏测试标注数据作为模型测评依据。训练集用来给选手训练模型,含苹果Logo图片269张,不含苹果Logo图片519张。

a) 我们将提供用于训练的图片和分类标签、测试图片以及提交示例文件,文件夹结构如下:

work/data/
├── test
├── train
└── 提交示例文件.csv

b) 其中,train文件夹存放训练集图像数据,test文件夹存放测试集图像数据,图片均为jpg格式。train文件夹结构如下:

work/data/train/
├── logo
└── without_logo

c) train训练集图像数据文件夹中,logo文件夹存放有苹果Logo的训练图片,without_logo存放没有苹果Logo的训练图片。

d) csv: 只包含测试集图片id的结果文件示例。

【提交说明】

本赛题要求选手通过使用主办方提供的数据,训练算法来预测测试集中的图片是否含苹果Logo,图片ID和标注结果一一对应生成csv文件提交评测。

提交文件示例(result.csv):

注:为避免评测过程中文编码格式导致评测错误的影响,请统一以utf-8编码,result.csv中第一列是图片的唯一标记,第二列是对应的标注。并且注意不要包含表头,标注结果只能是0或1:0表示图片中不含苹果Logo,1表示图片中含有苹果Logo。

【评估指标】

赛题分数计算方式:准确率ACC

# 持久化安装,只需运行一次
!mkdir /home/aistudio/external-libraries
!pip install paddlex==2.1.0 -t /home/aistudio/external-libraries
!pip install paddleclas==2.4.0 -t /home/aistudio/external-libraries
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: 
import sys 
sys.path.append('/home/aistudio/external-libraries')

一、数据准备

1.1 数据集格式说明

PaddleClas 使用 txt 格式文件指定训练集和测试集,即需要指定 train_list.txtval_list.txt 当作训练集和验证集的数据标签,格式形如:

# 每一行采用"空格"分隔图像路径与标注
train/1.jpg 0
train/10.jpg 1
...

如果您想获取更多常用分类数据集的信息,可以参考文档可以参考 PaddleClas 分类数据集格式说明 。

1.2 标注文件生成

如果您已经有实际场景中的数据,那么按照上节的格式进行标注即可。这里,我们提供了一个快速生成数据的脚本,您只需要将不同类别的数据分别放在文件夹中,运行脚本即可生成标注文件。

首先,假设您存放数据的路径为./traintrain/ 中包含了每个类别的数据,类别号从 0 开始,每个类别的文件夹中有具体的图像数据。

train
├── 0
│   ├── 0.jpg
│   ├── 1.jpg
│   └── ...
└── 1├── 0.jpg├── 1.jpg└── ...
└── ...
# %cd /home/aistudio/work/data
# # 从train文件夹中筛选出所有的图片文件,并把它们的完整路径和所属类别输出到train_list.txt文件中。
#     # tree -r -i -f train 是指使用tree程序以反向、无缩进、全路径的方式列出train文件夹下的所有文件。
#     # | 是指管道符,表示把前一个程序的输出作为后一个程序的输入。
#     # grep -E “jpg|JPG|jpeg|JPEG|png|PNG” 是指使用grep程序根据正则表达式匹配所有以jpg、JPG、jpeg、JPEG、png或PNG结尾的文件。
#     # awk -F “/” ‘{print $0" "$2}’ > train_list.txt 是指使用awk程序按照"/"分隔每一行,并打印每一行的全部内容($0)和第二个字段($2),即图片所属类别,然后重定向输出到train_list.txt文件中。# !tree -r -i -f train | grep -E "jpg|JPG|jpeg|JPEG|png|PNG" | awk -F "/" '{print $0" "$2}' > train_list.txt

1.3 切分训练集和验证集

# 关掉警告信息
import warnings
warnings.filterwarnings("ignore")# 将数据集以按8:2切分为训练集和验证集
!paddlex --split_dataset --format ImageNet --dataset_dir /home/aistudio/work/data/data --val_value 0.2

二、模型训练

修改 SwinTransformer_base_patch4_window12_384.yaml 中数据集路径的配置文件

# global configs
Global:checkpoints: 10pretrained_model: https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_base_patch4_window12_384_22kto1k_pretrained.pdparams# model architecture
Arch:name: SwinTransformer_base_patch4_window12_384class_num: 2Optimizer:lr:# for 1 cardslearning_rate: 1.25e-4warmup_start_lr: 2.5e-7# data loader for train and eval
DataLoader:Train:dataset:name: ImageNetDatasetimage_root: /home/aistudio/work/data/data/cls_label_path: /home/aistudio/work/data/data/train_list.txtsampler:batch_size: 16Eval:dataset: name: ImageNetDatasetimage_root: /home/aistudio/work/data/data/cls_label_path: /home/aistudio/work/data/data/val_list.txtsampler:batch_size: 16Infer:infer_imgs: /home/aistudio/work/data/testbatch_size: 16PostProcess:class_id_map_file: /home/aistudio/work/data/data/labels.txt
# 直接使用 SwinTransformer_base_patch4_window12_384.yaml 训练的命令为:
%cd /home/aistudio/work/PaddleClas-2.4.0
!export CUDA_VISIBLE_DEVICES=0
!python3 tools/train.py \-c ./ppcls/configs/ImageNet/SwinTransformer/SwinTransformer_base_patch4_window12_384.yaml

三、模型评估

训练好模型之后,可以通过以下命令实现对模型指标的评估。

其中 -o Global.pretrained_model="output/SwinTransformer_base_patch4_window12_384/best_model" 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。

%cd /home/aistudio/work/PaddleClas-2.4.0
!python3 tools/eval.py \-c ppcls/configs/ImageNet/SwinTransformer/SwinTransformer_base_patch4_window12_384.yaml \-o Global.pretrained_model=output/SwinTransformer_base_patch4_window12_384/best_model# [Eval][Epoch 0][Iter: 0/10]CELoss: 0.47169, loss: 0.47169, top1: 0.68750, batch_cost: 3.13238s, reader_cost: 1.29282, ips: 5.10793 images/sec
# [Eval][Epoch 0][Avg]CELoss: 0.27567, loss: 0.27567, top1: 0.89744

四、模型预测

模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 tools/infer.py 中提供了完整的示例,只需执行下述命令即可完成模型预测:

备注:

  • 这里-o Global.pretrained_model="output/SwinTransformer_base_patch4_window12_384/best_model" 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。

  • 默认是对 /home/aistudio/work/data/test 进行预测,此处也可以通过增加字段 -o Infer.infer_imgs=xxx 对其他图片预测。

  • 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定-o Infer.PostProcess.topk=k,其中,k 为您指定的值。

修改 /home/aistudio/work/PaddleClas-2.4.0/ppcls/engine/engine.py 中的推理代码 infer(self)

    @paddle.no_grad()def infer(self):assert self.mode == "infer" and self.eval_mode == "classification"total_trainer = dist.get_world_size()local_rank = dist.get_rank()image_list = get_image_list(self.config["Infer"]["infer_imgs"])# data splitimage_list = image_list[local_rank::total_trainer]batch_size = self.config["Infer"]["batch_size"]self.model.eval()batch_data = []image_file_list = []csvfile = open("/home/aistudio/work/data/result.csv", "a", newline="")writer = csv.writer(csvfile)for idx, image_file in enumerate(image_list):with open(image_file, 'rb') as f:x = f.read()for process in self.preprocess_func:x = process(x)batch_data.append(x)image_file_list.append(image_file)if len(batch_data) >= batch_size or idx == len(image_list) - 1:batch_tensor = paddle.to_tensor(batch_data)if self.amp and self.amp_eval:with paddle.amp.auto_cast(custom_black_list={"flatten_contiguous_range", "greater_than"},level=self.amp_level):out = self.model(batch_tensor)else:out = self.model(batch_tensor)if isinstance(out, list):out = out[0]if isinstance(out, dict) and "Student" in out:out = out["Student"]if isinstance(out, dict) and "logits" in out:out = out["logits"]if isinstance(out, dict) and "output" in out:out = out["output"]result = self.postprocess_func(out, image_file_list)for res in result:file_name = res['file_name'].split('/')[-1]class_id  = res['class_ids'][0]writer.writerow([file_name, class_id])batch_data.clear()image_file_list.clear()csvfile.close()
%cd /home/aistudio/work/PaddleClas-2.4.0/
!python3 tools/infer.py \-c ppcls/configs/ImageNet/SwinTransformer/SwinTransformer_base_patch4_window12_384.yaml \-o Global.pretrained_model=output/SwinTransformer_base_patch4_window12_384/best_model

将推理保存的 /home/aistudio/work/data/result.csv 文件在比赛苹果品牌Logo识别进行提交

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

这篇关于【AI达人特训营第三期】基于PaddleClas的苹果品牌Logo识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164707

相关文章

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用