暑假收集了口红53分类的数据集,但是由于数据量不大,效果不好……
听说PaddleClas套件有一个神奇的工具可以实现检测和识别
这就去看看,尝试一下,然后暴力解析——『抽丝剥茧』
参考文献:图像识别快速开始
项目地址:https://aistudio.baidu.com/aistudio/projectdetail/2363428
数据说明
数据来源自网络,收集人为三岁,目录结构为
rouge---------------- |----口红牌子 | |-----种类+类别 |-----Gucci | |----hh05 | |----hw03 …………………………
查看Paddle版本
import paddle print(paddle.__version__)
2.1.2
安装PaddleClas
# !git clone https://github.com/PaddlePaddle/PaddleClas.git # !git clone https://gitee.com/PaddlePaddle/PaddleClas.git # %cd ./PaddleClas/ # !pip install --upgrade pip # !pip3 install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple # %cd ./deploy
/home/aistudio/PaddleClas /home/aistudio/PaddleClas/deploy
下载通用场景检测模型和识别模型
下载的位置为:PaddleClas/deploy
# !mkdir models # %cd ./models # !wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar && tar -xf ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar # !wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar && tar -xf product_ResNet50_vd_aliproduct_v1.0_infer.tar # %cd ../ # !wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.0.tar && tar -xf recognition_demo_data_v1.0.tar
解压文件
将文件解压至PaddleClas/deploy/recognition_demo_data_v1.0/gallery_product
!unzip -d ./recognition_demo_data_v1.0/gallery_product /home/aistudio/data/data103228/rouge.zip
测试Gucci口红是否存在
对原始数据进行测试,查看对没有数据的展示效果。
这里修改了配置文件PaddleClas/deploy/configs/inference_product.yaml
中用于测试的图片路径
下面的!python python/predict_system.py -c configs/inference_product.yaml
默认为GPU模式
若是CPU需要添加-o Global.use_gpu=False
或者修改配置文件中的use_gpu
改成False
!python python/predict_system.py -c configs/inference_product.yaml
最后的结果为空
口红识别训练
数据处理
路径 \t 标签 \n
的顺序
例如:
gallery/anmuxi/001.jpg 安慕希酸奶 gallery/anmuxi/002.jpg 安慕希酸奶 gallery/anmuxi/003.jpg 安慕希酸奶 gallery/anmuxi/004.jpg 安慕希酸奶 gallery/anmuxi/005.jpg 安慕希酸奶 gallery/anmuxi/006.jpg 安慕希酸奶
每一行的文本中,第一个字段表示图像的相对路径,第二个字段表示图像对应的标签信息,中间用tab键分隔开
import os # import data_path = './recognition_demo_data_v1.0/gallery_product/rouge/' # 设置初始文件地址 character_folders = os.listdir(data_path) # 查看地址下文件夹 namelist = './recognition_demo_data_v1.0/gallery_product/rouge/name.txt' # 文件地址 lablelist = {} with open(namelist)as f: ''' 读取文件后处理成字典 ''' while True: line = f.readline().strip().split('\t') if line[0] == '': break if line[0] == '\ufeff0': lablelist[0] = line[1] else: lablelist[eval(line[0])] = line[1] print(lablelist) if(os.path.exists('./recognition_demo_data_v1.0/gallery_product/data_file_update.txt')): # 判断有误文件 os.remove('./recognition_demo_data_v1.0/gallery_product/data_file_update.txt') # 删除文件 # count = 0 train_list = [] train_count = {} for character_folder in character_folders: # 循环列表 if character_folder not in 'name.txt': new_character_folders = os.listdir(data_path+character_folder) # 生成地址 for new_character_folder in new_character_folders: photo_name = os.listdir(os.path.join(data_path,character_folder,new_character_folder)) # 获得3级目录 for photo_names in photo_name: name_path = os.path.join(character_folder,new_character_folder,photo_names) path_list ='rouge/' + name_path + '\t' + lablelist[int(new_character_folder[-2:])] + '\n' # 生成图片地址及标签 train_list.append(path_list) # 添加到列表 print(f'共有数据{len(train_list)}张') # train_ = os.listdir(os.path.join(data_path,character_folder)) # train_count[character_folder] = len(train_) print(train_list[0]) count = len(train_list) for data in train_list: with open('./recognition_demo_data_v1.0/gallery_product/data_file_update.txt', 'a')as f: f.write(data) print("数据写入完毕!")
{0: '古驰倾色柔纱润唇膏', 1: '古驰倾色丝润唇膏', 2: '古驰倾色琉光唇膏', 3: '古驰倾色华缎唇膏', 4: '古驰倾色绒雾唇膏', 5: '古驰倾色星辉唇膏', 6: '爱马仕唇妆系列缎光唇膏', 7: '阿玛尼红管臻致丝传奇绒哑光唇釉', 8: '阿玛尼红黑管哑光唇膏', 9: '阿玛尼小胖丁持色凝彩哑光染唇液', 10: '阿玛尼5G黑管', 11: '阿玛尼黑漆光迷情唇釉', 12: '迪奥烈艳蓝金唇膏', 13: 'Dior红管花芯唇膏', 14: 'Dior迪奥魅惑釉唇膏', 15: '烈艳蓝金锁色唇釉', 16: '圣罗兰纯口红', 17: '圣罗兰细管纯口红(小金条)', 18: '圣罗兰莹亮纯魅唇膏', 19: '圣罗兰细管纯口红(小黑条)', 20: '娇兰臻彩宝石唇膏', 21: '娇兰亲亲唇膏', 22: '娇兰唇蜜', 23: 'CHILI 小辣椒', 24: '魅可清新漆光唇釉', 25: '完美日记小细跟口红', 26: '完美日记唇彩', 27: '完美日记口红', 28: '兰蔻唇釉', 29: '兰蔻唇膏', 30: '娇韵诗丰盈唇膏', 31: '香奈儿可可小姐唇膏', 32: 'CL路铂廷女王权杖(萝卜丁口红)', 33: 'CL路铂廷女王权杖黑管(萝卜丁口红)', 34: '纪梵希小羊皮', 35: '纪梵希羊皮唇釉', 36: '纪梵希禁忌之吻星云唇膏', 37: '3CE细管唇膏', 38: '3CE哑光口红', 39: '3CE唇泥', 40: '3CE三熹玉云朵唇釉', 41: 'UNNY唇泥', 42: 'UNNY雾面雪雾花园唇釉', 43: '植村秀小黑方唇膏口红', 44: '植村秀无色限方管漆光唇釉口红', 45: 'TOM FORD唇膏', 46: '雅诗兰黛口红金管', 47: '橘朵哑光唇釉', 48: '橘朵小花管唇膏', 49: '稚优泉口红', 50: '稚优泉无惧幻想绒雾唇釉', 51: '稚优泉琉光之镜水光唇釉', 52: '稚优泉 绒情迷雾哑光唇釉'} 共有数据784张 rouge/Armani/cy07/12.jpg 阿玛尼红管臻致丝传奇绒哑光唇釉 数据写入完毕!
建立新的索引库
构建index索引,加速识别后的检索过程。
最终新的索引信息保存在文件夹./recognition_demo_data_v1.0/gallery_product/index_update
中。
!python python/build_gallery.py -c configs/build_product.yaml -o \ IndexProcess.data_file="./recognition_demo_data_v1.0/gallery_product/data_file_update.txt" -o \ IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update"
初步测试(训练数据测试)
这里采用了之前的训练数据进行先期测试
!python python/predict_system.py -c configs/inference_product.yaml -o \ Global.infer_imgs="./recognition_demo_data_v1.0/gallery_product/rouge/YSL/xjt17/11.jpg" -o \ IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update"
from PIL import Image Image.open('./recognition_demo_data_v1.0/gallery_product/rouge/YSL/xjt17/11.jpg')
训练数据效果查询
类别17
内容:圣罗兰细管纯口红(小金条)
外部数据测试
使用了网络图片(非数据集)进行测试
!python python/predict_system.py -c configs/inference_product.yaml -o\ Global.infer_imgs="/home/aistudio/YSL.png" -o\ IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update"
from PIL import Image Image.open('/home/aistudio/YSL.png')
测试结果1
应该没有什么大的问题(我也不知道是什么细分的但是圣罗兰没有问题)
!python python/predict_system.py -c configs/inference_product.yaml -o\ Global.infer_imgs="/home/aistudio/Dior.png" -o\ IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update"
Inference: 21.724224090576172 ms per batch image [{'bbox': [0, 0, 700, 700], 'rec_docs': '迪奥烈艳蓝金唇膏', 'rec_scores': 0.6667188405990601}]
Image.open('/home/aistudio/Dior.png')
测试结果2
Dior没有问题!在原始数据中属于第12类
基于文件夹的批量识别
!python python/predict_system.py -c configs/inference_product.yaml -o\ Global.infer_imgs="/home/aistudio/batch_map" -o\ -o\ Global.infer_imgs="/home/aistudio/batch_map" -o\ IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update"
Inference: 21.574020385742188 ms per batch image [] Inference: 19.788503646850586 ms per batch image [] Inference: 19.628524780273438 ms per batch image [{'bbox': [0, 0, 459, 603], 'rec_docs': 'TOM FORD唇膏', 'rec_scores': 0.5707532167434692}, {'bbox': [261, 228, 346, 350], 'rec_docs': '圣罗兰纯口红', 'rec_scores': 0.566393256187439}] Inference: 19.90532875061035 ms per batch image [{'bbox': [238, 150, 350, 307], 'rec_docs': '3CE哑光口红', 'rec_scores': 0.5311368703842163}] Inference: 19.890308380126953 ms per batch image [{'bbox': [0, 0, 523, 589], 'rec_docs': '圣罗兰莹亮纯魅唇膏', 'rec_scores': 0.5979276299476624}] Inference: 19.647836685180664 ms per batch image [{'bbox': [0, 0, 570, 470], 'rec_docs': 'Dior迪奥魅惑釉唇膏', 'rec_scores': 0.6497770547866821}]
批量识别结果说明
batch_map
中前面的英文为牌子,后面的数字为上面对应的类型。
经过测试:只有两支M.A.C测试失败(其中Unny是原始数据中不存在所以无法识别)
经过对原始数据的查看发现M.A.C原始数据有点小问题
建议该方向的数据精度要高效果会更加的好!
总结
通过PaddleClas
完成了少量样本的检测和识别,少样本问题是分类等的一个巨大困扰。
通过对Clas套件的使用解决了困扰。
使用中发现对数据集的精度要求较高。所以数据可以少但是精度要高!
大家好!这里是三岁!
让我们下次再见吧~~~
今天三岁口红分类的任务终于结束了!
嘤嘤嘤~~~