AI模型与计算机视觉的结合应用

在当今的技术领域,人工智能模型(AI)的应用越来越广泛,它们能够处理各种复杂的任务。本文将向展示如何利用最新的计算机视觉机器学习技术,通过结合多种模型,以最小的人工工作量启动一个初始的计算机视觉模型。将介绍一个模型训练流程,包括大型语言模型(LLMs)如最近发布的LLaMa 2,它们能够执行语言任务并能够跟进和迭代这些任务。此外,Midjourney允许快速生成详细、可定制的图像。而Roboflow的Autodistill则使得基于大型模型所持有的大量数据和信息训练更小、更快、更专业的模型成为可能。在本文中,将这些新解锁的能力结合起来,无需收集或标记数据,即可从头到尾训练一个目标检测模型。

发现,利用聊天LLMs的响应性和迭代性,可以使用Meta新发布的LLaMa 2模型来编写和迭代提示,以便Midjourney为项目数据集创建所需的图像。首先,为这个教程设定了一个任务。决定创建一个用于检测交叉路口交通灯的目标检测模型。然后,向LLaMa 2解释了想要做什么,并要求它为编写五个提示。尝试了这些提示在Midjourney上,虽然提供了结果,但并不是想要的。将这些问题与LLaMa 2沟通后,要求它编写新的提示。

在通过LLaMa 2迭代Midjourney的提示几次后,确定了要使用的提示。现在是时候生成将用于训练模型的图像了。由于Midjourney每次生成都会创建一组四张图像,决定使用Midjourney创建100张图像或25次生成。将这分成五个提示,每个提示尝试五次,因为Midjourney的特性意味着每次尝试都会创建独特的图像。除了生成的图像外,还使用了额外的`--style raw`参数来创建更具照片现实感的图像,`--aspect`参数来生成更真实和多样化的图像大小,以及`--repeat 5`来自动运行每个提示五次。

import os import glob import cv2 from PIL import Image for im_dir in midjourney_images: im = Image.open(im_dir) im_width, im_height = im.size res_im1_props = 0,0,im_width/2,im_height/2 res_im2_props = im_width/2,0,im_width,im_height/2 res_im3_props = 0,im_height/2,im_width/2,im_height res_im4_props = im_width/2,im_height/2,im_width,im_height for i in range(1,5): res_im = im.crop(locals()[f'res_im{i}_props']) res_im_dir = f'converted/{i}-{os.path.basename(im_dir)}' res_im.save(res_im_dir)

这些图像保存在`converted`文件夹中,然后可以使用它们来训练模型。

现在转向使用Ultraalytics的YOLOv8对模型进行标注和训练。将使用Autodistill的GroundedSAM和YOLOv8模块。安装并导入必要的包,并创建本体,本体用于对GroundedSAM的提示进行分类,以及希望它们拥有的类名:base_model = GroundedSAM(ontology=CaptionOntology({ "traffic light": "traffic_light" }))。对于项目,本体相当简单。可以根据自己的项目进行更改,例如添加、替换或包括汽车、人员等。然后,可以快速检查并迭代GroundedSAM的提示,通过检查它如何对数据集中的样本图像进行掩码,这表明它能够成功地标记图像中的所有交通灯:Automated Data Labeling and Model Training。现在已经为Autodistill确定了本体,现在可以标记整个数据集并进行训练,这可以用三行代码完成。base_model.label(input_folder = input_dir, extension = "", output_folder = output_dir)。

target_model = YOLOv8("yolov8n.pt") target_model.train("dataset/data.yaml", epochs=200)

完成后,可以评估模型的表现,并查看一些测试数据集图像,看看训练的模型表现如何。

现在已经有一个初始模型和初始数据集,已经成功地启动了一个用于生产的模型。有了这个,可以将模型和数据集上传到Roboflow以管理模型的进一步改进和添加。首先,将使用`roboflow` Python包上传数据集,通过将其转换为VOC数据集来使用Supervision。images_path = Path("voc_dataset/images")。images_path.mkdir(parents=True, exist_ok=True)。annotations_path = Path("voc_dataset/annotations")。annotations_path.mkdir(parents=True, exist_ok=True)。train_dataset = sv.DetectionDataset.from_yolo(images_directory_path="dataset/train/images", annotations_directory_path="dataset/train/labels", data_yaml_path="dataset/data.yaml")。valid_dataset = sv.DetectionDataset.from_yolo(images_directory_path="dataset/valid/images", annotations_directory_path="dataset/valid/labels", data_yaml_path="dataset/data.yaml")。dataset = sv.DetectionDataset.merge([train_dataset,valid_dataset])。dataset.as_pascal_voc(images_directory_path = str(images_path), annotations_directory_path = str(annotations_path))。

for image_name, image in dataset.images.items(): print("uploading:",image_name) image_path = os.path.join(str(images_path),image_name) annotation_path = os.path.join(str(annotations_path),f'{os.path.splitext(image_name)[0]}.xml') print(image_path,annotation_path) project.upload(image_path, annotation_path)

之后,可以生成数据集的一个版本,然后上传模型。project.version("1").deploy(model_type="yolov8", model_path=f"runs/detect/train/")。添加主动学习。一旦模型上传,可以部署它并使用主动学习将真实世界的数据添加到数据集中,以训练下一轮模型。model = project.version("1").model。model.confidence = 50。model.overlap = 25。image_path = "/converted/b0816d3f-3df7-4f48-a8fb-e937f221d6db.png"。prediction = model.predict(image_path)。prediction.json()。project.upload(image_path)。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485