热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

强迫症狂喜!PC端相册还能智能分类!

项目简介不知你们是否有过这样的烦恼,在特殊的节日,跟家人朋友游玩结束疲惫回到家后,还要自己手工从一堆拍摄的杂乱照片中分类整理出来哪些是风景

931006c72f9337215524d23526ab8a59.png

项目简介

不知你们是否有过这样的烦恼,在特殊的节日,跟家人朋友游玩结束疲惫回到家后,还要自己手工从一堆拍摄的杂乱照片中分类整理出来哪些是风景照,哪些是人物合照,哪些是美食照...面对成百上千张照片,恨不得请人来专门整理。虽然部分手机拥有了智能相册分类功能,但是不免有些对照片高质量的追求者还会后期在PC端使用Adobe Photoshop对照片进行美化修整,那么面对PC端的相册整理任务,我们是不是好像又回到了问题的起点呢?

66e5e001138d4fb15beeca612d10e177.png

苹果手机简单的相册分类功能(非AI)

本项目基于飞桨图像分类套件PaddleClas提出了利用图像分类技术训练常见照片图像分类模型解决PC端照片智能分类问题。PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,助力使用者训练出更好的视觉模型,从而应用落地。

ab4352f7aae3bfac288fe7bfc2c1f7b0.png

项目中利用图像模型智能分类流程

本项目采用PaddleClas提供的ResNet50_vd模型。在AI Studio上,使用小数据量快速实现模型的训练学习,后期经过测试,模型在测试集上准确率高达96.5%,在少量新数据图片情况下测试也可以正确分类。接下来将对项目进行详细介绍:

1.  环境配置

2.  数据集选取及处理

3.  模型选择及参数配置

4.  模型训练及测试

5.  WatchDog文件监控

6.  智能相册本地配置使用

环境配置

环境要求:

Python3

CUDA == 10.1

cuDNN ==7.6.5

PaddlePaddle v2.0或更高版本

PaddleX == 2.0.0

安装过程

安装PaddleClas套件:

1.    # 下载PaddleClas套件源码

2.    git clone https://gitee.com/paddlepaddle/PaddleClas.git -b develop

安装套件依赖库:

1.    cd PaddleClas
2.    pip install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple
3.    pip install paddlex -q


数据集选取及处理

我们日常拍摄照片种类众多,本项目优先选取了:动物、食物、任务、风景、文本这样一个五分类的数据,该数据完全采用公开数据,数据干净且清晰:

7c0fe40c5bd84325dd2b26003714b0bd.png

部分食物分类数据集展示

由于公开的原始数据集的庞大不利于我们缩短训练时长,快速开发模型,所以整个项目选取了每个类别的部分数据进行使用,并对选取的数据进行了统计,统计结果如下表:

6cb880c475e16fd19ac05724f088389a.png

原始公开数据集:

风景数据集:https://github.com/yuweiming70/Landscape-Dataset

食物数据集:https://www.datafountain.cn/datasets/5423

人物数据集:http://www.seeprettyface.com/mydataset_page2.html

文本数据集:https://challenge.xfyun.cn/topic/info?type=ad-2021&ch=dc-wbzmt-05

动物数据集:https://blog.csdn.net/sunshine__sun/article/details/115558151

整理后的数据集:

https://aistudio.baidu.com/aistudio/datasetdetail/110303

选取完数据集以后我们就要对数据集进行处理了,解压数据集到工作文件夹然后利用PaddleX小工具对数据集进行划分:

eff4a4df5afdcab99f329eccb79b1596.png

数据集划分【前】的文件结构

1.    # 数据集切分: 训练:测试:验证=7:1:2
2.    paddlex --split_dataset --format ImageNet --dataset_dir './dataset/' --val_value 0.2 --test_value 0.1

5c2bd0431a3f0c95b9433249fcd663dd.png

数据集划分【后】的文件结构

