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 -> 实现屏幕实时监控分析