Label Studio 源码托管于 GitHub,地址为 https://github.com/heartexlabs/label-studio。
Label Studio 是一个开源的数据标注工具,并且使用了 Apache 2.0 LICENSE,没有商业化和闭源的限制(遵守协议的情况下)。
后端是用纯 Python 编写的,由 Django 提供支持。
前端部分是一个与后端无关的 React + MST 应用程序,包括在一个预编译脚本中。
Label Studio 在 GitHub 官方项目中提供了多种使用方式,包括 docker、本地等,想要直接使用而不修改的话,十分方便。
但是如果想针对 Label Studio 进行某些定制化开发的话,可能就需要了解一些它在本地启动的方式了。此处使用 Windows 平台下的 PyCharm 作为例子,简略讲述 Label Studio 怎么在 PyCharm 下启动起来并且能自定义一些参数。
本人在此之前没有使用 Python 开发过 Django,也未曾有过任何开发 Python web 的经历。文中所讲述的方案、内容可能不一定完全正确。
该教程仅用于记录安装 Label Studio 方面的步骤,对过程中出现的问题不负任何责任。
相关改进请在评论区提出,会虚心接受改进。文章地址:https://blog.csdn.net/qq_36670734/article/details/122510886
到本地文件夹中执行命令:
git clone https://github.com/heartexlabs/label-studio.git
或者利用 PyCharm 中的 git clone
来下载代码
Label Studio 支持的 Python 版本是 大于等于 3.6 小于等于 3.9,见 GitHub install-locally-with-pip。与时俱进的是,就在此篇文章编写的时候(2022-01-15),Label Studio 将原本小于 3.9 的限制改为了小于等于,修改时间是 2022-01-15 04:27。
因此此处需要插一句了,在项目的 Dockerfile
文件中,有如下的依赖,如图:
可以看到第 15 行还是 python3.8。预计将来某个时候将会改成 python3.9。
设置虚拟环境的原因是:由于个人喜好,不愿意在 Python 的全局环境中安装各种 packages,避免可能存在的依赖问题,所以此处新建了虚拟环境。
打开 PyCharm 中的 Python 解释器设置(File - Setting - Project: label-studio - Python Interpreter),新建点击右边齿轮符号选择 add 打开新建环境的界面。选择本地安装的 Python 解释器的位置即可,如图:
做完此步骤之后,就会在工程的 venv
文件夹路径下新建了这个工程的环境。当然,可以在上图的 Location 里面指定环境的其他位置。
安装 GitHub 给的教程,地址:GitHub install-for-local-development,文字如下:
# Install all package dependencies
pip install -e .
只要去工程路径下执行 pip install -e .
命令即可。
作为使用 PyCharm 的我,非轻易不会打开控制台命令行进行操作。一般来说,很多项目都会有 requirements.txt
的文件。Label Studio 的这个文件在 deploy
文件夹下面。
打开设置(Setting - Tools - Python Intergated Tools),在 Packaging - Package requirements file 中选择 requirements.txt
的路径即可。
打开 requirements.txt
文件,PyCharm 可能会在文件上方提示需要 Install requirements,安装提示安装即可。或者没有出来提示的,打开 .py
文件,也会有相关提示出现,如图:
若再没有出现,使用命令行安装即可。
按照官方给的教程,运行下面两行命令即可启动项目,如下:
# Run database migrations
python label_studio/manage.py migrate
# Start the server in development mode at http://localhost:8080
python label_studio/manage.py runserver
第一行是第一次运行的时候初始化项目所需的 SQLite 数据库;第二行是运行项目。
我这边先执行了官网的教程的命令,首先数据库位置放在了我不想要的地方,其次数据库也启动失败了。
首先讲述数据库的位置。使用默认参数启动的项目,数据库、其他文件的路径都是在用户目录下的,比如 Windows 下一般就是 C:\Users\{user-name}\AppData\Local\label-studio\label-studio
。这个对于我来说不是很喜欢。
如果本地环境是 Python 3.7 的话,在启动的时候,会报错 SQLite does not support JSONFields.
错误,如下:
ERRORS:
data_export.Export: (fields.E180) SQLite does not support JSONFields.
data_manager.Filter: (fields.E180) SQLite does not support JSONFields.
data_manager.View: (fields.E180) SQLite does not support JSONFields.
data_manager.View: (fields.E180) SQLite does not support JSONFields.
data_manager.View: (fields.E180) SQLite does not support JSONFields.
projects.Project: (fields.E180) SQLite does not support JSONFields.
projects.Project: (fields.E180) SQLite does not support JSONFields.
projects.ProjectSummary: (fields.E180) SQLite does not support JSONFields.
projects.ProjectSummary: (fields.E180) SQLite does not support JSONFields.
projects.ProjectSummary: (fields.E180) SQLite does not support JSONFields.
projects.ProjectSummary: (fields.E180) SQLite does not support JSONFields.
tasks.Annotation: (fields.E180) SQLite does not support JSONFields.
tasks.Annotation: (fields.E180) SQLite does not support JSONFields.
tasks.AnnotationDraft: (fields.E180) SQLite does not support JSONFields.
tasks.Prediction: (fields.E180) SQLite does not support JSONFields.
tasks.Prediction: (fields.E180) SQLite does not support JSONFields.
tasks.Task: (fields.E180) SQLite does not support JSONFields.
tasks.Task: (fields.E180) SQLite does not support JSONFields.
webhooks.Webhook: (fields.E180) SQLite does not support JSONFields.
或者可能会提示
You are on Windows Python 3.7.
This Python version uses SQLite 3.31.1 which does not support JSON Field.
Read more about this issue: https://code.djangoproject.com/wiki/JSON1Extension [Windows section]
说明 SQLite 版本不匹配。
首先解决 SQLite 问题。
去官网 SQLite Download Page 下载 SQLite 包。Windows 系统下载 Precompiled Binaries for Windows
解压到 Python 目录下,替换 sqlite3.dll
文件即可。
其次解决默认数据库位置(默认多媒体文件位置)。这个不应该算是问题。官方的启动方式是 python label_studio/manage.py migrate
和 python label_studio/manage.py runserver
,这也是 Django 的正常启动方式。但是这种方式不能自定义各种参数,比如日志等级、多媒体文件路径、是否开启 debug 等。
经过源码的阅读,发现 server.py
文件有着和 manage.py
异曲同工的作用。由于该文件代码行数较多,就简单分析一下。
首先 main()
函数里面解析了命令行参数,然后把参数加入到环境变量中。接下来执行数据库的初始化操作,它内部调用了 call_command('migrate', '--no-color', verbosity=0)
语句,也就是执行了 python label_studio/manage.py migrate
操作。最后根据环境变量来是否启动项目,默认启动。
所以执行 server.py
即可启动项目。
我这里加入了如下的启动参数
–data-dir …/mydata/ --log-level WARNING -b -d
如图:
参数解释:
--data-dir ../mydata/
:设置多媒体路径为 ../mydata/
。
--log-level WARNING
:日志等级设置为 warn。
-b
:不自动打开浏览器。
-d
:开启 debug 模式。
其他参数请阅读 argparser.py
文件和 server.py
源码。
由于没有使用过 Django,所以当如上设置之后,发现静态文件无法加载。经过比对 server.py
和 manage.py
发现, manage.py
文件比 server.py
多了一行如下代码:
os.environ.setdefault('DEBUG', 'True')
也就是说,默认启动即开启了 debug 模式。
经过恶补了 Django 皮毛知识之后才知道,开启 debug 模式后,静态文件会走路由默认从项目路径找,否则会走普通的方式直接通过 ip:port/xxx
寻找静态文件。
关闭 debug 模式,可以使静态文件更好地结合 CDN,减少服务器的压力。
而上述启动命令行参数中已经指定了 -d
表示启动 debug 模式了,所以问题就出在,它没有把 debug 加入到环境变量中,也就是少了这行代码。
所以可以修改 server.py
文件,在 main
中加入如下代码:
os.environ.setdefault('DEBUG', 'True')
变成下述代码:
if __name__ == "__main__":
os.environ.setdefault('DEBUG', 'True')
sys.exit(main())
我这里采用了可配置的修改,加入了如下代码:
if input_args.debug:
os.environ.setdefault('DEBUG', 'True')
修改的位置在 main()
方法内部,如图:
这样子就能做到在命令行参数中指定 -d
开启 debug 模式了。
终于,在启动了项目之后,可以使用项目了。
默认启动的端口是 8080,所以在本地打开 http://localhost:8080 即可访问 Label Studio。