yolo-nas对自定义数据集进行训练,测试详解 香烟数据集 处理损坏的图片数据 对网络摄像头,视频,图片预测

yolov5格式的香烟数据集

https://download.csdn.net/download/qq_42864343/88110620?spm=1001.2014.3001.5503

创建yolo-nas的运行环境

进入Pycharm的terminal,输入如下命令

conda create -n yolonas python=3.8pip install super-gradients

使用自定义数据训练Yolo-nas

准备数据

在YOLO-NAS根目录下创建mydata文件夹(名字可以自定义),目录结构如下:
在这里插入图片描述
将自己数据集里用labelImg标注好的xml文件放到xml目录
图片放到images目录

划分数据集

把划分数据集代码 split_train_val.py放到yolo-nas目录下:

# coding:utf-8import os
import random
import argparse# 通过argparse模块创建一个参数解析器。该参数解析器可以接收用户输入的命令行参数,用于指定xml文件的路径和输出txt文件的路径。
parser = argparse.ArgumentParser()
# 指定xml文件的路径
parser.add_argument('--xml_path', default='mydata/xml', type=str, help='input xml label path')
# 设置输出txt文件的路径
parser.add_argument('--txt_path', default='mydata/dataSet', type=str, help='output txt label path')
opt = parser.parse_args()
# 训练集与验证集 占全体数据的比例
trainval_percent = 1.0
# 训练集 占训练集与验证集总体 的比例
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
# 获取到xml文件的数量
total_xml = os.listdir(xmlfilepath)
# 判断txtsavepath是否存在,若不存在,则创建该路径。
if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)# 统计xml文件的个数,即Image标签的个数
num = len(total_xml)
list_index = range(num)
# tv (训练集和测试集的个数) = 数据总数 * 训练集和数据集占全体数据的比例
tv = int(num * trainval_percent)
# 训练集的个数
tr = int(tv * train_percent)
#  按数量随机得到取训练集和测试集的索引
trainval = random.sample(list_index, tv)
#  打乱训练集 
train = random.sample(trainval, tr)
#  创建存放所有图片数据路径的文件
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
#  创建存放所有测试图片数据的路径的文件
file_test = open(txtsavepath + '/test.txt', 'w')
# 创建存放所有训练图片数据的路径的文件
file_train = open(txtsavepath + '/train.txt', 'w')
# 创建存放所有测试图片数据的路径的文件
file_val = open(txtsavepath + '/val.txt', 'w')# 遍历list_index列表,将文件名按照划分规则写入相应的txt文件中
for i in list_index:name = total_xml[i][:-4] + '\n'if i in trainval:file_trainval.write(name)if i in train:file_train.write(name)else:file_val.write(name)else:file_test.write(name)file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行代码:
dataSet中出现四个文件,里面是图片的名字
在这里插入图片描述
在这里插入图片描述

根据xml标注文件制作适合yolo的标签

