最近,实验室的比赛在识别上用到了灰度图,因为官方对颜色进行了修改,我们在没有官方数据的情况下,只能使用灰度图进行训练识别,以期望可以排除颜色的影响。但是在使用yolo训练单通道灰度图的时候出现了一些问题,在修改cfg配置文件后进行训练,一直出现,segmentation fault的错误。在百度上也没有找到类似的问题,最后在GitHubcomments上找到了答案,以下记录一下,方便后人。
YOLO对彩色图(三通道)数据的训练和识别在往上已经有很多很优秀的博客介绍了详细的介绍。
在这里仅仅讲述使用YOLO进行对单通道进行训练需要修改的配置。
很简单,分三步:
1、第一步修改源文件:
进入到以下文件中:
/darknet/src/data.c
找到load_data_detection这个方法
data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, int classes, float jitter, float hue, float saturation, float exposure)
{
char **random_paths = get_random_paths(paths, n, m);
int i;
data d = {0};
d.shallow = 0;
d.X.rows = n;
d.X.vals = calloc(d.X.rows, sizeof(float*));
d.X.cols = h*w; // d.X.cols = h*w*3; //这里将h*w*3修改为h*w
这里将h*w*3修改为h*w,本来以为数据的通道数只和cfg配置文件中的 channels 有关,在将channels设置为 1 后,在运行yolo训练代码时,马上出现了segmentation fault,我就想到了应该是和源码有关,没想到居然要这样修改,本来想到的改善方法是直接在代码中导入cfg文件,然后使用channels变量,但是仔细思考,发现确实是不行,因为yolo中提供了许多的cfg配置文件,每个用户都可能会使用不同的文件,因此单单导入一个配置文件的做法并不可行,所以这里确实是需要有一个更加优雅的实现方式。
2、第二步,重新编译
进入到darknet文件夹,进行重新编译:
make clean
make
3、第三部,修改cfg配置文件
这一步简单,只需要在你想使用的配置文件中,将channel变量改为 1 即可,以下为示例:
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=8
subdivisions=8
width=416
height=416
channels=1 #就是将这里的channels改为1即可
momentum=0.9
decay=0.0005
#angle=0
#saturation = 1.5
#exposure = 1.5
#hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 50200
policy=steps
steps=40000,45000
scales=.1,.1
接下来便可使用yolo的命令进行训练。这里便不再赘述。