Caffe时间(4) 实践FCN-AlexNet(二)

自制训练集训练FCN(对上一篇Caffe时间的补充)

上次由于测试数据不足导致最后的model的训练效果并不是特别好,这里需要扩充训练集,但是看了一圈也没有太好的方法来实现自动抠图,于是自己动手丰衣足食,不就是1.5K张图吗(实际上笔者抠这些图用了4天,有三天是抠图8个小时以上,还有一天由于是周末就没都用来抠图,一把辛酸泪)。

跟之前那个博客中实践的内容相比,这里我们只是将训练集换成了自己制作的数据集,其中原始图片来自于imagenet,至于groundtruth图没有提供所以只能自己像上面一样手动抠图。

借助的工具就是Photoshop了,方法如下,但是PS处理后有问题,下面我们再讲

1、首先导入图片

2、使用快速选择工具(按w键进行切换),对主体进行选择,按直接拖动即可进行选择,通过按住alt同时拖动可以进行减操作(因为有的时候快速选择工具会包含不需要的区域,需要这一步去除多余部分)

3、点击菜单栏 图像-模式-灰度

将图转为灰度图

4、ctrl + j 复制一层

5、然后按shift+f5将主体(即新产生的图层1)涂成白色

6、再选择另外一个图层(即背景图层),同样按住shfit+f5将背景图层涂成黑色

7、最后另存外PNG文件,文件名和原来保持一致,扩展名变为png

将任意一张处理后生成的图片导入matlab可以看到,在一些不规则的边缘像素的数值不是二值的除了我们期望的0和255还有其它值

当然发现这个也都是后话,是在训练过程中报错才发现的,报错的提示是:Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR ,而且在往上查看别的网友用ps处理之后也出现了这样的问题。

于是这里我们还是选择使用matlab来对这些抠出来的groundtruth图像进行二值化的处理
下面附上matlab代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%请大家根据自己的路径进行相应地修改
file_path = 'C:\Users\tx\Desktop\NewSet\train\cls\';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.png'));%获取该文件夹中所有png格式的图像
img_num = length(img_path_list);%获取图像总数量

outputfile = 'C:\Users\tx\Desktop\NewSet\train\cls\out\';%输出图像的路径

if img_num > 0 %有满足条件的图像
for j = 1:img_num %逐一读取图像
image_name = img_path_list(j).name;% 图像名
image = imread(strcat(file_path,image_name));
fprintf('%d %s\n',j,strcat(file_path,image_name));% 显示正在处理的图像名
%图像处理过程 省略
%level=graythresh(image);
bw2=im2bw(image);%让输出的图像的值只有0和1,之前用的0和255效果非常不好

imwrite(bw2,strcat(outputfile,image_name));

end
end

再导入matlab验证可以看到值只有0和255,。但是当这个groundtruth改好之后,重新运行又出现了新问题,报出如下错误,大概就是传进来的数组没有这么多维

在出现问题的那句之前添加了 print(in_.shape) 查看维数出了什么问题

输出如下

可以看到有的图片的维度是不对的,但是1.5k张照片怎么去找呢。。

于是有了老于的写的下面的检测代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding: utf-8 -*-

import numpy as np
from PIL import Image
import os

IMAGE_PATH = '/Users/nil/Pictures/Wallpapers' #这里改成自己需要检测的图片的路径

files = os.listdir(IMAGE_PATH)
for file in files:

if file.endswith('png') or file.endswith('jpg'): #这里改成你需要检测的扩展名
file = os.path.join(IMAGE_PATH, file)

img = Image.open(file)
arr = np.array(img, dtype=np.float32)

if len(arr.shape) < 3:#如果图像不是RGB三维的话会提示error并输出具体的文件名,那我们只需要删除对应的错误样本就好了
print('Error:', file)
# else:
# print('OK: ', file)

最后是发现由两张图片是灰度图。。图片来自于imagenet,折腾到这里就差不多了,然后再按照上一篇中的方法训练就行,写到这的时候还在等训练结果,还有7w迭代,慢慢等。。。。

p.s. 生成标签.txt文件:

这里再介绍之前说的生成.txt文件的另一种方法,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# import sys
import glob
import os
#注释的部分是用命令行的方式来运行,直接传参进行
'''
if len(sys.argv) < 3:
print 'usage: filenmae.py dir suffix'
exit()
dir = sys.argv[1]
suffix = sys.argv[2]
'''
#可以看到这里我是做val中的img的标签文件
dir = "C:\\Users\\tx\\Desktop\\NewSet\\val\\img" #这里输入需要的路径,注意路径的写法
suffix = "JPEG" #这里是扩展名

f = glob.glob(dir + '\\*.' + suffix)
fileout = open(dir + '\\' + suffix + '.txt', 'wt')
for file in f:
filename = os.path.basename(file)
print(filename[:-5])
fileout.write(filename[:-5])
fileout.write('\n')
fileout.close()

更改相应内容即可生成train.txt和val.txt文件

附一些其他的参考链接:

FCN制作自己的数据集、训练和测试全流程

MATLAB中将图像转换为二值图像im2bw

caffe下fcn数据集的制作

坚持原创分享,您的支持将鼓励我继续创作!