类孪生神经网络用于无需重新训练的猫咪相似度分类,未来他将包含后端、嵌入小程序以及完全的开源
主要的:
- PyTorch 1.8.0
- Torchvision 0.9.0
- Matplotlib
- OpenCV
其中pytorch我认为应当>=1.6但并不保证
更新追加: 在添加DCN可变形卷积时,其中实现的第一个版本(v1)使用的Torchvision的api,所以请确保自己的版本有对应函数
如果没有,可以选择切换成(v2)版本,后者来自第三方PyTorch框架实现,对两者进行的封装大体对外一致,理应没有问题
- 下载我们的数据集? 百度云提取码为:data
如何制作自己的数据集? 在下面!
下载的数据集在项目下直接解压
与models文件夹同级即可
├─markup_XML
├─models
├─original_image
...
-
进入data_generation.py文件 选择是否更改路径、更改生成数量!直接运行
-
- 运行后应当会生成标签对应txt(label.txt)、训练文件txt(train.txt)、以及生成的图像(存放在文件夹)
-
- 更新追加:现在data_generation允许选择模式,区分bitwise与seamlessClone,现在默认是后者
-
运行train.py
因为在Win环境下,所以参数是写在py文件内,未来会修改 -
- 运行保存的模型会在文件夹(默认ckpt下)如果这个文件夹出现了,说明已经有模型了,开始下一步
-
- 更新追加:无论是data_generation、train、pred都已支持命令行参数,这个我们稍后再谈!
-
运行pred.py 同样的,选择修改里面的路径和模型
-
- 随后会展示cam图和打印预测结果,开启参数选项允许cam图保存在文件夹(默认不会保存和创建pred_grad_cam文件夹)
- 如果你的数据集非常健壮而无需使用data_generation.py文件,那么跳过生成数据!向下一个分割线前进
- data_generation.py 允许将核心图像在保持精度的同时任意旋转并恰到好处的潜入背景图像中生成崭新的数据集,仅此而已
-
- 查看我们的数据集可以发现,它非常的差劲,参差不齐的同时数量稀少、并且干扰众多---因为猫咪(校园流浪猫)是神秘且稀有的!😀
- 需要标注数据集!并将其中猫咪的部分标注出来
- 根据数据集的情况选择适合的核心图像占比(核心图像缩放的大小)
详细的说:
1. 猫咪图像的标注可以是同一个类别,也可以是多个类别,这不会影响
2. 猫咪标注时尽量不要占据整个图像的宽,即不要左右不留任何余地,如果无可避免,微微留下哪怕1像素
3. 一张猫咪图像中有多只猫咪?或者仅仅只想要其中一只作为主角---你必须将他们全部标注出来,并给与多余猫咪一个单独类别
e.g: 主角为“cat”类别, 其余猫咪为“othercat”类别,那么在使用data_generation时允许设置黑名单将“othercat”类别过滤
注意!:如果你不标注多余的猫咪,将会导致这只猫咪作为背景存在,从而影响所有训练集
4. 背景图来源于去除猫咪后的图像---通过将标注的猫咪取出后,空缺图像的左右像素进行填充和高斯模糊,这也是为啥会有2要求的存在
5. size_dict也就是用于控制图像缩放大小的字典,他的本质是概率选择、size_dict的所有value之和必须为1,其key的缩放规则为等比缩放
e.g: size_dict = {
310: 0.15,
360: 0.2,
410: 0.3,
460: 0.2,
510: 0.15
}
这意味着有15%的概率选择图像合理缩放到510的大小---即最大边缩放到510,最小边等比缩放到一定比例从而保证图像不会失真
6. 最后也是最重要的一点:格式
├─markup_XML (存放所有类别所有图像的标注信息xml文件)
├─original_image (类别文件的更目录)
│ ├─丫头(class_name)(此处是我们流浪猫的名字也支持其他)
│ ├─ ├─img1.jpg (在项目文件夹中的图像,名字随意)
│ ├─ ├─img2.jpg
│ ├─ ├─...
│ ├─兔兔
│ ├─冒号
│ ├─小咪
│ ├─小美
│ ├─.....
相当于普通分类任务的格式,只不过需要额外的标注
- 对于生成完数据的人,现在你已经有个一个标准的分类任务数据集、标签对应txt、训练txt
- 对于无动于衷来此的人,你们需要为你们的数据集提供一些说明
1. 标签对应txt---将classname与label对应
e.g: label.txt
格式为 标签名 类别
其中:
丫头 0
兔兔 1
冒号 2
... ...
2. 训练txt
e.g: train.txt
格式为: 图片地址 对应类别
其中:
train\冒号\0.jpg 0
train\冒号\1.jpg 0
... ...
如果训练txt正确的话,那么对图像文件存放格式没有要求
你可以在data_generation.py中找到生成label.txt的函数,但训练txt也许需要你脚本实现
- 使用的数据读取并非是torch的DataLoader而是一个我额外的渐进式通用数据读取器项目
他类似DataLoader但可以在内存不足的情况下起到很好的作用,你可以用DataLoader取代他,因为train代码量很少 - 我使用了混合精度以提高速度和批大小,PyTorch做的很好,你可以手动改变他,很少的代码
- 模型上我使用了独立于torchvision的ResNet系列模型,他与torchvision分离并添加了BAM、CBAM等注意力机制,允许在加载模型参数时不严格
- 更新注意:最新的模型额外添加了一层DCN可变形卷积
- 注意!我使用的BAM、CBAM等注意力机制来源于这个项目库的独立
暂时想到这么多更新了!- 更新注意:最新的train文件增添了单机多卡训练(DP)并未实现DDP的原因是我们测试DP运行良好且显存分配均匀代码简单
- 现在处在train同级的py文件(包括train)都允许接收来自命令行的参数,方便的同时代价是安全上的隐患
详细的说:
他们共同引用了util文件夹下的args库,这个库允许获取命令行参数,并在调用对应函数后返回一个字节码对象
随后使用的exec将会运行所有命令行参数,举个例子 python train.py test=1 test2=2这就是他的用法
test=1和test2=2将会被执行,无此变量将会被创建,有此变量且在exec之前的将会被替换
所以你可以快捷的使用文件中的某些变量来更改他们而无需打开文件
但代价是:exec并不安全,我可以构建恶意的参数从而利用python的权限,所以如果你无法保证运行环境的安全或者无需使用它
可以在对应文件中进行注释,exec(args.get_args_compile)这句一般出现在所有参数定义结束后
- 预测是扫描根目录下所有的类别,并预测每个类别的图,他读取的格式如同一般的分类任务,如果你有需求同样修改他
- 预测由于使用了PyTorch的hook,所以对版本有一定要求,并且使用grad_cam(添加了额外平滑),所以在预测时无法使用torch.no_gard函数,使用会导致错误
- 注意!我使用的神经网络可视化来源于这个项目库的独立,我将其拉取了出来以无需安装
- 新增的此py文件是为了方便调试使用的,它的作用是在pred的基础上对所有模型进行预测
- 我将其多此一举的分离出来的目的是,未来这个文件可能并不需要,所以!Future warning
让我们为了更美好的未来而战!---无论是流浪猫还是人