postprocess.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. import time
  2. import torch
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from torchvision import transforms
  6. from models.wirenet.postprocess import postprocess
  7. def box_line(pred):
  8. '''
  9. :param pred: 预测结果
  10. :return:
  11. box与line一一对应
  12. {'box': [0.0, 34.23157501220703, 151.70858764648438, 125.10173797607422], 'line': array([[ 1.9720564, 81.73457 ],
  13. [ 1.9933801, 41.730167 ]], dtype=float32)}
  14. '''
  15. box_line = [[] for _ in range((len(pred) - 1))]
  16. for idx, box_ in enumerate(pred[0:-1]):
  17. box = box_['boxes'] # 是一个tensor
  18. line = pred[-1]['wires']['lines'][idx].cpu().numpy() / 128 * 512
  19. score = pred[-1]['wires']['score'][idx]
  20. for i in box:
  21. aaa = {}
  22. aaa['box'] = i.tolist()
  23. aaa['line'] = []
  24. score_max = 0.0
  25. for j in range(len(line)):
  26. if (line[j][0][0] >= i[0] and line[j][1][0] >= i[0] and line[j][0][0] <= i[2] and
  27. line[j][1][0] <= i[2] and line[j][0][1] >= i[1] and line[j][1][1] >= i[1] and
  28. line[j][0][1] <= i[3] and line[j][1][1] <= i[3]):
  29. if score[j] > score_max:
  30. aaa['line'] = line[j]
  31. score_max = score[j]
  32. box_line[idx].append(aaa)
  33. def box_line_(pred):
  34. for idx, box_ in enumerate(pred[0:-1]):
  35. box = box_['boxes'] # 是一个tensor
  36. line = pred[-1]['wires']['lines'][idx].cpu().numpy() / 128 * 512
  37. score = pred[-1]['wires']['score'][idx]
  38. line_ = []
  39. score_ = []
  40. for i in box:
  41. score_max = 0.0
  42. tmp = [[0.0, 0.0], [0.0, 0.0]]
  43. for j in range(len(line)):
  44. if (line[j][0][1] >= i[0] and line[j][1][1] >= i[0] and
  45. line[j][0][1] <= i[2] and line[j][1][1] <= i[2] and
  46. line[j][0][0] >= i[1] and line[j][1][0] >= i[1] and
  47. line[j][0][0] <= i[3] and line[j][1][0] <= i[3]):
  48. if score[j] > score_max:
  49. tmp = line[j]
  50. score_max = score[j]
  51. line_.append(tmp)
  52. score_.append(score_max)
  53. processed_list = torch.tensor(line_)
  54. pred[idx]['line'] = processed_list
  55. processed_s_list = torch.tensor(score_)
  56. pred[idx]['line_score'] = processed_s_list
  57. return pred
  58. # box与line匹配后画在一张图上,不设置阈值,直接画
  59. def show_(imgs, pred, epoch, writer):
  60. col = [
  61. '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c',
  62. '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',
  63. '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f',
  64. '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
  65. '#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3',
  66. '#fdb462', '#b3de69', '#fccde5', '#bc80bd', '#ccebc5',
  67. '#ffed6f', '#8da0cb', '#e78ac3', '#e5c494', '#b3b3b3',
  68. '#fdbf6f', '#ff7f00', '#cab2d6', '#637939', '#b5cf6b',
  69. '#cedb9c', '#8c6d31', '#e7969c', '#d6616b', '#7b4173',
  70. '#ad494a', '#843c39', '#dd8452', '#f7f7f7', '#cccccc',
  71. '#969696', '#525252', '#f7fcfd', '#e5f5f9', '#ccece6',
  72. '#99d8c9', '#66c2a4', '#2ca25f', '#008d4c', '#005a32',
  73. '#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
  74. '#4eb3d3', '#2b8cbe', '#08589e', '#f7fcfd', '#e0ecf4',
  75. '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb4', '#88419d',
  76. '#810f7c', '#4d004b', '#f7f7f7', '#efefef', '#d9d9d9',
  77. '#bfbfbf', '#969696', '#737373', '#525252', '#252525',
  78. '#000000', '#ffffff', '#ffeda0', '#fed976', '#feb24c',
  79. '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026',
  80. '#ff6f61', '#ff9e64', '#ff6347', '#ffa07a', '#fa8072'
  81. ]
  82. # print(len(col))
  83. im = imgs[0].permute(1, 2, 0)
  84. boxes = pred[0]['boxes'].cpu().numpy()
  85. line = pred[0]['line'].cpu().numpy()
  86. # 可视化预测结
  87. fig, ax = plt.subplots(figsize=(10, 10))
  88. ax.imshow(np.array(im))
  89. for idx, box in enumerate(boxes):
  90. x0, y0, x1, y1 = box
  91. ax.add_patch(
  92. plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, edgecolor=col[idx], linewidth=1))
  93. for idx, (a, b) in enumerate(line):
  94. ax.scatter(a[1], a[0], c='#871F78', s=2)
  95. ax.scatter(b[1], b[0], c='#871F78', s=2)
  96. ax.plot([a[1], b[1]], [a[0], b[0]], c=col[idx], linewidth=1)
  97. # 将Matplotlib图像转换为Tensor
  98. fig.canvas.draw()
  99. image_from_plot = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8).reshape(
  100. fig.canvas.get_width_height()[::-1] + (3,))
  101. plt.close()
  102. img2 = transforms.ToTensor()(image_from_plot)
  103. writer.add_image("all", img2, epoch)
  104. # box与line匹配后画在一张图上,设置阈值
  105. def show_predict(imgs, pred, t_start):
  106. col = [
  107. '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c',
  108. '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',
  109. '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f',
  110. '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
  111. '#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3',
  112. '#fdb462', '#b3de69', '#fccde5', '#bc80bd', '#ccebc5',
  113. '#ffed6f', '#8da0cb', '#e78ac3', '#e5c494', '#b3b3b3',
  114. '#fdbf6f', '#ff7f00', '#cab2d6', '#637939', '#b5cf6b',
  115. '#cedb9c', '#8c6d31', '#e7969c', '#d6616b', '#7b4173',
  116. '#ad494a', '#843c39', '#dd8452', '#f7f7f7', '#cccccc',
  117. '#969696', '#525252', '#f7fcfd', '#e5f5f9', '#ccece6',
  118. '#99d8c9', '#66c2a4', '#2ca25f', '#008d4c', '#005a32',
  119. '#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
  120. '#4eb3d3', '#2b8cbe', '#08589e', '#f7fcfd', '#e0ecf4',
  121. '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb4', '#88419d',
  122. '#810f7c', '#4d004b', '#f7f7f7', '#efefef', '#d9d9d9',
  123. '#bfbfbf', '#969696', '#737373', '#525252', '#252525',
  124. '#000000', '#ffffff', '#ffeda0', '#fed976', '#feb24c',
  125. '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026',
  126. '#ff6f61', '#ff9e64', '#ff6347', '#ffa07a', '#fa8072'
  127. ]
  128. print(len(col))
  129. im = imgs.permute(1, 2, 0) # 处理为 [512, 512, 3]
  130. boxes = pred[0]['boxes'].cpu().numpy()
  131. box_scores = pred[0]['scores'].cpu().numpy()
  132. lines = pred[0]['line'].cpu().numpy()
  133. line_scores = pred[0]['line_score'].cpu().numpy()
  134. # 可视化预测结
  135. fig, ax = plt.subplots(figsize=(10, 10))
  136. ax.imshow(np.array(im))
  137. idx = 0
  138. tmp = np.array([[0.0, 0.0], [0.0, 0.0]])
  139. for box, line, box_score, line_score in zip(boxes, lines, box_scores, line_scores):
  140. x0, y0, x1, y1 = box
  141. # 框中无线的跳过
  142. if np.array_equal(line, tmp):
  143. continue
  144. a, b = line
  145. if box_score >= 0.7 or line_score >= 0.9:
  146. ax.add_patch(
  147. plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, edgecolor=col[idx], linewidth=1))
  148. ax.scatter(a[1], a[0], c='#871F78', s=10)
  149. ax.scatter(b[1], b[0], c='#871F78', s=10)
  150. ax.plot([a[1], b[1]], [a[0], b[0]], c=col[idx], linewidth=1)
  151. idx = idx + 1
  152. t_end = time.time()
  153. print(f'predict used:{t_end - t_start}')
  154. plt.show()
  155. # 下面的都没有进行box与line的一一匹配
  156. # 只画线,设阈值
  157. def show_line(imgs, pred, t_start):
  158. im = imgs.permute(1, 2, 0)
  159. line = pred[-1]['wires']['lines'][0].cpu().numpy() / 128 * 512
  160. # print(pred[-1]['wires']['score'])
  161. line_score = pred[-1]['wires']['score'].cpu().numpy()[0]
  162. diag = (im.shape[0] ** 2 + im.shape[1] ** 2) ** 0.5
  163. line, line_score = postprocess(line, line_score, diag * 0.01, 0, False)
  164. # count = np.sum(line_score > 0.9)
  165. # print(f'draw line number:{count}')
  166. # 可视化预测结
  167. fig, ax = plt.subplots(figsize=(10, 10))
  168. ax.imshow(np.array(im))
  169. for idx, (a, b) in enumerate(line):
  170. if line_score[idx] < 0.9:
  171. continue
  172. ax.scatter(a[1], a[0], c='#871F78', s=2)
  173. ax.scatter(b[1], b[0], c='#871F78', s=2)
  174. ax.plot([a[1], b[1]], [a[0], b[0]], c='red', linewidth=1)
  175. t_end = time.time()
  176. print(f'show_line used:{t_end - t_start}')
  177. plt.show()
  178. # show_line优化
  179. def show_line_optimized(imgs, pred, t_start):
  180. im = imgs.permute(1, 2, 0).cpu().numpy()
  181. line_data = pred[-1]['wires']['lines'][0].cpu().numpy() / 128 * 512
  182. line_scores = pred[-1]['wires']['score'].cpu().numpy()[0]
  183. diag = (im.shape[0] ** 2 + im.shape[1] ** 2) ** 0.5
  184. nlines, nscores = postprocess(line_data, line_scores, diag * 0.01, 0, False)
  185. fig, ax = plt.subplots(figsize=(10, 10))
  186. ax.imshow(im)
  187. for i, t in enumerate([0.9]):
  188. for (a, b), s in zip(nlines, nscores):
  189. if s < t:
  190. continue
  191. ax.scatter([a[1], b[1]], [a[0], b[0]], c='#871F78', s=2)
  192. ax.plot([a[1], b[1]], [a[0], b[0]], c='red', linewidth=1)
  193. t_end = time.time()
  194. print(f'show_line_optimized used:{t_end - t_start}')
  195. plt.show()
  196. # 只画框,设阈值
  197. def show_box(imgs, pred, t_start):
  198. col = [
  199. '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c',
  200. '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',
  201. '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f',
  202. '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
  203. '#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3',
  204. '#fdb462', '#b3de69', '#fccde5', '#bc80bd', '#ccebc5',
  205. '#ffed6f', '#8da0cb', '#e78ac3', '#e5c494', '#b3b3b3',
  206. '#fdbf6f', '#ff7f00', '#cab2d6', '#637939', '#b5cf6b',
  207. '#cedb9c', '#8c6d31', '#e7969c', '#d6616b', '#7b4173',
  208. '#ad494a', '#843c39', '#dd8452', '#f7f7f7', '#cccccc',
  209. '#969696', '#525252', '#f7fcfd', '#e5f5f9', '#ccece6',
  210. '#99d8c9', '#66c2a4', '#2ca25f', '#008d4c', '#005a32',
  211. '#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
  212. '#4eb3d3', '#2b8cbe', '#08589e', '#f7fcfd', '#e0ecf4',
  213. '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb4', '#88419d',
  214. '#810f7c', '#4d004b', '#f7f7f7', '#efefef', '#d9d9d9',
  215. '#bfbfbf', '#969696', '#737373', '#525252', '#252525',
  216. '#000000', '#ffffff', '#ffeda0', '#fed976', '#feb24c',
  217. '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026',
  218. '#ff6f61', '#ff9e64', '#ff6347', '#ffa07a', '#fa8072'
  219. ]
  220. # print(len(col))
  221. im = imgs.permute(1, 2, 0)
  222. boxes = pred[0]['boxes'].cpu().numpy()
  223. box_scores = pred[0]['scores'].cpu().numpy()
  224. # 可视化预测结
  225. fig, ax = plt.subplots(figsize=(10, 10))
  226. ax.imshow(np.array(im))
  227. for idx, box in enumerate(boxes):
  228. if box_scores[idx] < 0.7:
  229. continue
  230. x0, y0, x1, y1 = box
  231. ax.add_patch(
  232. plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, edgecolor=col[idx], linewidth=1))
  233. t_end = time.time()
  234. print(f'show_box used:{t_end - t_start}')
  235. plt.show()
  236. # 将show_line与show_box合并,传入参数确定显示框还是线 都不显示,输出原图
  237. def show_box_or_line(imgs, pred, show_line=False, show_box=False):
  238. col = [
  239. '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c',
  240. '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',
  241. '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f',
  242. '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
  243. '#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3',
  244. '#fdb462', '#b3de69', '#fccde5', '#bc80bd', '#ccebc5',
  245. '#ffed6f', '#8da0cb', '#e78ac3', '#e5c494', '#b3b3b3',
  246. '#fdbf6f', '#ff7f00', '#cab2d6', '#637939', '#b5cf6b',
  247. '#cedb9c', '#8c6d31', '#e7969c', '#d6616b', '#7b4173',
  248. '#ad494a', '#843c39', '#dd8452', '#f7f7f7', '#cccccc',
  249. '#969696', '#525252', '#f7fcfd', '#e5f5f9', '#ccece6',
  250. '#99d8c9', '#66c2a4', '#2ca25f', '#008d4c', '#005a32',
  251. '#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
  252. '#4eb3d3', '#2b8cbe', '#08589e', '#f7fcfd', '#e0ecf4',
  253. '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb4', '#88419d',
  254. '#810f7c', '#4d004b', '#f7f7f7', '#efefef', '#d9d9d9',
  255. '#bfbfbf', '#969696', '#737373', '#525252', '#252525',
  256. '#000000', '#ffffff', '#ffeda0', '#fed976', '#feb24c',
  257. '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026',
  258. '#ff6f61', '#ff9e64', '#ff6347', '#ffa07a', '#fa8072'
  259. ]
  260. # print(len(col))
  261. im = imgs.permute(1, 2, 0)
  262. boxes = pred[0]['boxes'].cpu().numpy()
  263. line = pred[-1]['wires']['lines'][0].cpu().numpy() / 128 * 512
  264. # 可视化预测结
  265. fig, ax = plt.subplots(figsize=(10, 10))
  266. ax.imshow(np.array(im))
  267. if show_box:
  268. for idx, box in enumerate(boxes):
  269. x0, y0, x1, y1 = box
  270. ax.add_patch(
  271. plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, edgecolor=col[idx], linewidth=1))
  272. if show_line:
  273. for idx, (a, b) in enumerate(line):
  274. ax.scatter(a[1], a[0], c='#871F78', s=2)
  275. ax.scatter(b[1], b[0], c='#871F78', s=2)
  276. ax.plot([a[1], b[1]], [a[0], b[0]], c='red', linewidth=1)
  277. plt.show()
  278. # 将show_line与show_box合并,传入参数确定显示框还是线 一起画
  279. def show_box_and_line(imgs, pred, show_line=False, show_box=False):
  280. col = [
  281. '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c',
  282. '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',
  283. '#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f',
  284. '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
  285. '#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3',
  286. '#fdb462', '#b3de69', '#fccde5', '#bc80bd', '#ccebc5',
  287. '#ffed6f', '#8da0cb', '#e78ac3', '#e5c494', '#b3b3b3',
  288. '#fdbf6f', '#ff7f00', '#cab2d6', '#637939', '#b5cf6b',
  289. '#cedb9c', '#8c6d31', '#e7969c', '#d6616b', '#7b4173',
  290. '#ad494a', '#843c39', '#dd8452', '#f7f7f7', '#cccccc',
  291. '#969696', '#525252', '#f7fcfd', '#e5f5f9', '#ccece6',
  292. '#99d8c9', '#66c2a4', '#2ca25f', '#008d4c', '#005a32',
  293. '#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
  294. '#4eb3d3', '#2b8cbe', '#08589e', '#f7fcfd', '#e0ecf4',
  295. '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb4', '#88419d',
  296. '#810f7c', '#4d004b', '#f7f7f7', '#efefef', '#d9d9d9',
  297. '#bfbfbf', '#969696', '#737373', '#525252', '#252525',
  298. '#000000', '#ffffff', '#ffeda0', '#fed976', '#feb24c',
  299. '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026',
  300. '#ff6f61', '#ff9e64', '#ff6347', '#ffa07a', '#fa8072'
  301. ]
  302. # print(len(col))
  303. im = imgs.permute(1, 2, 0)
  304. boxes = pred[0]['boxes'].cpu().numpy()
  305. line = pred[-1]['wires']['lines'][0].cpu().numpy() / 128 * 512
  306. # 可视化预测结
  307. fig, axs = plt.subplots(1, 2, figsize=(10, 10))
  308. if show_box:
  309. axs[0].imshow(np.array(im))
  310. for idx, box in enumerate(boxes):
  311. x0, y0, x1, y1 = box
  312. axs[0].add_patch(
  313. plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, edgecolor=col[idx], linewidth=1))
  314. axs[0].set_title('Boxes')
  315. if show_line:
  316. axs[1].imshow(np.array(im))
  317. for idx, (a, b) in enumerate(line):
  318. axs[1].scatter(a[1], a[0], c='#871F78', s=2)
  319. axs[1].scatter(b[1], b[0], c='#871F78', s=2)
  320. axs[1].plot([a[1], b[1]], [a[0], b[0]], c='red', linewidth=1)
  321. axs[1].set_title('Lines')
  322. # 调整子图之间的距离,防止标题和标签重叠
  323. plt.tight_layout()
  324. plt.show()