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

神经网络对象计数概述:通过FasterR-CNN进行最先进的对象计数

时间:2023-03-21 12:36:24 科技观察

准确计算给定图像或视频帧中的对象实例是机器学习中的一个难题。已经发明了许多解决方案来计算行人、汽车和其他物体的数量,但没有一个是完美的。当然,我们谈论的是图像处理,所以神经网络是一种很好的方法。下面,本文将对神经网络对象计数领域的不同方法、一般问题、挑战和最佳解决方案进行一般描述。在文章的最后,将使用现有的FasterR-CNN网络模型作为概念证明,对给定视频中街道上的物体进行计数。为这个问题找到合适的解决方案的挑战取决于许多因素。除了神经网络图像处理面临的共同挑战(如训练数据大小、质量等)外,物体计数问题还有其特殊的挑战:计数物体的类型重叠视角检测物体的最小尺寸训练和测试速度这种用于计算高速公路上的汽车或体育场前的人群的方法,其中大多数物体彼此重叠,具有远距离物体很少的视角,将与用于计算物体的方法有很大不同在家庭照片中。此外,这种在单张照片??上计算对象的方法不同于在视频中实时计算对象的方法。简单的需求,简单的解决方案在本文中,我将尝试使用示例视频解决街道上的对象计数问题(多个对象同时可见,但不会太拥挤)。为了处理拥挤场景或交通拥堵中的图像以准确统计目标实例,我建议深入研究该领域的一篇优秀论文:Towardsperspective-freeobjectcountingthroughdeeplearningcountingwithdeeplearning,链接:http://agamenon.tsc.uah.es/Investigacion/gram/publications/eccv2016-onoro.pdf)。本文的结果可以通过GitHub上的开源代码复现。论文中提到的CCNN和HydraCNN等方法在给定只有几类对象的图像时表现不佳;因此,必须找到其他方法。机器学习中有一种非常有趣的方法叫做RCNN(基于区域的卷积神经网络),它可以识别给定图像中的多个对象和位置。对于概念验证工作,我将使用改进的FasterR-CNN的Keras实现来处理视频文件,并使用给定类的检测到的对象计数对图像进行注释。越来越快有很多方法可以结合目标定位和识别任务来提高速度和准确性。多年来,我们在使用标准RCNN网络、FastR-CNN甚至FasterR-CNN(用于解决我们的简单计数问题)方面取得了巨大进步。FastRCNN建立在之前的工作之上,使用深度卷积网络对目标提议进行有效分类。与RCNN相比,FastR-CNN有多项创新,提高了训练和测试速度以及检测精度。在多阶段流水线中使用RCNN训练模型的方法(首先是目标检测,然后是识别)相当慢,不适合实时处理。这种方法的主要弱点是速度,检测物体时训练和实际测试都很慢。使用著名的VGG16,使用标准RCNN训练5000张图像需要2.5GPU-Days,并且需要数百GB的存储空间。在测试期间使用GPU检测对象需要47秒每张图像。这主要是由于在卷积神经网络中对每个目标提议执行前向传递而没有摊销计算。FastR-CNN通过引入单步训练算法改进了RCNN,该算法可以在单个处理阶段对对象及其空间位置进行分类。FastR-CNN中引入的改进是:通过多任务损失函数在单阶段提高检测质量TrainingTraining可以更新所有网络层特征缓存(featurecaching)而无需磁盘存储FasterR-CNN引入了RPN(RegionProposalNetwork,RegionProposalNetwork),它与检测网络共享全图卷积函数,使得区域提议几乎没有成本。该方案的RPN组件告诉统一网络在哪里检测。对于相同的VGG-16模型,FasterR-CNN在GPU上以5fps的速度实现了最先进的检测精度。RPN是一个全卷积网络,可以端到端地进行训练,专门用于生成检测建议的任务,旨在有效地预测纵横比和广泛的预测区域建议。去年,Pinterest使用FasterR-CNN获得站点视觉搜索功能。下面,我们选择检测和计算所描述的PoC示例视频中的对象实例。概念验证为了解决这个问题,我们将在支持GPU的AWS实例上使用上述FasterR-CNN模型和Keras。深度学习框架不止一种,它们之间的竞争非常激烈,这使我们能够很好地下载最符合我们需求和框架选择的预训练模型。当然,您也可以使用提供的训练python脚本自己训练模型,请记住,这可能需要很多天。存在FasterR-CNN的多种实现,包括Caffe、TensorFlow等。我们将在后端使用支持TensorFlow的Keras(v.2.0.3),代码作为GitHub上原始KerasFastR-CNN实现的分支提供(链接:https://github.com/softberries/keras-frcnn)上。用于测试网络的脚本已修改,以便它可以处理视频文件并使用检测到的对象(具有概率)的适当数据和计数对象的摘要对每个帧进行注释。在处理帧时,我还使用opencv对视频和经过训练的模型进行大量处理。有一些用于处理视频的实用方法,例如:defconvert_to_images():cam=cv2.VideoCapture(input_video_file)counter=0whileTrue:flag,frame=cam.read()ifflag:cv2.imwrite(os.path.join(img_path,str(counter)+'.jpg'),frame)countercounter=counter+1else:breakifcv2.waitKey(1)==27:break#pressesctoquitcv2.destroyAllWindows()并保存已处理帧中的视频:defsave_to_video():list_files=sorted(get_file_names(output_path),key=lambdavar:[int(x)ifx.isdigit()elsexforxinre.findall(r'[^0-9]|[0-9]+',var)])img0=cv2。imread(os.path.join(output_path,'0.jpg'))height,width,layers=img0.shape#fourcc=cv2.cv.CV_FOURCC(*'mp4v')fourcc=cv2.VideoWriter_fourcc(*'mp4v')#fourcc=cv2.cv.CV_FOURCC(*'XVID')videowriter=cv2.VideoWriter(output_video_file,fourcc,frame_rate,(width,height))forfinlist_files:print("saving..."+f)img=cv2.imread(os.path.join(output_path,f))videowriter.write(img)videowriter.release()虽然对象检测发生在测试中,但我们创建了一个元组列表,其中检测到的对象类别和编号为1,稍后将减少计算特定目标类的出现次数:forjkinrange(new_boxes.shape[0]):(x1,y1,x2,y2)=new_boxes[jk,:]cv2.rectangle(img_scaled,(x1,y1),(x2,y2),class_to_color[key],2)textLabel='{}:{}'.format(key,int(100*new_probs[jk]))all_dets.append((key,100*new_probs[jk]))all_objects.append((key,1))和归约方法:defaccumulate(l):it=itertools.groupby(l,operator.itemgetter(0))forkey,subiterinit:yieldkey,sum(item[1]foriteminsubiter)脚本参数很明显:“—input_file”,输入视频文件的路径“—output_file”,输出视频文件的路径。“--input_dir”,存储已处理帧的输入工作目录的路径。“--output_dir”,存储带注释的已处理帧的输出工作目录的路径。“--frame_rate”,构建视频输出时使用的帧率摘要区域深度卷积网络是令人兴奋的工具,可以帮助软件开发人员解决许多有趣的问题。本文中介绍的场景仅仅是个开始。通过针对特定数据集调整网络或使用来自其他模型的迁移学习,我们可以在检测对象时实现高精度和高速度。链接下载PoC项目github地址:https://github.com/softberries/keras-frcnnKeras预训练模型:https://s3-eu-west-1.amazonaws.com/softwaremill-public/model_frcnn.hdf5FastR-CNN论文:http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdfFasterR-CNN论文:https://arxiv.org/pdf/1506.01497.pdf中使用本文视频样本:https://www.videezy.com/原文:https://softwaremill.com/counting-objects-with-faster-rcnn/《机器之心(id:almosthuman2014)》】点此阅读作者更多好文