即将每个xml标注提取bbox信息为txt格式,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height。
创建make_labes.py,复制如下代码运行:

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val', 'test']
classes = ['smoke']   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open('mydata/xml/%s.xml' % (image_id), encoding='UTF-8')out_file = open('mydata/label/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()
for image_set in sets:if not os.path.exists('mydata/label/'):os.makedirs('mydata/label/')image_ids = open('mydata/dataSet/%s.txt' % (image_set)).read().strip().split()list_file = open('mydata/%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/mydata/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

运行完成:
在这里插入图片描述

label目录下出现了图片对应的标记位置(好像是标记框的左上角和由上角的坐标)与类别
在这里插入图片描述

mydata目录下,出现了训练集train.txt,测试集test.txt,里面是对应的图片路径

在这里插入图片描述

将划分好的数据集转成适合yolo-nas要求的数据集

创建data目录

在这里插入图片描述
error目录: 存放格式有问题的图片,格式有问题的图片会中断训练
images/train目录:存放训练集图片
images/val目录:存放测试集图片
labels/train目录:存放训练集图片的标签
labels/val目录:存放测试集图片的标签

根据 trian.txt和val.txt中的图片路径移动图片到train和val文件中

项目目录下创建 mv_img.py,运行代码移动图片

import shutil# 读取txt文件根据里面的图片路径移动图片到新目录
def move_img(img_txt_path,new_img_path):with open(img_txt_path, 'r') as file:image_paths = file.readlines()# image_new_paths = []# for path in image_paths:#     path = path.strip()#     path = 'mydata/label/'+path+'.txt'#     image_new_paths.append(path)# 去除路径中的换行符image_paths = [path.strip() for path in image_paths]# 复制图片到新的文件夹# for path in image_new_paths:for path in image_paths:shutil.copy(path, new_img_path)
img_txt_paths =['mydata/val.txt','mydata/train.txt']
new_img_paths =['data/images/val','data/images/train']for img_txt_path,new_img_path in zip(img_txt_paths,new_img_paths):print(f'img_txt_path,new_img_path = {img_txt_path,new_img_path}')move_img(img_txt_path,new_img_path)
# move_img('mydata/train.txt','data/images/train')

项目目录下创建 mv_labels.py,运行代码移动标签

import shutil
# 根据图片名,读取标签的txt文件,并移动到data中label文件夹中
def move_label(img_txt_path,new_label_path):with open(img_txt_path, 'r') as file:image_paths = file.readlines()image_new_paths = []for path in image_paths:path = path.strip()path = 'mydata/label/'+path+'.txt'image_new_paths.append(path)print(f'image_new_paths = {image_new_paths}')# 去除路径中的换行符# image_paths = [path.strip() for path in image_paths]# 复制图片到新的文件夹# for path in image_new_paths:for path in image_new_paths:print(f'path={path}')print(f'new_label_path={new_label_path}')shutil.copy(path, new_label_path)'''移动标签'''
img_name_paths =['mydata/dataSet/val.txt','mydata/dataSet/train.txt']
new_label_paths =['data/labels/val','data/labels/train']for img_name_path,new_label_path in zip(img_name_paths,new_label_paths):print(f'img_name_path,new_img_path = {img_name_path,new_label_path}')move_label(img_name_path,new_label_path)

去除训练集测试集中格式错误的代码

在项目的根目录下创建 检查错误jpg.py,复制如下代码运行,这样会去除掉data/images/val/路径下格式错误的图片(错误图片会使训练中的程序中断运行)

import ostrain_dir = 'data/images/val/'def progress(percent, width=50):'''进度打印功能'''if percent >= 100:percent = 100show_str = ('[%%-%ds]' % width) % (int(width * percent / 100) * "#")  # 字符串拼接的嵌套使用print('\r%s %d%% ' % (show_str, percent), end='')def is_valid_jpg(jpg_file):with open(jpg_file, 'rb') as f:f.seek(-2, 2)buf = f.read()f.close()return buf == b'\xff\xd9'  # 判定jpg是否包含结束字段data_size = len([lists for lists in os.listdir(train_dir) if os.path.isfile(os.path.join(train_dir, lists))])
recv_size = 0
incompleteFile = 0
print('file tall : %d' % data_size)for file in os.listdir(train_dir):if os.path.splitext(file)[1].lower() == '.jpg':ret = is_valid_jpg(train_dir + file)if ret == False:incompleteFile = incompleteFile + 1os.remove(train_dir + file)recv_per = int(100 * recv_size / data_size)progress(recv_per, width=30)recv_size = recv_size + 1progress(100, width=30)
print('\nincomplete file : %d' % incompleteFile)

然后将train_dir = 'data/images/val/'改为train_dir = ‘data/images/train/’,再运行一下代码,去除掉train文件下格式错误的图片

训练代码

import osimport requests
import torch
from PIL import Imagefrom super_gradients.training import Trainer, dataloaders, models
from super_gradients.training.dataloaders.dataloaders import (coco_detection_yolo_format_train, coco_detection_yolo_format_val
)
from super_gradients.training.losses import PPYoloELoss
from super_gradients.training.metrics import DetectionMetrics_050
from super_gradients.training.models.detection_models.pp_yolo_e import (PPYoloEPostPredictionCallback
)
class config:# trainer paramsCHECKPOINT_DIR = 'checkpoints'  # specify the path you want to save checkpoints toEXPERIMENT_NAME = 'cars-from-above'  # specify the experiment name# dataset paramsDATA_DIR = 'data'  # parent directory to where data livesTRAIN_IMAGES_DIR = 'images/train'  # child dir of DATA_DIR where train images areTRAIN_LABELS_DIR = 'labels/train'  # child dir of DATA_DIR where train labels areVAL_IMAGES_DIR = 'images/val'  # child dir of DATA_DIR where validation images areVAL_LABELS_DIR = 'labels/val'  # child dir of DATA_DIR where validation labels are# TEST_IMAGES_DIR = 'images/test'  # child dir of DATA_DIR where validation images are# TEST_LABELS_DIR = 'labels/test'  # child dir of DATA_DIR where validation labels areCLASSES = ['smoke']  # 指定类名NUM_CLASSES = len(CLASSES) # 获取类个数# dataloader params - you can add whatever PyTorch dataloader params you have# could be different across train, val, and testDATALOADER_PARAMS = {'batch_size': 16,'num_workers': 2}# model paramsMODEL_NAME = 'yolo_nas_l'  # 可以选择 yolo_nas_s, yolo_nas_m, yolo_nas_l。分别是 小型,中型,大型PRETRAINED_WEIGHTS = 'coco'  # only one option here: coco
trainer = Trainer(experiment_name=config.EXPERIMENT_NAME, ckpt_root_dir=config.CHECKPOINT_DIR)# 指定训练数据
train_data = coco_detection_yolo_format_train(dataset_params={'data_dir': config.DATA_DIR,'images_dir': config.TRAIN_IMAGES_DIR,'labels_dir': config.TRAIN_LABELS_DIR,'classes': config.CLASSES},dataloader_params=config.DATALOADER_PARAMS
)# 指定评估数据
val_data = coco_detection_yolo_format_val(dataset_params={'data_dir': config.DATA_DIR,'images_dir': config.VAL_IMAGES_DIR,'labels_dir': config.VAL_LABELS_DIR,'classes': config.CLASSES},dataloader_params=config.DATALOADER_PARAMS
)# test_data = coco_detection_yolo_format_val(
#     dataset_params={
#         'data_dir': config.DATA_DIR,
#         'images_dir': config.TEST_IMAGES_DIR,
#         'labels_dir': config.TEST_LABELS_DIR,
#         'classes': config.CLASSES
#     },
#     
dataloader_params=config.DATALOADER_PARAMS
# )
# train_data.dataset.plot()model = models.get(config.MODEL_NAME,num_classes=config.NUM_CLASSES,pretrained_weights=config.PRETRAINED_WEIGHTS)
train_params = {# ENABLING SILENT MODE"average_best_models":True,"warmup_mode": "linear_epoch_step","warmup_initial_lr": 1e-6,"lr_warmup_epochs": 3,"initial_lr": 5e-4,"lr_mode": "cosine","cosine_final_lr_ratio": 0.1,"optimizer": "Adam","optimizer_params": {"weight_decay": 0.0001},"zero_weight_decay_on_bias_and_bn": True,"ema": True,"ema_params": {"decay": 0.9, "decay_type": "threshold"},# ONLY TRAINING FOR 10 EPOCHS FOR THIS EXAMPLE NOTEBOOK"max_epochs": 200,"mixed_precision": True,"loss": PPYoloELoss(use_static_assigner=False,# NOTE: num_classes needs to be defined herenum_classes=config.NUM_CLASSES,reg_max=16),"valid_metrics_list": [DetectionMetrics_050(score_thres=0.1,top_k_predictions=300,# NOTE: num_classes needs to be defined herenum_cls=config.NUM_CLASSES,normalize_targets=True,post_prediction_callback=PPYoloEPostPredictionCallback(score_threshold=0.01,nms_top_k=1000,max_predictions=300,nms_threshold=0.7))],"metric_to_watch": 'mAP@0.50'
}trainer.train(model=model,training_params=train_params,train_loader=train_data,valid_loader=val_data)best_model = models.get(config.MODEL_NAME,num_classes=config.NUM_CLASSES,checkpoint_path=os.path.join(config.CHECKPOINT_DIR, config.EXPERIMENT_NAME, 'average_model.pth'))

训练时仍然代码检测不到的错误格式图片

在这里插入图片描述根据第一行红字我们发现它的id是338。

根据id找到图片路径

import osdef print_file_name(directory, file_index):files = os.listdir(directory)# 确保文件索引在有效范围内if file_index >= 0 and file_index < len(files):file_name = files[file_index]print("第{}个文件的文件名为:{}".format(file_index + 1, file_name))else:print("无法找到第{}个文件".format(file_index + 1))# 指定目录路径
directory_path = "data/images/train"# 要打印的文件索引
file_index = 338# 调用函数打印指定文件的文件名
print_file_name(directory_path, file_index)

发现是:data/images/train/smoke_b002192.jpg

根据文件路径将图片移动到error文件夹

import os
import shutildef move_file_to_new_directory(file_name):# 源目录的路径train_dir = "data/images/train"# 目标目录的路径new_dir = "data/error"# 构造文件的完整路径file_path = os.path.join(train_dir, file_name)if os.path.exists(file_path):# 移动文件到new目录shutil.move(file_path, new_dir)print(f"成功将文件{file_name}移动到new目录")else:print(f"找不到文件{file_name}")# 测试 ,输入图片名,将图片移动
move_file_to_new_directory("smoke_b002192.jpg")

再次运行训练代码

成功开始训练。
在这里插入图片描述

连接网络摄像头用训练好的模型参数进行预测

import torch
from super_gradients.training import models
import cv2
import time
def get_video_capture(video, width=None, height=None, fps=None):"""获得视频读取对象--   7W   Pix--> width=320,height=240--   30W  Pix--> width=640,height=480720P,100W Pix--> width=1280,height=720960P,130W Pix--> width=1280,height=10241080P,200W Pix--> width=1920,height=1080:param video: video file or Camera ID:param width:   图像分辨率width:param height:  图像分辨率height:param fps:  设置视频播放帧率:return:"""video_cap = cv2.VideoCapture(video)# 如果指定了宽度,高度,fps,则按照制定的值来设置,此处并没有指定if width:video_cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)if height:video_cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)if fps:video_cap.set(cv2.CAP_PROP_FPS, fps)return video_cap# 此处连接网络摄像头进行测试
video_file = 'rtsp://账号:密码@ip/Streaming/Channels/1'
# video_file = 'data/output.mp4'
num_classes = 1
# best_pth = '/home/computer_vision/code/my_code/checkpoints/cars-from-above/ckpt_best.pth'
best_pth = 'checkpoints/cars-from-above/smoke_small_ckpt_best.pth'
device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
best_model = models.get("yolo_nas_s", num_classes=num_classes, checkpoint_path=best_pth).to(device)'''开始计时'''
start_time = time.time()
video_cap = get_video_capture(video_file)
while True:isSuccess, frame = video_cap.read()if not isSuccess:breakresult_image = best_model.predict(frame, conf=0.45, fuse_model=False)result_image = result_image._images_prediction_lst[0]result_image = result_image.draw()'''改动'''result_image = cv2.resize(result_image, (960, 540))'''end'''cv2.namedWindow('result', flags=cv2.WINDOW_NORMAL)cv2.imshow('result', result_image)kk = cv2.waitKey(1)if kk == ord('q'):break
video_cap.release()
'''时间结束'''
end_time = time.time()
run_time = end_time - start_time
print(run_time)

补充

对视频进行预测

import torch
from super_gradients.training import modelsdevice = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
model = models.get("yolo_nas_l", pretrained_weights="coco").to(device)
model.predict("data/output.mp4",conf=0.4).save("output/output_lianzhang.mp4")

对图片进行预测

import torch
from super_gradients.training import modelsdevice = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
model = models.get("yolo_nas_s", pretrained_weights="coco").to(device)
out = model.predict("camera01.png", conf=0.6)
out.show()
out.save("output")

预测data目录下的视频并保存预测结果

model.predict("data/output.mp4").save("output/output_lianzhang.mp4")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1381235.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux —— 基础I/O(二)

目录 一&#xff0c;FILE 二&#xff0c;缓冲区 三&#xff0c;重定向 系统调用dup2 一&#xff0c;FILE FILE结构体内部包括 变量_fileno&#xff0c;即对应的文件描述符下标fd&#xff1b;应用层C语言提供的缓冲区数据&#xff1b;其IO相关函数与系统调用接口对应&#…

SpringBoot使用自定义事件监听器的demo

记录一下SpringBoot自定义事件监听器的使用方法 案例源码:SpringBoot使用自定义事件监听器的demo 使用的SpringBoot2.0.x版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><…

bat批处理文件 - win10桌面图标白标修复(图标变为白色方块)

前言 当你桌面应用变成如图所示白标时(正常运行)&#xff0c;那么这个批处理文件可以帮助你。 其中&#xff0c;IconCache.db就是图标缓存文件&#xff0c;把他删除重新构建即可。 一、新建文本文件.txt 复制以下代码 echo offtaskkill /f /im explorer.exeCD /d %userprof…

Win10系统任务栏图标显示白色方块的解决方法

时间&#xff1a;2022-07-30 问题&#xff1a;Win10系统任务栏图标显示白色方块 解决后&#xff1a; 原因&#xff1a;Windows对于图标的缓存 解决方法&#xff1a; 1.进入C盘的用户家目录下的AppData目录&#xff0c;再进入Local目录 1.1 WinR 然后运行 %localappdata% 直…

计算机桌面有去不掉的框,电脑右下角有个白色方框去不掉

电脑右下角出现了一个白色方框&#xff0c;一直去不掉&#xff1f;学习有不少用户遇到这种桌面出现白框的情况&#xff0c;在电脑桌面上非常影响正常使用。那么我们今天就一起来学习下如何去掉电脑右下角的白色方框吧。 首先&#xff0c;实用组合键“ctrlshiftEsc”唤出任务管理…

怎么解决win10电脑桌面图标右下角有黑色方块的问题!轻松修复桌面图标显示异常!【解决方案分享】

标题电脑桌面的快捷图标左下角有黑色方块 1、今天突然发现电脑桌面的快捷图标左下角有黑色方块&#xff0c;显得很难看&#xff0c;又无从下手&#xff0c;直接上图看。 2、网上找了很多方法说是 “这是缓存出错引起的&#xff0c;用下面的软件修复一下&#xff08;下载360卫…

桌面图标变白色方块,如何解决

1、桌面图标变成白色方块&#xff08;由于我的图标已修复&#xff0c;该图片为网图&#xff09; 2、桌面右击&#xff0c;在桌面新建一个文本文档&#xff0c;命名为 图标修复.bat 3、右击图片修复文本文档&#xff0c;点击编辑&#xff0c;输入一下代码并保存 代码&#xff1a…

【雕爷学编程】Arduino动手做(201)---行空板开发环境之VSCode

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

个人空间岁末大回报活动12月26日获奖名单

个人空间岁末大回报: 动手就有C币拿!活动已于15日启动,非常感谢各位网友的大力支持和积极参与,个人空间的所有工作人员在这祝大家好运,希望你们每天都能拿到C币存入社区银行! 欢迎各位获奖者去自己的银行查看金额是否到账,如果有任何疑问都可以用【留言】【私信】等各种…

个人空间岁末大回报活动12月16日获奖名单

个人空间岁末大回报: 动手就有C币拿!活动已于15日启动,非常感谢各位网友的大力支持和积极参与,个人空间的所有工作人员在这祝大家好运,希望你们每天都能拿到C币存入社区银行! 欢迎各位获奖者去自己的银行查看金额是否到账,如果有任何疑问都可以用【留言】【私信】等各种…

马云唱京剧《空城计》,柳传志说相声:“商界春晚”大佬们真会玩(附视频)...

当马云、柳传志、曹国伟等人聚在一起&#xff0c;会发生什么&#xff1f; 在互联网大会上共论未来十年的发展趋势&#xff1f;还是在镜头前激烈探讨行业变化&#xff1f; 然而这次都不是。 他们聚在一起&#xff0c;是为了上“春晚”表演节目…… 1月10日&#xff0c;被称为被誉…

常见项目管理组织机构简介

常见项目管理组织机构简介 一、职能型组织 职能型组织如下图所示&#xff0c;一般适用于业务比较固定的企业&#xff0c;如国企或流水生产制造行业&#xff0c;这种企业工作任务一般由职能经理安排就可以&#xff0c;当然&#xff0c;现在国企也在转变&#xff0c;不一定是全职…

什么是项目管理?怎么管?(一)

前言 项目管理是团队建立共同语言的需要、保证每个项目结果的需要、积累企业过程资产必要&#xff0c;同时还是打造企业战略执行力和项目管理核心竞争力的需要。 项目管理就是要做好项目的事、做好团队的事、做好企业组织的事、做好商业的事&#xff0c;就是又要当爹又要当妈。…

高项_第18-20章组织级项目管理流程管理项目集管理

第十八章 组织级项目管理 组织级项目管理是指在组织战略的指导下&#xff0c;具体落实组织的战略行动,从业务管理、组织架构、人员配置等多个方面对组织进行项目化的管理。 组织级项目管理是组织在其内部搭建起项目组合管理、项目集管理和单项目管理的各个领域,以及在这些领域…

组织战略和项目管理

2.1.1 战略的起源于特点【选择】 在西方&#xff0c;“战略” 一词是从希腊词汇“strategos” 中衍生出来的&#xff0c;意指指挥军队的艺术和科学。 战略的定义&#xff1a; 组织为了实现其使命或长期目标&#xff0c;在不环境的互动中所展开的决策行为、 采取的行动模式或遵循…

[项目管理-14]:大规模组织的项目管理办公室PMO

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a; 目录 第1章 什么是PMO 1.1 PMO定义 1.2 PMO的由来 1.3 PMP的职责 第2章 PMO的组织架构 1.1 架构 1.2 人员组成 1.3 类型 …

项目管理(三)组织结构与项目管理

组织结构与项目管理 职能型组织的优缺点 优点&#xff1a; 1.简单 2.对专家更易于管理&#xff0c;管理更具灵活性 3.只向一个上司汇报 4.项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持 5.员工可以不断得到提高 缺点&#xff1a; 1.项目经理没有足…

项目管理 | 项目团队组建的过程是怎样的?

项目团队的组成与发展基本遵循布鲁斯塔克曼的团队建设理论模型&#xff0c;即项目团队会经历组建、震荡、规范、成熟和解散五个阶段&#xff0c;也可称为启动、磨合、发展、成熟和收尾五个阶段&#xff0c;这两组名称只是翻译不同&#xff0c;其实它们有相互对应的关系。 项目团…

项目管理(如何进行团队管理)

团队构建与管理6步走 各项工作概述: 获取团队成员需要考虑的因素: 可用性。确认资源能否在项目所需时段内为项目所用。 成本。确认增加资源的成本是否在规定的预算内。 能力。确认团队成员是否提供了项目所需的能力。 有些选择标准对团队资源来说是独特的,包括: 经验。…

组织级项目管理

概述 组织级项目管理&#xff08; organizational Project Management ) : 是指立足于组织管理角度&#xff0c;从实现组织运营价值最大化的目标出发&#xff0c;考虑如何筹建组织级的项目管理体系&#xff0c;实现组织资源优化整合、提高项目成功率&#xff0c;并在项目立项和…