平时在做一些测试时候,是没有进度条出现的,这跟大家pip安装程序不一样(有安装进度条),比如做遍历的时候:
for i in range(10):
time.sleep(0.5)
print(i)
只是每过0.5秒就进行打印输出,在这个等待过程是没有任何提示的,所以说如果是一个安装程序或者运行一个特别耗时的程序,这个时候,顾客就不知道还要多久才能完成,就造成不好的用户体验,如果在这个时候我们给这个程序的执行过程加一个进度条那就效果好很多了。
这个在Faster RCNN的test.py中有出现:
with tqdm(total=imdb.num_images) as pbar:
for i, data_batch in enumerate(test_data):
# 前向计算
im_info = data_batch.data[1][0]
mod.forward(data_batch)
rois, scores, bbox_deltas = mod.get_outputs()
rois = rois[:, 1:]
scores = scores[0]
bbox_deltas = bbox_deltas[0]
det = im_detect(rois, scores, bbox_deltas, im_info,
bbox_stds=args.rcnn_bbox_stds, nms_thresh=args.rcnn_nms_thresh,
conf_thresh=args.rcnn_conf_thresh)
for j in range(1, imdb.num_classes):
indexes = np.where(det[:, 0] == j)[0]
all_boxes[j][i] = np.concatenate((det[:, -4:], det[:, [1]]), axis=-1)[indexes, :]#axis=-1表最后维
pbar.update(data_batch.data[0].shape[0])
# 评估模型
imdb.evaluate_detections(all_boxes)
这个目标检测比较耗时,所以使用进度条的形式,可以了解到具体检测到哪儿来了。
接下来我们进行安装与测试,这个tqdm到底如何使用。
安装tqdm
需要导入tqdm库
from tqdm import tqdm
当然如果没有安装tqdm的话,将会报错:
ModuleNotFoundError: No module named 'tqdm'
安装即可,带上豆瓣镜像地址:
pip install tqdm -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
安装很简单,然后我们来个简单的测试,如下:
import time
for i in tqdm(range(10)):
time.sleep(0.5)
100%|███████████████████████████████████| 10/10 [00:05<00:00, 1.96it/s]
这里就会出现一个进度条的动画,每0.5秒进度就会往后面累加直到全部完成。
这里的tqdm(range(10)),其中里面是range,我们可以简化成trange,等价于trange(10),如下:
from tqdm import trange
for i in trange(10):
time.sleep(0.5)
print(i)
设置进度条颜色
我们还可以对进度条设置颜色,变得更加的美观和醒目
for i in tqdm(range(10),colour="green",desc="运行进度"):
time.sleep(0.5)
print(i)
为了显示效果,截图如下:
当然这个描述还可以显得更贴心点:
l = ['a', 'b', 'c', 'd', 'e']
pbar = tqdm(l)
for i in pbar:
time.sleep(0.2)
pbar.set_description('进度'+i)
update方法
使用update方法来控制进度条的更新进度,这里的tqdm里面的参数可以不是迭代类型,只需设定总任务大小,这里就跟上面的模型检测的方法一样了。
with tqdm(total=200) as pbar:
for i in range(20):
time.sleep(1)
pbar.update(10)#总任务是200,每次更新10
或者
pbar = tqdm(total=200)
for i in range (20):
time.sleep(1)
pbar.update(10)
pbar.close()
100%|██████████████████████████████████████| 200/200 [00:20<00:00, 9.88it/s]
更细化的还可以指定进度条的长度,单位类型等
with tqdm(total=100, desc='进度条', ncols=80, unit='B') as pbar:
for i in range(10):
time.sleep(1)
pbar.update(10)
进度条: 90%|███████████████████████████████▌ | 90/100 [00:09<00:01, 9.94B/s]
write方法
可以完成了多少做个提示,这里的tqdm.write效果可跟print不一样,有兴趣的可以试试
pbar = trange(10)
for i in pbar:
time.sleep(1)
if not (i % 3):
tqdm.write('完成进度 %i' %i)
完成进度 0
完成进度 3
完成进度 6
完成进度 9
100%|██████████████████████████████████████████████████████| 10/10 [00:10<00:00, 1.01s/it]
多循环进度条
多个循环嵌套,比如说两个for循环,里面的每次循环之后,外循环的进度条就累加,当内循环处理完毕之后,内部的进度条消失,最终留下总任务的进度条!
for i in trange(10, colour='red', desc='总的进度'):
for i in trange(5, colour = 'green', desc='分支任务进度', leave=False):
time.sleep(0.1)
如图:
也可以使用bar_format来制作,其中{bar:60}表示进度条长度,{n}/{total}表示当前进度和总进度
for i in tqdm(range(100), bar_format='\033[44m{bar:60}\033[0m {n}/{total}'):
time.sleep(0.1)
其中\033[44m是ANSI 颜色码,这里是底色为蓝色,进度条是白色的情况
想要了解更多关于tqdm有哪些方法和属性,可以dir查询
>>>dir(tqdm)
['__bool__', '__class__', '__contains__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_comparable', '_decr_instances', '_get_free_pos', '_instances', '_lock', 'clear', 'close', 'display', 'external_write_mode', 'format_dict', 'format_interval', 'format_meter', 'format_num', 'format_sizeof', 'get_lock', 'monitor', 'monitor_interval', 'moveto', 'pandas', 'refresh', 'reset', 'set_description', 'set_description_str', 'set_lock', 'set_postfix', 'set_postfix_str', 'status_printer', 'unpause', 'update', 'wrapattr', 'write']
>>>help(tqdm)
__init__(self, iterable=None, desc=None, total=None, leave=True, file=None, ncols=None, mininterval=0.1, maxinterval=10.0, miniters=None, ascii=None, disable=False, unit='it', unit_scale=False, dynamic_ncols=False, smoothing=0.3, bar_format=None, initial=0, position=None, postfix=None, unit_divisor=1000, write_bytes=None, lock_args=None, nrows=None, colour=None, delay=0, gui=False, **kwargs)
其中参数 unit='it' 这里的例子是处理字节,进度条后面类似9.88it/s这样,如果是图片的话,就是img/s结尾