孪生网络算法对数据需求量较大,训练一般使用多个数据集。检测数据集普遍图大目标多,pysot 第一步准备数据,屏蔽了不同数据集的差异,也提升了数据加载效率。网络设定的模板大小为 127×127127\times 127127×127,搜索区域大约为 255×255255\times 255255×255。为给数据增强留有余地,数据切图大小为 511×511511\times 511511×511。下面以 COCO 数据集为例进行介绍。

par_crop.py

    since = time.time()main(int(sys.argv[1]), int(sys.argv[2]))time_elapsed = time.time() - sinceprint('Total complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))

main

创建切图路径。

    dataDir = '.'crop_path = './crop{:d}'.format(instanc_size)if not isdir(crop_path): mkdir(crop_path)

对于训练集和验证集,根据标注文件实例化 pycocotools.coco.COCO。

concurrent.futures.Executor 是一个抽象类,提供异步执行调用的方法。要通过它的子类调用,而不是直接调用。
concurrent.futures.Executor.submit 调度可调用对象fn,以fn(*args **kwargs)方式执行并返回代表可调用对象的执行的 Future 对像。
concurrent.futures.ProcessPoolExecutor 是 Executor 的子类,使用最多max_workers个进程的进程池异步执行调用。如果 max_workersNone或未给出,则默认为计算机上的处理器数。 如果max_workers低于或等于0,则会引发 ValueError。在 Windows 上,max_workers必须小于等于61.如果不是,则会引发 ValueError。如果max_workersNone,那么即使有更多的处理器可用,默认值也最多为61。mp_context可以是一个多进程上下文或是None。 用它来启动工作者。如果mp_contextNone或未给出,将使用默认的多进程上下文。
initializer是一个可选的 callable,在每个 worker 进程的开头调用; initargs是传递给初始化器的参数元组。如果初始化程序引发异常,则所有当前挂起的作业以及向池中提交更多作业的任何尝试都将引发 BrokenProcessPool。

crop_img 从图上根据目标框
loadImgs 加载指定 ID 的图片。
loadAnns 加载指定 ID 的注释。
getAnnIds 获取满足给定过滤条件的标注 ID。默认跳过该过滤器。
printProgress 打印进程状态。

    for dataType in ['val2017', 'train2017']:set_crop_base_path = join(crop_path, dataType)set_img_base_path = join(dataDir, dataType)annFile = '{}/annotations/instances_{}.json'.format(dataDir,dataType)coco = COCO(annFile)n_imgs = len(coco.imgs)with futures.ProcessPoolExecutor(max_workers=num_threads) as executor:fs = [executor.submit(crop_img, coco.loadImgs(id)[0],coco.loadAnns(coco.getAnnIds(imgIds=id, iscrowd=None)),set_crop_base_path, set_img_base_path, instanc_size) for id in coco.imgs]for i, f in enumerate(futures.as_completed(fs)):# Write progress to error so that it can be seenprintProgress(i, n_imgs, prefix=dataType, suffix='Done ', barLength=40)print('done')

crop_img

crop_img
crop_like_SiamFC

img['file_name']读取文件名。以该名称创建文件夹。
读取图像,根据每个目标框截取后保存。
crop_like_SiamFC 像 SiamFC 那样截取,即外扩截取后缩放到指定大小。

    frame_crop_base_path = join(set_crop_base_path, img['file_name'].split('/')[-1].split('.')[0])if not isdir(frame_crop_base_path): makedirs(frame_crop_base_path)im = cv2.imread('{}/{}'.format(set_img_base_path, img['file_name']))avg_chans = np.mean(im, axis=(0, 1))for trackid, ann in enumerate(anns):rect = ann['bbox']bbox = [rect[0], rect[1], rect[0] + rect[2], rect[1] + rect[3]]if rect[2] <= 0 or rect[3] <=0:continuez, x = crop_like_SiamFC(im, bbox, instanc_size=instanc_size, padding=avg_chans)cv2.imwrite(join(frame_crop_base_path, '{:06d}.{:02d}.z.jpg'.format(0, trackid)), z)cv2.imwrite(join(frame_crop_base_path, '{:06d}.{:02d}.x.jpg'.format(0, trackid)), x)

crop_like_SiamFC

crop_like_SiamFC
crop_hwc

[x1, y1, x2, y2]的框得到中心和大小。
pos_s_2_bbox 根据中心位置和大小解码出框。
crop_hwc 截取图像块并缩放为指定大小。

    target_pos = [(bbox[2]+bbox[0])/2., (bbox[3]+bbox[1])/2.]target_size = [bbox[2]-bbox[0], bbox[3]-bbox[1]]wc_z = target_size[1] + context_amount * sum(target_size)hc_z = target_size[0] + context_amount * sum(target_size)s_z = np.sqrt(wc_z * hc_z)scale_z = exemplar_size / s_zd_search = (instanc_size - exemplar_size) / 2pad = d_search / scale_zs_x = s_z + 2 * padz = crop_hwc(image, pos_s_2_bbox(target_pos, s_z), exemplar_size, padding)x = crop_hwc(image, pos_s_2_bbox(target_pos, s_x), instanc_size, padding)return z, x

crop_hwc

ab分别为宽高的比例系数。
cd分别为宽高方向的平移量。

    a = (out_sz-1) / (bbox[2]-bbox[0])b = (out_sz-1) / (bbox[3]-bbox[1])c = -a * bbox[0]d = -b * bbox[1]mapping = np.array([[a, 0, c],[0, b, d]]).astype(np.float)crop = cv2.warpAffine(image, mapping, (out_sz, out_sz), borderMode=cv2.BORDER_CONSTANT, borderValue=padding)return crop

printProgress

    """Call in a loop to create terminal progress bar@params:iteration   - Required  : current iteration (Int)total       - Required  : total iterations (Int)prefix      - Optional  : prefix string (Str)suffix      - Optional  : suffix string (Str)decimals    - Optional  : positive number of decimals in percent complete (Int)barLength   - Optional  : character length of bar (Int)"""formatStr       = "{0:." + str(decimals) + "f}"percents        = formatStr.format(100 * (iteration / float(total)))filledLength    = int(round(barLength * iteration / float(total)))bar             = '' * filledLength + '-' * (barLength - filledLength)sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents, '%', suffix)),if iteration == total:sys.stdout.write('\x1b[2K\r')sys.stdout.flush()

