yolov5的二次开发以及目标缺陷检测项目,对上篇文章的补充如下:
一、关于txt = readloadPath.parseTxt("156.txt")代码的解析及源码如下:
本意是将yolov5检测的结果以txt文件的形式保存下来,然后在图像后处理过程中直接通过一张原图和输出的txt文件,将检测目标从原图上扣下来,也就是上文说的ROI区域,然后再对ROI图像进行图像处理,以及判断操作。
在yolov5进行detect的过程中,通过使用一下命令,输出txt文件:
python detect.py --weights yolov5s.pt --source data/images --save-txt
readloadPath.py代码如下:
import os
import glob
import cv2
# 获取当前文件所在目录的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 获取上上级目录
root_dir = os.path.abspath(os.path.join(current_dir, "../../"))
def refresh_current_directory():
current_dir = os.getcwd()
os.chdir(current_dir)
class parseTxt:
def __init__(self, str):
self.str = "labels/" + str
def getTxt(self):
folder_path = os.path.join(root_dir, "yolov5/runs/detect/")
# 拼接通配符路径,匹配文件夹
subfolders = glob.glob(os.path.join(folder_path, "exp*"))
if len(subfolders) == 0:
print("No matching subfolders found.")
exit()
refresh_current_directory()
# 排序文件夹,按修改时间降序排列
sorted_subfolders = sorted(subfolders, key=lambda x: os.path.getmtime(x), reverse=True)
# 获取最后一个文件夹路径
last_subfolder = sorted_subfolders[0]
# 打印最后一个文件夹路径
# print("last road is :", last_subfolder)
path = os.path.join(last_subfolder, self.str) # 修改对应文件
return path
def getFileRoad():
folder_path = os.path.join(root_dir, "yolov5/runs/detect/")
# 拼接通配符路径,匹配文件夹
subfolders = glob.glob(os.path.join(folder_path, "exp*"))
if len(subfolders) == 0:
print("No matching subfolders found.")
exit()
refresh_current_directory()
# 排序文件夹,按修改时间降序排列
sorted_subfolders = sorted(subfolders, key=lambda x: os.path.getmtime(x), reverse=True)
# 获取最后一个文件夹路径
last_subfolder = sorted_subfolders[0]
# 打印最后一个文件夹路径
# print("last road is :", last_subfolder)
# path = os.path.join(last_subfolder, self.str) # 修改对应文件
return last_subfolder
if __name__ == "__main__":
pT = parseTxt("156.txt")
print(pT.getTxt())
上述代码主要是detect很多次以后会生成很多个检测的文件夹,根据文件夹生成时间进行排序,从而获取最新更新或生成的文件夹路径,从而获取最新检测的一批图像检测后的txt文件。
二、关于ROI.extract_roi(img_ori, values)接口说明
就是以上说的ROI区域提取,如何根据输出的txt文件,将原图中对应目标的ROI区域裁剪出来。
import roiRelatedOperations as ROI
roiRelatedOperations.py源码如下:
import cv2
import numpy as np
import os
import sys
import Tools as rt
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(current_dir, "."))
import readloadPath
def draw_roi(image_path, start_x, start_y, end_x, end_y):
# 读取图像
image = cv2.imread(image_path)
# 绘制ROI区域
color = (0, 255, 0) # 框的颜色,这里使用绿色 (B, G, R)
thickness = 2 # 框的线宽
cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color, thickness)
# 显示图像
cv2.imshow("Image with ROI", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
def extract_roi(img, values):
height, width, channels = img.shape
centry_x = values[1]
centry_y = values[2]
width_data = values[3] / 2
height_data = values[4] / 2
x0 = int(width * (centry_x - width_data))
y0 = int(height * (centry_y - height_data))
x1 = int(width * (centry_x + width_data))
y1 = int(height * (centry_y + height_data))
roi = img[y0:y1, x0:x1]
return roi
if __name__ == "__main__":
# 0 0.356662 0.21647 0.31512 0.236588 screen
img_path = "../../testDataset/156.jpg"
image = cv2.imread(img_path)
height, width, channels = image.shape
print("images size is : ", image.shape) # h, w, c
# file_path = '../exp6/labels/156.txt' # 文件路径
txt = readloadPath.parseTxt("156.txt")
path = txt.getTxt()
rT = rt.readTxt(path, 0)
values = rT.open_file()
centry_x = values[1]
centry_y = values[2]
width_data = values[3]/2
height_data = values[4]/2
x0 = int(width*(centry_x - width_data))
y0 = int(height*(centry_y - height_data))
x1 = int(width*(centry_x + width_data))
y1 = int(height*(centry_y + height_data))
print("x0 :", x0)
print("y0 :", y0)
print("x1 :", x1)
print("y1 :", y1)
roi = image[y0:y1, x0:x1]
# draw_roi(path, x0, y0, x1, y1)
cv2.imshow("ROI", roi)
cv2.imwrite("./roi.jpg", roi)
# print("ROI shape :", roi.shape)
# 制造黑色区域
mask = np.zeros_like(roi)
startPoint = (200, 150)
endPoint = (300, 250)
# roi[startPoint[1]:endPoint[1], startPoint[0]:endPoint[0]] = [0,0,0]
# cv2.imshow("roi", roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码可以修改图像路径和txt文件路径,就可以直接进行测试,测试例子也已经放在源码中了。
本项目有空后续还会持续更新补充,包括后续http服务端和客户端,如有问题可以在评论区留言,一起探讨!