首页 游戏 软件 资讯 排行榜 专题
首页
AI
[AI特训营第三期]基于半监督ppyoloe垃圾车检测

[AI特训营第三期]基于半监督ppyoloe垃圾车检测

热心网友
47
转载
2025-07-24
随着城市化进程的加速,城市垃圾数量不断增多。然而,由于缺乏有效的垃圾处理和监管体系,一些不法分子驾驶垃圾车偷盗垃圾。这不仅严重破坏了环境卫生,还对人们的健康造成了威胁。 为了解决这个问题,我们开发此项目的项目,旨在通过智能技术手段,检测出垃圾车,并监控它们的行为。本项目map@0.5高于0.9,表现优秀。同时利用了半监督的方法,充分利用了数据集。

[ai特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网

[AI特训营第三期]基于半监督ppyoloe垃圾车检测

一、项目背景

随着城市化进程的加速,城市垃圾数量不断增多。然而,由于缺乏有效的垃圾处理和监管体系,一些不法分子驾驶垃圾车偷盗垃圾。这不仅严重破坏了环境卫生,还对人们的健康造成了威胁。 为了解决这个问题,我们开发此项目的项目,旨在通过智能技术手段,检测出垃圾车,并监控它们的行为。本项目map@0.5高于0.9,表现优秀。同时利用了半监督的方法,充分利用了数据集。

[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网        

二、项目任务说明

该项目将采用先进的机器视觉技术和深度学习算法,对垃圾车进行实时监测和识别,便于后续管理。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

三、数据说明

本项目数据为卡车倾倒垃圾数据集,为VOC格式,数据集中只给出部分图片的标注信息,并且存在格式错误,数据错误。数据下载地址:下载地址

数据集导航

truck_waste_dataset/images 存放图片truck_waste_dataset/xml_label 存放标注文件

四、代码实现

In [ ]
#解压数据集!unzip data/data198415/archive.zip
登录后复制    In [ ]
#下载PaddleDetection!git clone https://gitee.com/PaddlePaddle/PaddleDetection.git #从gitee上下载速度会快一些
登录后复制    In [ ]
#安装PaddleDetection相关依赖!pip install motmetrics!pip install pycocotools!pip install -U scikit-image!pip install -r PaddleDetection/requirements.txt!python  PaddleDetection/setup.py install
登录后复制    In [ ]
#导入相关的包import randomimport osimport xml.dom.minidomimport cv2from PIL import Imageimport numpy as npimport pandas as pdimport shutilimport jsonimport globimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport seaborn as snsfrom matplotlib.font_manager import FontProperties
登录后复制    

4.0 清洗数据集

In [1]
#如果是标准的COCO的数据集,则无需进行清洗转换
登录后复制    In [ ]
#重写xml文件,标签中有空格无法转COCOdef change_one_xml(xml_path, xml_dw, update_content):    # 打开xml文档    dom=xml.dom.minidom.parse(xml_path)    root=dom.documentElement    # 查找修改路劲    if 1:        sub1=root.getElementsByTagName('name')         # 修改标签内容        for i in range(len(sub1)):            sub1[i].firstChild.data  = update_content        # 保存修改    with open(xml_path,'w') as fh:        dom.writexml(fh)# 欲修改文件for xml_path in os.listdir('truck_waste_dataset/xml_label'):    if xml_path!='.ipynb_checkpoints':        xml_dw = './/object/name'        # 想要修改成什么内容        update_content = 'Truck_dumping_construction_waste'        change_one_xml(os.path.join('truck_waste_dataset/xml_label',xml_path), xml_dw, update_content)
登录后复制    In [ ]
#重写数据集图片和xml名称,;路径中有空格无法读取for path in os.listdir('truck_waste_dataset/images'):    img_path = os.path.join('truck_waste_dataset/images',path)    if ' ' in img_path:        img_path_ = img_path        img_path_ = img_path_.replace(' ','_')        os.rename(img_path,img_path_)for path in os.listdir('truck_waste_dataset/xml_label'):    img_path = os.path.join('truck_waste_dataset/xml_label',path)    if ' ' in img_path:        img_path_ = img_path        img_path_ = img_path_.replace(' ','_')        os.rename(img_path,img_path_)
登录后复制    In [ ]
#重写xml文件,改正其某些图片宽高信息错误def change_one_xml(xml_path):    # 打开xml文档    img_list = os.listdir('truck_waste_dataset/images')    dom=xml.dom.minidom.parse(xml_path)    root=dom.documentElement    # 查找修改路劲    sub1=root.getElementsByTagName('filename')    sub1[0].firstChild.data  = root.getElementsByTagName('filename')[0].firstChild.data.replace(' ','_')    if   root.getElementsByTagName('filename')[0].firstChild.data.replace(' ','_') in img_list:        H,W,C = cv2.imread('truck_waste_dataset/images/'+root.getElementsByTagName('filename')[0].firstChild.data.replace(' ','_')).shape        sub1=root.getElementsByTagName('width')        sub1[0].firstChild.data  = W        sub1=root.getElementsByTagName('height')        sub1[0].firstChild.data  = H        # 保存修改    with open(xml_path,'w') as fh:        dom.writexml(fh)# 欲修改文件for xml_path in os.listdir('truck_waste_dataset/xml_label'):    if xml_path!='.ipynb_checkpoints':        # 想要修改成什么内容        change_one_xml(os.path.join('truck_waste_dataset/xml_label',xml_path))
登录后复制    In [ ]
%cd truck_waste_dataset
登录后复制    In [ ]
# 生成train.txt和val.txtrandom.seed(2020)xml_dir = 'xml_label'img_dir = 'images'xml_list = os.listdir('xml_label')path_list = list()extra_list = list()for img in os.listdir(img_dir):    img_path = os.path.join(img_dir,img)    xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))    if img.replace('jpg', 'xml') in xml_list:        path_list.append((img_path, xml_path))    else:        extra_list.append(img_path)random.shuffle(path_list)ratio = 0.8train_f = open('train.txt', 'w') val_f = open('val.txt', 'w')extra_f = open('extra.txt', 'w')for i ,content in enumerate(path_list):    img, xml = content    text = img + ' ' + xml + '\n'    if i < len(path_list) * ratio:        train_f.write(text)    else:        val_f.write(text)for i ,content in enumerate(extra_list):    extra_f.write(content+'\n')train_f.close()val_f.close()extra_f.close()# 根据自己数据类别生成标签文档label = ['Truck_dumping_construction_waste']with open('label_list.txt', 'w') as f:    for text in label:        f.write(text + '\n')
登录后复制    In [ ]
%cd ~
登录后复制    In [ ]
len(os.listdir('truck_waste_dataset/images')),len(os.listdir('truck_waste_dataset/xml_label'))
登录后复制    In [ ]
#将数据集转化成COCO数据集#生成训练数据!python PaddleDetection/tools/x2coco.py --dataset_type voc \--dataset_type voc \--voc_anno_dir truck_waste_dataset \--voc_anno_list truck_waste_dataset/train.txt \--voc_label_list truck_waste_dataset/label_list.txt \--voc_out_name truck_waste_dataset/train.json
登录后复制    In [ ]
#生成验证数据!python PaddleDetection/tools/x2coco.py --dataset_type voc \--dataset_type voc \--voc_anno_dir truck_waste_dataset \--voc_anno_list truck_waste_dataset/val.txt \--voc_label_list truck_waste_dataset/label_list.txt \--voc_out_name truck_waste_dataset/val.json
登录后复制    In [ ]
#写入未标注图片#写入extra.jsonimport jsonwrite_json_context=dict()                                                      #写入.json文件的大字典write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2024, 'contributor': '', 'date_created': '2024-07-25'}write_json_context['categories']=[]write_json_context['images']=[]img_pathDir = 'truck_waste_dataset'with open('truck_waste_dataset/extra.txt','r') as fr:    lines1=fr.readlines()for i,imageFile in enumerate(lines1):    imagePath = os.path.join(img_pathDir,imageFile)                             #获取图片的绝对路径    imagePath = imagePath.replace('\n','')    image = Image.open(imagePath)                                               #读取图片,然后获取图片的宽和高    W, H = image.size    img_context={}                                                              #使用一个字典存储该图片信息    #img_name=os.path.basename(imagePath)    path = imageFile.split('\n')[0]    path = path.split('/')[1]                                      #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值    img_context['file_name']=path    src_front, src_back = os.path.splitext(imageFile)                           #将文件名和文件格式分开    img_context['height']=H    img_context['width']=W    img_context['id']=i    write_json_context['images'].append(img_context)cat_context={}cat_context['supercategory'] = 'none'cat_context['id'] = 1cat_context['name'] = 'Truck_dumping_construction_waste'write_json_context['categories'].append(cat_context)name = os.path.join('truck_waste_dataset',"extra"+ '.json')with open(name,'w') as fw:                                                                #将字典信息写入.json文件中    json.dump(write_json_context,fw,indent=2)
登录后复制    

4.1可视化

In [ ]
###解决中文画图问题myfont = FontProperties(fname=r"NotoSansCJKsc-Medium.otf", size=12)plt.rcParams['figure.figsize'] = (12, 12)plt.rcParams['font.family']= myfont.get_family()plt.rcParams['font.sans-serif'] = myfont.get_name()plt.rcParams['axes.unicode_minus'] = False
登录后复制    In [ ]
# 加载训练集路径TRAIN_DIR = 'truck_waste_dataset/images/'TRAIN_CSV_PATH = 'truck_waste_dataset/train.json'# 加载训练集图片目录train_fns = glob.glob(TRAIN_DIR + '*')print('数据集图片数量: {}'.format(len(train_fns)))
登录后复制    In [ ]
def generate_anno_result(dataset_path, anno_file):    with open(os.path.join(dataset_path, anno_file)) as f:        anno = json.load(f)        total=[]    for img in anno['images']:        hw = (img['height'],img['width'])        total.append(hw)    unique = set(total)        ids=[]    images_id=[]    for i in anno['annotations']:        ids.append(i['id'])        images_id.append(i['image_id'])        # 创建类别标签字典    category_dic=dict([(i['id'],i['name']) for i in anno['categories']])    counts_label=dict([(i['name'],0) for i in anno['categories']])    for i in anno['annotations']:        counts_label[category_dic[i['category_id']]] += 1    label_list = counts_label.keys()    # 各部分标签    size = counts_label.values()    # 各部分大小    train_fig = pd.DataFrame(anno['images'])    train_anno = pd.DataFrame(anno['annotations'])    df_train = pd.merge(left=train_fig, right=train_anno, how='inner', left_on='id', right_on='image_id')    df_train['bbox_xmin'] = df_train['bbox'].apply(lambda x: x[0])    df_train['bbox_ymin'] = df_train['bbox'].apply(lambda x: x[1])    df_train['bbox_w'] = df_train['bbox'].apply(lambda x: x[2])    df_train['bbox_h'] = df_train['bbox'].apply(lambda x: x[3])    df_train['bbox_xcenter'] = df_train['bbox'].apply(lambda x: (x[0]+0.5*x[2]))    df_train['bbox_ycenter'] = df_train['bbox'].apply(lambda x: (x[1]+0.5*x[3]))    print('最小目标面积(像素):', min(df_train.area))    balanced = ''    small_object = ''    densely = ''    # 判断样本是否均衡,给出结论    if max(size) > 5 * min(size):        print('样本不均衡')        balanced = 'c11'    else:        print('样本均衡')        balanced = 'c10'    # 判断样本是否存在小目标,给出结论    if min(df_train.area) < 900:        print('存在小目标')        small_object = 'c21'    else:        print('不存在小目标')        small_object = 'c20'    arr1=[]    arr2=[]    x=[]    y=[]    w=[]    h=[]    for index, row in df_train.iterrows():        if index < 1000:            # 获取并记录坐标点            x.append(row['bbox_xcenter'])            y.append(row['bbox_ycenter'])            w.append(row['bbox_w'])            h.append(row['bbox_h'])    for i in range(len(x)):        l = np.sqrt(w[i]**2+h[i]**2)        arr2.append(l)        for j in range(len(x)):            a=np.sqrt((x[i]-x[j])**2+(y[i]-y[j])**2)            if a != 0:                arr1.append(a)    arr1=np.matrix(arr1)    # print(arr1.min())    # print(np.mean(arr2))    # 判断是否密集型目标,具体逻辑还需优化    if arr1.min() <  np.mean(arr2):        print('密集型目标')        densely = 'c31'    else:        print('非密集型目标')        densely = 'c30'    return balanced, small_object, densely
登录后复制    In [38]
# 分析训练集数据generate_anno_result('truck_waste_dataset', 'train.json')
登录后复制        
最小目标面积(像素): 1054.0样本均衡不存在小目标密集型目标
登录后复制        
('c10', 'c20', 'c31')
登录后复制                In [ ]
# 读取训练集标注文件with open('truck_waste_dataset/train.json', 'r', encoding='utf-8') as f:    train_data = json.load(f)train_fig = pd.DataFrame(train_data['images'])
登录后复制    In [37]
ps = np.zeros(len(train_fig))for i in range(len(train_fig)):    ps[i]=train_fig['width'][i] * train_fig['height'][i]/1e6plt.title('训练集图片大小分布', fontproperties=myfont)sns.distplot(ps, bins=21,kde=False)
登录后复制        
登录后复制                
登录后复制登录后复制                In [ ]
!python box_distribution.py --json_path truck_waste_dataset/train.json
登录后复制    

[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网        

In [ ]
# 训练集目标大小统计结果train_anno = pd.DataFrame(train_data['annotations'])df_train = pd.merge(left=train_fig, right=train_anno, how='inner', left_on='id', right_on='image_id')df_train['bbox_xmin'] = df_train['bbox'].apply(lambda x: x[0])df_train['bbox_ymin'] = df_train['bbox'].apply(lambda x: x[1])df_train['bbox_w'] = df_train['bbox'].apply(lambda x: x[2])df_train['bbox_h'] = df_train['bbox'].apply(lambda x: x[3])df_train['bbox_xcenter'] = df_train['bbox'].apply(lambda x: (x[0]+0.5*x[2]))df_train['bbox_ycenter'] = df_train['bbox'].apply(lambda x: (x[1]+0.5*x[3]))df_train.area.describe()
登录后复制    In [36]
df_train['bbox_count'] = df_train.apply(lambda row: 1 if any(row.bbox) else 0, axis=1)train_images_count = df_train.groupby('file_name').sum().reset_index()plt.title('训练集目标个数分布', fontproperties=myfont)sns.distplot(train_images_count['bbox_count'], bins=21,kde=True)
登录后复制        
登录后复制                
登录后复制登录后复制                

4.2模型介绍

PaddleDetection团队结合 Dense Teacher前沿算法,针对 PP-YOLOE+提供了半监督学习方案。

半监督学习结合有标签数据和无标签数据,在大幅节省数据标注的情况下,依然达到较高的模型精度。在实际产业应用过程中,半监督学习是项目冷启动时常见的策略之一。

下表是,在仅采用5%、10%有标签数据进行监督学习,95%、90%无标签数据进行半监督学习的情况下,精度得到了1.2~2.5的提升。

[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网        

配置文件

如果训练小样本算法,修改configs/coco_detection.yml配置文件中的路径

metric: COCOnum_classes: 2TrainDataset:  name: COCODataSet  image_dir: images  anno_path: train.json  dataset_dir: truck_waste_dataset  data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']EvalDataset:  name: COCODataSet  image_dir: images  anno_path: val.json  dataset_dir: truck_waste_dataset  allow_empty: trueTestDataset:  name: ImageFolder  anno_path: annotations/instances_val2017.json # also support txt (like VOC's label_list.txt)  dataset_dir: dataset/coco # if set, anno_path will be 'dataset_dir/anno_path、
登录后复制        

如果是半监督算法,则需要修改configs/semi_det/base/coco_detection_percent_10.yml配置文件中路径

metric: COCOnum_classes: 2# partial labeled COCO, use `SemiCOCODataSet` rather than `COCODataSet`TrainDataset:  !SemiCOCODataSet    image_dir: images    anno_path: train.json    dataset_dir: truck_waste_dataset    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']# partial unlabeled COCO, use `SemiCOCODataSet` rather than `COCODataSet`UnsupTrainDataset:  !SemiCOCODataSet    image_dir: images    anno_path: extra.json    dataset_dir: truck_waste_dataset    data_fields: ['image']    supervised: FalseEvalDataset:  !COCODataSet    image_dir: images    anno_path: val.json    dataset_dir: truck_waste_dataset    allow_empty: trueTestDataset:  !ImageFolder    anno_path: pre.json # also support txt (like VOC's label_list.txt)    dataset_dir:  # if set, anno_path will be 'dataset_dir/anno_path'
登录后复制    

4.3模型训练

In [ ]
#小样本方案# !python PaddleDetection/tools/train.py -c configs/ppyoloe_plus_crn_s_80e_contrast_pcb.yml --use_vdl=True --eval
登录后复制    In [ ]
# 开始训练,训练环境为单卡V100(32G)#半监督方案!python PaddleDetection/tools/train.py -c configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml --use_vdl=True --eval --amp
登录后复制    

训练结果可视化

4.4模型评价

In [ ]
!python PaddleDetection/tools/eval.py -c configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml
登录后复制    

4.5模型推理

In [ ]
!python  PaddleDetection/tools/infer.py -c configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml \--infer_img truck_waste_dataset/images/ction-garbage-process-concrete-recycling-crushing-and-recycling-of-c-2ATK81G.webp\--draw_threshold 0.1\
登录后复制    

4.6模型导出

In [ ]
!python PaddleDetection/tools/export_model.py -c configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml
登录后复制    

五、效果展示

方案效果对比

[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网[AI特训营第三期]基于半监督ppyoloe垃圾车检测 - 游乐网
来源:https://www.php.cn/faq/1425515.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Pywinrm,一个 Python 管理利器!
科技数码
Pywinrm,一个 Python 管理利器!

Pywinrm 通过Windows远程管理(WinRM)协议,让Python能够像操作本地一样执行远程Windows命令,真正打通了跨平台管理的最后一公里。 在混合IT环境中,Linux机器管理Wi

热心网友
04.07
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
科技数码
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。 早些时候,聊过 Pyth

热心网友
04.07
Toga,一个超精简的 Python 项目!
科技数码
Toga,一个超精简的 Python 项目!

Toga 是 BeeWare 家族的核心成员,号称“写一次,跑遍所有平台”,而且用的是系统原生控件,不是那种一看就是网页套壳的界面 。 写了这么多年 Python,你是不是也想过:要是能一套代码跑

热心网友
04.07
Python 异常处理:别再用裸奔的 try 了
科技数码
Python 异常处理:别再用裸奔的 try 了

异常处理的核心:让错误在正确的地方被有效处理。正确的地方,就是别在底层就把异常吞了,也别在顶层还抛裸奔的 Exception。 异常处理写得好,半夜不用起来改 bug。1 你是不是也这么干过?tr

热心网友
04.07
OpenClaw如何自定义SKILL
AI
OpenClaw如何自定义SKILL

1 Skills机制概述 提起OpenClaw的Skills机制,不少人可能会把它想象成传统意义上的可执行插件。其实,它的内涵要更精妙一些。 简单说,Skills本质上是一套基于提示驱动的能力扩展机制。它并不是一个可以独立“跑”起来的程序模块,而是通过一份结构化描述文件(核心就是那个SKILL m

热心网友
04.07

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08