没有合适的资源?快使用搜索试试~ 我知道了~
首页Yolo 语义分割Semantic Segmentation代码修改及训练全纪录 - Artyze的博客 - CSDN博客.pdf
资源详情
资源评论
资源推荐

首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 专题 招聘 ITeye GitChat 图文课
Python工程师
写博客 消息 登录 注册
原
Yolo 语义分割Semantic Segmentation代码修改及训练全纪录
置顶 2018年09月16日 12:04:51 Artyze 阅读数 1885
首先说一下,本人由于之后嵌入式开发移植的需求,因此主要改动的框架就是darknet。前面一篇博文主要介绍了我所使用的数据集及其预处理方式,本文我将对
darknet中相关语义分割的修改进行介绍,供大家参考,如果大家有兴趣的话可以参考我的github主页:https://github.com/ArtyZe/yolo_segmentation
当然,yolo作者也在不断的对整个框架进行更新,大家也可以实时关注:https://github.com/pjreddie/darknet
有任何问题欢迎大家找我讨论,下面开始正文:
1. 主程序修改
2. Origin image及Lable image读取方式修改
3. 损失函数修改
4. 网络结构修改
5. 修改经验及错误更正总结
1. 主程序修改
主要是根据我的训练类别将classes设为1,其实在后面代码修改过程中,这个参数已经不起作用了,在instance segmentation过程中会关系到你生成多少层
的label图像。但是为了让大家知道后续这个参数起到什么作用,这里还是进行相应修改。至于threads,它主要与你的ngpus有关系,我在后面代码中,发现在
每个thread中都会加载一次我的image和label,然而若按作者的32线程,意味着我有31个线程其实什么都没做,通过printf imgs这个参数同样验证了我的想法。
1 void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display)
2 {
3 args.classes = 1;
4 args.threads = 1;
2
10
关闭

2. Origin image及Lable image读取方式修改
在原作者的代码中,估计是从coco数据集的想法而来,需要和json文件的配合,我以主要代码举例
可以看到,主要是通过两个函数将图像读取后返回至image结构体对象中
5 }
1 void *load_threads(void *ptr)
2 {
3 for(i = 0; i < args.threads; ++i){
4 args.d = buffers + i;
5 args.n = (i+1) * total/args.threads - i * total/args.threads;
6 threads[i] = load_data_in_thread(args);
7 }
8 }
1 image orig = load_image_color(random_paths[i], 0, 0);
2
3 image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes);
1 image get_segmentation_image(char *path, int w, int h, int classes)
2 {
3 find_replace(labelpath, ".JPEG", ".txt", labelpath);
4 image mask = make_image(w, h, classes);
5 FILE *file = fopen(labelpath, "r");
6 if(!file) file_error(labelpath);
7 image part = make_image(w, h, 1);
8 while(fscanf(file, "%d %s", &id, buff) == 2){
9 int n = 0;
10 int *rle = read_intlist(buff, &n, 0);
2
10
关闭

做了几句删减,请忽略语法错误,可以看到对应每一张输入图像,都需要一个对应的.txt文件,这个文件具体什么格式等下细说。
可以看到最后return回的mask对象是一个l.w*l.h*classes的图像,因此对于作者代码来说,这个classes需要根据自己的训练集进行修改,或者在txt文件中进行修改。
下面看下其中的子函数:
这里所做的工作就是根据txt文件中的每一行首尾参数对每一个part图像进行赋值0-1操作,给大家个示意图
12 or_image(part, mask, id);
13 free(rle);
14 }
15 return mask;
16 }
11 load_rle(part, rle, n);
1 void load_rle(image im, int *rle, int n)
2 {
3 int count = 0;
4 int curr = 0;
5 int i,j;
6 for(i = 0; i < n; ++i){
7 for(j = 0; j < rle[i]; ++j){
8 im.data[count++] = curr;
9 }
10 curr = 1 - curr;
11 }
12 for(; count < im.h*im.w*im.c; ++count){
13 im.data[count] = curr;
14 }
15 }
2
10
关闭

其实很简单,txt中就是存储的每一行的首尾坐标,这样就能先将0-x2的值设为1,然后再将0-x1的值设为0,这样就成功的将x1-x2之间的值赋为了1,其他行同理;不
过需要注意的是整张图像其实是一个l.w*l.h的一维向量,这里只是给大家说明一下。
这里就简单了,根据每一个类别的part图像,将对应的mask图像中对应那一层设为0或者1。了解完作者的代码后,觉得自己需要只要输入label图像就能自动生成label
矩阵的代码,因此下面着手进行修改。
首先将mask的输入方式进行修改如上
1 void or_image(image src, image dest, int c)
2 {
3 int i;
4 for(i = 0; i < src.w*src.h; ++i){
5 if(src.data[i]) dest.data[dest.w*dest.h*c + i] = 1;
6 }
7 }
image mask = load_image_gray(random_paths[i], orig.w, orig.h);
1 image load_image_gray(char *path, int w, int h){
2 char labelpath[4096];
2
10
关闭
剩余18页未读,继续阅读


















huxizhong2017
- 粉丝: 3
- 资源: 96
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- Xilinx SRIO详解.pptx
- Informatica PowerCenter 10.2 for Centos7.6安装配置说明.pdf
- 现代无线系统射频电路实用设计卷II 英文版.pdf
- 电子产品可靠性设计 自己讲课用的PPT,包括设计方案的可靠性选择,元器件的选择与使用,降额设计,热设计,余度设计,参数优化设计 和 失效分析等
- MPC5744P-DEV-KIT-REVE-QSG.pdf
- 通信原理课程设计报告(ASK FSK PSK Matlab仿真--数字调制技术的仿真实现及性能研究)
- ORIGIN7.0使用说明
- 在VMware Player 3.1.3下安装Redhat Linux详尽步骤
- python学生信息管理系统实现代码
- 西门子MES手册 13 OpcenterEXCR_PortalStudio1_81RB1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0