我想使用深度学习和计算机视觉技术来检测和计算葡萄园中葡萄藤的数量。我正在使用 YOLOv4 对象检测器并在 darknet 框架上进行训练。我已经能够将 SORT 跟踪器集成到我的应用程序中并且运行良好,但我仍然遇到以下问题:
您可以在下面中看到重新分配问题的示例。正如您所看到的,在第 40 帧中,id 9 是一根金属柱,从第 42 帧开始,它被分配给一棵树
在寻找这些问题的原因时,我了解到DeepSORT是SORT的改进版本,旨在通过使用神经网络将轨迹与检测相关联来处理这个问题。
我面临的问题是深度排序这个特定模型的训练。我已经看到作者使用“余弦度量学习”来训练他们的模型,但我无法为我的自定义类自定义学习。我的疑问如下:
图像数据集,我用它来训练 YOLOv4 模型。我可以为 Deepsort 跟踪器重复使用相同的数据集吗?如果是的话,那怎么办?
基本上,一旦 YOLO 检测到您的类别,您就会将裁剪后的检测到的图像传递到您的孪生网络,它将其转换为特征嵌入,并使用余弦距离将这些特征与过去的特征进行比较。
总之,您可以对 DeepSORT 和 SORT 使用相同的 YOLO 类,因为它们都需要一个由 YOLO 处理的检测阶段。
def update(self, bbox_xywh, confidences, class_ids, ori_img):
self.height, self.width = ori_img.shape[:2]
# generate features
features = self._get_features(bbox_xywh, ori_img)
# Prepare detections for the tracker
# Adding a default oid (object ID) for compatibility with the Detection class
default_oid = 0
detections = [Detection(bbox, conf, feature, default_oid) for bbox, conf, feature in zip(bbox_xywh, confidences, features)]
# update tracker
self.tracker.predict()
self.tracker.update(detections)
# output bbox identities
outputs = []
for track in self.tracker.tracks:
if not track.is_confirmed() or track.time_since_update > 1:
continue
box = track.to_tlwh()
x1, y1, x2, y2 = self._tlwh_to_xyxy(box)
track_id = track.track_id
outputs.append(np.array([x1, y1, x2, y2, track_id], dtype=int))
if len(outputs) > 0:
outputs = np.stack(outputs, axis=0)
return outputs
然后,在主类中,您需要编写对 yolo 数据进行排序、加载、转换为绝对坐标、绘制 bbox 格式并提供输出的方法(您可以以文本(这将是绝对坐标)、帧的形式获得输出或视频)。您可以在互联网上找到所有这些方法,并根据您的需要进行修改。请随时通知我,希望这会有所帮助,因为更改原始实现的步骤对我有帮助。