小言_互联网的博客

基于YOLOV7的桥梁基建裂缝检测

347人阅读  评论(0)

自从YOLO诞生依赖,关于YOLO的各种版本迭代更新就从未停止过,前不久的时候官方也推出了全新一代的YOLOv7模型,在各大主流视觉任务上都取得了很大的进步。

官方项目地址在这里,首页截图如下所示:

 截止目前已经有超过6.5K的star量了,还是很强的。

感兴趣的话可以自行前去学习了解,闲话就说到这里了,接下来进入正文,首先来看效果:

裂缝检测系统演示

接下来看下完整项目详情:

 首先看下数据集:

【图像数据】

 【标注数据】

 【xml数据】

 如果不想直接使用作者基于COCO或者是VOC数据集计算出来的anchor数据的话,也可以基于autoAnchors.py模块完成对自建数据集训练数据的自动anchor聚类计算,主要使用的就是kmeans聚类算法,详细原理可以自行百度了解即可,这里看下训练数据集train.txt,截图如下所示:

基于autoAnchors.py模块自动计算得到的anchor数据如下所示:

43,14, 36,21, 49,21, 42,25, 50,29, 58,27, 72,34, 101,42, 129,57

为了直观呈现数据聚类分布情况,这里对其进行了可视化,如下所示:

 为了对整体数据集标注类别分布情况做统计分析,这里简单以柱状图形式进行可视化,核心实现如下所示:


  
  1. data_dict={}
  2. with open( "train.txt") as f:
  3. train_data=[one.strip().split( " ")[ 1:] for one in f.readlines() if one.strip()]
  4. for one_list in train_data:
  5. for one_line in one_list:
  6. one_label=one_line.split( ",")[- 1].strip()
  7. if one_label in data_dict:
  8. data_dict[one_label]+= 1
  9. else:
  10. data_dict[one_label]= 1
  11. barPloter(data_dict, "训练数据集类别框统计分析柱状图",savepath= "barPloter.jpg")

可视化结果如下所示:

 这里比较特殊,因为我这里的标注对象只有一个就是裂缝,所以柱状图展现出来就是比较突兀,如果你的是多个类别的话这个就会对比比较明显了。

为了更加方便地自由创建训练集-测试集,这里我开发了makeDataset.py模块,实现一键完成数据集的创建,核心实现如下所示:


  
  1. def convert( image_id, list_file):
  2. in_file = open( "dataset/xmls/%s.xml" % (image_id), encoding= "utf-8")
  3. tree = ET.parse(in_file)
  4. root = tree.getroot()
  5. for obj in root. iter( "object"):
  6. difficult = 0
  7. if obj.find( "difficult") != None:
  8. difficult = obj.find( "difficult").text
  9. cls = obj.find( "name").text
  10. if cls not in classes or int(difficult) == 1:
  11. continue
  12. cls_id = classes.index(cls)
  13. xmlbox = obj.find( "bndbox")
  14. b = (
  15. int(xmlbox.find( "xmin").text),
  16. int(xmlbox.find( "ymin").text),
  17. int(xmlbox.find( "xmax").text),
  18. int(xmlbox.find( "ymax").text),
  19. )
  20. list_file.write( " " + ",".join([ str(a) for a in b]) + "," + str(cls_id))
  21. prefix = ""
  22. for image_set in sets:
  23. image_ids = open( "dataset/%s.txt" % (image_set)).read().strip().split()
  24. list_file = open( "%s.txt" % (image_set), "w")
  25. for image_id in image_ids:
  26. one_line_prefix = prefix + "dataset/JPEGImages/" + image_id + ".jpg"
  27. list_file.write(one_line_prefix)
  28. convert(image_id, list_file)
  29. list_file.write( "\n")
  30. list_file.close()

终端执行完成之后就会在同级目录下面自动生成train.txt和test.txt 两个数据集文件了。

