文章目录
本文记录一下,使用FSDet进行小样本目标检测的一个实践过程(以铝材瑕疵数据为例)。
数据准备
数据来源
使用的数据集为 [飞粤云端2018]广东工业智造大数据创新大赛—智能算法赛 的数据,百度云链接: https://pan.baidu.com/s/1sncD_D12PkR4D8huei3d6Q 提取码: egwc
使用的数据为赛制第二阶段的数据,数据格式为:
在每个类别中随机挑选了15张-20张图片组成小样本数据集。
数据预处理
- 将文件中的中文改为英文
# -*- coding=utf-8-*-
"""
@Time : 22-7-12下午4:49
@Author : MaQian
@language : Python2.7
"""
import os
import numpy as np
import codecs
import json
from glob import glob
import cv2
import shutil
from xml.dom import minidom
import xml.etree.cElementTree as ET
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
# 将中文名字改为英文名 瑕疵名字用拼音代替
def change_cn2en():
cn2en_names = {
'不导电': 'BuDaoDian', '喷流': 'PenLiu', '擦花': 'CaHua', '杂色': 'ZaSe',
'桔皮': 'JuPi', '漆泡': 'QiPao', '漏底': 'LouDi', '脏点': 'ZangDian',
'角位漏底': 'JiaoWeiLouDi', '起坑': 'QiKeng', '正常': 'ZhengChang'}
path = './few-shot-lvcai-data'
imgdir = os.listdir(path)
for id in imgdir:
file_path = os.path.join(path, id)
# print id.decode(encoding='utf-8')
# print(file_path)
file_names = os.listdir(file_path)
for file_name in file_names:
# print(file_name)
name = file_name.strip().split('.')[0]
type = file_name.strip().split('.')[1]
xiaciname = name[0:name.index('2018')]
if xiaciname.__contains__(','):
xcnames = xiaciname.strip().split(',')
for xcn in xcnames:
name = name.replace(xcn, cn2en_names[xcn])
name = name.replace(',', "And")
else:
name = name.replace(xiaciname, cn2en_names[xiaciname])
name = name[0:name.index('对照')]
name = name + '.' + type
# print(name)
# os.rename(file_name, name)
os.rename(os.path.join(file_path, file_name), os.path.join(file_path, name))
# 将文件夹也改为英文
def change_cn2en2():
cn2en_names = {
'不导电': 'BuDaoDian', '喷流': 'PenLiu', '擦花': 'CaHua', '杂色': 'ZaSe',
'桔皮': 'JuPi', '漆泡': 'QiPao', '漏底': 'LouDi', '脏点': 'ZangDian',
'角位漏底': 'JiaoWeiLouDi', '起坑': 'QiKeng', '正常': 'ZhengChang'}
path = './few-shot-lvcai-data'
imgdir = os.listdir(path)
for id in imgdir:
if len(id) < 5:
# print(id, cn2en_names[id])
os.rename(os.path.join(path, id), os.path.join(path, cn2en_names[id]))
- 将json文件转换为xml文件
# 将数据集转换为VOC格式
# 处理json文件,生成xml文件
def handel_json2xml():
label_warp = {
'不导电': 'BuDaoDian',
'喷流': 'PenLiu',
'擦花': 'CaHua',
'杂色': 'ZaSe',
'桔皮': 'JuPi',
'漆泡': 'QiPao',
'漏底': 'LouDi',
'脏点': 'ZangDian',
'角位漏底': 'JiaoWeiLouDi',
'起坑': 'QiKeng'}
# 保存路径
saved_path = "./VOC2007/"
# 创建要求文件夹
if not os.path.exists(saved_path + "Annotations"):
os.makedirs(saved_path + "Annotations")
if not os.path.exists(saved_path + "JPEGImages/"):
os.makedirs(saved_path + "JPEGImages/")
if not os.path.exists(saved_path + "ImageSets/Main/"):
os.makedirs(saved_path + "ImageSets/Main/")
src_path = './few-shot-lvcai-data'
src_filepath = os.listdir(src_path)
json_paths = [