# dwarf
**Repository Path**: yinguobing/dwarf
## Basic Information
- **Project Name**: dwarf
- **Description**: An open source solution for automatic data labeling and management.
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-05-02
- **Last Updated**: 2022-05-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Dwarf
视频与图像数据的自动化整理与标记。
## 功能
- 自动发现新文件。
- 支持自动与手动标签。
- 文件集中存储,标签数据库存储。
## 快速开始
以下内容介绍了如何在本机部署并启用Dwarf服务。
### 依赖安装
Dwarf依赖以下应用与服务包。在运行之前需要安装完成。
#### RabbitMQ
版本 3.8.18。用于消息队列。可遵循官网安装教程。或者使用Docker服务。
官方安装指南:https://www.rabbitmq.com/download.html。
Docker参考命令:
```bash
sudo docker run -d --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
```
#### MongoDB
版本 4.4。用于标签存储。
官方安装教程:https://docs.mongodb.com/manual/installation/
#### FFMPEG
用于视频标签提取。可以使用系统包管理器安装,也可以自行编译安装。包管理器安装方式:
```bash
# Ubuntu
sudo apt install ffmpeg
```
#### 其它Python相关依赖
可以使用 pip requirements.txt 安装。
```bash
python3 -m pip install -r requirement.txt
```
### 应用安装
当前直接使用源码。在目标机器上使用git clone代码。
```bash
git clone https://github.com/yinguobing/dwarf.git
```
## 服务设定
Dwarf使用配置文件 `config.yml` 来设定服务行为。可以使用任意文本编辑器编辑该配置文件。服务启动时会自动加载该配置文件。
### 设置文件目录
Dwarf服务当前会使用两个目录。
第一个目录是 `barn`,待处理的文件需要放置在此文件夹中。
第二个目录是 `warehouse` ,处理后的文件会存储在此文件夹中。
```yaml
dirs:
barn: /path/to/barn
warehouse: /path/to/warehouse
```
### 设置待处理文件类型
Dwarf使用文件后缀名来判定文件类型。将文件后缀名以文本的形式添加到配置文件即可。不区分大小写。
```yaml
video_types: ["avi", "mp4"]
image_types: ["jpg", "jpeg", "png", "gif", "bmp"]
```
### 设置消息队列
当前使用RabbitMQ。在配置文件中指定消息服务地址与队列名称。
```yaml
rabbitmq:
address: "localhost"
queue: "file_list"
```
### 设置数据库
在启用Dwarf服务前,需要为其创建专用的数据库。例如:
- 数据库访问地址 `localhost` 端口 `27017`。
- 数据库名称为 `dwarf`
- 数据库通过用户名 `mongoadmin` 与密码 `secret` 授权访问,该用户具备读写权限。
将以上信息填入配置文件如下:
```yaml
mongodb:
host: "localhost"
port: 27017
username: "mongoadmin"
password: "secret"
name: "dwarf"
collections:
images: "images"
videos: "videos"
```
其中 `images` 与 `videos` 为collection的名称。Dwarf会自动创建。
## 权限配置
Dwarf服务需要具备目标文件夹的读写权限。假设用于该服务运行的用户名为`dwarf`,可为其更改目录权限。以`barn`目录为例:
```bash
sudo chown dwarf:dwarf barn
```
## 运行
首先切换到该服务的执行用户,例如:
```bash
su dwarf
```
之后执行以下命令开启服务:
```bash
python3 main.py
```
示例输出如下:
```bash
$ python3 main.py
2021-07-07 10:36:33,121 root INFO Porter is ready.
2021-07-07 10:36:33,125 root INFO Stocker is ready.
2021-07-07 10:36:33,138 root INFO Clark is ready.
2021-07-07 10:36:33,138 root INFO Steward is ready.
2021-07-07 10:36:33,138 porter INFO [*] Monitoring...
2021-07-07 10:36:33,144 steward INFO [*] Waiting for messages...
```
如果需要使用其它配置文件,可以在命令中指定:
```bash
python3 main.py myconfig.yml
```
处理日志在文件 `dwarf.log` 中。
## 使用方法
录入Dwarf系统的文件需要满足以下条件:
- 是当前系统所支持的文件格式。例如视频,图像。
- 需要为文件指定标签与作者。
将满足条件的文件整理后放置到监控目录下即可,系统会自动将文件分析归档。
例如现有来自园区入口监控的视文件若干,需要录入系统,可按如下步骤实现。
1. 在监控目录 `barn` 下新建作业目录,名称自行指定,例如 `upload`。
2. 在作业目录下新建 `tags.txt` 文本文档,在其中手动指定文件标签,使用**空格**分隔,不要换行。例如 `花园 草坪 猫 狗`。手动标签的意义在于方便后期回溯查找。
3. 在作业目录下新建 `authors.txt` 文本文档,在其中手动录入作者。多个作者可使用**空格**分隔,不要换行。例如 `李白 杜甫 李清照`
此时目录树的状况如下:
```bash
barn
└── upload
├── authors.txt
└── tags.txt
```
最后一步,将视频文件拖入该目录下即可。
## 注意事项
以下表现为服务的预期行为
- 处理完成后的文件会被自动归档并从作业目录消失。
- 无法处理的文件会留在原地。
- 如果存在多级目录,默认使用根目录标签与作者。
- 如果存在多级目录,且当前目录与根目录存在标签与作者,则当前目录优先。
以下文件可能无法被处理
- 不支持的文件格式。
- 不完整的文件,例如解码失败的视频文件,损坏的图像文件。
- 没有读取权限的文件。
- 没有配套标签与作者的文件。
- 在写入数据库时失败的文件。
## 异常处理
### 处理失败原因查询
如果文件无法被处理,可以通过日志文件查询具体原因。
### 手动执行
如果目录下存在之前无法被处理的文件(例如`tags.txt`文件缺失),但是经过处理后满足处理条件的情况下(例如补上了缺失的`tags.txt`文件),可以在当前目录下新建`dwarf.run`文件手动触发处理流程。