参考资料:

  • 2. 使用Python的 concurrent.futures 模块
  • python concurrent.futures
  • Speed Up Your Python Program With Concurrency

pysot 中的异步多进程切图相关推荐

  1. 五分钟学GIS | 多进程切图

    1.多进程切图概述 9D版本之后除SuperMap iServer支持多进程切图,SuperMap iObjects Java 9D版本也支持多进程切图,可实现多机分发切图,切图更稳定.更高效,其还提 ...

  2. 使用python中PIL库进行切图时候出现了图片全黑

    使用PIL的Image切图时候图片全黑 不知道大家有没有遇见这样得问题,使用python中PIL库进行切图时候出现了图片全黑得现象 今天写了个切图得代码,但是得到得图片是全黑的,像这样的情况: 不知道 ...

  3. 【图数据库中的”分布式”和“切图”】

    今天,我试着简要综述几类不同的图数据库的分布式与切图的设计,希望可以帮助大家了解不同项目.产品的设计差异.如果有理解不对的地方,欢迎留言讨论. 什么是分布式系统 一般来说,分布式系统是一组计算机程序的 ...

  4. html中sprite标签,网页切图 CSS Sprites(CSS精灵)介绍和图文使用教程

    CSS Sprites 技术对于广大的前端工程师来说应该是一点也不陌生.这个被国内开发者昵称为CSS精灵.CSS雪碧的家伙到底解决了什么问题,我们又怎样合理使用这个技术呢?下面让我们详细的聊聊. 在大 ...

  5. 【iDesktop】多机多任务切图实现步骤

    文章目录 前言 一.新建共享文件夹 二.新建切图任务 三.参与切图任务机器加入切图 前言   随着技术的进步,地图数据量已经迈进海量数据的时代,而单机切图的效率实在不能满足需求.例如,在普通的工作机上 ...

  6. android切图尺寸_安卓设计尺寸规范

    画布尺寸: 如果想一稿适配ios,那就新建720×1280  分辨率72,像素/英寸. 如果单独设计安卓MD新规范的,那就新建1080×1920  分辨率72,像素/英寸. 单位和度量 Units a ...

  7. android 系统的切图方式_UI设计切图规范

    移动UI设计切图是UI设计师最重要的设计输出物,切图资源输出是否规范直接影响到工程师对设计效果的还原度.设计师的切图输出物是是体现一个设计师专业水准的重要标准,同时也是设计师表达自己对设计态度的最有力 ...

  8. 移动端切图内容包括什么_移动终端界面切图

    移动终端的界面切图探讨 摘 要:手机或者平板电脑应用中 android 切图中不仅需要清楚 "点九"的方法,还有其他各种小技巧,本文阐述了在工作中几个 关于切图的心得. 关键词:移 ...

  9. android ps切图工具下载,Cutterman

    Cutterman是款专注于设计的ps切图插件,支持各种各样的图片尺寸.格式.形态,一键切图,自动将你需要的图层进行输出,有了它就免去了"导出web所用格式" 以及使用切片工具进行 ...