之后就可以启动训练了,训练完成后随机选取测试数据进行模型的测试,如下:

 核心推理实现如下:


  
  1. def batchImgsDetect( dataDir="test/", saveDir="testResult/"):
  2. """
  3. 批量数据检测计算
  4. """
  5. picDir = saveDir + "picture/"
  6. jsonDir = saveDir + "json/"
  7. if not os.path.exists(picDir):
  8. os.makedirs(picDir)
  9. if not os.path.exists(jsonDir):
  10. os.makedirs(jsonDir)
  11. for one_pic in tqdm(os.listdir(dataDir)):
  12. try:
  13. one_path = dataDir + one_pic
  14. print( "Loading From: ", one_path)
  15. one_id = one_pic.split( ".")[ 0].strip()
  16. one_img = Image. open(one_path)
  17. resImg, resData = yolo.detect_image(one_img)
  18. print( "resData: ", resData)
  19. one_save_pic_path = picDir + one_id + ".jpg"
  20. one_save_json_path = jsonDir + one_id + ".json"
  21. if one_save_pic_path:
  22. resImg.save(one_save_pic_path, quality= 95, subsampling= 0)
  23. if one_save_json_path:
  24. with open(one_save_json_path, "w") as f:
  25. f.write(json.dumps(resData))
  26. print( "Saving resImg To: ", one_save_pic_path)
  27. print( "Saving resData To: ", one_save_json_path)
  28. except Exception as e:
  29. print( "Exception: ", e)

结果会同时存储检测结果数据与结果图像数据,如下:

 我们随机选取单张图像,样例如下:

 检测结果数据如下:


  
  1. {
  2. "neg": [
  3. [
  4. 0.35188737511634829,
  5. [
  6. 553,
  7. 3,
  8. 607,
  9. 103
  10. ]
  11. ],
  12. [
  13. 0.3090079426765442,
  14. [
  15. 580,
  16. 1294,
  17. 628,
  18. 1395
  19. ]
  20. ],
  21. [
  22. 0.2989051342010498,
  23. [
  24. 539,
  25. 0,
  26. 637,
  27. 221
  28. ]
  29. ],
  30. [
  31. 0.2701702117919922,
  32. [
  33. 573,
  34. 1150,
  35. 669,
  36. 1394
  37. ]
  38. ],
  39. [
  40. 0.2558406889438629,
  41. [
  42. 582,
  43. 143,
  44. 632,
  45. 244
  46. ]
  47. ],
  48. [
  49. 0.23760168254375459,
  50. [
  51. 579,
  52. 211,
  53. 626,
  54. 311
  55. ]
  56. ],
  57. [
  58. 0.23735187947750092,
  59. [
  60. 622,
  61. 1122,
  62. 665,
  63. 1227
  64. ]
  65. ],
  66. [
  67. 0.2307254672050476,
  68. [
  69. 639,
  70. 877,
  71. 682,
  72. 983
  73. ]
  74. ],
  75. [
  76. 0.22685378789901734,
  77. [
  78. 614,
  79. 1188,
  80. 661,
  81. 1299
  82. ]
  83. ],
  84. [
  85. 0.21937736868858338,
  86. [
  87. 652,
  88. 731,
  89. 698,
  90. 842
  91. ]
  92. ],
  93. [
  94. 0.21803757548332215,
  95. [
  96. 559,
  97. 307,
  98. 603,
  99. 413
  100. ]
  101. ],
  102. [
  103. 0.2148183137178421,
  104. [
  105. 572,
  106. 453,
  107. 620,
  108. 560
  109. ]
  110. ],
  111. [
  112. 0.21115651726722718,
  113. [
  114. 617,
  115. 1056,
  116. 660,
  117. 1156
  118. ]
  119. ],
  120. [
  121. 0.21088728308677674,
  122. [
  123. 613,
  124. 563,
  125. 665,
  126. 663
  127. ]
  128. ],
  129. [
  130. 0.20798684656620027,
  131. [
  132. 650,
  133. 802,
  134. 695,
  135. 912
  136. ]
  137. ],
  138. [
  139. 0.20459488034248353,
  140. [
  141. 568,
  142. 72,
  143. 620,
  144. 173
  145. ]
  146. ],
  147. [
  148. 0.20070792734622956,
  149. [
  150. 543,
  151. 168,
  152. 640,
  153. 430
  154. ]
  155. ]
  156. ]
  157. }

同时对其检测热力图也进行了可视化:

 可以看到:模型整体检测结果显示出来的热力区域都是缠绕在图像中的裂缝区域周边的,还是不错的,唯一感觉不好的就是检测框的置信度普遍不是很高,不知道是不是数据太少的问题。

最后,为了能够构架直观便利地使用整套模型服务,这里我开发了专门的界面,使用效果如下:

【训练数据集类别统计分析可视化】

 【训练数据集自动锚框计算可视化】

 【图像数据目标检测识别】

 【检测模型热力图可视化】


转载:https://blog.csdn.net/Together_CZ/article/details/127572126
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场