import os import requests from retrying import retry from io import BytesIO from PIL import Image import progressbar import concurrent.futures as concurrent
i = 0 total = len(image_urls) pbar = progressbar.ProgressBar(max_value=total).start() for task in concurrent.as_completed(tasks): url, file_path = tasks[task] try: task.result() i = i + 1 pbar.update(i) except Exception as exc: print('{} generated an exception: {}'.format(url, exc)) pbar.finish()
4. 遍历文件夹中所有文件
首先目录结构如下:
1 2 3 4 5 6 7
$ tree test test ├── 1.txt ├── 2.txt └── test2 ├── 3.txt └── 4.txt
使用os.walk()遍历test目录,代码如下:
1 2 3 4 5 6
root_dir = '/tmp/test' for root, dirs, files in os.walk(root_dir, topdown=True): for name in files: print(os.path.join(root, name)) for name in dirs: print(os.path.join(root, name))
deftimethis(func): """ Decorator that reports the execution time """ @wraps(func) defwrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(func.__name__, end-start)
if __name__ == "__main__": a = [1, 2] b = 3 print(f"'a' is {'iterable'if isiterable(a) else'not iterable'}") print(f"'b' is {'iterable'if isiterable(b) else'not iterable'}")
目标检测算法定位该汽车的位置时找出了一堆检测框,此时我们需要去除冗余的检测框。假设目标算法找到了6个检测框,而且算法还提供了每个框中内容属于汽车的概率或者得分 (在RCNN中,使用SVM计算检测框属于该类别的得分),NMS方法首先根据得分大小对检测框进行排序,假设从小到大的排序为 A, B, C, D, E, F。
从最大得分的检测框 F 开始,分别判断 A~E 与 F 的重叠度IoU是否大于某个设定的阈值。
假设检测框 B、D 与 F 的重叠度超过阈值,那么就抛弃 B、D,并将检测框 F 标记为要保留的检测框。
第2步去掉 B 和 D 后,剩余检测框 A、C、E,接着在剩下的检测框中选择得分最大检测框 E,然后判断 E 和 A、C 的重叠度,如果重叠度大于设定阈值,那就抛弃该检测框,否则留到下一轮的筛选过程,并将检测框 E 标记为要保留的检测框。
重复步骤 3,直到剩余待筛选的框个数为 0。
实现
关于单类别的NMS的实现,网上已经有实现好的,这里贴出 Ross Girshick (RCNN提出者) 写的Python实现 py_cpu_nms.py,并且加了个人的标注。
fps = [] tps = [] for threshold in thresholds: # 大于等于阈值判定为 1 (正类),否则为 0 (负类) y_predict = [1 if i >= threshold else 0 for i in y_score] # 预测值是否等于真实值 result = [i == j for i, j in zip(y_true, y_predict)] # 预测值是否为 1 (正类) positive = [i == 1 for i in y_predict]
# 预测为正类且预测错误 fp = [(not i) and j for i, j in zip(result, positive)].count(True) # 预测为正类且预测正确 tp = [i and j for i, j in zip(result, positive)].count(True)