本文首先谈自己的源码阅读体验,然后给几个案例解读,选的例子都是比较简单。重在说明我琢磨的点线面源码阅读方法。我不是专业架构师,是从一个深度学习算法工程师的角度来谈的,不专业的地方请大家轻拍。

经常看别人写的代码,然后改别人的代码,然后实现自己的想法,我想这是我们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)的更多相关文章

  1. caffe-windows中classification.cpp的源码阅读

    caffe-windows中classification.cpp的源码阅读 命令格式: usage: classification string(模型描述文件net.prototxt) string( ...

  2. Caffe源码阅读(1) 全连接层

    Caffe源码阅读(1) 全连接层 发表于 2014-09-15   |   今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...

  3. 深度学习(七十一)darknet 源码阅读

    深度学习(七十一)darknet 源码阅读

  4. caffe中batch norm源码阅读

    1. batch norm 输入batch norm层的数据为[N, C, H, W], 该层计算得到均值为C个,方差为C个,输出数据为[N, C, H, W]. <1> 形象点说,均值的 ...

  5. Pytorch版本yolov3源码阅读

    目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...

  6. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  7. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  8. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  9. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

随机推荐

  1. 20175224 2018-2019-2 《Java程序设计》第二周学习总结

    教材学习内容总结 本周对教材的第二第三章进行了学习,通过阅读教材,我发现java和c语言在相似的基础上还是有很多不同的地方,以下是我对这周学习知识的一些总结. 2.1 java标识符中的字母是区分大小 ...

  2. Oracle数据库统一审核的启用测试与关闭

    环境:windows server 2008.Oracle 12c R2 下面的步骤,连接为sysdba,除非指定了其它方式. (1)运行如下查询,确定统一审核是否启用了: select value ...

  3. nodejs --- formidable模块 , post 上传.

    1. 只有一个文件域: var formidable = require('formidable'), http = require('http'), util = require('util'); ...

  4. windows2008 转 centos7 数据磁盘NTFS无损挂载

    转换时 原win硬盘里作为系统稳盘的硬盘必须重新格式化才能装机 数据盘在安装ntfs-3g可以直接挂载 几个重要命令: #lsblk  //查看硬盘情况 df -T 只可以查看已经挂载的分区和文件系统 ...

  5. linux中运行.sql文件

    1.linux目录结构 2.假设home下面有a.sql文件 先得use databasename,要不会报错 “No Database Selected” 然后source /home/a.sql ...

  6. mysql数据库的基本操作命令整理

    快捷键 ctrl+l 清屏 ctrl +a 回到行首 ctrl + e 回到行末   数据库操作 进入数据库 方式1 mysql -u用户名 -p 密码 --------直接输入密码,缺点,会暴露自己 ...

  7. 自动化测试-14.selenium加载FireFox配置

    前言 有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile ...

  8. 在Power BI报表和仪表板中显示刷新日期\时间

    有人最近问我:“如何在报告和仪表板中显示最后刷新数据的日期和时间?”这里有两个简单的技巧在这分享下,也许可以帮助到你. 显示上次刷新日期\时间 要想显示刷新的日期和时间,我们需要在模型本身中存储时间刷 ...

  9. Python学习二十八周(vue.js)

    一.指令 1.一个例子简单实用vue: 下载vue.js(这里实用1.0.21版本) 编写html代码: <!DOCTYPE html> <html lang="en&qu ...

  10. openssl查看apk的证书信息

    查看apk的证书信息: openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text