labelImg 修改不同类别的颜色(点大小、标签大小、框角)+ 打包为.exe文件 + 解决闪退bug
KeyWords:点大小、标签大小、框角
1. 问题
在我的任务中,有 blue_obj
、 green_obj
和 yellow_obj
,但它们显示在不同颜色的框中,这使得我很难检查注释。我直接修改 box 的颜色后,下一张图片就不生效了。我应该如何将 box 的颜色修改为特定颜色?
例如:
- blue_obj:命名是蓝色,但 box 是黄色
- red_obj:命名是红色,但 box 是蓝色
- yellow_obj:命名是黄色,但 box 是红色
以上这些框的颜色就会让人混乱。
2. 解决方案
为了解决这个问题,我们可以参考《LabelImg目标检测标注工具之标记框修改显示明显、特定标签指定颜色》这篇文章,具体做法为:
Step 1 下载 labelImg 的源码,下载地址为:labelImg
Step 2 根据 Readme -> Installation -> Build from source
,按照不同操作系统安装相关依赖
pip install pyqt=5
pip install -c anaconda lxml
Step 3 修改 labelImg\libs\utils.py
文件中的函数:
"""
函数解释:根据text(即标签名)生成对应颜色
修改自己需要的标签
"""
def generate_color_by_text(text):
s = ustr(text)
hash_code = int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16)
r = int((hash_code / 255) % 255)
g = int((hash_code / 65025) % 255)
b = int((hash_code / 16581375) % 255)
Q = QColor(r, g, b, 155)
# RGBA格式: (R, G, B, 透明度),范围均为 [0, 255],其中透明度的越大越不透明,越小越透明
if text == "类别1": # 类别1 设置为红色(完全不透明)
Q = QColor(255, 0, 0, 255)
elif text == "类别2": # 类别2 设置为绿色(完全不透明)
Q = QColor(0, 255, 0, 255)
elif text == "类别3": # 类别3 设置为蓝色(完全不透明)
Q = QColor(0, 0, 255, 255)
return Q
💡 Tips:其中 类别
指的是具体的类别名称,比如 cat
、dog
这种。
Step 4 编译源码,使上述修改生效:
pyrcc5 -o libs/resources.py resources.qrc
Step 5 打开修改后的 labelImg
:
python labelImg.py
3. 修改 box 的四个角的大小和 label 名称的大小
修改 libs\shape.py
文件:
class Shape(object):
P_SQUARE, P_ROUND = range(2)
MOVE_VERTEX, NEAR_VERTEX = range(2)
# The following class variables influence the drawing
# of _all_ shape objects.
line_color = DEFAULT_LINE_COLOR
fill_color = DEFAULT_FILL_COLOR
select_line_color = DEFAULT_SELECT_LINE_COLOR
select_fill_color = DEFAULT_SELECT_FILL_COLOR
vertex_fill_color = DEFAULT_VERTEX_FILL_COLOR
h_vertex_fill_color = DEFAULT_HVERTEX_FILL_COLOR
point_type = P_ROUND
point_size = 8 # 点的大小
scale = 1.0
label_font_size = 8
💡 Tips:要想让每一个框在旁边显示其类别,可以使用快捷键 ctrl + shift + p。
4. 修改 [显示类别] 的文字大小
在 labelImg.py
中,修改:
def paint_canvas(self):
assert not self.image.isNull(), "cannot paint null image"
self.canvas.scale = 0.01 * self.zoom_widget.value()
self.canvas.overlay_color = self.light_widget.color()
self.canvas.label_font_size = int(0.02 * max(self.image.width(), self.image.height()))
self.canvas.adjustSize()
self.canvas.update()
将 self.canvas.label_font_size = int(0.02 * max(self.image.width(), self.image.height()))
中的 0.02
改成为 0.01
或其他你想要的大小。
5. [补充] RBGA 颜色大全
RGB颜色大全(HEX、对照表、Matplotlib、plt、好看的颜色)
6. 将 labelImg 打包为 .exe 可执行文件
6.1 安装环境
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
6.2 打包为 .exe 文件
conda activate 之前的环境
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "CustomlabelImg" -c labelImg.py -p ./libs -p ./
pyinstaller
是一个可以将 Python 代码打包成独立可执行程序的工具。这个命令的意思是:
pyinstaller labelImg.py
:使用pyinstaller
打包labelImg.py
这个 Python 脚本文件;--hidden-import=pyqt5
和--hidden-import=lxml
:表示隐藏导入pyqt5
和lxml
两个模块,因为它们是labelImg.py
依赖的第三方模块,需要一起打包;-F
:表示生成一个文件,将所有依赖都打包到一个可执行文件中;-n "CustomlabelImg"
:表示生成的可执行文件名为CustomlabelImg
;-c labelImg.py
:表示要打包的主 Python 文件是labelImg.py
;-p ./libs
和-p ./
:表示要打包的额外文件夹有./libs
和当前目录
。
总结:使用 pyinstaller
将 labelImg.py
及其依赖的第三方库、资源文件等都打包到一个名为 labelImg
的可执行文件中。这样生成的 labelImg
文件可以在其他机器上直接运行,不需要安装 Python 环境和第三方库。
6.2 存在的问题:预置的标签怎么使用?
在 labelImg 项目中,有 data\predefined_classes.txt
这样的文件,目的是预置一些类别:
cat
dog
lion
但是按照上面打包的方式之后,是没有使用预置文件的。如果想要使用预置文件,则在打包时使用下面命令:
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "CustomlabelImg" -c labelImg.py -p ./libs -p ./ -p ./data --add-data=./data/predefined_classes.txt;./data
💡 Tips:注意自己修改 data\predefined_classes.txt
中的内容嗷。
6.3 自定义图标
假如我有一个名为 data\labelImgXtastien.ico
的图标,则可以使用下面的命令:
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "CustomlabelImg" -c labelImg.py -p ./libs -p ./ -p ./data --add-data=./data/predefined_classes.txt;./data --icon=./data/labelImgXtastien.ico
💡 Tips:将图片转换为图标请见 image2ico 😄
7. 闪退问题
7.1 [不推荐] 临时方案
有时候我们运行 python labelImg.py
或者运行 CustomlabelImg.exe
文件后,在选择了图片文件夹和 xml 标签文件夹后会报错,此时我的解决方案不太好,但是也可以用 😂
- 在你要标注的文件夹下打开 cmd 或者 powershell;
- 切换有 labelImg 的 Python 环境;
- 打开环境自带的 labelImg(不是我们修改后的 labelImg):
labelImg
- 加载图片文件夹和标签文件夹;
- 如果没有问题了,退出这个 labelImg;
- 打开我们自己的 labelImg:运行
python labelImg.py
或者运行CustomlabelImg.exe
文件; - 再次加载图片文件夹和标签文件夹;
- 此时应该就正常了。
💡 Tips:以上的解决方案虽然能解决问题,但是临时且繁琐的。
7.2 [推荐] 一劳永逸的方法
闪退的原因是有一个名为 C:\Users\用户名\.labelImgSettings.pkl
的文件存在,这导致了闪退,那我们可以修改 labelImg.py
,当检测到有这个文件时,自动删除,代码如下:
def _debug_for_windows():
import getpass
username = getpass.getuser()
need_to_del_file_path = os.path.join(r'C:\Users', username, '.labelImgSettings.pkl')
if os.path.exists(need_to_del_file_path):
os.remove(need_to_del_file_path)
if __name__ == '__main__':
_debug_for_windows()
sys.exit(main())
💡 Tips:这种解决方案也是可以打包为 .exe
可执行文件的 😄。
参考
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)