本次工程实践需要用深度学习目标检测的算法进行印章识别,需要了解使用YOLO模型进行训练,所以本次分析YOLO_tensorflow的源代码(基于python)
目录结构:YOLO_tensorflow的目录结构如下图,文件夹组织十分清晰,根目录下的train.py为训练代码,test.py为测试代码,其他辅助函数放在对应的文件夹里,data:数据,test:测试集,utils:一些实用程序,yolo:YOLO模型的一些函数。
文件名:取个好名字是十分关键的,既要便于标识,又要符合一定的代码规范。文件名应尽量使用小写命名,首字母保持小写,尽量不要用下划线。这个源代码的文件夹命名比较简单,用英文字母命名即可达到便于理解符合规范的目的。
类名:类名首字母一般要大写,使用驼峰(CamelCase)命名风格,最好能清晰地表示出此类的作用,私有类可用一个下划线开头
函数名:函数名采用小写形式,如果有多个单词,就用下划线隔开,另外私有函数在函数前加一个下划线_,这个跟C++和Java的规则不太一样。
变量名:变量名基本同函数名的规则,不过对于常量,采用全大写,如有多个单词,使用下划线隔开
接口定义:在python中接口由抽象类和抽象方法去实现,接口是不能被实例化的,只能被别的类继承去实现相应的功能。换句话来说就是接口类中定义了一些接口名,且并未实现接口的功能,子类继承接口类,并且实现接口中的功能。此源代码功能主要是训练模型和测试模型,没有单独定义接口。
单元测试:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。
python有一个很好用的单元测试框架unittest(详见https://www.cnblogs.com/hackerain/p/3682019.html)
编写单元测试时,需要编写一个测试类,这个类从unittest.TestCase
继承。以test
开头的方法就是测试方法。对每一类测试都需要编写一个test_xxx()
方法。由于unittest.TestCase
提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。
此源代码有一个test.py,但此文件并不是单元测试,而是用来测试模型是否能正常识别目标的。
源代码分析总结:
1、哪些做法符合代码规范和风格一般要求:
从上面的分析可以看出,此源代码的目录结构、类名、函数名、变量名等均符合代码规范和风格的一般要求,而且此代码的命名简洁易懂,便于理解。
2、列举哪些做法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进:
此源代码基本没有注释,只靠名称来辨识功能,容易造成歧义。
3、总结同类编程语言或项目在代码规范和风格的一般要求:
前面已经详细说了文件名、类名、函数名、变量名、接口定义、单元测试的一些要求或方法,就不再赘述,此处再补充一些其他的要求:
(1)类、方法、变量等名称尽量不要用缩写,如果有不常用缩写,需要写好注释
(2)缩进,python通过缩进来识别代码块,缩进错误程序很可能就错了。一般使用tab缩进4个空格
(3)行长:一般不超过80个字符,这样方便一个屏幕可以看完整行,便于阅读代码
(4)空行:一级类、函数之间一般空2行,二级类和方法之间空1行
(5)尽量避免使用全局变量
(6)做好注释;单行注释用#号顶头,空1格后写注释;多行注释用三对双引号或三对单引号。
(7)import操作一般放在文件头部,先导入python包,再导入第三方包,最后导入自定义的包。不使用的包不要导入,不要两个文件循环导入