data() { return { fileList: [], results: [] }; },

data() {
    return {
      fileList: [],
      results: [] 
    };
  },

这段代码是一个JavaScript函数,它返回一个包含两个空数组的对象。其中,fileList数组用于存储文件列表,results数组用于存储处理结果。具体来说,这段代码常用于前端开发中的文件上传功能。通过定义一个初始状态的数据结构,可以方便地对上传的文件进行管理和处理。

const express = require('express'); const cors = require('cors'); const multer = require('multer'); const axios = require('axios'); const fs = require('fs'); const qs = require('qs'); const path = require('path'); const app = express(); const port = 3000; // 创建上传目录 const uploadDir = path.join(__dirname, 'uploads'); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir); } // 跨域配置 app.use(cors({ origin: '*', methods: ['POST', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'] })); // 文件上传配置 const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, uploadDir); }, filename: (req, file, cb) => { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9); cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname)); } }); const upload = multer({ storage: storage, fileFilter: (req, file, cb) => { const allowedTypes = ['image/jpeg', 'image/png', 'image/bmp', 'image/gif']; if (!allowedTypes.includes(file.mimetype)) { return cb(new Error('仅支持JPEG/PNG/BMP/GIF格式图片'), false); } cb(null, true); }, limits: { fileSize: 5 * 1024 * 1024 // 限制5MB } }); // 百度API配置(请替换为实际密钥) const BAIDU_API_KEY = 'iBhL0RP4TD0ioSFbWI55Hs90'; const BAIDU_SECRET_KEY = '9pLRd6YNyq7NLytHMOBLACNSO80CQtmE'; const TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'; const PLANT_URL = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/plant'; // 全局错误处理 app.use((err, req, res, next) => { if (err instanceof multer.MulterError) { return res.status(400).json({ error: `文件上传错误: ${err.message}`, result: [] }); } else if (err) { return res.status(500).json({ error: `服务器错误: ${err.message}`, result: [] }); } next(); }); // 植物识别路由 app.post('/recognize', upload.single('image'), async (req, res) => { let tempFilePath = ''; try { if (!req.file) { return res.status(400).json({ error: '请上传有效的图片文件', result: [] }); } tempFilePath = req.file.path; // 读取图片并转换为base64 const imageBuffer = fs.readFileSync(tempFilePath); const imageBase64 = imageBuffer.toString('base64'); // 获取百度API访问令牌 const tokenRes = await axios.post(TOKEN_URL, null, { params: { grant_type: 'client_credentials', client_id: BAIDU_API_KEY, client_secret: BAIDU_SECRET_KEY } }); if (!tokenRes.data || !tokenRes.data.access_token) { throw new Error('获取百度API访问令牌失败'); } const accessToken = tokenRes.data.access_token; // 调用植物识别API const plantRes = await axios.post( PLANT_URL, qs.stringify({ image: imageBase64, baike_num: 5 // 返回5个结果 }), { params: { access_token: accessToken }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, timeout: 20000 // 20秒超时 } ); console.log('百度API原始响应:', plantRes.data); // 统一响应格式 - 更健壮的处理 let resultData = []; // 情况1:标准格式 { result: [...] } if (plantRes.data && Array.isArray(plantRes.data.result)) { resultData = plantRes.data.result; } // 情况2:百度API错误格式(如返回错误码) else if (plantRes.data.error_code) { throw new Error(`百度API错误: ${plantRes.data.error_msg} (错误码: ${plantRes.data.error_code})`); } // 情况3:直接数组格式(理论上百度API不会这样返回,但为了健壮性保留) else if (Array.isArray(plantRes.data)) { resultData = plantRes.data; } // 情况4:其他未知格式 else { throw new Error('百度API返回了无法解析的格式'); } // 格式化响应 const formattedResponse = { result: resultData .filter(item => item.name) // 过滤无效项(必须有名字) .map(item => ({ name: item.name, score: item.score || 0 // 如果没有分数,设为0 })) }; // 如果过滤后没有结果,尝试使用第一个结果(即使没有名字,但可能有其他信息) if (formattedResponse.result.length === 0 && resultData.length > 0) { formattedResponse.result = [{ name: resultData[0].name || '未知植物', score: resultData[0].score || 0 }]; } console.log('格式化后的响应:', formattedResponse); res.json(formattedResponse); } catch (error) { console.error('识别错误:', error); let errorMessage = '植物识别失败'; // 提取更具体的错误信息 if (error.response) { // 如果是百度API的响应错误 if (error.response.data && error.response.data.error_msg) { errorMessage = `百度API错误: ${error.response.data.error_msg}`; } else { errorMessage = `服务请求错误: ${error.response.status} ${error.response.statusText}`; } } else if (error.code === 'ECONNABORTED') { errorMessage = '请求超时,请重试'; } else { errorMessage = error.message; } res.status(500).json({ error: errorMessage, result: [] }); } finally { // 清理临时文件 if (tempFilePath) { fs.unlink(tempFilePath, (err) => { if (err) console.error('删除临时文件失败:', err); }); } } }); // 启动服务器 app.listen(port, () => { console.log(`植物识别服务运行中:http://localhost:${port}`); console.log('等待上传图片进行识别...'); }); <template> <div class="plant-recognize-page"> <van-nav-bar title="植物识别" /> <div class="upload-container"> <div class="uploader-wrapper"> <van-uploader :after-read="onRead" accept="image/*" :preview-size="120" :max-count="1" v-model="fileList" > <van-button type="primary" block round icon="photo">选择图片</van-button> </van-uploader> </div> <div v-if="uploadedImage" class="preview-container"> <van-image :src="uploadedImage" fit="contain" width="100%" height="auto" class="preview-image" /> </div> </div> <div v-if="loading" class="loading-overlay"> <van-loading size="24px">识别中,请稍候...</van-loading> </div> <div v-if="results.length > 0" class="result-section"> <h3 class="result-title">识别结果:</h3> <van-cell-group inset> <van-cell v-for="(item, index) in results" :key="index" :title="item.name" :value="`${(item.score * 100).toFixed(2)}%`" :label="`置信度:${(item.score * 100).toFixed(2)}%`" /> </van-cell-group> </div> <div v-else-if="errorMessage" class="error-message"> <van-icon name="warning-o" color="#f56c6c" size="16" /> <span>{{ errorMessage }}</span> </div> </div> </template> <script> import axios from 'axios'; import { NavBar, Uploader, Image, Button, Loading, Cell, CellGroup, Toast, Icon } from 'vant'; export default { name: 'PlantRecognize', components: { [NavBar.name]: NavBar, [Uploader.name]: Uploader, [Image.name]: Image, [Button.name]: Button, [Loading.name]: Loading, [Cell.name]: Cell, [CellGroup.name]: CellGroup, [Icon.name]: Icon }, data() { return { fileList: [], uploadedImage: '', loading: false, results: [], errorMessage: '' }; }, methods: { async onRead(file) { this.loading = true; this.results = []; this.errorMessage = ''; try { // 预览图片 const reader = new FileReader(); reader.onload = (e) => { this.uploadedImage = e.target.result; }; reader.readAsDataURL(file.file); // 准备上传数据 const formData = new FormData(); formData.append('image', file.file); // 发送识别请求 const response = await axios.post( 'http://localhost:3000/recognize', formData, { headers: { 'Content-Type': 'multipart/form-data' }, timeout: 30000 // 30秒超时 } ); console.log('后端原始响应数据:', response.data); // 更健壮的响应格式校验 if (response.data && typeof response.data === 'object' && Array.isArray(response.data.result)) { // 转换格式,添加默认值处理 this.results = response.data.result.map(item => ({ name: item.name || '未知植物', score: item.score || 0 })); if (this.results.length === 0) { this.errorMessage = '未识别到植物特征,请尝试其他图片'; Toast.info(this.errorMessage); } } // 处理百度API原始响应格式(直接数组) else if (response.data && Array.isArray(response.data)) { this.results = response.data .filter(item => item.name) // 过滤掉无效项 .map(item => ({ name: item.name, score: item.score || 0 })); Toast.success('识别成功'); } else { throw new Error('服务端响应格式异常,缺少有效数据'); } } catch (error) { console.error('识别失败:', error); // 更详细的错误处理 if (error.response) { // 尝试获取后端返回的错误信息 if (error.response.data && error.response.data.error) { this.errorMessage = error.response.data.error; } else { this.errorMessage = `服务端错误: ${error.response.status} ${error.response.statusText}`; } } else if (error.request) { this.errorMessage = '网络请求无响应,请检查服务是否运行'; } else { this.errorMessage = error.message || '识别失败,请重试'; } Toast.fail(this.errorMessage); } finally { this.loading = false; } } } }; </script> <style scoped> .plant-recognize-page { min-height: 100vh; background-color: #f7f8fa; padding-bottom: 20px; } .upload-container { padding: 20px; background: white; margin: 20px; border-radius: 12px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); } .uploader-wrapper { display: flex; justify-content: center; align-items: center; flex-direction: column; margin-bottom: 20px; } .preview-container { margin-top: 20px; text-align: center; border: 1px dashed #ebedf0; border-radius: 8px; padding: 10px; background: #fafafa; } .preview-image { max-height: 300px; display: block; margin: 0 auto; } .loading-overlay { margin: 30px 0; text-align: center; color: #969799; } .result-section { margin: 20px; padding: 16px; background: white; border-radius: 12px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); } .result-title { font-size: 18px; font-weight: bold; margin-bottom: 12px; color: #323233; padding-left: 8px; } .error-message { margin: 20px; padding: 12px 16px; text-align: center; color: #f56c6c; background-color: #fef0f0; border-radius: 8px; display: flex; justify-content: center; align-items: center; font-size: 14px; }未识别到有效数据 .error-message .van-icon { margin-right: 8px; } </style>
06-09
@router.post(path=‘/ledgers/upload’, description=‘互锁台账上传’) async def _(files: List[UploadFile] = File(…)): print(‘互锁台账上传逻辑’) for file in files: print(file.filename) return Success(msg=“Upload Successfully”, data={}) 写一个互锁台账上传逻辑:输入一个excel文件,列值是中文名称,但是在数据表中的字段名是英文,将每行数据解析保存到数据库的对应字段中,<script setup lang="ts"> import { reactive, ref, watch } from "vue"; import { $t } from "@/locales"; import { UploadFileInfo, UploadInst } from "naive-ui"; import { exportXlsx, SheetData } from "@/utils/export-excel"; defineOptions({ name: "LedgerUploadDrawer", }); interface Props { /** the type of operation */ } const props = defineProps<Props>(); const fileListLengthRef = ref(0); const uploadRef = ref<UploadInst | null>(null); interface Emits { (e: "submitted"): void; } const emit = defineEmits<Emits>(); const visible = defineModel<boolean>("visible", { default: false, }); const model: any = reactive(createDefaultModel()); function createDefaultModel(): any { return { file: null, }; } function handleInitModel() { Object.assign(model, createDefaultModel()); } function closeDrawer() { visible.value = false; } async function handleSubmit() { // request uploadRef.value?.submit(); closeDrawer(); emit("submitted"); } function handleChange(options: { fileList: UploadFileInfo[] }) { fileListLengthRef.value = options.fileList.length; } //sheet={} function downloadTemplate() { const sheets: SheetData[] = [ { sheetName: "互锁台账列表", data: [ [ "报警名称", "互锁类型", "所属模块", "模块类型", "所属产品", "触发器", "触发器渠道", "报警描述", "报警级别", "报警动作", "报警动作Data通道", "报警动作描述", "满足条件", "备注", ], ], }, ]; exportXlsx(sheets, "互锁台账导入模板"); } watch(visible, () => { if (visible.value) { handleInitModel(); } }); </script> <template> <NModal v-model:show="visible" preset="dialog" :title="$t('common.upload')"> <NPopover trigger="hover"> <template #trigger> <NButton @click="downloadTemplate" text type="primary">{{ $t("common.templateDownload") }}</NButton> </template> <span>点此下载导入模板</span> </NPopover> <NUpload accept=".csv,.xls,.xlsx" ref="upload" action="/api/v1/interlock/ledger/lock" :default-upload="false" :max="10" multiple @change="handleChange" > <NUploadDragger> <div style="margin-bottom: 12px"> <icon-mdi-tray-upload class="text-icon" /> </div> <NText style="font-size: 16px"> 点击或者拖动文件到该区域来上传 </NText> <NP depth="3" style="margin: 8px 0 0 0"> 请参考上传模板来提供数据,支持csv,xls,xlsx格式,单次最多上传10个文件 </NP> </NUploadDragger> </NUpload> <template #action> <NSpace :size="16"> <NButton @click="closeDrawer">{{ $t("common.cancel") }}</NButton> <NButton type="primary" @click="handleSubmit">{{ $t("common.confirm") }}</NButton> </NSpace> </template> </NModal> </template> <style scoped></style> 这是已有的前端代码
最新发布
07-16
public Result<PpmSelfCheckRecordGetCheckItemByVinResult> getCheckItemByVin(PpmSelfCheckRecordGetCheckItemByVinParam param) { WorkingProcedureInspectionProcedureInspectionParam inspectionParam = new WorkingProcedureInspectionProcedureInspectionParam(); inspectionParam.setVehicleVinNo(param.getVehicleVinNo()); inspectionParam.setWorkProductionTaskNo(param.getWorkProductionTaskNo()); inspectionParam.setStationCode(param.getStationCode()); List<WorkingProcedureInspectionProcedureInspectionResult> results = ipsAdapter.procedureInspection(inspectionParam); PpmSelfCheckRecordGetCheckItemByVinResult selfresult = new PpmSelfCheckRecordGetCheckItemByVinResult(); List<WorkingProcedureInspectionProcedureInspectionResult> inspectionResults = new ArrayList<>(); for (WorkingProcedureInspectionProcedureInspectionResult result : results) { WorkingProcedureInspectionProcedureInspectionResult prorest = new WorkingProcedureInspectionProcedureInspectionResult(); BeanUtil.copyProperties(result, prorest); LambdaQueryWrapper<PpmSelfCheckIpsInspection> chin = new LambdaQueryWrapper<>(); chin.eq(PpmSelfCheckIpsInspection::getIpsInspectionId, result.getId()); chin.eq(PpmSelfCheckIpsInspection::getSelfCheckSonId, param.getSelfCheckSonId()); chin.eq(PpmSelfCheckIpsInspection::getIsDel, YesOrNoEnum.NO.getCode()); PpmSelfCheckIpsInspection ipsInspection = selfCheckIpsInspectionDao.selectOne(chin); BeanUtil.copyProperties(ipsInspection, prorest); FileInfoBatchParam infoBatchParam = new FileInfoBatchParam(); List<String> listids = new ArrayList<>(); listids.add(ipsInspection.getId()); infoBatchParam.setIdList(listids); infoBatchParam.setCode("PpmSelfCheckIpsInspection"); List<BasicFileListResult> fileList = basicAdapter.fileInfoBatch(infoBatchParam); prorest.setFileListResults(fileList); inspectionResults.add(prorest); } selfresult.setInspectionResults(inspectionResults); return Result.ok(selfresult); } @Override public Result<PpmSelfCheckRecordGetCheckItemByVinAppResult> getCheckItemByVinApp(PpmSelfCheckRecordGetCheckItemByVinAppParam param) { LambdaQueryWrapper<PpmSelfCheckRecordSon> checkson = new LambdaQueryWrapper<>(); checkson.eq(PpmSelfCheckRecordSon::getSnCode, param.getVehicleVinNo()); checkson.eq(PpmSelfCheckRecordSon::getIsDel, YesOrNoEnum.NO.getCode()); checkson.eq(PpmSelfCheckRecordSon::getBranchCompanyId, UserTokenUtils.getBranchCompanyId()); List<PpmSelfCheckRecordSon> sonList = selfCheckRecordSonDao.selectList(checkson); PpmSelfCheckRecordGetCheckItemByVinAppResult result=new PpmSelfCheckRecordGetCheckItemByVinAppResult(); List<PpmSelfCheckRecordGetCheckItemByVinResult> resultList=new ArrayList<>(); PpmSelfCheckRecordGetCheckItemByVinResult byVinResult=new PpmSelfCheckRecordGetCheckItemByVinResult(); if (sonList.isEmpty()){ WorkingProcedureInspectionProcedureInspectionParam inspectionParam = new WorkingProcedureInspectionProcedureInspectionParam(); inspectionParam.setVehicleVinNo(param.getVehicleVinNo()); inspectionParam.setStationCode(param.getStationCode()); List<WorkingProcedureInspectionProcedureInspectionResult> results = ipsAdapter.procedureInspection(inspectionParam); byVinResult.setInspectionResults(results); resultList.add(byVinResult); result.setIsCheck(YesOrNoEnum.NO.getCode()); result.setItemByVinResults(resultList); return Result.ok(result); } sonList.forEach(son -> { PpmSelfCheckRecordGetCheckItemByVinParam vinParam=new PpmSelfCheckRecordGetCheckItemByVinParam(); vinParam.setVehicleVinNo(param.getVehicleVinNo()); vinParam.setStationCode(param.getStationCode()); vinParam.setSelfCheckSonId(son.getId()); Result<PpmSelfCheckRecordGetCheckItemByVinResult> checkItemByVin = this.getCheckItemByVin(vinParam); resultList.add(checkItemByVin.getData()); }); result.setIsCheck(YesOrNoEnum.YES.getCode()); result.setItemByVinResults(resultList); return Result.ok(result); } 帮我把这两段设计的查询都加上索引,把sql语句打印出来
06-28
#!/usr/bin/env python # -*- coding:utf-8 -*- #This Python codes are created by Li hexi for undergraduate student course --maxhine learning #Any copy of the codes is illegal without the author' permission.2021-9-3 #--------This program uses to crawl and download images on some websites ------ import math import imghdr from distutils.command.clean import clean import cv2 import re import time,os import urllib import requests import numpy as np import tkinter as tk import tkinter.filedialog as file import threading as thread import tkinter.messagebox as mes import tkinter.simpledialog as simple from PIL import Image, ImageDraw, ImageFont from tkinter import scrolledtext as st import argostranslate.translate as Translate from h5py.h5a import delete from pypinyin import pinyin, Style from pypinyin import lazy_pinyin, Style from matplotlib import pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg#导入在tkinter 内嵌入的画布子窗口 from matplotlib.backend_bases import MouseEvent from tkinter import scrolledtext as st from tkinter import ttk from ultralytics import YOLO MainWin = tk.Tk() #常数列表 #FrameWidth=600 #FrameHeight=300 FileLength=0 TagFlag=False TargetVector=[] CrawlFlag=False #ObjectName = ['人','电脑', '手机', '鼠标', '键盘'] #ObjectName=['人','电脑', '键盘', '鼠标', '订书机', '手机', '书', '台灯','杯子','电水壶'] Name80 = ['人', '自行车', '轿车', '摩托', '飞机', '巴士', '火车', '卡车', '船', '交通灯', '消防栓', '停止标志', '咪表', '长凳', '鸟', '猫', '狗', '马', '羊', '奶牛', '象', '熊', '斑马', '长颈鹿', '背包', '伞', '手袋', '领带', '手提箱', '飞碟', '滑板', '滑雪板', '运动球', '风筝', '棒球杆', '棒球手套', '滑板', '冲浪板', '网球拍', '瓶子', '酒杯', '杯子', '叉子', '刀', '勺子', '碗', '香蕉', '苹果', '三文治', '桔子', '西兰花', '胡萝卜', '热狗', '披萨', '甜甜圈', '蛋糕', '椅子', '沙发', '盆景', '床', '餐桌', '厕所', '监视器', '电脑', '鼠标', '遥控器', '键盘', '手机', '微波炉', '烤箱', '烤面包机', '洗碗槽', '冰箱', '书', '钟', '花瓶', '剪刀', '泰迪熊', '干发器', '牙刷'] Name10=['人','电脑','鼠标', '键盘', '订书机', '手机', '书', '台灯','杯子','电水壶'] Name2=['人','电脑'] ObjectName=Name80.copy() MainWin.title('目标检测系统智能体平台') MainWin.geometry('1300x700') MainWin.resizable(width=False,height=False) #========函数区开始=========== def callback1(): filename = file.askopenfilename(title='打开文件名字', initialdir="\image", filetypes=[('jpg文件', '*.jpg'), ('png文件', '.png')]) picshow(filename) def callback2(): #import argostranslate.package #argostranslate.package.update_package_index() #available_packages = argostranslate.package.get_available_packages() #package_to_install = next(p for p in available_packages if p.from_code == "zh" and p.to_code == "en") #argostranslate.package.install_from_path(package_to_install.download()) #text = Translate.translate("蔬菜和水果", "zh", "en") #FileName=text.replace(" ","") text = '紫荆花' pinyin_str = ''.join(lazy_pinyin(text)) print(pinyin_str) # ni hao #print(FileName) def picshow(filename): global GI I1 = cv2.imread(filename) I2 = cv2.resize(I1, (WW, WH)) cv2.imwrite('ImageFile/temp.png', I2) I3 = tk.PhotoImage(file='ImageFile/temp.png') L1 = tk.Label(InputFrame, image=I3) L1.grid(row=1, column=0, columnspan=2, padx=40) GI = I2 MainWin.update() #******************************** #******************************** #以下下是文件操作代码区************* #******************************** #******************************** def LoadImage(): global TargetVector, GI path=os.getcwd() filename = file.askopenfilename(title='打开文件名字', initialdir=path, filetypes=[('jpg文件', '*.jpg'), ('png文件', '.png')]) if len(filename) == 0: return I1 = cv2.imread(filename) I2 = cv2.resize(I1, (WW, WH)) GI = I2 # print(np.shape(GI)) cv2.imwrite('image/temp.png', I2) I3 = tk.PhotoImage(file='image/temp.png') L1 = tk.Label(InputFrame, image=I3) L1.grid(row=1, column=0, columnspan=2, padx=40) s = np.shape(I1) MainWin.mainloop() return def SaveImage(): return #******************************** #******************************** #以下下是图像爬取代码区************* #******************************** #******************************** def StartCrawling(): global CrawlFlag if KeyStr.get()=="": return CrawlFlag=True Thd1 = thread.Thread(target=CrawlPicture, args=(300, 500,)) Thd1.setDaemon(True) Thd1.start() return PauseFlag=False def StopCrawling(): global CrawlFlag CrawlFlag = False return def Suspending(): return def Resuming(): return #******************************** #******************************** #以下下是图像清洗代码区************* #******************************** #******************************** std=None def CleanImage(): global img, recimg, sw, sh, FileLength, pathname, FileNum, filelist, std, ax if std != None: std.destroy() std = None fig.clear() draw_set.draw() OutputFrame.update() curpath = os.getcwd() pathname = file.askdirectory(title='图像文件目录', initialdir=curpath) if len(pathname) == 0: return filelist = os.listdir(pathname) FileLength = len(filelist) DeletFile=[] fig.clear() ax = fig.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) for i in range(FileLength): fstr = pathname + '/' + filelist[i] if imghdr.what(fstr) is not None: #print(fstr) img = cv2.imread(fstr) if np.shape(img) == (): DeletFile.append(fstr) else: s = np.shape(img) sw = s[0] sh = s[1] if s[0] > 1024 or s[1] > 1024: sv = 1024.0 / max(s[0], s[1]) img = cv2.resize(img, (int(sv * s[1]), int(sv * s[0]))) cv2.imwrite(fstr, img) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) ax.imshow(img) draw_set.draw() OutputFrame.update() else: DeletFile.append(fstr) if len(DeletFile) !=0: for i in range(len(DeletFile)): fstr = DeletFile[i] os.remove(fstr) return def ScanImage(): global img, recimg, sw, sh, FileLength, pathname, FileNum, filelist, std, ax if std!=None: std.destroy() std=None fig.clear() draw_set.draw() OutputFrame.update() curpath = os.getcwd() pathname = file.askdirectory(title='图像文件目录', initialdir=curpath) if len(pathname) == 0: return filelist = os.listdir(pathname) FileLength = len(filelist) for i in range(FileLength): fstr = pathname + '/' + filelist[i] img = cv2.imread(fstr) if np.shape(img) == (): os.remove(fstr) filelist = os.listdir(pathname) FileLength = len(filelist) FileNum = 0 fstr = pathname + '/' + filelist[FileNum] img = cv2.imread(fstr) s = np.shape(img) sw = s[0] sh = s[1] if s[0] > 1024 or s[1] > 1024: sv = 1024.0 / max(s[0], s[1]) img = cv2.resize(img, (int(sv * s[1]), int(sv *s[0]))) recimg = np.zeros((sw, sh, 3), dtype=np.uint8) s = np.shape(img) sw = s[0] sh = s[1] img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) fig.clear() ax = fig.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) ax.imshow(img) draw_set.draw() recimg = np.zeros((WH, WW, 3), dtype=np.uint8) fig.canvas.mpl_connect('scroll_event', on_ax_scroll) fig.canvas.mpl_connect('button_press_event', on_ax_click) fig.canvas.mpl_connect('motion_notify_event', on_ax_motion) OutputFrame.update() return def RenameImage(): return def NPZfile(): return #******************************** #******************************** #以下下是图像标注代码区************** #******************************** #******************************** def LoadClassName(): return #批量区域标定 def LabelBatch(): global img, recimg, sw, sh, FileLength, pathname, FileNum, filelist, std2,ax2 global Mflag fig2.clear() draw_set2.draw() InputFrame.update() Lab3.config(text="图片标注结果输出") std2=st.ScrolledText(InputFrame,width=60,height=22,foreground="blue", font=("隶书",12)) std2.grid(row=1, column=0,columnspan=2,padx=10) std2.config(foreground="black", relief="solid",font=("宋体", 12)) std2.delete(0.0, tk.END) InputFrame.update() cwd = os.getcwd() pathname = file.askdirectory(title='图像文件目录', initialdir=cwd) if len(pathname) == 0: return filelist = os.listdir(pathname) FileLength = len(filelist) FileNum = 0 DeletFile=[] for i in range(FileLength): fstr = pathname + '/' + filelist[i] if imghdr.what(fstr) is not None: #print(fstr) img = cv2.imread(fstr) if np.shape(img) == (): DeletFile.append(fstr) else: fstr = DeletFile[i] DeletFile.append(fstr) for i in range(len(DeletFile)): os.remove(fstr) filelist = os.listdir(pathname) FileLength = len(filelist) FileNum = 0 fstr = pathname + '/' + filelist[FileNum] img = cv2.imread(fstr) s = np.shape(img) if s[0] > 1024 or s[1] > 1024: sv = 1024.0 / max(s[0], s[1]) img = cv2.resize(img, (int(sv * s[1]), int(sv * s[0]))) img = cv2.resize(img, (WW, WH)) recimg = np.zeros(img.shape, dtype=np.uint8) s = np.shape(img) sh = s[0] sw = s[1] img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) fig.clear() ax = fig.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) ax.imshow(img) draw_set.draw() recimg = np.zeros((WH, WW, 3), dtype=np.uint8) fig.canvas.mpl_connect('scroll_event', on_ax_scroll) fig.canvas.mpl_connect('button_press_event', on_ax_click) fig.canvas.mpl_connect('motion_notify_event', on_ax_motion) OutputFrame.update() but7.config(state=tk.DISABLED) but8.config(state=tk.DISABLED) Mflag=1 return def LabelEnd(): global LabelData, BoxData if len(BoxData) != 0: LabelData.append(BoxData.copy()) but8.config(state=tk.ACTIVE) return def LabelSave(): global ImageData, LabelData, BoxData cwd = os.getcwd() dir1 = cwd + "\image" if not os.path.exists(dir1): os.mkdir(dir1) startnum = len(os.listdir(dir1)) for i in range(len(ImageData)): fname = dir1 + "\myimage" + str(i + startnum) + ".jpg" myim = cv2.cvtColor(ImageData[i], cv2.COLOR_RGB2BGR) cv2.imwrite(fname, myim) dir1 = cwd + "\label" if not os.path.exists(dir1): os.mkdir(dir1) for i in range(len(ImageData)): fname = dir1 + "\myimage" + str(i + startnum) + ".txt" with open(fname, 'w', encoding='utf-8') as file: for j in range(len(LabelData[i])): txt = str(LabelData[i][j][0]) + " " + str(LabelData[i][j][1]) + " " + str( LabelData[i][j][2]) + " " + str(LabelData[i][j][3]) + " " + str(LabelData[i][j][4]) file.write(txt + '\n') # 添加换行符 file.close() ClearAnn() return #******************************** #******************************** #以下下是图像训练代码区************* #******************************** #******************************** def TrainSetting(): return def TrainStarting(): TrainYoloV8() return def TrainResultShow(): return def SaveTrainResult(): return #******************************** #******************************** #以下下是图像测试代码区************* #******************************** #******************************** def SelectImage(): LoadImage() return def SingleImageTest(): Yolov8SingleDetect() return def ObjectTracking(): Yolov8Detect() return def SaveTestResult(): return #******************************** #******************************** #以下下是操作帮助代码区************* #******************************** #******************************** def HelpPicCrawl(): global std if std != None: std.destroy() fig.clear() draw_set.draw() OutputFrame.update() std = st.ScrolledText(OutputFrame, width=60, height=22, foreground="blue", font=("隶书", 12)) std.grid(row=1, column=0, padx=10) std.config(relief="solid") #std.config(foreground="black", relief="solid", font=("宋体", 13)) std.delete(0.0, tk.END) Lab3.config(text="图片爬取操作指导") HelpStr1="图像爬取操作步骤:\r\n 1)在主题框输入要爬取的主题提示词" \ "\r\n 2)单击《开始爬取》按钮,开始爬取图片,并存在当前目录下" \ "\r\n 3)单击《停止爬取》按钮,停止爬取图片,但爬完当前页才结束"\ "\r\n 4)爬取的图像存在主题词拼音目录下" std.delete(0.0,tk.END) std.insert(tk.END,HelpStr1) return def HelpAnnSave(): return def HelpBatchAnn(): global std if std!=None: std.destroy() fig.clear() draw_set.draw() OutputFrame.update() std = st.ScrolledText(OutputFrame, width=60, height=22, foreground="blue", font=("隶书", 12)) std.config(relief="solid") std.grid(row=1, column=0, padx=10) std.delete(0.0, tk.END) Lab3.config(text="区域标注操作指导") HelpStr3 = "图像区域标注操作步骤:\r\n 1)单击《方框标注》按钮,弹出目录选择对话框,选择图片目录" \ "\r\n 2)计算机会对该目录的图像文件扫描,清洗掉一些格式不对的非图像文件,时间较长" \ "\r\n 3)显示目录下第1幅图像,通过鼠标滚轮,快速浏览目录下的所有图片" \ "\r\n 4)停在所选图片,在要标注的物体左上角按下鼠标左键,选择拉框起点" \ "\r\n 5)按下鼠标左键不放,拖动鼠标拉框,将要标注的物体画到矩形框内" \ "\r\n 6)点击鼠标右键,激活目标选项,滚动鼠标滚轮,浏览目标名称,并停在所选名称" \ "\r\n 7)点击鼠标左键,确认选项,并在文本框内显示类别ID和矩形几何参数" \ "\r\n 8)如果本张图片还有要标定的目标,则重复步骤4-7,继续标注" \ "\r\n 9)更换图片和浏览一样滚动鼠标滚轮,选择图片,然后重复步骤4-7" \ "\r\n 10)结束本次标定,单击《结束标注》按钮" \ "\r\n 11)保存标定结果,单击《保存标注》按钮"\ "\r\n 12)标定的图像保存在\image目录下,标签保存在\label目录下" std.delete(0.0, tk.END) #std.config(foreground="blue", font=("楷体", 12)) std.insert(tk.END, HelpStr3) ########################################## def TagPicture(): return def SpareBut(): global ImageData for i in range(len(ImageData)): cv2.imshow("ls",ImageData[i]) cv2.waitKey(200) return def GetPageURL(URLStr): #获取一个页面的所有图片的URL+下页的URL if not URLStr: print('现在是最后一页啦!爬取结束') return [], '' try: header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"} html = requests.get(URLStr,headers=header)#,verify=False) html.encoding = 'utf-8' html = html.text except Exception as e: print("err=",str(e)) ImageURL = [] NextPageURL = '' return ImageURL, NextPageURL ImageURL = re.findall(r'"objURL":"(.*?)",', html, re.S) #print("ImageURL",ImageURL) NextPageURLS = re.findall(re.compile(r'<a href="(.*)" class="n">下一页</a>'), html, flags=0) if NextPageURLS: NextPageURL = 'http://image.baidu.com' + NextPageURLS[0] else: NextPageURL='' return ImageURL, NextPageURL ImageCount=0 def DownLoadImage(pic_urls): """给出图片链接列表, 下载所有图片""" global ImageCount,ImageFilePath, CrawlFlag #print(ImageFilePath) for i,pic_url in enumerate(pic_urls): if not CrawlFlag: return try: pic = requests.get(pic_url, timeout=6) ImageCount=ImageCount+1 #print(ImageCount) string = ImageFilePath+str(ImageCount)+".jpg" with open(string, 'wb') as f: f.write(pic.content) FileStr.set("已下载第"+str(ImageCount)+"图片") DownAddrStr.set(str(pic_url)) #print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url))) except Exception as e: FileStr.set("下载第"+(str(ImageCount)+"张图片失败")) ImageCount-=1 DownAddrStr.set(e) continue ImageFilePath='' def CrawlPicture(v1,v2): global CrawlFlag,PauseFlag,ImageFilePath,ImageCount while not CrawlFlag: time.sleep(1) ImageCount=0 str1 = os.getcwd() str2 = KeyStr.get() str3 = ''.join(lazy_pinyin(str2)) if str3 == '': str3 = "temp" ImageFilePath = str1 + "\\" + str3+"\\" #print(ImageFilePath) if not os.path.exists(ImageFilePath): os.makedirs(ImageFilePath) else: while os.path.exists(ImageFilePath): str3 = str3 + str(np.random.randint(1, 10000)) ImageFilePath = str1 + "\\" + str3 + "\\" os.makedirs(ImageFilePath) BaiduURL=r'https://image.baidu.com/search/flip?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=' keyword=KeyStr.get() FirstURL=BaiduURL+urllib.parse.quote(keyword,safe='/') ImageURL, NextPageURL= GetPageURL(FirstURL) PageCount = 0 # 累计翻页数 while CrawlFlag: ImageURL, NextPageURL = GetPageURL(NextPageURL) PageCount += 1 CountStr.set(str(PageCount)) if ImageURL!=[]: DownLoadImage(list(set(ImageURL))) if NextPageURL== '': CrawlFlag=False def SetTarget(): global TagFlag, TargetVector TagFlag = True for i in range(10): if (TargetV.get() == i): TargetVector = np.zeros(10) TargetVector[i] = 1.0 print(TargetVector) #按“图像预处理”键,将弹出一个文件目录选择框,你选择一个目录,将列出此目录下的第一个文件,显示在“image"窗口 #然后就可以对此目录下的文件进行批处理 #将鼠标移到“image"窗口,利用鼠标橡皮筋功能裁剪图像,左键按下选择裁剪起点point1 #左键按下并拖动鼠标产生橡皮筋功能的矩形框,抬起选择结束 #点击右键将所选框的图像剪裁出来,并显示新的剪裁窗口”crop" #鼠标移到“crop"窗口,双击左键将将用这个剪裁的图像替代原图像 #鼠标移到“crop"窗口,双击右键将这个剪裁的图像取名另存盘,等于增加一幅图像 #连续选择图像功能,将鼠标移至”image",滚动鼠标的滚轮,在“image"窗口将连续滚动显示打开目录下的图像 #对不想要的图像,双击左键弹出一个确认对话框,选择yes将文件删除 global point1, point2, img, recimg,sw,sh,crop filelist=[]#图片文件列表 FileNum=0 pathname='' ObjectNum=len(ObjectName) Mflag=0#鼠标双功能切换标志 ObjectCode=0 #当前目标的类别代码 centerX=0 #标注矩形框中心的X坐标 centerY=0 #标注矩形框中心的坐标 boxw=0 #标注矩形框的宽度 boxh=0 #标注矩形框的高度 LabelData=[] #每幅图像对应的yolov8的TXT表数据 ImageData=[] #每幅标注的图像数据 BoxData=[]#每幅标注的矩形框数据表 CurImageNum=-1 #当前标定的图像序号 DrawRectangleFlag=False #画矩形标志 def InsertTable(data): global std2 str1 = "ClassID:" + str(data[0]) str2 = " xc:" + str(data[1]) str3 = " yc:" + str(data[2]) str4 = " w:"+str(data[3]) str5 = " h:"+str(data[4]) bbox = str1 + str2 + str3 + str4 + str5 std2.insert(tk.END, bbox) std2.insert(tk.END, '\r\n') return def ClearAnn(): global ImageData, LabelData, BoxData, CurImageNum, DrawRectangleFlag global Mflag, ObjectCode, centerX, centerY, boxw, boxh,std2 ImageData.clear() LabelData.clear() BoxData.clear() Mflag = 0 # 鼠标双功能切换标志 ObjectCode = 0 # 当前目标的类别代码 centerX = 0 # 标注矩形框中心的X坐标 centerY = 0 # 标注矩形框中心的坐标 boxw = 0 # 标注矩形框的宽度 boxh = 0 # 标注矩形框的高度 CurImageNum = -1 # 当前标定的图像序号 DrawRectangleFlag = False # 画矩形标志 std2.delete(0.0,tk.END) return #crop 剪裁窗口的鼠标响应 #双击鼠标左键,用剪裁出来的 def on_mouse2(event, x, y, flags, param): global crop,filelist,FileLength if event == cv2.EVENT_RBUTTONDBLCLK: file1 = file.asksaveasfilename(title='保存文件名字', initialdir="\image", filetypes=[('jpg文件', '*.jpg')]) if file1 == "": return cv2.imwrite(file1+'.jpg', crop) cv2.destroyWindow("crop") filelist = os.listdir(pathname) FileLength = len(filelist) elif event == cv2.EVENT_LBUTTONDBLCLK: fstr = pathname + '/' + filelist[FileNum] cv2.imwrite(fstr, crop) cv2.destroyWindow("crop") #批量标注,就是对某一目录下的同类图片给予一个标注号,首先通过移动滚动条选择图像目标的标注序号 #然后点击“批量标注”按钮,弹出批量标注图像文件的初始目录,可以浏览选择批量标注的新目录 #确定目录后就对整个目录下的图片打“标签”-就是设置为同一序号 def BatchTag(): global SamData, SamTag, ObjectCode, pathname,filelist if ObjectCode is None: mes.showwarning("无标签警告","没有设置标签") return pathname = file.askdirectory(title='批量标注图像文件目录', initialdir='\LhxArt\KerasCnn') if len(pathname) == 0: mes.showwarning("目录选择无效", "没有正确选择目录") return filelist = os.listdir(pathname) FileLength = len(filelist) fstr = pathname + '/' for i in range(FileLength): I1=cv2.imread(fstr+filelist[i]) if np.any(I1): I2=cv2.resize(I1,(ph,pw)) if np.any(I2): SamData.append(I2) SamTag.append(ObjectCode) CountStr.set(str(len(SamData))) ObjectCode=None return def on_ax_click(event): global ax, point1, point2, crop, FileLength, FileNum, pathname,filelist,yimg global CurImageNum, Mflag, centerX, centerY, boxw, boxh, DrawRectangleFlag,std2 if Mflag==1: if event.dblclick and event.button == 1: ans = mes.askyesno("图像删除确认", "确实想删除此图片吗?") if ans: fstr = pathname + '/' + filelist[FileNum] os.remove(fstr) filelist = os.listdir(pathname) FileLength = len(filelist) if FileNum > 0: FileNum -= 1 return elif event.button == 1: point1 = np.array([event.x, WH - event.y]) point2 = point1.copy() return elif event.dblclick and event.button==3: if point1[0] == point2[0] or point1[1] == point2[1]: return h,w=yimg.shape[:2] ymax = int(max(point1[1], point2[1])*(h/WH)) xmax = int(max(point1[0], point2[0])*(w/WW)) xmin = int(min(point1[0], point2[0])*(w/WW)) ymin = int(min(point1[1], point2[1])*(h/WH)) crop = yimg[ymin:ymax, xmin:xmax, :] cv2.imshow('crop', crop) cv2.setMouseCallback('crop', on_cv_mouse2) return elif event.button==3: if DrawRectangleFlag: centerX = np.around((point1[0] + point2[0]) / (2.0 * WW), decimals=5) centerY = np.around((point1[1] + point2[1]) / (2.0 * WH), decimals=5) boxw = np.around(np.abs(point2[0] - point1[0]) / WW, decimals=5) boxh = np.around(np.abs(point2[1] - point1[1]) / WH, decimals=5) DrawRectangleFlag = False Mflag = 2 return elif Mflag==2: if event.button==1: # 左键点击确定点BOX ls = [ObjectCode, centerX, centerY,boxw,boxh] if CurImageNum== FileNum: InsertTable(ls) BoxData.append(ls.copy()) else: fstr = pathname + '/' + filelist[FileNum] std2.insert(tk.END, fstr) std2.insert(tk.END, '\r\n') InsertTable(ls) ImageData.append(img) if len(ImageData)==1: but7.config(state=tk.ACTIVE) BoxData.append(ls.copy()) else: LabelData.append(BoxData.copy()) BoxData.clear() BoxData.append(ls.copy()) CurImageNum = FileNum Mflag = 1 return def on_ax_motion(event): global point1, point2, ax, img, recimg, GI, recimg, newimg,DrawRectangleFlag if event.button == 1: point2 = np.array([event.x, WH - event.y]) cv2.rectangle(recimg, point1, point2, (0, 255, 0), 2) newimg = cv2.bitwise_xor(np.uint8(img), np.uint8(recimg)) ax.imshow(newimg) recimg = np.zeros((WH, WW, 3), dtype=np.uint8) draw_set.draw() OutputFrame.update() DrawRectangleFlag=True return def on_ax_scroll(event): global img, recimg,filelist, FileNum, FileLength, pathname, ax, yimg, point1, newimg, ObjectCode, Mflag if Mflag==1: if pathname == "": return if event.button=="down" : if FileNum > 0: FileNum -= 1 else: if FileNum < FileLength - 1: FileNum += 1 fstr = pathname + '/' + filelist[FileNum] I = cv2.imread(fstr) imgsize = np.shape(I) # 图像尺寸大于1024,进行适当缩放 if imgsize[0] > 1024 or imgsize[1] > 1024: sv = 1024.0 / max(imgsize[0], imgsize[1]) img = cv2.resize(I, (int(sv * imgsize[1]), int(sv * imgsize[0]))) else: img = I yimg=img.copy() img=cv2.resize(img,(WW,WH)) img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) fig.clear() ax = fig.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) ax.axis("off") ax.imshow(img) draw_set.draw() OutputFrame.update() elif Mflag==2: if event.button=="up" : if ObjectCode > 0: ObjectCode -= 1 else: if ObjectCode < ObjectNum - 1: ObjectCode += 1 drawChinese(newimg, point1, ObjectCode) return #ObjectName =['人','电脑','鼠标', '键盘', '订书机', '手机', '书', '台灯','杯子','笔'] #ObjectName = ['行人','汽车', '树木', '摩托', '交通灯', '狗', '路灯', '停车场','自行车','鲜花'] ObjectNum=len(ObjectName) def drawChinese(img, point, num): global ObjectName image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将OpenCV图像转换为PIL图像 pil_image = Image.fromarray(image) # 准备写中文的工具 draw = ImageDraw.Draw(pil_image) font = ImageFont.truetype('simsun.ttc', 30) # 'simsun.ttc' 是常见的中文字体 # 写入中文文本 draw.text(point, ObjectName[num], font=font, fill=(255, 0, 0)) # 将PIL图像转换回OpenCV图像 img = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) ax.imshow(img) draw_set.draw() OutputFrame.update() return #crop 剪裁窗口的鼠标响应 #cv2窗口双击鼠标左键,用剪裁出来的 def on_cv_mouse2(event, x, y, flags, param): global crop,filelist,FileLength if event == cv2.EVENT_RBUTTONDBLCLK: file1 = file.asksaveasfilename(title='保存文件名字', initialdir="\image", filetypes=[('jpg文件', '*.jpg')]) if file1 == "": return cv2.imwrite(file1+'.jpg', crop) cv2.destroyWindow("crop") filelist = os.listdir(pathname) FileLength = len(filelist) elif event == cv2.EVENT_LBUTTONDBLCLK: fstr = pathname + '/' + filelist[FileNum] cv2.imwrite(fstr, crop) cv2.destroyWindow("crop") ######################################### def Yolov8Detect(): global ObjectName,model8 cap = cv2.VideoCapture('MyVideo.mp4') #cap.open(0, cv2.CAP_DSHOW) #model8.load(r"E:\LhxAgent\runs\detect\train35\weights\best.pt") cv2.waitKey(10) while True: ret, frame = cap.read() # 从本地视频通道采集一帧图像 img = cv2.resize(frame, (640, 480)) # 改变帧的长和宽为1024X800 results = model8.predict(img, show=False, save=False, verbose=False) boxes = results[0].boxes.xywh.cpu() indx = results[0].boxes.cls conf = results[0].boxes.conf class_names = [ObjectName[int(cls)] for cls in indx] vconf = [float(c) for c in conf] for box, name, score in zip(boxes, class_names,vconf): x_center, y_center, width, height = box.tolist() x1 = int(x_center - width / 2) y1 = int(y_center - height / 2) width = int(width) height = int(height) cv2.rectangle(img, (x1, y1), (x1 + width, y1 + height), (255, 0, 0), 2) pil_image = Image.fromarray(img) draw = ImageDraw.Draw(pil_image) font = ImageFont.truetype('simsun.ttc', 30) # 'simsun.ttc' 是常见的中文字体 # 写入中文文本 str1 = name + " " + str(score)[0:4] draw.text((x1, y1), str1, font=font, fill=(255, 0, 0)) # 将PIL图像转换回OpenCV图像 #img = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) img=np.array(pil_image) cv2.imshow("img", img) k = cv2.waitKey(10) & 0xff if k == 27: # press 'ESC' to quit break cap.release() cv2.destroyAllWindows() return def Yolov8SingleDetect(): global GI, ObjectName, model8 #results = model8.predict(GI, show=False, save=False, verbose=False) results = model8.predict(GI, show=False, save=False, verbose=False) img =GI # results[0].plot() boxes = results[0].boxes.xywh.cpu() #img = results[0].plot() #获得检测目标框的类别-是张量 indx=results[0].boxes.cls conf = results[0].boxes.conf class_names = [ObjectName[int(cls)] for cls in indx] vconf = [float(c) for c in conf] print(vconf) #print("result=",class_names) for box, idx,score in zip(boxes, class_names,vconf): x_center, y_center, width, height = box.tolist() x1 = int(x_center - width / 2) y1 = int(y_center - height / 2) width=int(width) height=int(height) cv2.imshow("img",GI) #print(name) cv2.rectangle(img, (x1, y1), (x1 + width, y1 + height), (255, 0, 0), 2) pil_image = Image.fromarray(img) draw = ImageDraw.Draw(pil_image) font = ImageFont.truetype('simsun.ttc', 30) # 'simsun.ttc' 是常见的中文字体 # 写入中文文本 str1=idx+" "+str(score)[0:4] draw.text((x1, y1), str1, font=font, fill=(255, 0, 0)) # 将PIL图像转换回OpenCV图像 img =np.array(pil_image)# cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) cv2.imshow("img", img) return def TrainYoloV8(): global model8 model8 = YOLO("yolov8n.yaml") # build a new model from scratch model8 = YOLO("yolov8n.pt") model8.train(data="lihexi1.yaml", epochs=100, device="CPU", save=True) return def LoadModel(): global model8 #model8=YOLO(r'E:\LhxAgent\runs\detect\train2\weights\best.pt') model8 = YOLO(r'E:\LhxAgent\runs\detect\train2\weights\yolov8n.pt') return #========函数区结束=========== #=========菜单区============= menubar = tk.Menu(MainWin) # file menu fmenu = tk.Menu(menubar) fmenu.add_command(label='装入图像', command=LoadImage) fmenu.add_command(label='保存图像', command=SaveImage) fmenu.add_command(label='批量保存', command=callback1) fmenu.add_command(label='备用', command=callback1) # Image processing menu pmenu = tk.Menu(menubar) pmenu.add_command(label='开始爬取', command=StartCrawling) pmenu.add_command(label='暂停爬取', command=Suspending) pmenu.add_command(label='继续爬取', command=Resuming) pmenu.add_command(label='停止爬取', command=StopCrawling) # machine learning qmenu = tk.Menu(menubar) qmenu.add_command(label='图像清洗', command=CleanImage) qmenu.add_command(label='图像浏览', command=ScanImage) qmenu.add_command(label='批量换名', command=RenameImage) qmenu.add_command(label='转换成NPZ', command=NPZfile) lmenu = tk.Menu(menubar) lmenu.add_command(label='图像浏览', command=ScanImage) lmenu.add_command(label='标注类别名称', command=LoadClassName) lmenu.add_command(label='批量标注', command=LabelBatch) lmenu.add_command(label='标注结束', command=LabelEnd) lmenu.add_command(label='保存标注', command=LabelSave) tmenu = tk.Menu(menubar) tmenu.add_command(label='训练配置', command=TrainSetting) tmenu.add_command(label='训练启动', command=TrainStarting) tmenu.add_command(label='结果指标', command=TrainResultShow) tmenu.add_command(label='保存结果', command=SaveTrainResult) emenu = tk.Menu(menubar) emenu.add_command(label='打开图像', command=SelectImage) emenu.add_command(label='单幅测试', command=SingleImageTest) emenu.add_command(label='跟踪测试', command=ObjectTracking) emenu.add_command(label='保存测试结果', command=SaveTestResult) hmenu = tk.Menu(menubar) hmenu.add_command(label='图像爬取操作说明', command=HelpPicCrawl) hmenu.add_command(label='图像区域标注说明', command=HelpBatchAnn) hmenu.add_command(label='批量标注说明', command=HelpBatchAnn) hmenu.add_command(label='模型训练说明', command=callback1) menubar.add_cascade(label="文件操作", menu=fmenu) menubar.add_cascade(label="目标图像爬取", menu=pmenu) menubar.add_cascade(label="目标图像清洗", menu=qmenu) menubar.add_cascade(label="目标图像标注", menu=lmenu) menubar.add_cascade(label="目标图像训练", menu=tmenu) menubar.add_cascade(label="目标图像测试", menu=emenu) menubar.add_cascade(label="操作说明", menu=hmenu) MainWin.config(menu=menubar) #设置4个Frame 区, w1=600 h1=500 WW=550 WH=400 InputFrame =tk.Frame(MainWin,height =h1, width=w1) OutputFrame =tk.Frame(MainWin,height =h1, width=w1) butFrame = tk.Frame(MainWin,height=h1, width=w1) DataFrame = tk.Frame(MainWin,height=h1, width=w1) InputFrame.grid(row=0,column=0) OutputFrame.grid(row=0,column=1) butFrame.grid(row=1,column=0) DataFrame.grid(row=1,column=1,sticky=tk.N) #InputFrame Lab1=tk.Label(InputFrame,text='在此输入爬取图片主题词:',font=('Arial', 12),width=20, height=1) Lab1.grid(row=0,column=0,padx=10,pady=20) KeyStr=tk.StringVar() entry1=tk.Entry(InputFrame,font=('Arial', 12), width=20,textvariable=KeyStr) entry1.grid(row=0,column=1) KeyStr.set('') fig2 = plt.Figure(figsize=(WW/100, WH/100), dpi=100) # 设置空画布窗口,figsize为大小(英寸),dpi为分辨率 draw_set2 = FigureCanvasTkAgg(fig2, master=InputFrame) # 将空画布设置在tkinter的输出容器OutputFrame上 draw_set2.get_tk_widget().grid(row=1, column=0,columnspan=2) ax2 = fig2.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) logo=cv2.imread('ImageFile/AnnLogo.jpg') logo=cv2.cvtColor(logo,cv2.COLOR_BGR2RGB) ax2.axis("off") ax2.imshow(logo) draw_set2.draw() #LogoImage = tk.PhotoImage(file='ImageFile/AnnLogo.png') #Lab2=tk.Label(InputFrame, image=LogoImage) #Lab2.grid(row=1,column=0,columnspan=2,padx=40) ########输出窗口 Lab3 = tk.Label(OutputFrame, text='输出窗口', font=('Arial', 14), width=16, height=1) Lab3.grid(row=0, column=0, pady=20) fig = plt.Figure(figsize=(WW/100, WH/100), dpi=100) # 设置空画布窗口,figsize为大小(英寸),dpi为分辨率 draw_set = FigureCanvasTkAgg(fig, master=OutputFrame) # 将空画布设置在tkinter的输出容器OutputFrame上 draw_set.get_tk_widget().grid(row=1, column=0) ax = fig.add_subplot(1, 1, 1, position=[0, 0, 1, 1]) draw_set.draw() ############################################ Target=[('0',0),('1',1),('2',2),('3',3),('4',4),('5',5),('6',6),('7',7),('8',8),('9',9)] TargetVector=np.zeros(10) TargetV=tk.IntVar() Target_startx=50 Target_starty=20 for txt,num in Target: rbut=tk.Radiobutton(butFrame, text=txt, value=num,font=('Arial', 12), width=3, height=1,command=SetTarget, variable=TargetV) rbut.place(x=Target_startx + num * 50, y=Target_starty) but1=tk.Button(butFrame, text='开始爬取', font=('Arial', 12), width=10, height=1,command=StartCrawling) but2=tk.Button(butFrame, text='停止爬取', font=('Arial', 12), width=10, height=1,command=StopCrawling) but3=tk.Button(butFrame, text='浏览图片', font=('Arial', 12), width=10, height=1,command=ScanImage) but4=tk.Button(butFrame, text='模型训练', font=('Arial', 12), width=10, height=1, command=TrainStarting) but5=tk.Button(butFrame, text='装入模型', font=('Arial', 12), width=10, height=1, command=LoadModel) but6=tk.Button(butFrame, text='方框标注', font=('Arial', 12), width=10, height=1, command=LabelBatch) but7=tk.Button(butFrame, text='结束标注', font=('Arial', 12), width=10, height=1, command=LabelEnd) but8=tk.Button(butFrame, text='标注存盘', font=('Arial', 12), width=10, height=1, command=LabelSave) but9=tk.Button(butFrame, text='目标识别', font=('Arial', 12), width=10, height=1, command=Yolov8Detect) but1.place(x=50,y=80) but2.place(x=250,y=80) but3.place(x=450,y=80) but4.place(x=50,y=120) but5.place(x=250,y=120) but6.place(x=450,y=120) but7.place(x=50,y=160) but8.place(x=250,y=160) but9.place(x=450,y=160) but7.config(state=tk.DISABLED) but8.config(state=tk.DISABLED) #Data Frame Lab4=tk.Label(DataFrame,text='网页计数:',font=('Arial', 12),width=10, height=1) Lab4.grid(row=0,column=0,pady=40) Lab5=tk.Label(DataFrame,text='文件名称:',font=('Arial', 12),width=10, height=1) Lab5.grid(row=1,column=0) Lab6=tk.Label(DataFrame,text='下载地址',font=('Arial', 12),width=10, height=1) Lab6.grid(row=2,column=0,pady=40) CountStr=tk.StringVar() entry4=tk.Entry(DataFrame,font=('Arial', 12),width=15, textvariable=CountStr) entry4.grid(row=0,column=1,pady=40) CountStr.set("0") FileStr=tk.StringVar() entry5=tk.Entry(DataFrame,font=('Arial', 12), width=30,textvariable=FileStr) entry5.grid(row=1,column=1) FileStr.set("") DownAddrStr=tk.StringVar() entry6=tk.Entry(DataFrame,font=('Arial', 12), width=50,textvariable=DownAddrStr) entry6.grid(row=2,column=1,pady=40) #Thd1=thread.Thread(target=CrawlPicture,args=(300,500,)) #Thd1.setDaemon(True) #Thd1.start() MainWin.mainloop()怎么使用
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值