当前位置: 首页 > 科技观察

几行代码搭建一个功能齐全的物体检测模型,他是怎么做到的?

时间:2023-03-15 19:51:54 科技观察

机器学习和计算机视觉现在很流行。我们都看过有关自动驾驶汽车和面部识别的新闻,并且可能想象过构建我们自己的计算机视觉模型会有多酷。然而,进入该领域并不总是那么容易,尤其是在没有强大数学背景的情况下。如果你只想做小实验,像PyTorch和TensorFlow这样的库可能会很无聊。在本教程中,作者为任何人提供了一种简单的方法,只需几行代码即可构建功能齐全的对象检测模型。更具体地说,我们将使用Detecto,这是一个构建在PyTorch之上的Python包,可简化流程并向所有级别的程序员开放。快速简单的示例为了演示如何轻松启用Detecto,让我们加载一个预训练模型并对下图进行推理:首先,使用pip下载Detecto包:pip3installdetecto然后,将上图保存为“fruit.jpg"并在与图像相同的文件夹中创建一个Python文件。在Python文件中,写入如下5行代码:fromdetectoimportcore,utils,visualizeimage=utils.read_image('fruit.jpg')model=core.Model()labels,boxes,scores=model.predict_top(image)visualize。show_labeled_image(image,boxes,labels)运行此文件后(如果您的计算机上没有启用CUDA的GPU,可能需要几秒钟;稍后会详细介绍),您应该会看到类似以下内容:在5行代码中,这真的很酷。以下是我们在每个步骤中所做的:1)导入Detecto模块2)读取图像3)初始化预训练模型4)在图像上生成顶部预测5)绘制我们对预测图的预测Detecto使用模型动物园来自PyTorchFasterR-CNNResNet-50FPN,能够检测大约80种不同的物体,例如动物、车辆、厨房用具等。但是,如果您想检测自定义对象,例如可口可乐和百事可乐罐、斑马和长颈鹿,该怎么办?此时您会发现在自定义数据集上训练检测器模型同样简单;同样,您只需要5行代码和一个现有数据集,或者花一些时间标记图像。构建自定义数据集在本教程中,作者将从头开始构建他们自己的数据集。建议你也这样做,但如果你想跳过这一步,你可以在这里下载一个示例数据集(从斯坦福的Dog数据集修改而来)。对于我们的数据集,我们将训练我们的模型以检测来自RoboSub竞赛的水下外星人、蝙蝠和女巫,如下所示:理想情况下每个类别至少100张图像。好处是每张图像中可以有多个对象,因此理论上,如果每张图像都包含要检测的每种类型的对象,则总共可以获得100张图像。此外,如果您有视频片段,Detico可以轻松地将这些视频片段分割成可在数据集中使用的图像:fromdetecto.utilsimportsplit_videosplit_video('video.mp4','frames/',step_size=4)以上代码在“video.mp4”并将其保存为“frames”文件夹中的JPEG文件。生成训练数据集后,您应该有一个类似于以下内容的文件夹:images/|image0.jpg|image1.jpg|image2.jpg|...如果需要,您还可以使用另一个包含一组验证图像的文件夹。现在是耗时的部分:标记。Detecto支持PASCALVOC格式,该格式具有包含图像中每个对象的标签和位置数据的XML文件。要创建这些XML文件,您可以使用开源的LabelImg工具,如下所示:pip3installlabelImg#DownloadLabelImgusingpiplabelImg#Launchtheapplication现在,您应该会看到一个弹出窗口。单击左侧的“打开目录”按钮,然后选择要标记的图像文件夹。如果一切正常,您应该会看到如下内容:要绘制边界框,请单击左侧菜单栏中的图标(或使用键盘快捷键“w”)。然后您可以在对象周围拖一个框并写入/选择标签:完成图像标签后,使用CTRL+S或CMD+S保存XML文件(为简单起见,您可以使用自动填充的默认值文件位置和名称)。要标记下一张图片,请单击下一张图片(或使用键盘快捷键“d”)。处理完整个数据集后,您的文件夹应如下所示:images/|image0.jpg|image0.xml|image1.jpg|image1.xml|...我们准备开始训练我们的对象检测模型!访问GPU首先,检查您的计算机是否具有支持CUDA的GPU。由于深度学习需要大量的处理能力,因此在典型的CPU上进行训练可能会非常慢。值得庆幸的是,大多数现代深度学习框架,例如PyTorch和Tensorflow,都可以在GPU上运行,从而使处理速度更快。确保您已下载PyTorch(如果您安装了Detecto,则应该下载),然后运行以下两行代码:importtorchprint(torch.cuda.is_available())如果它打印True,则您可以跳到下一部分。如果它显示False,请不要担心。按照以下步骤创建GoogleColaboratorynotebook,这是一个带有免费GPU的在线编码环境。对于本教程,您将只在GoogleDrive文件夹中工作,而不是在您的计算机上工作。1)登录到GoogleDrive2)创建一个名为“DetectoTutorial”的文件夹并导航到它3)将您的训练图像(和/或验证图像)上传到该文件夹??4)右键单击??,转到“更多”并单击“GoogleColaboratory”:您现在应该会看到这样的界面:5)如果您愿意,可以为您的笔记本命名,然后转到“编辑”->“笔记本设置”->“硬件加速器”,然后选择“GPU”6)输入以下代码“挂载”您的驱动器,将目录更改为当前文件夹,然后安装Detecto:importosfromgoogle.colabimportdrivedrive.mount('/content/drive')os.chdir('/content/drive/MyDrive/DetectoTutorial')!pipinstalldetecto为了确保一切正常,您可以创建一个新的代码单元并键入!ls以检查您是否在正确的目录中。训练自定义模型最后,我们现在可以在自定义数据集上训练模型。如前所述,这是简单的部分。只需要4行代码:fromdetectoimportcore,utils,visualizeddataset=core.Dataset('images/')model=core.Model(['alien','bat','witch'])model.fit(dataset)让我们再分解一下我们对每一行代码做了什么:1.导入Detecto模块2.从“images”文件夹创建一个数据集(其中包含我们的JPEG和XML文件)3.初始化模型检测自定义对象(外部Starmen,Bats,andWitches)4.在数据集上训练我们的模型根据数据集的大小,这可能需要10分钟到一个多小时才能运行,因此请确保您的程序不会在上述语句执行后运行立即退出(例如:您正在使用Jupyter/Colab笔记本,它在活动时保持状态)。使用经过训练的模型现在您已经有了经过训练的模型,让我们在一些图像上对其进行测试。要从文件路径读取图像,您可以使用detecto.utils模块中的read_image函数(或来自上面创建的数据集的图像):#Specifythepathtoyourimageimage=utils.read_image('images/image0.jpg')predictions=model.预测(图像)#predictionsformat:(标签,框,分数)标签,框,分数=预测#['外星人','蝙蝠','蝙蝠']打印(标签)#xminyminxmaxymax#tensor([[569.2125,203.6702,1003.4383,658.1044],#[276.2478,144.0074,579.6044,508.7444],#[277.2929,162.6719,627.9399,511.9841]])print(boxes)#tensor([0.9952,0.9853]co,0.95)你可以23,0.95看,模型的predict方法返回一个包含3个元素的元组:label、box和score。在上面的示例中,该模型以0.995(score[0])的置信度在坐标[569,204,1003,658](box[0])处预测了一个外星人(label[0])。根据这些预测,我们可以使用detecto.visualize模块来绘制结果。例如:visualize.show_labeled_image(image,boxes,labels)使用接收到的图像和预测运行上面的代码将产生如下结果:如果您有视频,则可以对其运行对象检测:visualize。detect_video(model,'input.mp4','output.avi')这将获取一个名为“input.mp4”的视频文件,并根据给定模型的预测生成一个“output.avi”文件。如果您使用VLC或其他视频播放器打开此文件,您应该会看到一些预期的结果!最后,您可以从文件中保存和加载模型,从而保存您的进度并稍后返回:model.save('model_weights.pth')#...Later...model=core.Model.load('model_weights.pth',['alien','bat','witch'])高级用法你会发现Detecto并不局限于5行代码。例如,该模型不如您希望的那样好。我们可以尝试通过使用Torchvision转换扩展我们的数据集并定义自定义数据加载器来提高其性能:fromtorchvisionimporttransformsaugments=transforms.Compose([transforms.ToPILImage(),transforms.RandomHorizo??ntalFlip(0.5),transforms.ColorJitter(saturation=0.5),transforms.ToTensor(),utils.normalize_transform(),])dataset=core.Dataset('images/',transform=augmentations)loader=core.DataLoader(dataset,batch_size=2,shuffle=True)此代码应用随机对数据集中的图像进行水平翻转和饱和效果,增加数据的多样性。然后,我们定义一个batch_size=2的数据加载器对象;我们将它传递给model.fit而不是Dataset,这告诉我们的模型在2个图像而不是默认的1个图像上进行批处理。如果您之前创建了一个单独的验证数据集,现在是时候在训练期间加载它了。通过提供验证数据集,fit方法将返回每个时期的损失列表,如果verbose=True,它将在训练期间打印出来。以下代码块演示了这一点并自定义了其他几个训练参数:importmatplotlib.pyplotaspltval_dataset=core.Dataset('validation_images/')losses=model.fit(loader,val_dataset,epochs=10,learning_rate=0.001,lr_step_size=5,verbose=True)plt.plot(losses)plt.show()损失的结果图应该或多或少地减少:为了获得更大的灵活性和对模型的控制,您可以完全绕过Detecto。您可以根据需要自由调整model.get_internal_model方法使用的基本模型。结论在本教程中,作者展示了计算机视觉和对象检测不需要具有挑战性。您所需要的只是一点时间和耐心来处理标记的数据集。如果您有兴趣进一步探索,请查看GitHub上的Detecto或访问文档以获取更多教程和用例!