当前位置:   article > 正文

(深度学习)yolo坐标形式数据的扩充、与普通图片坐标系的转换、在原图上绘制目标框_yolo坐标转换

yolo坐标转换

一、问题背景

        要使用yolo框架进行目标检测步骤如下:1、数据标注 ,生成对应的txt文档 2、对现有数据进行扩充,生成相应的txt文档 3、根据txt文档 在图片上绘制目标框 4、训练 。此文档主要解决前三个问题。

1、数据标注后生成的txt文档的格式如下:


 注:第一个数字代表目标类别 第2-5个数字代表 x_center(目标框中心位置的x坐标)/原本图片的宽度, y_center(目标框中心位置的y坐标)/原本图片的高度 width(目标框的宽度)/原本图片的宽度, height(目标框的高度)/原本图片的高度

 yolo以及其他图片的坐标形式参考此文档

2、对现有数据扩充(对图片水平、垂直、水平垂直翻转 扩充三倍,具体见另一篇文档图片扩充

图片扩充完成之后需要生成对应的txt文档。也就是原txt文档中的第二个数字 和第三个数字需要发生变化,即目标框的中心位置。可由数学推理得出

水平翻转之后 现目标框的x=1-原目标框的x坐标 现目标框的y=原目标框y。

垂直翻转之后 现目标框的y=1-原目标框的y坐标 现目标框的x=原目标框x。

水平垂直翻转之后 现目标框的x=1-原目标框的x坐标,现目标框的y=1-原目标框的y坐标。

python代码为:(以水平垂直翻转举例,前两中稍加更改即可。

  1. import glob
  2. import os
  3. import copy
  4. from array import array
  5. def main():
  6. txt_path = 'E:/home/home/test/' #原txt文档
  7. txt_out_path = 'E:/ver_mir/' #水平垂直翻转后的txt
  8. if not os.path.exists(txt_out_path):
  9. os.mkdir(txt_out_path)
  10. filelist = os.listdir(txt_path)
  11. for file in filelist:
  12. f = open(txt_path + file, 'r') #以只读形式打开txt文档
  13. lines = f.readlines() #按行读取
  14. t = []
  15. out_txt_name = os.path.splitext(file)[0] #取.txt之前
  16. for i in lines:
  17. line_object = i.split(' ')
  18. #print(line_object)
  19. line_object[1] = float(1- float(line_object[1])) #新目标框 x的值
  20. line_object[2] = float(1-float(line_object[2]) ) #新目标框 y的值
  21. t.append(line_object)
  22. out_path = txt_out_path + out_txt_name + '_ver_mir.txt' #新保存入的txt文档
  23. with open(out_path, 'w') as f:
  24. for i in t:
  25. str_array = " ".join(map(str, i)) #将i转为str类型,并用空格连接
  26. print(str_array)
  27. f.write(str_array)
  28. if __name__ == '__main__':
  29. main()

运行之后生成的txt文档如下:

 3、根据txt文档在原图片上绘制目标框。

        绘制矩形框需要用到opencv 的是rectabgle函数。

  1. cv2.rectangle(image,(xmin,ymin),(xmax,ymax),(0,0,255),2) #image要画框的图片
  2. #(xmin,ymin)框的左上角坐标
  3. #(xmax,ymax)框的右下角坐标
  4. #(0255255)框的颜色
  5. #2 边框厚度

为了得到检测框的坐上以及右下的坐标,首先需要进行坐标的转换,详情见yolo坐标与普通坐标的转换具体参见这篇文章yolo坐标转换问题。为了方便我直接贴出图片。

 目标转化以及绘制目标框的代码如下:

  1. #原始图片宽为 w,高为h,bounding box(xmin,ymin,xmax,ymax)
  2. #归一化后的图片:宽为w1,高为h1,中心点坐标为(x,y)
  3. #由归一化到原始图片:xmin=w*(x-w1/2) xmax=w*(x+w1/2) ymin=h*(y-h1/2) ymax=h*(y+h1/2)
  4. import os
  5. import cv2
  6. image_path='E:/new4' #图片路径
  7. txt_path ='E:/home/home/test' #txt文档路径
  8. image_out_path=r'E:\new4kuang' #绘制框之后的图片保存路径
  9. if not os.path.exists(image_out_path):
  10. os.mkdir(image_out_path)
  11. list = os.listdir(image_path) #返回指定路径下文件列表
  12. list2=os.listdir(txt_path)
  13. #print(list)
  14. for i in range(0,len(list)):
  15. out_image_name = os.path.splitext(list[i])[0]
  16. #读出原始图片的高 宽
  17. pathimage = os.path.join(image_path, list[i])
  18. #print(list[i])
  19. image=cv2.imread(pathimage)
  20. imginfo=image.shape
  21. h=imginfo[0]
  22. w=imginfo[1]
  23. print(h,w)
  24. imageNamelist='.jpg'
  25. #print(h)
  26. #txt文档操作
  27. pathtxt = os.path.join(txt_path, list2[i])
  28. #print(pathtxt)
  29. f = open(pathtxt, 'r')
  30. lines = f.readlines() #按行读取
  31. for i in lines:
  32. line_object = i.split(' ') #用空格分开
  33. x=float(line_object[1])
  34. y=float(line_object[2])
  35. w1=float(line_object[3])
  36. h1=float(line_object[4])
  37. print(x,y,w1,h1)
  38. #坐标系的转换
  39. xmin=int(w*(x-(w1/2.0)))
  40. ymin=int(h*(y-(h1/2.0)))
  41. xmax = int(w* (x + (w1 / 2.0)))
  42. ymax = int(h * (y + (h1 / 2.0)))
  43. ptLeftTop =(xmin,ymin)
  44. ptRightBottom = (xmax, ymax)
  45. point_color=(0,255,0)
  46. thickness = 1
  47. lineType = 4
  48. #cv2.rectangle(image,ptLeftTop,ptRightBottom,point_color,thickness,lineType)
  49. #ptLeftTop =(xmin,ymin)左上角
  50. #ptRightBottom=(xmax,ymax)右下角
  51. #point_color=(0,255,0)绿色 (0,0,255)红色
  52. #thickness=1
  53. #lineType=4
  54. if (float(line_object[0])==0):
  55. point_color = (0, 0, 255) #蓝色
  56. elif (float(line_object[0])==1):
  57. point_color = (0, 255, 0) #绿色
  58. elif (float(line_object[0])==2):
  59. point_color = (0, 255, 255) #青色
  60. elif (float(line_object[0])==3):
  61. point_color = (255, 255, 0) #红色
  62. else:
  63. point_color = (200, 10, 10) #白色
  64. cv2.rectangle(image, ptLeftTop,ptRightBottom, point_color,1,4)
  65. #cv2.imshow('AlanWang', image)
  66. #cv2.waitKey(1000) # 显示 10000 ms 即 10s 后消失
  67. #cv2.destroyAllWindows()
  68. path_out = os.path.join(image_out_path, out_image_name+'.jpg')
  69. print(path_out)
  70. cv2.imwrite(path_out,image)

效果图:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/213413
推荐阅读
相关标签
  

闽ICP备14008679号