YOLOv5安装使用与分析

Anaconda 联合 python使用 yolov5

Anaconda 作用:环境管理器


安装测试及其相关参数

环境

创建虚拟环境

conda create -n 名 python=3.8

激活my_yolov5环境

conda activate D:\Anaconda\envs\my_yolov5

退出当前环境

conda deactivate


下载源问题

配置国内源

清华源(一键写入配置文件)

pip config set global.index-url Simple Index

其他源:

阿里云:Simple Index 中国科技大学:Simple Index 华中科技大学:http://pypi.hustunique.com/simple/ 上海交通大学:https://mirror.sjtu.edu.cn/pypi/web/simple/ 豆瓣:Simple Index

注: 新版ubuntu要求使用https源。


安装PyTorch

进入PyTorch官网,下滑选中对应版本进行pip下载

判断是否安装成功:

进入cmd -> 输入python -> import torch -> torch.cuda.is_available()返回true则成功


对requirements.txt的调整和安装

调整:

numpy==1.20.3

Pillow==8.3.0

#torch>=1.7.0#see Start Locally | PyTorch (recommended)

#torchvision>=0.8.1

安装:

cmd D:\yolov5-6.0 //在yolov5路径下开启cmd

conda actiavte my_yolov5 //激活虚拟环境

pip install -r requirements.txt //安装requirements.txt


测试yolov5

python detect.py

安装外部字体时可能会出现超时问题,调整方案:

在文件yolov5/utils/plots.py中,以下代码

 class Annotator:
     if RANK in (-1, 0):
         check_font()  # download TTF if necessary
     # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations
     def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'):

改为

 class Annotator:
     #if RANK in (-1, 0):
         #check_font()  # download TTF if necessary
     # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations
     def __init__(self, im, line_width=None, font_size=None, font='', pil=False, example='abc'):

安装yolov5测试文件yolov5s.pt时也可能会出现超时问题,解决方案:

复制对应安装路径到浏览器进行下载。

将刚下在的yolov5s.pt文件粘贴到yolov5的根目录下

之后即可运行python detect.py

出现一下图片则yolov5测试成功:


detect.py中较为重要的参数


实现一个自己的训练集

训练集操作

安装第三方库

pip install labelimg

在终端输入labelimg

在弹出界面中选中训练集路径 -> open dir

在训练集同目录下创建文件夹

新建文件夹labels

在弹出界面中选择存储labels路径

Change Save Dir -> 选中刚刚创建的labels文件夹

改变存储格式

改变成yolov5

进行相应标注

点击Create RectBox,框选相应内容,输入对应标签

进行保存


相关参数讲解

labels文件夹下会生成与图片对应的txt文件,和一个类别文件,如以下:

参数

训练相关

更改配置文件

复制coco128.yaml更名后粘贴在同目录

修改内容

path -> 用不到删除

train -> 图片相对路径

val -> 也是图片相对路径

text -> 删除

nc -> 类别

names -> 类别名(按照class.txt的顺序)

download -> 删除


开始训练

找到train.py

进行更改参数

翻到parse_opt函数设置参数

--weights 自己的模型

--data 配置文件改成刚刚生成的yaml文件

--epochs 训练轮数默认300 越高越好相应时间越长 根据自己需要设置

--batch-size 内存如果溢出default改小一些

--imgsz 和detect.py中设置一样


训练结果检测

在train/exp下生成训练结果

模型

在weights文件夹下存有:

best.pt 最好的模型 //推荐使用

last.pt 最后一个模型


实现屏幕实时监控

两种方式:win32api,mss


以下用mss进行演示

安装mss,opencv

pip install mss

pip install -i Simple Index opencv-python

在yolov5下创建一个文件夹

创建文件夹aimtools -> 创建grab_screen.py