最新文章

  1. java rest httpclient_java http请求建议使用webClient,少用RestTemplate,不用HttpClient
  2. 优秀的代码都是如何分层的?
  3. c语言中不能表示的整型常量进制,C语言中整型常量的表示方法
  4. web自动化测试---概述
  5. Could not set property 'xxx' of 'class 'xxx' with value 'xxx'
  6. 设计原则交互思维,重塑产品设计
  7. C++set和multiset区别
  8. 俄国数学家称:“平行线可以相交”,却遭到质疑,死后12年被证实
  9. Oracle分组取前n条记录
  10. 远场(far-field)语音识别的主流技术有哪些?
  11. android内存占用分析,Android内存优化————虚引用与弱引用的使用及内存分析工具...
  12. EasyCHM制作教程
  13. 空手套白狼的典型案例,不花一分钱,整合别家产品,赚自己的钱
  14. mac uvc相机_Mac相机无法正常工作? 这是解决方法
  15. java集合中取最大值_Java后台通过Collections获取list集合中最大数,最小数代码
  16. [Algorithms] Gale-Shapley算法(婚姻匹配问题,高考录取机制)
  17. 什么是非同质化代币(non-fungible token)?关于NFT你需要知道的一切
  18. 联想Thinkpad E420 重装系统
  19. C语言如何打开txt文件
  20. 如何将深度学习的float32图像转为Unit8格式以方便cv2使用

热门文章

  1. 我国计算机信息系统安全保护工作的重点是,网络信息安全知识:计算机信息系统的安全保护工作,重点维护国家事务、经济建设、国防建设、尖端科学技术等重要领域的()的安全。...
  2. Excel 2010 VBA 入门 087 数据处理之按单列汇总多个工作表
  3. socket编程——upd(数据报套接字)
  4. JAVA滁州市住房公积金管理中心网站计算机毕业设计Mybatis+系统+数据库+调试部署
  5. ubuntu系统 有线网络无法通过网页认证上网
  6. linux服务器如何识别移动硬盘,Linux服务器如何识别移动硬盘?
  7. linux内核和发行版本的关系,简述Linux内核和Linux发行版的区别
  8. 爬虫3 requests基础2 代理 证书 重定向 响应时间
  9. 关于pbootcms中被挂马以后的处理
  10. 游戏开发的人员结构(1)