源码阅读经验谈-slim,darknet,labelimg,caffe(1)
本文首先谈自己的源码阅读体验,然后给几个案例解读,选的例子都是比较简单。重在说明我琢磨的点线面源码阅读方法。我不是专业架构师,是从一个深度学习算法工程师的角度来谈的,不专业的地方请大家轻拍。
经常看别人写的代码,然后改别人的代码,然后实现自己的想法,我想这是我们coder常干的事情。看人看代码,代码如人。他代码写的有多清爽简洁,说明他思维是清晰的;代码的结构有多合理,模块化内聚如何,是否低耦合,反应他的宏观把控能力。一个软件系统你可以把他看成是一个简单的企业,各个职能部门如何发挥自己的作用,相当于每个软件的模块如何组织理顺,一段繁冗杂乱的代码和一家管理混乱的公司一样,剪不断理还乱,索性推翻重来。
谈一谈我阅读源码的经验吧。希望能成为大家的垫脚石,大家可以在我的基础上飞的更高,走的更稳。
源码阅读我自己琢磨的经验是:点-线-面立体式逐层深入。
点:点有两个层面的意思,首先你要找到突破点,比如说程序的入口main函数,或者说一个比较容易切入的点,很多时候main函数下面写的很简洁,就几行代码走一个主流程,或调用多进程,你很难看清楚里面的逻辑,这时候找切入点就是一个比较技巧的事情了。找到切入点才能由点到线,开始去摸清楚里面的东西。
点的另一个层面的意思是当通过切入点找到主线后,由线串起来的其它一些点,比如说一些功能性函数utils,一些功能性模块的内容。这些东西你干瘪瘪的去看没有太大趣味,你有可能搞不明白它是干什么的,有一根线来串的话,你就可以调试,你会快速搞清楚里面的功能。
线:线有主线和旁线。深度学习我认为是一个面向过程的,因为它其实就是一个方程,一个函数,面向过程的编程思想就是给一个input,在你软件系统里走一遍后,得到一些输出。主线就是连接输入和输出的线。旁线就是主线的一些分支。给定一个输入后,你可以跟着这根线逐步往后走,每步打印出一些关键变量,你就能基本明白每步做了什么事情。
旁线就是一些分支,从主线上分出一个输入,然后调用一个功能性模块,得到一个结果后,又去走主线的流程。这个调用功能性模块就是一个旁线,只有把这些旁线搞明白,你才能建立一个知识树,你才能立体的对一个系统有深入认识。
面:线跟线交错,线把点串起来,组织成一张网,就是一个面了。讲面这层次主要是希望大家有全局意识。系统的设计者设计系统的时候应该首先想到的是面,是一个立体的东西,然后才抽丝剥缕的码代码。哪个文件放到哪个模块,哪个函数放哪个文件中更合适,都要非常清楚,这样有一个整体感,层次鲜明,逻辑清楚。就像网络工程师搭网线一样,有的高手搭建的网线有层次感,顺手一摸就知道那根线是跟哪个交换机连的。
杂乱无章
有逻辑的代码结构。
Labelimg案例:
实话实说,我之前经常用labelimg打标签,但一直没看过源码。由于要在这个基础上开发一个半自动化标签系统,这周我也是从0开始摸索的。搞了三天才把它摸清楚。
Labelimg是用pyqt写的。姑且说是一个面向对象的编程框架吧。他的主函数很简单。主要逻辑全在mainwindow这个类里面了。
这个mainwindow类东西太多了,一时找不到突破点。本来就对这种获取点击信息然后执行一些action的编程范式不是很熟,摸索了好久,才找到了一个突破口,那就是,画完框后,他会弹出一个对话框,就是这个OK或者cancel的框。
之所以选它作为突破口,是因为1、下面那个列表数据是从txt文件中读取返显出来的,根据这条线,就能摸清楚怎么样把自己想要的数据返显到对话框中;2他是在图片上画框后自动弹出对话框,这有助于你摸清楚他是怎么获取鼠标点击交互的,获取点击交互后怎么打开对话框的。你把这个搞明白了就抓到主线了。
通过摸索,发现这个对话框写在libs下面,代码如下:
然后就是去找一些点了:1、在主mainwindow中是怎么调用这个类的;2、txt中存的数据是怎么读取然后给到labeldialog的。3、这些Qwidget、QlistWidget都是干啥的。大家是不是觉得特别简单?别笑话我为了琢磨这些玩意琢磨了三天哈。哥是比你笨,但哥比你action。
这个系列起了个头,可能大家觉得这些都是工程的事情,算法工程师干这些玩意浪费时间。事实上,鼻祖hinton曾经告诫我们说:要少看论文,不要停止编程。强大的工程能力才是算法的基石,而如何收集数据(包括打标签)和如何定义问题及建模是算法落地的基石。有没有同感的请扣1。
源码阅读经验谈-slim,darknet,labelimg,caffe(1)的更多相关文章
- caffe-windows中classification.cpp的源码阅读
caffe-windows中classification.cpp的源码阅读 命令格式: usage: classification string(模型描述文件net.prototxt) string( ...
- Caffe源码阅读(1) 全连接层
Caffe源码阅读(1) 全连接层 发表于 2014-09-15 | 今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...
- 深度学习(七十一)darknet 源码阅读
深度学习(七十一)darknet 源码阅读
- caffe中batch norm源码阅读
1. batch norm 输入batch norm层的数据为[N, C, H, W], 该层计算得到均值为C个,方差为C个,输出数据为[N, C, H, W]. <1> 形象点说,均值的 ...
- Pytorch版本yolov3源码阅读
目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
随机推荐
- Java语法基础学习DaySixteen(多线程)
一.多线程的创建 1.作用 程序需要同时执行两个或多个任务时需要多线程. 程序需要实现需要等待的任务时,如用户输入.文件读写操作.网络操作.搜索等,需要多线程. 需要一些后台运行的程序时,需要多线程. ...
- 数据库行转列、列转行,pivot透视多列
这就是典型的行转列问题. 首先说下最简单的思路 用union all select year,sum(m1) m1,sum(m2) m2,sum(m3) m3,sum(m4) m4 from ( s ...
- 基于Verilog的串口发送程序
一.模块框图及基本思路 tx_bps_module:波特率时钟产生模块 tx_control_module:串口发送的核心控制模块 tx_module:前两个模块的组合 control_module: ...
- Unable to resolve module crypto
Add rn-nodeify to your devDependencies in package.json: "devDependencies": { "rn-node ...
- 后台获取用户登录token 和获取前端参数方法
//获取request请求中所有参数 Enumeration<String> names = request.getParameterNames(); HashMap<String, ...
- python中序列化模块json和pickle
json模块:json是第三方包,不是系统内置模块,以字符串序列 常用操作有: json.dumps() # 将变量序列化,即将功能性字符转化为字符串 例: >>> import j ...
- HDU 2062:Subset sequence(思维)
Subset sequence Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- ubuntu yolov2 训练自己的数据集
项目需求+锻炼自己,尝试用yolov2跑自己的数据集,中间遇到了很多问题,记下来防止忘记 一.数据集 首先发现由于物体特殊没有合适的现成的数据集使用,所以只好自己标注,为了减少工作量,先用opencv ...
- 安装Vmware workstation虚拟机软件
运行下载完成的Vmware Workstation虚拟机软件包,将会看到图1-1 所示的虚拟机程序安装向导初始界面. 在虚拟机软件的安装向导界面单击"下一步"按钮,如图1-2所示. ...
- POJ1821 Fence
题意 Language:Default Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6478 Accepted: ...