不知你们是否有过这样的烦恼,在特殊的节日,跟家人朋友游玩结束疲惫回到家后,还要自己手工从一堆拍摄的杂乱照片中分类整理出来哪些是风景照,哪些是人物合照,哪些是美食照...面对成百上千张照片,恨不得请人来专门整理。虽然部分手机拥有了智能相册分类功能,但是不免有些对照片高质量的追求者还会后期在PC端使用Adobe Photoshop对照片进行美化修整,那么面对PC端的相册整理任务,我们是不是好像又回到了问题的起点呢?
1. 环境配置
2. 数据集选取及处理
3. 模型选择及参数配置
4. 模型训练及测试
5. WatchDog文件监控
6. 智能相册本地配置使用
环境配置
环境要求:
安装过程
安装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
数据集选取及处理
我们日常拍摄照片种类众多,本项目优先选取了:动物、食物、任务、风景、文本这样一个五分类的数据,该数据完全采用公开数据,数据干净且清晰:
1. # 数据集切分: 训练:测试:验证=7:1:2
2. paddlex --split_dataset --format ImageNet --dataset_dir './dataset/' --val_value 0.2 --test_value 0.1
模型选择与参数配置
数据预处理之后,需要选择并训练网络。本项目选择的网络是ResNet50_vd,关于ResNet网络结构的代码分析,可单击链接:
save_interval:10 每隔多少个epoch保存模型
模型训练及测试
使用已经配置好的训练文件就可以执行模型的训练了,指令如下:
python3 tools/train.py \
-c ./ppcls/configs/quick_start/ResNet50_vd.yaml \
-o Arch.pretrained=True
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
WatchDog文件监控
分类模型已经训练好了,但是本地使用该模型还需要更加自动化的操作,本项目使用了一个文件监控库-WatchDog,那么WatchDog是什么呢?WatchDog用来监控指定目录/文件的变化,如添加删除文件或目录、修改文件内容、重命名文件或目录等,每种变化都会产生一个事件,且有一个特定的事件类与之对应,然后再通过事件处理类来处理对应的事件,怎么样处理事件完全可以自定义,只需继承事件处理类的基类并重写对应实例方法。
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os
folder_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 +"\\"+ filename
if filename.endswith("jpg") or filename.endswith("png"):
new_destination=folder_destination_pic + "\\"+filename
elif filename.endswith("mp3") :
new_destination=folder_destination_music + "\\" + filename
elif filename.__contains__("ziliao") :
new_destination = folder_destination_kaoyan + "\\"+filename
os.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 +"/"+ filename
if filename.endswith("jpg") or filename.endswith("png"):
#new_destination=folder_destination_picture + "/"+filename
print(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 + "/" +filename
if result=='people':
new_destination=people + "/" +filename
if result=='food':
new_destination=food + "/" +filename
if result=='scenery':
new_destination=scenery + "/" +filename
if result=='text':
new_destination=text + "/" +filename
elif filename.endswith("mp3") :
new_destination=folder_destination_music + "/" + filename
elif filename.endswith("avi") or filename.endswith("mp4"):
new_destination = folder_destination_video + "/"+filename
os.rename(src, new_destination)
心得体会
本项目使用了飞桨开源深度学习平台以及PaddleClas套件,在AI Studio上完成了数据处理、模型训练、模型评估推理等工作。PaddleClas套件让图像分类技术变得更为简单便捷,降低了开发者的上手难度。
关注公众号,获取更多技术内容~