U2Net部署到CVAT实现自动化分割标注

本文仅供学习交流。

1.主要任务

把u2net的detect部署到cvat工具上,提供接口给用户使用,这样用户就可以自动标注了。

2.遇到的问题的解决: 

2.1 主要是配环境时候会出现各种报错,主要的解决办法是针对具体问题具体分析(百度+google+youtube)。

2.2 在部署的时候,cvat会默认调用自己内部的python解析器,但是这个解析器可能缺少我们代码里面import的库,此时不能过在ubuntu终端直接安装缺少的库,而是需要在yaml文件里面安装(官方没有说,纯靠自己感觉出来的)。

 2.3 端口号冲突问题,有些进程已经占用了8080,cvat的yaml配置文件对接的端口号也是8080,此时运行程序,会出现超时的问题,(解决:杀死已有占用8080的进程or改变yaml配置文件中的端口号,参考官网中的issue中有人遇到了该类问题)。

3.脚本对接:

部署到了cvat,但是暂时无法调用,可能原因是代码上的冲突,需要修改源代码。最大的难点是只能在网页上看到报错,且并没有返回调用源头的文件,没有调试的界面,所以暂时不知道我们的代码哪一行错了,可能需要看日志文件,看能不能找到调用关系,或者选择debug版本。(重写代码,本地调试后再上传)。

要注意生成的结果results是字典格式,这是CVAT的要求。

总结:需要注意的是,CVAT官方就是要求我们提交三个文件,一个function.yaml,一个main.py,一个model_handler.py,我们只需要模仿其他案例就行,案例在CVAT/serveless里面找,然后写yaml文件的时候,需要安装什么就在这里面安装,当时遇到很多nu module torch等问题都是在这个里面安装的。另外写后面两个py文件就是写4个函数,只需要把自己写的输入输出和案例对齐就行,中间写你自己的东西。然后部署成功可能会没法运行,这个时候可以在CAT的界面上点击一下自动标注的按键,他会报错,这个网页的报错没太多参考价值,可以去看日志的报错(就是下面的查看docker的日志),就可以找到你代码报错的地方,然后根据提示修改代码,基本上就可以实现debug的功能。

 以上就是我当时的报错,可以定位到我的main.py的43行,基本上就解决了问题。

如果还是不行,可以参考官方的debug模式的教程,写的很粗糙,配置也有点麻烦,我因为监控日志就搞定了,所以最后没用。

 

 Serverless tutorial | CVAT (opencv.github.io)

4.几个常用命令

查看nuclio的日志:nuctl invoke my-function --namespace nuclio --via external-ip

查看docker的日志:docker logs cvat

                                docker logs --follow nuclio --tail=1

5.参考连接:(主要是官网和github)

Semi-automatic and Automatic Annotation | CVAT (opencv.github.io)

Issues · nuclio/nuclio (github.com)

Issues · opencv/cvat (github.com)

Serverless tutorial | CVAT (opencv.github.io)

Issues · nuclio/nuclio (github.com)

cvat/serverless at develop · opencv/cvat (github.com)

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个简单的PyQt5界面实现U2Net图像分割的例子,使用PyTorch实现。 ``` import sys import os import numpy as np from PIL import Image from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog from PyQt5.QtGui import QPixmap import torch import torchvision.transforms as transforms from model.u2net import U2NET class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建UI界面 self.initUI() # 加载模型 self.model = U2NET() self.model.load_state_dict(torch.load("u2net.pth", map_location=torch.device('cpu'))) self.model.eval() def initUI(self): # 设置窗口标题和大小 self.setWindowTitle("U2Net Image Segmentation") self.setGeometry(100, 100, 800, 600) # 创建标签和按钮 self.label = QLabel(self) self.label.setGeometry(25, 50, 750, 450) self.label.setStyleSheet("border: 1px solid black;") self.button = QPushButton("Select Image", self) self.button.setGeometry(25, 525, 150, 50) self.button.clicked.connect(self.selectImage) self.button2 = QPushButton("Segment Image", self) self.button2.setGeometry(200, 525, 150, 50) self.button2.clicked.connect(self.segmentImage) def selectImage(self): # 打开文件对话框,选择要处理的图像 options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Images (*.png *.jpg *.jpeg)", options=options) if fileName: # 加载图像并显示在标签上 pixmap = QPixmap(fileName) pixmap = pixmap.scaled(750, 450) self.label.setPixmap(pixmap) # 将图像转换为PyTorch tensor格式 self.input_image = Image.open(fileName).convert("RGB") self.transform = transforms.Compose([transforms.Resize((320, 320)), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))]) self.input_tensor = self.transform(self.input_image).unsqueeze(0) def segmentImage(self): # 对选择的图像进行分割 with torch.no_grad(): output_tensor = self.model(self.input_tensor) # 将输出转换为PIL Image格式 output_tensor = output_tensor.squeeze().numpy() output_tensor = np.where(output_tensor > 0.5, 1.0, 0.0) output_image = Image.fromarray((output_tensor * 255).astype(np.uint8)).convert("L") # 显示分割结果 output_pixmap = QPixmap.fromImage(ImageQt(output_image)) output_pixmap = output_pixmap.scaled(750, 450) self.label.setPixmap(output_pixmap) if __name__ == "__main__": # 创建应用程序和主窗口 app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在上面的代码中,我们首先创建了一个`MainWindow`类,它继承自`QMainWindow`类,并重写了`initUI`方法来创建UI界面。在`initUI`方法中,我们创建了一个标签和两个按钮,其中一个用于选择图像,另一个用于对图像进行分割。 在选择图像按钮的回调函数`selectImage`中,我们使用`QFileDialog`打开一个文件对话框,让用户选择要处理的图像。然后,我们使用`PIL`库来加载图像,并将其转换为PyTorch tensor格式。在转换过程中,我们使用了`transforms`模块来对图像进行缩放、标准化等预处理操作。 在对图像进行分割的按钮回调函数`segmentImage`中,我们将输入张量传递给已加载的U2Net模型,并得到输出张量。然后,我们将输出张量转换为PIL Image格式,并将其显示在标签上。在转换过程中,我们使用了NumPy来将输出张量转换为二值图像,使用`PIL`库将其转换为灰度图像,并使用`QPixmap`将其转换为Qt图像格式。 最后,我们在`__main__`函数中创建了应用程序和主窗口,并调用`show`方法来显示窗口。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值