Yolov5检测并生成文本及标签文件

本文介绍了一个从检测到标注的完整工作流程,包括使用Python脚本进行目标检测、将检测结果转换为文本文件、进一步将文本内容解析为数组及JSON格式,并最终生成XML标注文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

检测目标文件夹

python detect.py --source **path/**/ --weights **.pt --img 640

生成文本文件

加 --save-txt 参数即可

python detect.py --source **path/**/ --weights **.pt --img 640 --save-txt

文本文件转成数组

function fnTxt2Arr($fn,$iW,$iH){
  $tStr = read2Str($fn); 
  $arr = explode("\r\n",$tStr);
  $arr = array_filter($arr);//清除空字符
  for($i=0;$i<count($arr);$i++){
     $arrT = explode(" ",$arr[$i]);
     $tArr[$i]["labId"] = $arrT[0];//种类标签序号
     $tArr[$i]["xMax"] = ($arrT[1]*$iW*2 + $arrT[3]*$iW  )/2;
     $tArr[$i]["xMin"] = $arrT[1]*$iW*2 - $tArr[$i]["xMax"];
     $tArr[$i]["yMax"] = ($arrT[2]*$iH*2 + $arrT[4]*$iH  )/2;
     $tArr[$i]["yMin"] = $arrT[2]*$iH*2 - $tArr[$i]["yMax"];
  }
  return $tArr;
}   

返回种类标签,xmax,xmin,ymax,ymin的数组。

数组转成json字符串

function fnTxt2json($arr){//文本文件转成json
global $yEnArr, $arrImg, $arrColor;
   for($i=0;$i<count($arr);$i++){
       $t1Arr[0]["x"] = $arr[$i]["xMin"];
       $t1Arr[0]["y"] = $arr[$i]["yMin"];
       $t1Arr[1]["x"] = $arr[$i]["xMax"];
       $t1Arr[1]["y"] = $arr[$i]["yMin"];
       $t1Arr[2]["x"] = $arr[$i]["xMax"];
       $t1Arr[2]["y"] = $arr[$i]["yMax"];
       $t1Arr[3]["x"] = $arr[$i]["xMin"];
       $t1Arr[3]["y"] = $arr[$i]["yMax"];
       $jArr[$i]["content"] = $t1Arr;
       $t2Arr["xMin"] = $arr[$i]["xMin"];
       $t2Arr["yMin"] = $arr[$i]["yMin"];
       $t2Arr["width"] = $arr[$i]["xMax"] - $arr[$i]["xMin"];
       $t2Arr["height"] = $arr[$i]["yMax"] - $arr[$i]["yMin"];
       $jArr[$i]["rectMask"] = $t2Arr;
       
       $t3Arr["labelName"] = trim($yEnArr[$arr[$i]["labId"]]);
       $tId = array_search($yEnArr[$arr[$i]["labId"]],$arrImg);
       $t3Arr["labelColor"] = $arrColor[$tId];
       $t3Arr["labelColorRGB"] = "undefined,undefined,undefined" ;
       $t3Arr["visibility"] = false; ;
       $jArr[$i]["labels"] = $t3Arr;
       
       $t4Arr["x"] = ($arr[$i]["xMin"] + $arr[$i]["xMax"])/2 ;
       $t4Arr["y"] = ($arr[$i]["yMin"] + $arr[$i]["yMax"])/2 ;
       $jArr[$i]["labelLocation"] = $t4Arr;
       $jArr[$i]["contentType"] = "rect";
   }  
  return json_encode($jArr);
}  

数组生成xml文件

function fn2xml($arr,$imgFile,$iW,$iH,$fn,$arrCh,$arrEn){
   global $yEnArr;
   $arrsT = explode("/",$imgFile); 
   $jpgName = str_replace(".txt",".jpg",$arrsT[count($arrsT)-1]);
   $tStr =     "<annotation>\r\n";
   $tStr .= "    <folder>VOC2007</folder>\r\n";
   $tStr .= "    <filename>".$jpgName."</filename>\r\n";
   $tStr .= "    <path>".$jpgName."</path>\r\n";
   $tStr .= "    <source>\r\n";
   $tStr .= "        <database>Unknown</database>\r\n";
   $tStr .= "    </source>\r\n";
   $tStr .= "    <size>\r\n";
   $tStr .= "        <width>".$iW."</width>\r\n";
   $tStr .= "        <height>".$iH."</height>\r\n";
   $tStr .= "        <depth>3</depth>\r\n";
   $tStr .= "    </size>\r\n";
   $tStr .= "    <segmented>0</segmented>\r\n";
   for($i=0;$i<count($arr);$i++){
     $tStr .= "    <object>\r\n";
     $tStr .= "        <name>".trim($yEnArr[$arr[$i]["labId"]])."</name>\r\n";
     $tStr .= "        <pose>Unspecified</pose>\r\n";
     $tStr .= "        <truncated>0</truncated>\r\n";//是否分割 isP
     $tStr .= "        <difficult>0</difficult>\r\n";//困难字段 isD
     $tStr .= "        <bndbox>\r\n";
     $tStr .= "            <xmin>".round($arr[$i]["xMin"],1)."</xmin>\r\n";//舍去取整
     $tStr .= "            <ymin>".round($arr[$i]["yMin"],1)."</ymin>\r\n";
     $tStr .= "            <xmax>".round($arr[$i]["xMax"],1)."</xmax>\r\n";//进1取整
     $tStr .= "            <ymax>".round($arr[$i]["yMax"],1)."</ymax>\r\n";
     $tStr .= "        </bndbox>\r\n";
     $tStr .= "    </object>\r\n";       
     $labStr .= $yEnArr[$arr[$i]["labId"]].",";//标签的昆虫名称
   }
   $tStr .=     "</annotation>";
   $xmlFName= str_replace(".txt",".xml",$imgFile);
   $fp = fopen("$xmlFName", "w"); //打开文件指针,创建文件
   if(!is_writable($xmlFName) ){ die("文件:" .$xmlFName. "不可写,请检查!" );}
   fwrite($fp,$tStr);
   fclose($fp); 
   varTxt($imgFile,$labStr,$fn);//昆虫标签写入指定文本文件
}

Notepad++比较文本文件异同

compare插件

需github

C:\Windows\System32\drivers\etc下修改

HOSTS文件

ping github.com

加入IP地址

array_search()注意空字符

array_search(trim($str),$arr)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值