优化图像识别模型以适应边缘部署
在现代的图像识别领域,模型的大小和性能是至关重要的。随着技术的发展,有能力将大型复杂的计算机视觉模型,如Segment Anything Model (SAM),转化为更小、更适合边缘部署的模型,例如YOLOv8。这些小型模型在推理时间和计算资源的限制下,提供了更好的性能。
Autodistill是一个自动化工具,它接受一个与项目相关的图像文件夹,使用一个大型通用模型(称为“基础模型”)自动对这些图像进行标注,并使用这些图像来训练目标模型。为了告诉Autodistill如何在项目中标注图像,需要指定一个提示(prompt),以指导基础模型进行注释。
但是,什么提示最适合用例呢?怎么知道是否选择了正确的提示?这些是关键问题,尤其是当计划为模型使用成百上千的图像进行标注时。不希望用Autodistill标注了一千张图像后,发现提示并没有准确地标注数据。
在本指南中,将展示如何使用开源的CV evals框架来评估与Autodistill一起使用的提示。让开始吧!
步骤1:安装Autodistill和CVevals
在本指南中,将使用Grounded SAM作为基础模型与Autodistill一起使用。Grounded SAM是Grounding DINO和Segment Anything Model (SAM)的结合体。将从Grounded SAM中提取知识到一个更小的模型中。
首先,需要安装Autodistill和相关的基础模型包autodistill-grounded-sam:
pip install autodistill autodistill-grounded-sam
接下来,需要安装CVevals,这是将用于评估不同提示的框架:
git clone https://github.com/roboflow/cvevals
cd cvevals
pip install -e .
CVevals是一个独立的工具,附带了一组用于比较提示的启动脚本。所有启动脚本都在examples目录中。在本指南中,将使用examples/grounding_dino_compare.py评估器与Autodistill一起使用。
还需要为这个例子安装Grounding DINO。在cvevals根目录下运行以下命令:
git clone https://github.com/IDEA-Research/GroundingDINO.git
cd GroundingDINO/
pip3 install -r requirements.txt
pip3 install -e .
mkdir weights
cd weights
wget https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
步骤2:准备评估数据
在本指南中,将使用Autodistill构建一个识别货运集装箱的模型。已经准备了一组货运集装箱的数据集,用于训练模型。
为了评估提示,需要目标模型的预测——在本例中,是使用Grounding DINO的Grounded SAM——以及所做的注释的地面真实数据。目标模型的预测与地面真实数据进行比较,以确定目标模型在注释数据集中的图像的准确性。
在评估货运集装箱模型的提示之前,需要一些地面真实数据。首先,在Roboflow中创建一个项目:
然后,上传大约10-20张代表想要用Autodistill标注的图像。使用Roboflow Annotate,在数据集上创建注释:
在批准图像包含在数据集中时,确保将所有图像添加到训练集中:
当注释了图像后,在Roboflow平台的侧边栏点击“生成”,并创建一个包含所有注释图像的版本:
现在准备好比较与Autodistill一起使用的不同的提示了。
步骤3:评估基础模型提示
所有CVevals脚本都接受Roboflow数据集作为输入。要设置提示,打开examples/grounding_dino_compare.py文件(或正在工作的任何示例文件),并将evals列表中的提示替换为想要测试的提示列表。
所有与Autodistill一起工作的比较脚本都有一个标准API,所以这部分代码无论正在使用哪个基础模型都是适用的。
以下是将在本例中测试的提示:
垃圾
废物
废料
让编辑examples/grounding_dino_compare.py文件中的evals列表:
evals = [
{"classes": [{"ground_truth": "垃圾", "inference": "垃圾"}], "confidence": 0.5},
{"classes": [{"ground_truth": "垃圾", "inference": "废物"}], "confidence": 0.5},
{"classes": [{"ground_truth": "垃圾", "inference": "废料"}], "confidence": 0.5},
]
"ground truth"是在注释中给每件垃圾的标签。如果使用了另一个地面真实标签,适当替换该值。
"inference"是将传递给底层模型的。
有了这个代码准备,可以运行评估脚本了。需要Roboflow工作空间和模型IDs、版本号和API密钥。要了解如何检索这些值,请参考Roboflow文档。
让运行评估脚本:
python3 examples/dino_compare_example.py --eval_data_path=./images1 \
--roboflow_workspace_url=james-gallagher-87fuq \
--roboflow_project_url=trash-detection-2xndh \
--roboflow_model_version=1 \
--config_path=./GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py \
--weights_path=./GroundingDINO/weights/groundingdino_swint_ogc.pth
这个脚本将根据是在CPU还是GPU上工作以及想要标注的图像数量,运行几分钟。最后,将出现一个表格显示评估结果。默认情况下,评估是按f1分数排序的。
以下是垃圾评估的结果:
从这个代码中,可以看到“垃圾”是标注数据的最佳提示。现在可以通过Autodistill传递这个提示来标注数据。
步骤4:运行基础模型
对于Grounded SAM示例,可以使用以下代码运行基础模型:
base_model = GroundedSAM(ontology=CaptionOntology({"垃圾": "垃圾"}))
base_model.label("./context_images", extension=".jpeg")
在这段代码中,将提示“垃圾”映射到“垃圾”。“垃圾”被传递给基础模型,所有容器都被标记为“垃圾”。虽然提示和标签是相同的,但如果另一个提示更有效,这些将是不同的(例如,提示可能是"废物",标签可能是"垃圾")。
然后开始标注过程。
可以使用标注的图像来训练目标模型。有关如何训练目标模型的更多信息,请查看Autodistill指南中的目标模型部分,或参考Autodistill文档。
在本指南中,展示了如何使用CVevals来评估与Autodistill一起使用的提示。设置了Autodistill和CVevals,比较了20个图像数据集上三种不同提示的性能,然后使用最佳提示来标注其余数据集。
现在有了使用Autodistill找到最优化提示所需的工具。