Tips:可以看到,在这里我们使用了PaddleX的一个小工具对数据集进行了划分。PaddleX是飞桨全流程开发工具。有了它,我们划分数据集开始变得更加简单快速!当然,如果你不满足使用它,也可以去参考写一个划分数据集的代码。

模型选择与参数配置

数据预处理之后,需要选择并训练网络。本项目选择的网络是ResNet50_vd,关于ResNet网络结构的代码分析,可单击链接:

https://aistudio.baidu.com/aistudio/projectdetail/438756

在 PaddleClas/ppcls/configs/quick_start/ResNet50_vd.yaml中的修改必要参数:

  • save_interval:10  每隔多少个epoch保存模型

  • validate:True  是否在训练时评估

  • valid_interval:10    每隔多少个epoch进行模型评估

  • epochs:50  训练总epoch数

  • classes_num:5  分类数

  • image_shape:[3, 224, 224]  图片大小

Train:

  • image_root: ./dataset/   数据集文件

  • cls_label_path: ./dataset/train_list.txt  数据集标签文件

Eval:

  • image_root: ./dataset/   数据集文件

  • cls_label_path: ./dataset/val_list.txt  数据集标签文件

Tips:关于学习率的设置问题,大部分的神经网络选择的初始学习率为0.1,batch_size是256,根据实际的模型大小和显存情况,可以将学习率设置为0.1×k,batch_size设置为256×k。

修改好配置文件,我们再把labels.txt文件做一个映射修改就可以训练了:

ff72fd51646ecd0f6faf71fb1f72edc4.png

类别标签映射(1映射改成2)

当然,如果你想要让你的模型更加优秀,性能更加出众的话,你可以在PaddleClas技术文档找到更多的训练技巧和参数设置可以关注PaddleClas技术文档,其对相关参数进行了详细的解释说明:

https://paddleclas.readthedocs.io/zh_CN/latest/models/Tricks.html

模型训练及测试

使用已经配置好的训练文件就可以执行模型的训练了,指令如下:

python3 tools/train.py \-c ./ppcls/configs/quick_start/ResNet50_vd.yaml \-o Arch.pretrained=True

188df03ba86bc66cc77027d7cc42a0dd.png

每个epochs训练完成后,保存评估的最好模型

本次项目中设置的是阶段性模型评估,同时保存评估结果最好的模型,参数在下述目录:PaddleClas/output/ResNet50_vd/best_model。best_model文件夹下包含ppcls.pdmodel、ppcls.pdopt、ppcls.pdparams三个文件用来进行后续的评估测试推理使用。

在训练完成后,使用训练评估保存的最好模型去预测一张随机找到的食物照片看一下测试结果:

python tools/infer.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml \-o Infer.infer_imgs=./demo/food/1043283.jpg \-o Global.pretrained_model=./output/ResNet50_vd/latest/latest

9d2b4ae19286ea62841e06edec3a98de.png

推理图片及结果

WatchDog文件监控

分类模型已经训练好了,但是本地使用该模型还需要更加自动化的操作,本项目使用了一个文件监控库-WatchDog,那么WatchDog是什么呢?WatchDog用来监控指定目录/文件的变化,如添加删除文件或目录、修改文件内容、重命名文件或目录等,每种变化都会产生一个事件,且有一个特定的事件类与之对应,然后再通过事件处理类来处理对应的事件,怎么样处理事件完全可以自定义,只需继承事件处理类的基类并重写对应实例方法。

上面这段文字你可能有些迷茫,还是不知道WatchDog是干什么的,那么形象举个例子来说,我们把文件监控看作是两个部分,一个叫做Listener(松鼠)和Handler(老虎),当Listener(松鼠)站在书上看着远处,如果来了一个事件(狮子)到来,那么Listener告诉Handler(老虎)让它去执行准备战斗的操作,如果看到了另外一个事件(人)到来,Listener(松鼠)会告诉Handler(老虎)让它执行逃跑操作。

