图像标注工具简单列表

究竟需要什么样的标注工具:单人or多人协同?最后数据保存格式?运行环境?分类任务or/and检测任务?效率和速度?等等。确定了这些才可以去挑选工具或自制工具。

有图像标注工具推荐或者分享吗? – 知乎
What is the best image labeling tool for object detection? – Quora

1
tzutalin/labelImg: LabelImg is a graphical image annotation tool and label object bounding boxes in images
py+qt单机软件,保存结果PASVAL VOC XML格式。

2
hzylmf/od-annotation: 目标检测数据标注工具
python flask写就的B/S架构的工具,支持多人。结果可导出为PASCAL VOC XML格式。

3
Image Labeler Label ground truth in a collection of images
Matlab工具,支持多种标注类型。

4
LabelMe. The Open annotation tool
MIT出品,提供手机APP,提供Matlab接口。

5
wkentaro/labelme: Image Polygonal Annotation with Python.
高仿MIT LabelMe的PyQT单机软件。

6
lanbing510/ImageLabel: 图像标注工具 Image Label Tool
单机多边形标注工具

7
VGG Image Annotator (VIA)
VGG组提供的多边形标注工具,html+js写就,单机浏览器下使用。

8
OpenCV探索之路(二十五):制作简易的图像标注小工具 – Madcola – 博客园
网友自写简易工具

9
Labelbox: Data labeling platform for expert artificial intelligence applications
提供商业服务,支持COCO和VOC XML格式。

10
Dataturks – ML data annotations and labeling doesn’t need to suck
提供商业服务

11
NaturalIntelligence/imglab: Web based tool to label images for objects. So that they can be used to train dlib or other object detectors. Integrated with Face++

12
精灵标注助手-人工智能数据集标注必备工具

13
RectLabel – Labeling images for bounding box object detection and segmentation

14
OCLAVI | Object Classification and Annotation for Computer Vision Models
提供商业服务

15
Edgecase AI data labeling | Bounding Box
提供商业服务

16
puzzledqs/BBox-Label-Tool: A simple tool for labeling object bounding boxes in images
python tkinter 单机工具

17
LabelD by sweppner

18
A Universal Labeling Tool for Computer Vision: Sloth

19
LIBLABEL: Lightweight Semantic/Instance Annotation Tool Autonomous Vision Group | MPI for Intelligent Systems

20
wadefelix/ROIDrawer 把我的也贴一贴。计划重写中。。。
B/S架构,支持多人,支持导出PASCAL VOC XML。关注效率,针对左右键盘右手鼠标这种操作方式特别优化设计,除了拖曳bounding box外重复操作尽量使用键盘按键完成。

 

微信里的图像音视频

文件名

在目录Tencent/MicroMsg/目录下的一个ID字符串目录下。
voice2目录存放的是语音。在经过两级2位十六进制字母散列的目录中文件是按“秒时分日月年”的顺序组成文件名msg_后的前12位数字。
video目录存放是视频文件和相关的图片。目录中文件是按“时分秒日月年”的顺序组成文件名前12位数字。比如”083909140318afaaef195653.mp4″,就是“08点39分09秒在14日03月18年”在手机上生成的。同个小视频若转发到多个对话会出现多个文件和文件名。

image2目录中存放的用户聊天图片,也是经过两级2位十六进制字母散列的目录中,但是文件名貌似随机无规律。

上面都是自动保存的原文件等。如果视频图片保存下载到Tencent/MicroMsg/WeiXin文件夹下,则视频直接使用保存时的unixtime时间戳,而图片则是mmexport加上unixtime时间戳。但是注意下载的图片可image2里自动缓存的图片清晰度高,保存的视频无区别。

对于使用微信发送消息框直接拍摄的图片和视频则也是保存在Tencent/MicroMsg/WeiXin文件夹下,文件名时wx_camera_加上unixtime时间戳。

微信amr音频文件转mp3

微信amr音频使用silk v3编码,工具集 https://github.com/kn007/silk-v3-decoder/tree/master/windows
BAT批处理程序示例

setlocal enabledelayedexpansion

for /r D:\\micromsgvoice2 %%i in (*.amr) do (
set fullfilename=%%i
C:\silk2mp3\silk_v3_decoder.exe !fullfilename! msg.pcm -Fs_API 44100
C:\silk2mp3\lame.exe -ar -s 24 msg.pcm !fullfilename:.amr=.mp3!
)