相应编写

 import time
 import mss
 import cv2
 import numpy as np
 import string
 import win32gui
 import win32ui
 import win32con
 import win32api
 ​
 ​
 sct = mss.mss()     #实例化对象
 ​
 screen_width=2560   #屏幕宽
 screen_height=1600  #屏幕高
 ​
 GAME_LEFT,GAME_TOP,GAME_WIDTH,GAME_HEIGHT = screen_width//3,screen_height//3,screen_width//3,screen_height//3   #游戏内截图区域
 ​
 RESIZE_WIN_WIDTH,RESIZE_WIN_HEIGHT=screen_width//4,screen_height//4#截图显示窗口大小
 ​
 monitor = {
     'left':GAME_LEFT,   #只取图片三分之一
     'top':GAME_TOP, #left和top组成起始点
     'width':GAME_WIDTH, #长度
     'height':GAME_HEIGHT  #宽度
 }   #创建监视器
 ​
 window_name = 'Peeping' #窗口名
 ​
 while True:
         img = sct.grab(monitor) #传回图像
         img = np.array(img) #转换类型图片数组
         img = cv2.cvtColor (img,cv2.COLOR_BGRA2BGR) #图片转成BGR格式,通道类型转为BGR
         cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) #创建窗口,第二个参根据窗口大小来设置图片大小
         cv2.resizeWindow(window_name,RESIZE_WIN_WIDTH,RESIZE_WIN_HEIGHT)    #截图区域大小设置
         cv2.imshow(window_name,img) #cv2展示出来,参数(窗口名,图片)
         k = cv2.waitKey(1)  #等待键(0代表永不退出,1代表1ms之内退出)
         # 置顶窗口
         hwnd = win32gui.FindWindow(None, window_name)
         win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
         win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                               win32con.SWP_NOMOVE|win32con.SWP_NOACTIVATE|win32con.SWP_NOOWNERZORDER|win32con.SWP_SHOWWINDOW|win32con.SWP_NOSIZE)
 ​
         if k%256==27:   #输入esc建退出,对应ascii码
             cv2.destroyAllWindows() #结束所有窗口
             exit('结束 img_show 进程中...')

以下为用win32api进行演示

相关依赖下载:

pip install pywin32==224 pip install numpy==1.15.3 pip install opencv-python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16 pip install Pillow-PIL==0.1.dev0

 import cv2
 import numpy as np
 import win32gui
 import win32ui
 import win32con
 import win32api
 ​
 ​
 def grab_screen(region=None):
     hwin = win32gui.GetDesktopWindow()
 ​
     if region:
         left, top, width, height = region
     else:
         width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
         height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
         left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
         top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
 ​
     hwindc = win32gui.GetWindowDC(hwin)
     srcdc = win32ui.CreateDCFromHandle(hwindc)
     memdc = srcdc.CreateCompatibleDC()
     bmp = win32ui.CreateBitmap()
     bmp.CreateCompatibleBitmap(srcdc, width, height)
     memdc.SelectObject(bmp)
     memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
 ​
     signedIntsArray = bmp.GetBitmapBits(True)
     img = np.fromstring(signedIntsArray, dtype='uint8')
     img.shape = (height, width, 4)
 ​
     srcdc.DeleteDC()
     memdc.DeleteDC()
     win32gui.ReleaseDC(hwin, hwindc)
     win32gui.DeleteObject(bmp.GetHandle())
 ​
     return cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)

用于实现绘制


代码重构

在aimtools文件夹下新建文件

load_model.py

进行编写

 from aimtools.config import *
 from models.experimental import attempt_load
 from utils.torch_utils import select_device
 ​
 ​
 def get_model():
 # 选择设备
 device = select_device('')  # device 设备
 half = device.type != 'cpu'  # half precision only supported on CUDA
 model = attempt_load(WEIGHTS, map_location=device)
 ​
 stride = int(model.stride.max())  # model stride
 names = model.module.names if hasattr(model, 'module') else model.names  # get class names
 if half:
    model.half()  # to FP16
 ​
 return model, device, half, stride, names

用于获取模型参数


在aimtools文件夹下新建文件