4575384414e61b0fe253954fc7d8c6de.png

形象化的WatchDog理论讲解(比喻)

如上描述,我们把一个文件夹使用WatchDog做成一个Listener,然后当Listener监控到有照片文件放进来就会触发Paddle模型去预测照片种类,并将该照片移动到相应的相册分类文件夹中。

如果你对WatchDog感兴趣可以运行下以下Demo程序:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import osfolder_to_track = "python\\movingFiles\\src"
folder_destination_pic = "python\\movingFiles\\des\\pic"
folder_destination_music = "python\\movingFiles\\des\\music"
folder_destination_kaoyan = "python\\movingFiles\\des\\kaoyan"class MyHandler(FileSystemEventHandler):def on_any_event(self, event):for filename in os.listdir(folder_to_track) :src = folder_to_track +"\\"+ filenameif filename.endswith("jpg") or filename.endswith("png"):new_destination=folder_destination_pic + "\\"+filenameelif filename.endswith("mp3") :new_destination=folder_destination_music + "\\" + filenameelif filename.__contains__("ziliao") :new_destination = folder_destination_kaoyan + "\\"+filenameos.rename(src, new_destination)event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, folder_to_track, recursive=True)
observer.start()
try:while True:time.sleep(10)
except KeyboardInterrupt:observer.stop()observer.join()

智能相册本地配置使用

借助之前完成的模型开发和WatchDog监控,项目就可以部署在本地使用了。在这里我们需要完成之前的核心文件监控代码:

class MyHandler(FileSystemEventHandler):def on_any_event(self, event):for filename in os.listdir(folder_to_track) :src = folder_to_track +"/"+ filenameif filename.endswith("jpg") or filename.endswith("png"):#new_destination=folder_destination_picture + "/"+filenameprint(filename)os.system(r"python PaddleClas/tools/infer.py -c ./PaddleClas/ppcls/configs/quick_start/ResNet50_vd.yaml -o Infer.infer_imgs=./src/"+str(filename)+" -o Global.pretrained_model=./PaddleClas/output/ResNet50_vd/latest/latest > ./result.txt")with open('result.txt', 'r', encoding='utf-8') as f:  # 打开文件lines = f.readlines()  # 读取所有行last_line = lines[-1]  # 取最后一行#print(eval(last_line))result = eval(last_line)[0]['label_names'][0]#print(type(eval(last_line)))if result=='animals':new_destination=animals + "/" +filenameif result=='people':new_destination=people + "/" +filenameif result=='food':new_destination=food + "/" +filenameif result=='scenery':new_destination=scenery + "/" +filenameif result=='text':new_destination=text + "/" +filenameelif filename.endswith("mp3") :new_destination=folder_destination_music + "/" + filenameelif filename.endswith("avi") or filename.endswith("mp4"):new_destination = folder_destination_video + "/"+filenameos.rename(src, new_destination)

可以部署本地使用的整体项目目录结构:

7f04d3c4f79b505bcac828917fcd1827.png

项目代码结构

心得体会

本项目使用了飞桨开源深度学习平台以及PaddleClas套件,在AI Studio上完成了数据处理、模型训练、模型评估推理等工作。PaddleClas套件让图像分类技术变得更为简单便捷,降低了开发者的上手难度。

项目开源地址:https://aistudio.baidu.com/aistudio/projectdetail/2408523

38072d2c65c30e1f2264e11a20085416.gif

关注公众号,获取更多技术内容~


推荐阅读
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了在Windows系统下安装Python、setuptools、pip和virtualenv的步骤,以及安装过程中需要注意的事项。详细介绍了Python2.7.4和Python3.3.2的安装路径,以及如何使用easy_install安装setuptools。同时提醒用户在安装完setuptools后,需要继续安装pip,并注意不要将Python的目录添加到系统的环境变量中。最后,还介绍了通过下载ez_setup.py来安装setuptools的方法。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
author-avatar
zhuzhuxiaozhuzhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有