另外,我这里还有个自动通过ftp从手机下载音频文件的脚本 https://github.com/wadefelix/Scripts100/blob/master/fetchmicromsgvoice2.py

改DICOM这种平面结构数据为对象结构

DICOM格式中所有信息条目类似于平铺地保存于一张表格中,与协议中按对象组织的信息条目组合不对应。

例如fo-dicom中的示例也都是这样编辑条目

var file = await DicomFile.OpenAsync(@"test.dcm"); // Alt 2

var patientid = file.Dataset.Get(DicomTag.PatientID);

file.Dataset.Add(DicomTag.PatientsName, "DOE^JOHN");

能不能把Patient Identification Module弄成对象,即将上面的示例改成下列形式呢?

var file = await DicomFile.OpenAsync(@"test.dcm"); // Alt 2
var dicomfileobj = file.Dataset;
var patientid = dicomfileobj.Patient.ID;
dicomfileobj.Patient.Name = "DOE^JOHN";

答案当然是能。

按照DICOM规范把所有Macro/Module定义成对象,DICOM Atributes就定义成C#对象的Properties,getter和setter内封装fo-dicom的Add等方法。用反射自动解码和编码DICOM即可。

具体实现此处不表了。

面向windows的支持plugins的caffe

https://github.com/wadefelix/caffe/tree/pwin

prototxt文件整合是在CMake脚本里完成,所以修改proto文件的话要用CMake再生成。

另外protocal buffer版本换成了最新的3.5.2,预编译的protobuf对扩展的支持没搞定可能不太好搞。编译protobuf时注意修改其运行库是和caffe一致的多线程DLL

已携带了和Linux下pCaffe分支一样有的 fast_rcnnSSDyolo

另外,因为电脑所限,我只编译了纯CPU版本,所以GPU版本不确定,也没有支持CUDA的Dynamic Parallelism动态并行特性。

使用tcl语言unknown指令操作形如LDAP的dn形式对象的方法

这是很久之前的一个工作了,简单回忆下思路。

我们的某系统中以树的形式保存了复杂系统的各种配置信息,并且给每个节点分配了形如LDAP的dn那样的名字,这就是一个dn:cn=somenone,ou=Group,dc=example,dc=com,但是我们把这个顺序反过来了,这样更符合国人的思考方式吧,就成了dc=com,dc=example,ou=Group,cn=somenone。这个系统又基本以增删改查的形式提供管理接口,以及别的一些管理接口。我们就以此为基础对常用功能开发了一套更简单的管理方法,使用的语言就是tcl,充分利用了tcl提供的expect等优秀功能,特别是我直接利用了tcl的unknown。使用unknown的机制给我们的dn添加各种动作,等于实现了它的对象化。
举例:

# Group中增加一个名为newuser的人
dc=com,dc=example,ou=Group.AddUser newuser
# 实际上我们的对象都是查出来的或根据规则动态生成的
set mygroup dc=com,dc=example,ou=Group
# 那之前增加用户的指令就成了
$mygroup.AddUser newuser

set userobj $mygroup,cn=newuser
# 修改年龄
$userobj.SetAttribute age 23

这里面就用了unknown,因为形如dc=com,dc=example,ou=Group.AddUser这个命令肯定查不到啊,我们定制个unknown处理函数,检查一下命令的格式,发现它符合我们的规则,就调用我们为它写的专门的处理函数。那处理函数在哪里呢?这点我们肯定也要采取些技巧了啊。
把它写在ou.tcl里,当然对于dc=com,dc=example,ou=Group,cn=newuser我们就写在cn.tcl中。这里我们补充一下,我们的系统里并不会出现LDAP这样有两级都叫dc,树的每一层都是不同的类型。这样我们只需要检查一下dn最终那一级是什么类型就去加载相应的tcl文件进来就可以了。那这个tcl文件就有dc=com,dc=example,ou=Group.AddUser这个命令么?当然没有了,这个dn好多呢,怎么可能每个都写一个过程呢。dc=com,dc=example,ou=Group.AddUser newuser这个命令被我们的unknown处理函数翻译成了AddUser dc=com,dc=example,ou=Group newuser,哦,原来那个函数叫AddUser,就放在ou.tcl文件里,轻松多了吧。

真他娘的的是个人才!