基于密集场景的下的目标检测与计数(实战+代码实现)

在很多的场景下,我们需要对较为密集的物体来进行计数从而得到他们的数量,有时候我们可以使用yolo模型,通过目标检测来框定每一个物体,再把他们分别加起来求出最后的和,但是对于密集场景下的目标检测和计数来说,yolo可能并不是一个很好的选择,于是在这里引入一种新的基于密集场景下的目标检测和技术方法,原文参考来自于:https://arxiv.org/abs/2104.08391

该项目的全部代码来自于:https://github.com/cvlab-stonybrook/LearningToCountEverything

出处:CVPR 2021
作者单位:石溪大学, VinAI研究院

该篇文章所提及的具体方法以及实现手段在这里就不过多阐述,大家有兴趣可以去看看原文以及相应的论文解读,但是值得一提的是,该种计数方法所需要的代码量异常小,而且是基于一种半监督的方法,在很多密集场景下的计数都有着不错的表现,下面我将开始告诉大家如何实现这种计数方法:

1.首先,我们打开上面的链接,下载关于该项目的全部源码,下载好解压后,我们可以将其导入到Pycharm中,如下图所示:(当然,别忘记了必要库的安装)

在开始我们的项目前,我们可以先实验一下它所提供的demo的样本,就是图中所打开的demo文件,注意,这时候我们直接运行是会报错的,报错如下图所示:

这个时候,我们需要单击右键,选择更多运行/调试,再选择修改运行配置,如下图所示:

我们在参数变量那一行加入下列参数:

具体内容为:--input-image orange.jpg --bbox-file orange_box_ex.txt

之后,我们再返回原界面,就可以正常运行了,运行结束后的效果如图所示:

我们也可以打开最后的结果图进行查看:

如果你想要训练和测试自己的数据集,记得在一个密集场景下标注3个框左右,然后在每个物体上的中心上标注一个点,紧接着就可以用它进行训练了!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于 YOLOv5 和 ByteTrack 算法实现计数的 Python 代码: ```python import cv2 import torch import argparse from models.experimental import attempt_load from utils.general import non_max_suppression from utils.torch_utils import select_device from trackers.byte_tracker import ByteTracker def detect(source, weights, conf_thres, iou_thres, device): model = attempt_load(weights, map_location=device) # load FP32 model stride = int(model.stride.max()) # model stride imgsz = check_img_size(640, s=stride) # check image size if device.type != 'cpu': model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters()))) # run once cap = cv2.VideoCapture(source) # ByteTrack 初始化 byte_tracker = ByteTracker() while cap.isOpened(): ret, img0 = cap.read() if not ret: break img = letterbox(img0, new_shape=imgsz)[0] img = img[:, :, ::-1].transpose(2, 0, 1) img = np.ascontiguousarray(img) img = torch.from_numpy(img).to(device) img = img.float() # uint8 to fp16/32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 if img.ndimension() == 3: img = img.unsqueeze(0) # YOLOv5 推理 pred = model(img, augment=False)[0] pred = non_max_suppression(pred, conf_thres, iou_thres, classes=None, agnostic=False) # ByteTrack 计数 byte_tracker.track(img0, pred[0], 0.5) cv2.destroyAllWindows() cap.release() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--source', type=str, default='0', help='source') # file/folder, 0 for webcam parser.add_argument('--weights', type=str, default='yolov5s.pt', help='model.pt path') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') args = parser.parse_args() detect(args.source, args.weights, args.conf_thres, args.iou_thres, args.device) ``` 其中,`ByteTracker` 是一个基于 ByteTrack 算法的目标跟踪器,可以参考 [这个链接](https://github.com/STVIR/pysot/tree/master/pysot/tracker) 获取代码。`detect()` 函数中,首先加载 YOLOv5 模型,并对视频帧进行预处理,然后进行 YOLOv5 的目标检测。接着,将检测结果传递给 `ByteTracker` 进行目标跟踪,并进行计数。最后,关闭视频流并释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值