码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【课程作业经验】基于MindSpore的YOLOv3-Darknet53的车辆检测计数实现


    本项目基于MindSpre框架、YOLOv3-Darknet53、VisDrone数据集实现目标检测与计数。

    1.项目地址

    GitHub - whitewings-hub/mindspore-yolov3-vehicle_counting: training mindspore yolov3 model and counting vehicle

    2.环境准备

    MindSpore版本为1.5。

    3.数据集处理

    VisDrone数据集下载http://aiskyeye.com/download/object-detection-2/

    需要将原始VisDrone数据集转换为coco格式,然后存放在本地目录

    使用mindspore-yolov3-vehicle_counting/VisDrone2coco.py at main · whitewings-hub/mindspore-yolov3-vehicle_counting · GitHub来进行处理,python VisDrone2coco.py即可。

    4.基于albumentations的数据增强

    mindspore-yolov3-vehicle_counting/transforms.py at main · whitewings-hub/mindspore-yolov3-vehicle_counting · GitHub

    使用了albumentations库中的RandomBrightnessContrast方法、HueSaturationValue方法、Cutout方法进行随机调整亮度和对比度、随机调整输入图像的色调饱和度、在图像中生成正方形区域来对图像数据进行增强,通过albumentations库中的Compose方法把这三个图像数据增强变换放在一起按顺序执行,并在后面读取图片进行图像数据增强。

    1. transform = A.Compose([
    2. A.RandomBrightnessContrast(p=0.5),
    3. A.HueSaturationValue(),
    4. A.Cutout(num_holes=10, max_h_size=20, max_w_size=20, fill_value=0, p=0.5)
    5. ])

    5.DIoU-NMS

    将普通NMS算法替换为DIoU-NMS算法。在传统NMS代码的基础上,前面按置信度得分从高到底排序并选择置信度得分最高的候选框的操作是一样的,主要增加的额外变量就是两框最小外接框的对角线长的平方以及两框中心点距离的平方,之后再根据DIoU计算的公式进行计算得到DIoU然后过滤掉DIoU高于阈值的框,保留置信度分数最高的目标框并对其余剩下的目标框进行递归。

    1. def _diou_nms(self, dets, thresh=0.6):
    2. x1 = dets[:, 0]
    3. y1 = dets[:, 1]
    4. x2 = x1 + dets[:, 2]
    5. y2 = y1 + dets[:, 3]
    6. scores = dets[:, 4]
    7. areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    8. order = scores.argsort()[::-1]
    9. keep = []
    10. while order.size > 0:
    11. i = order[0]
    12. keep.append(i)
    13. xx1 = np.maximum(x1[i], x1[order[1:]])
    14. yy1 = np.maximum(y1[i], y1[order[1:]])
    15. xx2 = np.minimum(x2[i], x2[order[1:]])
    16. yy2 = np.minimum(y2[i], y2[order[1:]])
    17. w = np.maximum(0.0, xx2 - xx1 + 1)
    18. h = np.maximum(0.0, yy2 - yy1 + 1)
    19. inter = w * h
    20. ovr = inter / (areas[i] + areas[order[1:]] - inter)
    21. center_x1 = (x1[i] + x2[i]) / 2
    22. center_x2 = (x1[order[1:]] + x2[order[1:]]) / 2
    23. center_y1 = (y1[i] + y2[i]) / 2
    24. center_y2 = (y1[order[1:]] + y2[order[1:]]) / 2
    25. inter_diag = (center_x2 - center_x1) ** 2 + (center_y2 - center_y1) ** 2
    26. out_max_x = np.maximum(x2[i], x2[order[1:]])
    27. out_max_y = np.maximum(y2[i], y2[order[1:]])
    28. out_min_x = np.minimum(x1[i], x1[order[1:]])
    29. out_min_y = np.minimum(y1[i], y1[order[1:]])
    30. outer_diag = (out_max_x - out_min_x) ** 2 + (out_max_y - out_min_y) ** 2
    31. diou = ovr - inter_diag / outer_diag
    32. diou = np.clip(diou, -1, 1)
    33. inds = np.where(diou <= thresh)[0]
    34. order = order[inds + 1]
    35. return keep

    6.模型训练、验证、使用

    模型训练、验证、使用分别对应train.py,eval.py,predict.py,详细方法参考mindspore-yolov3-vehicle_counting/README.md at main · whitewings-hub/mindspore-yolov3-vehicle_counting · GitHub

    7.车辆检测与计数

    计数功能实现。在前面从图像中检测出来的目标框出来并显示目标的类别的基础上,统计每个类别的目标的数量,即创建一个列表,每个目标类别对应一个项,初始值为0,在给物体画目标检测框的时候顺便在刚才创建列表中目标类别对应的项加1,在画框结束后,对于每种目标类别对应的数量也保存到了列表中,然后构建好表示目标类别和数量的字符串并通过cv2库中的putText方法将统计到的目标的种类及相对应的数量添加到图片当中。

    1. def draw_boxes_in_image(self, img_path):
    2. num_record = [0 for i in range(12)]
    3. img = cv2.imread(img_path, 1)
    4. for i in range(len(self.det_boxes)):
    5. x = int(self.det_boxes[i]['bbox'][0])
    6. y = int(self.det_boxes[i]['bbox'][1])
    7. w = int(self.det_boxes[i]['bbox'][2])
    8. h = int(self.det_boxes[i]['bbox'][3])
    9. cv2.rectangle(img, (x, y), (x + w, y + h), (0, 225, 0), 1)
    10. score = round(self.det_boxes[i]['score'], 3)
    11. classname = self.det_boxes[i]['category_id']
    12. text = self.det_boxes[i]['category_id'] + ', ' + str(score)
    13. cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 225), 2)
    14. num_record[label_list.index(classname)] = num_record[label_list.index(classname)] + 1
    15. result_str = ""
    16. for ii in range(12):
    17. current_name = label_list[ii]
    18. current_num = num_record[ii]
    19. if current_num != 0:
    20. result_str = result_str + "{}:{} ".format(current_name, current_num)
    21. font = cv2.FONT_HERSHEY_SIMPLEX
    22. img = cv2.putText(img, result_str, (20, 20), font, 0.5, (255, 0, 0), 2)
    23. return img

    详细代码运行方法参考mindspore-yolov3-vehicle_counting/README.md at main · whitewings-hub/mindspore-yolov3-vehicle_counting · GitHub

    运行效果图如下:

    检测前

    检测后

    8.项目参考

    models: Models of MindSpore - Gitee.com

    GitHub - leonwanghui/ms-yolov3-basketball: This is a tutorial for training MindSpore Yolov3-DarkNet53 model to detecting basktball games.

  • 相关阅读:
    redis笔记 三 redis持久化
    Kotlin 开发Android app(七)上:Kotlin函数fun
    【C++】几种特殊类(包含单例模式)
    c++ 常用STL总结
    Android学习之路(19) ListView详解
    加密货币,可能是你唯一能实现“财富自由”的领域 2021-05-24
    SuperMap海量影像瓦片最佳方案
    4.Spring Boot
    【工程应用九】再谈基于离散夹角余弦相似度指标的形状匹配优化(十六角度量化+指令集加速+目标只有部分在图像内的识别+最小外接矩形识别重叠等)
    STM32F407 串口使用DMA方式通信
  • 原文地址:https://blog.csdn.net/skytttttt9394/article/details/126290377
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号