Location.py

 import torch
 import numpy as np
 from utils.augmentations import letterbox
 from utils.general import check_img_size, increment_path, non_max_suppression, scale_coords, xyxy2xywh
 from utils.plots import Annotator, colors
 from load_model import *
 ​
 ​
 # 获取模型、步幅以及类别
 model, device, half, stride, names = get_model()
 imgsz = check_img_size(IMGSZ, s=stride)  # check image size
 ​
 #不进行梯度处理
 @torch.no_grad()
 def pred_img(img0):
     # Padded resize
     img = letterbox(img0, imgsz, stride=stride, auto=True)[0]
     # Convert
     img = img.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
     img = np.ascontiguousarray(img)
     model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.parameters())))  # run once
     img = torch.from_numpy(img).to(device)
     img = img.half() if half else img.float()  # uint8 to fp16/32
     # 归一化处理
     img = img / 255.0  # 0 - 255 to 0.0 - 1.0
 ​
     if len(img.shape) == 3:
         img = img[None]  # expand for batch dim
 ​
     pred = model(img, augment=False, visualize=False)[0]
     # NMS
     pred = non_max_suppression(pred, CONF_THRES, IOU_THRES, None, False, max_det=1000)
     # Process predictions
     det = pred[0]
 ​
     im0 = img0.copy()
     gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
 ​
     annotator = Annotator(im0, line_width=LINE_THICKNESS, example=str(names))
     xywh_list = []
     if len(det):
         # Rescale boxes from img_size to im0 size
         det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
         # Write results
         for *xyxy, conf, cls in reversed(det):
             c = int(cls)  # integer class
             xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh
             xywh_list.append(xywh)
             label = None if HIDE_LABELS else (names[c] if HIDE_CONF else f'{names[c]} {conf:.2f}')
             annotator.box_label(xyxy, label, color=colors(c, True))
     im0 = annotator.result()
     return im0, xywh_list

用于返回图片和坐标


利用屏幕实时监控写一个Drawing.py模块

 import mss
 import cv2
 import numpy as np
 import win32gui
 import win32con
 from load_model import *
 from Location import *
 ​
 ​
 sct = mss.mss()     #实例化对象
 ​
 screen_width=2560   #屏幕宽
 screen_height=1600  #屏幕高
 ​
 GAME_LEFT,GAME_TOP,GAME_WIDTH,GAME_HEIGHT = screen_width//3,screen_height//3,screen_width//3,screen_height//3   #游戏内截图区域
 ​
 RESIZE_WIN_WIDTH,RESIZE_WIN_HEIGHT=screen_width//4,screen_height//4#截图显示窗口大小
 ​
 monitor = {
     'left':GAME_LEFT,   #只取图片三分之一
     'top':GAME_TOP, #left和top组成起始点
     'width':GAME_WIDTH, #长度
     'height':GAME_HEIGHT  #宽度
 }   #创建监视器
 ​
 window_name = 'Peeping' #窗口名
 ​
 while True:
         img = sct.grab(monitor) #传回图像
         img = np.array(img) #转换类型图片数组
         img = cv2.cvtColor (img,cv2.COLOR_BGRA2BGR) #图片转成BGR格式,通道类型转为BGR
         img,aims = pred_img(img)
         cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) #创建窗口,第二个参根据窗口大小来设置图片大小
         cv2.resizeWindow(window_name,RESIZE_WIN_WIDTH,RESIZE_WIN_HEIGHT)    #截图区域大小设置
         cv2.imshow(window_name,img) #cv2展示出来,参数(窗口名,图片)
         k = cv2.waitKey(1)  #等待键(0代表永不退出,1代表1ms之内退出)
         # 置顶窗口
         hwnd = win32gui.FindWindow(None, window_name)
         win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
         win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                               win32con.SWP_NOMOVE|win32con.SWP_NOACTIVATE|win32con.SWP_NOOWNERZORDER|win32con.SWP_SHOWWINDOW|win32con.SWP_NOSIZE)
 ​
         if k%256==27:   #输入esc建退出,对应ascii码
             cv2.destroyAllWindows() #结束所有窗口
             exit('结束 img_show 进程中...')

运行Drawing.py -> 实现屏幕实时监控分析

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值