# coding: utf-8 """ 物体检测标注小工具 基本思路: 对要标注的图像建立一个窗口循环,然后每次循环的时候对图像进行一次复制, 鼠标在画面上画框的操作、画好的框的相关信息在全局变量中保存, 并且在每个循环中根据这些信息,在复制的图像上重新画一遍,然后显示这份复制的图像。 简化的设计过程: 1、输入是一个文件夹的路径,包含了所需标注物体框的图片。 如果图片中标注了物体,则生成一个相同名称加额外后缀_bbox的文件,来保存标注信息。 2、标注的方式:按下鼠标左键选择物体框的左上角,松开鼠标左键选择物体框的右下角, 按下鼠标右键删除上一个标注好的物体框。 所有待标注物体的类别和标注框颜色由用户自定义。 如果没有定义则默认只标注一种物体,定义该物体名称为Object。 3、方向键 ← 和 → 键用来遍历图片, ↑ 和 ↓ 键用来选择当前要标注的物体, Delete键删除一种脏图片和对应的标注信息。 自定义标注物体和颜色的信息用一个元组表示 第一个元素表示物体名字 第二个元素表示BGR颜色的tuple或者代表标注框坐标的元祖 利用repr()保存和eval()读取 """ """ 一些说明: 1. 标注相关的物体标签文件即 .labels 结尾的文件,需要与所选文件夹添加到同一个根目录下 一定要注意这一点,否则无法更新标注物体的类型标签,致使从始至终都只有一个默认物体出现 我就是这个原因,拖了两三天才整好,当然也顺便仔细的读了这篇代码。同时也学习了@staticmethod以及相应Python的decorator的知识。 可以说,在曲折中前进才是棒的。 2. .labels文件为预设物体标签文件,其内容具体格式为: 'object1', (B, G, R) 'object2', (B, G, R) 'object3', (B, G, R)…… 具体见文后图片。 3. 最后生成的标注文件,在文后会有,到时再进行解释。 """ import os import cv2 # tkinter是Python内置的简单GUI库,实现打开文件夹、确认删除等操作十分方便 from tkMessageBox import askyesno # 定义标注窗口的默认名称 WINDOW_NAME = 'Simple Bounding Box Labeling Tool' # 定义画面刷新帧率 FPS = 24 # 定义支持的图像格式 SUPPORTED_FORMATS = ['jpg', 'jpeg', 'png'] # 定义默认物体框的名字为Object,颜色为蓝色,当没有用户自定义物体时,使用该物体 DEFAULT_COLOR = {'Object': (255, 0, 0)} # 定义灰色,用于信息显示的背景和未定义物体框的显示 COLOR_GRAY = (192, 192, 192) # 在图像下方多处BAR_HEIGHT的区域,用于显示信息 BAR_HEIGHT = 16 # 上下左右,DELETE键对应的cv2.
函数是编程是一种抽象程度很高的编程范式。特点之一是允许将函数本身作为参数传入另一个函数。并且允许返回一个函数。
1 高阶函数 变量可以指向的函数 f = abs 其中abs为一个函数,即变量f指向abs本身。
函数名也是变量 abs()是函数,abs其实是一个指向该函数的变量。
ps:abs定义在__builtin__模块中。
传入函数 函数的参数可以接受变量,那么也可以接受其实是变量的函数名。
>>>def add(x, y, f): return f(x) + f(y) >>>add(-9, 6, abs) 15 实际上就是abs(-9) + abs(6)的过程。
#####总结:把函数作为参数传入,这样的函数就是高阶函数。
2 map() / reduce() map() 接受两个参数:函数与序列。 map(f, [ something ]) map(str, [1, 2, 3, 4, 5, 6]) ==> ['1', '2', '3', '4', '5', '6'] 实际上map()是把计算过程抽象化了。
reduce() 接收两个参数:函数和序列。 与map()不同的是,reduce将接收到的函数作用在序列的每一个元素上并将其累计计算。
>>> def fn(x, y): return x * 10 + y >>> reduce(fn, [1, 3, 5, 7, 9]) 13579 3 filter() filter()接收一个函数和一个序列。 它将传入的函数依次作用于每个元素,然后根据返回值决定保留或是丢弃。 例:找1~100之间的素数
def my_shiny_new_decorator(a_function_to_decorate): def the_wrapper_around_the_original_function(): print 'Befor the function runs' a_function_to_decorate() print 'After the function runs' return the_wrapper_around_the_original_function def a_stand_alone_function(): print "I'm a stand alone function, don't you dare modify me" a_stand_alone_function() a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function) a_stand_alone_function() @my_shiny_new_decorator def another_stand_alone_function(): print 'Leave me alone' another_stand_alone_function() 输出结果:def bread(func): def wrapper(): print "</''''''\>" func() print "</______\>" return wrapper def ingredients(func): def wrapper(): print "#tomatoes#" func() print "~salad~" return wrapper def sandwich(food="--ham--"): print food sandwich = bread(ingredients(sandwich)) sandwich() 输出结果:def bread(func): def wrapper(): print "</''''''\>" func() print "</______\>" return wrapper def ingredients(func): def wrapper(): print "#tomatoes#" func() print "~salad~" return wrapper @bread @ingredients def sandwich(food='--ham--'): print food sandwich() 输出结果:
一个增加图片数量的工具,实现crop等操作。
image_augmentation.py ########## image_augmentation.py ############## # coding: utf-8 import numpy as np import cv2 ''' 定义裁剪函数,四个参数如下 x0:左上角横坐标 y0:左上角纵坐标 w:裁剪宽度 h:裁剪高度 ''' crop_image = lambda img, x0, y0, w, h: img[y0:y0 + h, x0:x0 + w] ''' 随机裁剪 area_ratio 为裁剪画面占原画面的比例 hw_vari是 扰动 占 原高宽比 的比例范围 ''' def random_crop(img, area_ratio, hw_vari): h, w = img.shape[:2] hw_delta = np.random.uniform(-hw_vari, hw_vari) hw_mult = 1 + hw_delta # 下标进行裁剪,宽高必须是正整数 w_crop = int(round(w*np.sqrt(area_ratio*hw_mult))) # 裁剪宽度不可超过原图可剪裁的宽度 if w_crop > w: w_crop = w h_crop = int(round(h*np.
之前由于需要处理一些从网站数据库直接提取出的excel表格,进行去重和对相应单位的编号,所以有了这一次Excel数据清洗的经历。
下面就进行详细说明。
目的:
去重
编号
使用语言:python
涉及到的主要模块:
xlrd Pandas 一、知识准备 1、Pandas介绍 python的数据分析包,是作为金融数据分析工具而被开发的,这里我们主要是利用pandas将excel表格数据转化为其中的数据结构DataFrame,从而将操作excel表变成操作DataFrame。
2、DataFrame 该数据结构是一个表格型的数据结构,包含一组有序的列,每列可以是不同的值类型。拥有行索引和列索引。 具体的关于DataFrame的操作这里给出一个比较好的使用说明,里面也有介绍Series的内容:Pandas使用指南
3、xlrd介绍 在这次数据经历的工作中还使用到了python中来读取和存储excel的扩展模块——xlrd。 它的作用来对本次处理的excel表格进行读取和存储,同时也可以实现指定表单、指定单元格的读写。
4、xlrd的基本操作 1)导入模块 import xlrd 2)打开Excel文件读取数据 data = xlrd.open_workbook('excelFile.xls') 3)使用技巧 获取一个工作表 table = data.sheets()[0] #通过索引顺序获取 table = data.sheet_by_index(0) #通过索引顺序获取 table = data.sheet_by_name(u'Sheet1') #通过名称获取 获取整行和整列的值(数组) table.row_values(i) table.col_values(i) 获取行数和列数 nrows = table.nrows ncols = table.ncols 循环行列表数据 for i in range(nrows ): print table.row_values(i) 单元格 cell_A1 = table.
1 变量 1)前带 _ 的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2)前带两个 _ ,后带两个 _ 的变量:标明是内置变量, 3)大写加下划线的变量: 标明是不会发生改变的全局变量
常量 : 大写加下划线
USER_CONSTANT 对于不会发生改变的全局变量,使用大写加下划线。
私有变量 : 小写和一个前导下划线
_private_value Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。
内置变量 : 小写,两个前导下划线和两个后置下划线
__class__ 两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。
2 函数和方法 1)前带 _ 的变量: 标明是一个私有函数, 只用于标明, 2)前带两个 _ ,后带两个 _ 的函数: 标明是特殊函数
总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范。
私有方法 : 小写和一个前导下划线
def _secrete(self): print "don't test me." 这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。 特殊函数后面会提及。
特殊方法 : 小写和两个前导下划线,两个后置下划线
def __add__(self, other): return int.__add__(other) 这种风格只应用于特殊函数,比如操作符重载等。
在训练模型时,增加 -log_dir 路径参数来保证在相应路径下保存所需绘图的日志文件。并且将所需要进行分析的日志文件的后缀改为.log 将path_to_caffe\tools\extra下的三个文件拷贝到当前工作目录下,需要拷贝的文件如下。 需要注意的是,可以将最后一个的文件名改为plot_training_log.py方便查看使用。并且如果想要生成完整的可视化图表,这三个文件缺一不可。
然后根据plot_training_log.py中的提示,在命令行中输入相应的参数,一般的命令格式为: ...\plot_training_log.py param_types where_you_store_image.png where_your_log_is.log 其中可供选择的param_number如下:
Supported chart types: 0: Test accuracy vs. Iters 1: Test accuracy vs. Seconds 2: Test loss vs. Iters 3: Test loss vs. Seconds 4: Train learning rate vs. Iters 5: Train learning rate vs. Seconds 6: Train loss vs. Iters 7: Train loss vs. Seconds PS:在制作lmdb时候调用convert_imageset来进行数据转换
D:\new_caffe\caffe\build\tools>convert_imageset.exe D:\python_caffe_test\Classification/ D:\python_caffe_test\Classification\train.txt D:\python_caffe_test\Classification\train_lmdb -resize_width 224 -resize_height 224 --shuffle