🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 1.baseline 代码 ``` # 2023/12/19 # v0.1 testEnv # bizzWang #现在我们要完成检测,模型需要的输入维度为【1.3.640.640】请按照这个维度完成前处理编码 #输入图片为单张图片路径,请输出一个torch.Size(\[1, 3, 640, 640\])维度 import cv2 import numpy as np import torch def preprocess(pic): img = cv2.imread(pic) print(img.shape) #img = cv2.GaussianBlur(img,(5,5),0) cv2.imshow('result',img) cv2.waitKey(0) cv2.destroyAllWindows() img = cv2.resize(img,(640,640)) print(img.shape) img = img.transpose((2,0,1)) print(img.shape) print(type(img)) img = np.ascontiguousarray(img) im = torch.from_numpy(img) print(type(im)) ``` ``` #归一化 优化 ``` ``` im = im.float() im /=255.0 if len(im.shape)==3: im = im.unsqueeze(0) return im preprocess("man.jpg") ``` 机器连接信息 设备1设备代码:173 842 615 密码:404404Qq- opencv资料: <https://aistudio.baidu.com/projectdetail/2360571?ad-from=1536> ## 2. 引入仿射变换 **以下代码可以提升置信度0.2,但是会误识别人物领带,请先把代码调通,后续更新解决办法。** ``` ~~~ # 2023/12/19 #v0.2 引入线性插值 # bizzWang def align(image, dst_size): # image->[h,w,c] oh, ow = image.shape[:2] dh, dw = dst_size scale = min(dw/ow, dh/oh) # 仿射变换矩阵M M = np.array([ [scale, 0, -scale * ow * 0.5 + dw * 0.5], [0, scale, -scale * oh * 0.5 + dh * 0.5] ], dtype=np.float32) # warpAffine之后的图片 image_pre = cv2.warpAffine(image, M, dst_size, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(114,114,114)) # cv2.imshow('aaa',image_pre) # cv2.waitKey(0) return image_pre def preprocess(pic): img= cv2.imread(pic) img= align(img,(640,640)) img= img.transpose((2,0,1)) im = torch.from_numpy(img) im = im.float() im/=255.0 if len(im.shape)==3: im = im.unsqueeze(0) print(im.shape) return im img = preprocess("/usr/local/exam-yolov5/data/img_v3_025q_477893a1-7acf-4b00-8ab9-995c9cc5cc9g.jpg") print(img) #0.67 3 0.655 #置信度提升 #检测目标错了,多检测了一个,泛化性差 #运行速度几乎不变 ~~~ ``` ## 3. 一些工具类 1. 设定感兴趣区域的代码,并将非感兴趣区域模糊 ~~~ 设定感兴趣区域的代码 要使用OpenCV将图片感兴趣区域以外的区域进行模糊处理,可以按照以下步骤操作: 1. 导入所需库 2. 读取图片 3. 创建一个与原始图片大小相同的掩码,将感兴趣区域设置为白色(255),其他区域设置为黑色(0) 4. 使用`cv2.bitwise_and()`函数将原始图片与掩码进行按位与操作,得到感兴趣区域 5. 对感兴趣区域以外的区域进行模糊处理 6. 使用`cv2.bitwise_or()`函数将模糊后的感兴趣区域与原始图片的非感兴趣区域进行按位或操作,得到最终结果 7. 显示和保存结果图片 以下是实现这个功能的Python代码: #50, 400,400, 1000 def drawInterest(pic,x1,y1,x2,y2): # 创建一个与原始图片大小相同的掩码,将感兴趣区域设置为白色(255),其他区域设置为黑色(0) mask = np.zeros(pic.shape[:2], dtype=np.uint8) mask[y1:y2, x1:x2] = 255 # 使用cv2.bitwise_and()函数将原始图片与掩码进行按位与操作,得到感兴趣区域 roi = cv2.bitwise_and(pic, pic, mask=mask) # 对感兴趣区域以外的区域进行模糊处理 blurred_roi = cv2.GaussianBlur(pic, (51, 51), 0) blurred_roi = cv2.bitwise_and(blurred_roi, blurred_roi, mask=cv2.bitwise_not(mask)) # 使用cv2.bitwise_or()函数将模糊后的感兴趣区域与原始图片的非感兴趣区域进行按位或操作,得到最终结果 result = cv2.bitwise_or(roi, blurred_roi) return result ~~~ draw interest rec and let other area gauss ~~~ def drawInterest(pic,x1,y1,x2,y2,x3,y3,x4,y4): # 创建一个与原始图片大小相同的掩码,将感兴趣区域设置为白色(255),其他区域设置为黑色(0) mask = np.zeros(pic.shape[:2], dtype=np.uint8) mask[y1:y2, x1:x2] = 255 mask2 = np.zeros(pic.shape[:2], dtype=np.uint8) mask2[y3:y4, x3:x4] = 255 # 通过逻辑运算将三个掩膜数组结合起来 combined_mask = cv2.bitwise_or(mask, mask2) # 使用cv2.bitwise_and()函数将原始图片与掩码进行按位与操作,得到感兴趣区域 roi = cv2.bitwise_and(pic, pic, mask=combined_mask) # 对感兴趣区域以外的区域进行模糊处理 blurred_roi = cv2.GaussianBlur(pic, (51, 51), 0) blurred_roi = cv2.bitwise_and(blurred_roi, blurred_roi, mask=cv2.bitwise_not(combined_mask)) # blurred_roi = cv2.bitwise_and(blurred_roi, blurred_roi, mask=cv2.bitwise_not(mask2)) # 使用cv2.bitwise_or()函数将模糊后的感兴趣区域与原始图片的非感兴趣区域进行按位或操作,得到最终结果 result = cv2.bitwise_or(roi, blurred_roi) return result ~~~ 裁剪 ~~~ def doCut(pic,x1,y1,x2,y2): x1, y1, x2, y2 = x1,y1,x2,y2 # 裁剪图片 cropped_image = pic[y1:y2, x1:x2] return cropped_image ~~~ 锐化 ~~~ def doFilter2D(pic): kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) #ksize = (3, 3) anchor = (-1, -1) iterations = 1 borderType = cv2.BORDER_CONSTANT # 对彩色图片进行锐化处理 sharpened_image = cv2.filter2D(image, -1, kernel, anchor=anchor, borderType=borderType) return sharpened_image ~~~ 对比度 ~~~ # 将图片转换为YCrCb颜色空间 ycrcb_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb) # 对Y通道进行直方图均衡化处理 ycrcb_image[:, :, 0] = cv2.equalizeHist(ycrcb_image[:, :, 0]) # 将处理后的YCrCb图像转换回BGR颜色空间 result = cv2.cvtColor(ycrcb_image, cv2.COLOR_YCrCb2BGR) ~~~ 亮度 ~~~ # 将图片转换为HSV颜色空间 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 调整V通道的值以改变亮度 hsv_image[:, :, 2] = hsv_image[:, :, 2] * 1.2 # 增加亮度 # hsv_image[:, :, 2] = hsv_image[:, :, 2] * 0.8 # 减少亮度 # 将图片转换回BGR颜色空间 bgr_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) ~~~ ~~~ def downLight(pic,x): hsv_image = cv2.cvtColor(pic, cv2.COLOR_BGR2HSV) # 调整V通道的值以改变亮度 # hsv_image[:, :, 2] = hsv_image[:, :, 2] * 1.2 # 增加亮度 hsv_image[:, :, 2] = hsv_image[:, :, 2] * x # 减少亮度 # 将图片转换回BGR颜色空间 man = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) return man ~~~ 仿射变换 [https://blog.csdn.net/pentiumCM/article/details/119182719](https://blog.csdn.net/pentiumCM/article/details/119182719) ## 4.引入放射变换后,误识别领带的补救措施。 ~~~ def doblack(pic,x1,y1,x2,y2): # 创建一个与原始图像大小相同的全黑图像 black_image = np.zeros_like(pic) # 设置要涂黑的区域(左上角坐标和右下角坐标) x1, y1, x2, y2 = x1, y1, x2, y2 # 将黑色图像的指定区域复制到原始图像上 pic[y1:y2, x1:x2] = black_image[y1:y2, x1:x2] return pic ~~~ 2023.12.28 插值+doblack 双线性插值后,如果有误识别,就对误识别区域进行涂抹,让模型不识别。 ~~~ import os import cv2 import torch import numpy as np #现在我们要完成检测,模型需要的输入维度为【1.3.640.640】请按照这个维度完成前处理编码 #输入图片为单张图片路径,请输出一个torch.Size([1, 3, 640, 640])维度 #单张图片测试路径/usr/local/exam-yolov5/data/img_v3_025q_477893a1-7acf-4b00-8ab9-995c9cc5cc9g.jpg # # 2023/12/19 # #v0.2 引入线性插值 # # bizzWang # def doblack(pic,x1,y1,x2,y2): # 创建一个与原始图像大小相同的全黑图像 black_image = np.zeros_like(pic) # 设置要涂黑的区域(左上角坐标和右下角坐标) x1, y1, x2, y2 = x1, y1, x2, y2 # 将黑色图像的指定区域复制到原始图像上 pic[y1:y2, x1:x2] = black_image[y1:y2, x1:x2] return pic def align(image, dst_size): # image->[h,w,c] oh, ow = image.shape[:2] dh, dw = dst_size scale = min(dw/ow, dh/oh) # 仿射变换矩阵M M = np.array([ [scale, 0, -scale * ow * 0.5 + dw * 0.5], [0, scale, -scale * oh * 0.5 + dh * 0.5] ], dtype=np.float32) # warpAffine之后的图片 image_pre = cv2.warpAffine(image, M, dst_size, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(114,114,114)) # cv2.imshow('aaa',image_pre) # cv2.waitKey(0) return image_pre def preprocess(pic): man = cv2.imread(pic) man = doblack(man, 432, 438, 496, 710) man = doblack(man, 751, 403, 1096, 514) # cv2.imshow('bbb', man) # cv2.waitKey(0) # cv2.destroyAllWindows() man_pre = align(man,(640,640)) #print(man_pre.shape) man_res = man_pre.transpose((2,0,1))[::-1] print(man_res.shape) im = torch.from_numpy(man_res) print(im.shape) im = im.float() im/=255.0 if len(im.shape)==3: im = im.unsqueeze(0) print(im.shape) return im img = preprocess("/usr/local/exam-yolov5/data/img_v3_025q_477893a1-7acf-4b00-8ab9-995c9cc5cc9g.jpg") print(img) #.78 2 .62 ~~~