【小白】基于百度飞桨PaddleClas的图像识别项目-实战

本项目源自:https://aistudio.baidu.com/aistudio/projectdetail/2219455

在百度ai studio里运行的



1、确认环境:python的版本

!python3 -c "import paddle; print(paddle.__version__)"

2.1.2版本

2、解压数据集

!unzip -oq /home/aistudio/data/data101651/aoteman.zip

输出:多出来了一个文件夹aoteman,内部包含4种奥特曼数据集和一个预测demo照片

 3、查看解压的数据集文件结构

!tree

 提前命名好的训练集文件

4、安装PaddleClas和相关三方库

记得!!!!要先登录上gitee,不然安不了paddleclas

# 安装paddleclas以及相关三方包(好像studio自带的已经够用了,无需安装了)
!git clone https://gitee.com/paddlepaddle/PaddleClas.git -b release/2.2
# 我这里安装相关包时,花了30几分钟还有错误提示,不管他即可
#!pip install --upgrade -r PaddleClas/requirements.txt -i https://mirror.baidu.com/pypi/simple

 成功啦,多了PaddleClas文件夹

 

 5、检查

# 查看都安装上了没
!pip list package

 很多 OK了

6、小插曲

# 忽略(垃圾)警告信息
# 在python中运行代码经常会遇到的情况是——代码可以正常运行但是会提示警告,有时特别讨厌。
# 那么如何来控制警告输出呢?其实很简单,python通过调用warnings模块中定义的warn()函数来发出警告。我们可以通过警告过滤器进行控制是否发出警告消息。
import warnings
warnings.filterwarnings("ignore")

7、导入需要的库,以防万一


from sklearn.utils import shuffle
import os
import pandas as pd
import numpy as np
from PIL import Image
import paddle
import paddle.nn as nn
from paddle.io import Dataset
import paddle.vision.transforms as T
import paddle.nn.functional as F
from paddle.metric import Accuracy
import random

 

8、读取数据

把所有的数据集转换为txt文件

dirpath = "aoteman"
# 先得到总的txt后续再进行划分,因为要划分出验证集,所以要先打乱,因为原本是有序的
def get_all_txt():
    all_list = []
    i = 0
    for root,dirs,files in os.walk(dirpath): # 分别代表根目录、文件夹、文件
        for file in files:
            i = i + 1 
            # 文件中每行格式: 图像相对路径      图像的label_id(注意:中间有空格)。              
            #                aoteman/dijia/001.png    0
            #                aoteman/jike/001.png     1
            #                aoteman/saiwen/001.png   2
            #                aoteman/tailuo/001.png   3
            if("dijia" in root):
                all_list.append(os.path.join(root,file)+" 0\n")
            if("jieke" in root):
                all_list.append(os.path.join(root,file)+" 1\n")
            if("saiwen" in root):
                all_list.append(os.path.join(root,file)+" 2\n")
            if("tailuo" in root):
                all_list.append(os.path.join(root,file)+" 3\n")
    allstr = ''.join(all_list)
    f = open('all_list.txt','w',encoding='utf-8')
    f.write(allstr)
    return all_list , i

all_list,all_lenth = get_all_txt()
print(all_lenth-1) # 有意者是预测的图片,得减去

生成了一个文件all_list.txt,输出共550张照片

9、打乱数据

把数据打乱(2次),准备开始训练

random.shuffle(all_list)
random.shuffle(all_list)

 10、分割数据

把所有图像分成两个部分,一个是训练集,一个是验证集

# 我们总共是200+100+100+150=550张图片,按照经典的划分方式0.8:0.2
# train_list.txt(训练集,440张图)
# val_list.txt(验证集,110张图)

train_size = int(all_lenth * 0.8)
train_list = all_list[:train_size]
val_list = all_list[train_size:]

print(len(train_list))
print(len(val_list))

11、生成训练集和验证集

# 运行cell,生成txt 
train_txt = ''.join(train_list)
f_train = open('train_list.txt','w',encoding='utf-8')
f_train.write(train_txt)
f_train.close()
print("train_list.txt 生成成功!")
# 运行cell,生成txt
val_txt = ''.join(val_list)
f_val = open('val_list.txt','w',encoding='utf-8')
f_val.write(val_txt)
f_val.close()
print("val_list.txt 生成成功!")

 生成俩文件

 12、把图片移到PaddleClas下面,方便

# 将图片移动到paddleclas下面的数据集里面
# 至于为什么现在移动,也是我的一点小技巧,防止之前移动的话,生成的txt的路径是全路径,反而需要去掉路径的一部分
!mv aoteman/ PaddleClas/dataset/
!mv all_list.txt PaddleClas/dataset/aoteman
!mv train_list.txt PaddleClas/dataset/aoteman
!mv val_list.txt PaddleClas/dataset/aoteman

 移动前:

移动后:

 

移动后:

 

13、进入PaddleClas里准备训练

官方说,要训练,得先改配置模型

先找到yaml这个文件,根据我们项目改参数!

路径:PaddleClas/ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml

(主要是以下几点:分类数、图片总量、训练和验证的路径、图像尺寸、数据预处理、训练和预测的num_workers: 0才可以在aistudio跑通。)

直接替换下面的即可:

# global configs
Global:
  checkpoints: null
  pretrained_model: null
  device: gpu
  output_dir: ./output/
  save_interval: 20
  eval_during_train: True
  eval_interval: 10
  epochs: 600
  print_batch_step: 10
  use_visualdl: True
  # used for static mode and model export
  image_shape: [3, 224, 224]
  save_inference_dir: ./inference

# model architecture
Arch:
  name: ShuffleNetV2_x0_25
  class_num: 4
 
# loss function config for traing/eval process
Loss:
  Train:
    - CELoss:
        weight: 1.0
  Eval:
    - CELoss:
        weight: 1.0


Optimizer:
  name: Momentum
  momentum: 0.9
  lr:
    name: Cosine
    learning_rate: 0.0125
    warmup_epoch: 5
  regularizer:
    name: 'L2'
    coeff: 0.00001


# data loader for train and eval
DataLoader:
  Train:
    dataset:
      name: ImageNetDataset
      image_root: ./dataset/
      cls_label_path: ./dataset/aoteman/train_list.txt
      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - ResizeImage:
            resize_short: 256
        - CropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''

    sampler:
      name: DistributedBatchSampler
      batch_size: 16
      drop_last: False
      shuffle: True
    loader:
      num_workers: 0
      use_shared_memory: True

  Eval:
    dataset: 
      name: ImageNetDataset
      image_root: ./dataset/
      cls_label_path: ./dataset/aoteman/val_list.txt
      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - ResizeImage:
            resize_short: 256
        - CropImage:
            size: 224
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
    sampler:
      name: DistributedBatchSampler
      batch_size: 64
      drop_last: False
      shuffle: False
    loader:
      num_workers: 0
      use_shared_memory: True

Infer:
  infer_imgs: dataset/aoteman/predict_demo.jpg
  batch_size: 10
  transforms:
    - DecodeImage:
        to_rgb: True
        channel_first: False
    - ResizeImage:
        resize_short: 256
    - CropImage:
        size: 224
    - NormalizeImage:
        scale: 1.0/255.0
        mean: [0.485, 0.456, 0.406]
        std: [0.229, 0.224, 0.225]
        order: ''
    - ToCHWImage:
  PostProcess:
    name: Topk
    topk: 4
    class_id_map_file: ppcls/configs/quick_start/new_user/aoteman_label_list.txt

Metric:
  Train:
    - TopkAcc:
        topk: [1, 4]
  Eval:
    - TopkAcc:
        topk: [1, 4]

14、添加类别映射文件 

在这个文件夹下面新建一个文件:

ppcls/configs/quick_start/new_user

新建aoteman_label_list.txt文件

主要是把类别对照起来,后续好认

文件代码: 

0 迪迦奥特曼  
1 杰克奥特曼  
2 赛文奥特曼  
3 泰罗奥特曼

15、开始训练

先设置设备

!export CUDA_VISIBLE_DEVICES=0
# 开始训练 
!python tools/train.py \
    -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml

 然后就会自动生成模型文件,保存在这个,生成俩文件夹

等着训练吧(*^_^*)

这个vdl是可视化文件,我的打不开

我也懒得再换啦

 

ok了 600次都训练完成了 

16、验证模型

predict_demo.jpg  这个就是用来预测照片的哈

!python3 tools/infer.py \
    -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml \
    -o Infer.infer_imgs=dataset/aoteman/predict_demo.jpg \
    -o Global.pretrained_model=output/ShuffleNetV2_x0_25/best_model

结果出来了:

真实照片

结果 :

[{'class_ids': [0, 1, 2, 3], 'scores': [1.0, 0.0, 0.0, 0.0], 'file_name': 'dataset/aoteman/predict_demo.jpg', 'label_names': ['迪迦奥特曼  ', '杰克奥特曼  ', '赛文奥特曼  ', '泰罗奥特曼']}]

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python图像识别实战项目包括基于OpenCV的各种应用。这些项目通过Python代码实现,并提供了文字讲解和源代码,方便小伙伴们学习和入门。其中,主要涉及以下几部分: 1. OpenCV基本函数介绍:该部分介绍了OpenCV中自带的基本函数,帮助小伙伴们熟悉OpenCV的常用功能。 2. 实际项目中的对象检测:这部分项目利用OpenCV实现特定对象的检测,例如车道线检测、路面坑洼检测等。通过这些项目,可以更好地理解计算机视觉在日常生活中的应用。 3. 图像增强项目:这部分项目利用OpenCV实现图像增强技术,例如消除运动引起的图像模糊等。通过这些项目,可以学习如何利用OpenCV提升图像质量。 4. 结合深度学习的图像处理项目:这部分项目较为复杂,涉及到OpenCV与深度学习等其他技术的结合,包括图像分割、人脸检测、运动检测等。这些项目挑战较大,但也有很高的学习价值。 最近,小白学视觉公众号推出了一本集成了31篇经典项目的手册,方便小伙伴们在日常学习中使用。这本手册涵盖了各个方面的Python图像识别实战项目,对于想要学习和实践图像识别的小伙伴们来说是一份很好的学习资料。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [31个Python实战项目带你学会图像处理](https://blog.csdn.net/qq_42722197/article/details/109085533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值