对布匹的疵点数据集进行分析
1. 课题介绍
布匹疵点检验是纺织行业生产和质量管理的重要环节,目前的人工检验速度慢、劳动强度大,受主观因素影响,缺乏一致性。2016年我国布匹产量超过700亿米,且产量一直处于上升趋势,如果能够将人工智能和计算机视觉技术应用于纺织行业,对纺织行业的价值无疑会是巨大的。 通过探索布样疵点精确智能诊断的优秀算法,提升布样疵点检验的准确度,降低对大量人工的依赖,提升布样疵点质检的效果和效率。
本次课程设计的Demo主要工作是通过对布样图像数据集的处理,对布样中疵点形态、长度、面积以及所处位置进行分析 。
2. 课题要求
数据集涵盖了纺织业中素色布的各类重要瑕疵。数据共包括2部分:原始图片和瑕疵的标注数据。具体要求如下 :
- 数据集提供用于训练的图像数据和标注数据,文件夹结构:
- 正常
- 薄段
- 笔印
- …
- 织稀
- 正常: 存放无瑕疵的图像数据,jpeg编码图像文件。图像文件名如:XXX.jpg
- 薄段、笔印、…、织稀: 按瑕疵类别分别存放瑕疵原始图片和用矩形框进行瑕疵标注的位置数据。
- 图像文件jpeg编码。标注文件采用xml格式,其中filename字段是图像的文件名,name字段是瑕疵的类别,bndbox记录了矩形框左上角和右下角的位置。图像左上角为(0,0)点,向右x值增加,向下y值增加。
- 其中defect_code和瑕疵的对应关系:
norm | defect_1 | defect_2 | defect_3 | defect_4 | defect_5 | defect_6 | defect_7 | defect_8 | defect_9 | defect_10 |
---|---|---|---|---|---|---|---|---|---|---|
正常 | 扎洞 | 毛斑 | 擦洞 | 毛洞 | 织稀 | 吊经 | 缺经 | 跳花 | 油/污渍 | 其他 |
注:“其他”代表剩余所有类型的瑕疵。
3. 代码分析
-
导入程序所需包
import pandas as pd import numpy as np from matplotlib import pyplot as plt from matplotlib import rc as matplotlib_rc from code.main.flaw import Flaw
其中os是python的标准库,pandas、numpy、matplotlib是外部引入的第三方库,flaw是此课题中对原始数据提取有关信息的部分。
-
通过main函数对各个分析函数进行调用。因为正常数据非常多,如果把正常布匹数据也进行分析的话,会导致绘图非常不均匀,呈现两极化现象,从而看不出效果,故在处理数据时需要删除正常数据。
if __name__ == '__main__': # 获取所有瑕疵类 flaws = get_all_flaw("../../data/train/") # 获取所有所有种类名称并去重 type_names = list(set([flaw.type for flaw in flaws])) # 所有种类的数量 type_num = [0] * len(type_names) # 删除无瑕疵数据 index = type_names.index("正常") del type_names[index] del type_num[index] # 获取所有瑕疵种类的大小 type_size = get_all_type_size(flaws, type_names, type_num) df = pd.DataFrame([type_names, type_num, [size[0] for size in type_size], [size[1] for size in type_size], [size[2] for size in type_size]], index=["类型", "数量", "最小瑕疵", "平均瑕疵", "最大瑕疵"]) df_sorted = df.T.sort_values(by="数量", ascending=False) print(df_sorted) draw_type_num(df_sorted[0:]['类型'], df_sorted[0:]['数量'], save_path="./") draw_type_size(df_sorted[0:]['类型'], df_sorted[0:]['平均瑕疵'], df_sorted[0:]['最小瑕疵'], df_sorted[0:]['最大瑕疵'], save_path="./") draw_flaw_pos(flaws, save_path="./")
-
统计瑕疵数量函数
def draw_type_num(type_names, type_num, save_path)
:根据type_names和type_num绘制柱状图,如果传入save_path,则保存图片。其中type_names作为x轴,type_num作为y轴,save_path是保存的路径。def draw_type_num(type_names, type_num, save_path=None): # 设置图片大小 plt.figure(figsize=(10, 8)) plt.bar(type_names, type_num) plt.grid(alpha=0.4, linestyle=':') plt.xticks(rotation=90) # 设置xy标签和图标题 plt.xlabel("瑕疵类型") plt.ylabel("样本数量") plt.title("瑕疵类型-样本数量") # 保存图片 if save_path: plt.savefig(save_path + "瑕疵类型-样本数量.svg") plt.show()
-
统计瑕疵大小函数
draw_type_size(type_names, type_size_avg, type_size_min,type_size_max, save_path)
: 根据 type_names 和type_num 两个参数绘制柱状图,如果传入了save_path,则保存图片。其中type_size_avg 表示平均瑕疵值,type_size_max 表示最大瑕疵值,type_size_min 表示最小瑕疵值, type_names 作为x轴, save_path是分析图像将其保存的路径。def draw_type_size(type_names, type_size_avg, type_size_min, type_size_max, save_path=None): # 设置图片大小 plt.figure(figsize=(10, 8)) plt.bar(type_names, type_size_max, label="最大瑕疵") plt.bar(type_names, type_size_avg, label="平均瑕疵") plt.bar(type_names, type_size_min, label="最小瑕疵") plt.grid(alpha=0.4, linestyle=':') plt.xticks(rotation=90) plt.legend(loc="upper left") # 设置xy标签和图标题 plt.xlabel("瑕疵类型") plt.ylabel("瑕疵大小") plt.title("