yolov5是基于pytorch的目标检测模型,无需darknet,安装简单,性能比较好。
$ git clone https://github.com/ultralytics/yolov5
$ cd yolov5
$ pip install -r requirements.txt
安装完成就可进行检测或训练了。
检测:python detect.py
-- weights yolov5s.pt weight模型权重
--source data/pest 图片目录
--img 640 图片大小
训练:
python train.py --img 640 --cfg yolov5s.yaml --batch 16 --epochs 77 --data coco.yaml --weights yolov5s.pt --resume
其中coco.yaml文件包含了训练数据集信息。
path: ../datasets/coco128 # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)
xml文件转换为txt文本文件
coco数据集为xml文件,yolov5标签为文本文件,不支持difficult和truncated选项。
function xml2txt($jsFn,$str,$arr){//xml字符串转txt文件xml2txt($jsFn,$str,$arr)
$tArr = xmltoarray($str);
$imgW = $tArr["size"]["width"];//图片宽
$imgH = $tArr["size"]["height"];//高
echo $imgW."*".$imgH."--";
$objArr = $tArr["object"];
if(empty($objArr[0]["name"])){//单个object
$pNum = array_search($objArr["name"],$arr);
$xPlot = ($objArr["bndbox"]["xmin"] + $objArr["bndbox"]["xmax"])/2/$imgW;
$yPlot = ($objArr["bndbox"]["ymin"] + $objArr["bndbox"]["ymax"])/2/$imgH;
$wVal = ($objArr["bndbox"]["xmax"] - $objArr["bndbox"]["xmin"])/$imgW;
$hVal = ($objArr["bndbox"]["ymax"] - $objArr["bndbox"]["ymin"])/$imgH;
$yoloStr = $pNum." ".round($xPlot,6)." ".round($yPlot,6)." ".round($wVal,6)." ".round($hVal,6)."\r\n";
}else{
for($i=0;$i<count($objArr);$i++){
$pNum = array_search($objArr[$i]["name"],$arr);
$xPlot = ($objArr[$i]["bndbox"]["xmin"] + $objArr[$i]["bndbox"]["xmax"])/2/$imgW;
$yPlot = ($objArr[$i]["bndbox"]["ymin"] + $objArr[$i]["bndbox"]["ymax"])/2/$imgH;
$wVal = ($objArr[$i]["bndbox"]["xmax"] - $objArr[$i]["bndbox"]["xmin"])/$imgW;
$hVal = ($objArr[$i]["bndbox"]["ymax"] - $objArr[$i]["bndbox"]["ymin"])/$imgH;
$yoloStr .= $pNum." ".round($xPlot,6)." ".round($yPlot,6)." ".round($wVal,6)." ".round($hVal,6)."\r\n";
}
}
$yFn = str_replace("Annotations","yolo",$jsFn);
$yFn = str_replace(".xml",".txt",$yFn);
echo $yFn."<br>";
saveFile($yFn,$yoloStr);
}
拷贝相应文件到训练集和验证集目录
function mkYolo($fn,$str){//yolo训练集和验证集
if(file_exists($fn)){//train文件存在
$jStr = file_get_contents($fn);
}
$tArr = explode("\r\n",$jStr);
for($i=0;$i<count($tArr);$i++){
if(!empty(trim($tArr[$i]))){
if(file_exists("VOC2007/JPEGImages/".$tArr[$i].".jpg")){
copy("VOC2007/JPEGImages/".$tArr[$i].".jpg","VOC2007/images/".$str."/".$tArr[$i].".jpg");
copy("VOC2007/yolo/".$tArr[$i].".txt","VOC2007/labels/".$str."/".$tArr[$i].".txt");
}
}
}
}
生成.yaml数据集配置文件
function yamlFile($arr){
//# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
$str = "path: ../datasets/coco128 # dataset root dir\r\n";
$str .= "train: images/train2017 # train images (relative to 'path') 128 images\r\n";
$str .= "val: images/train2017 # val images (relative to 'path') 128 images\r\n";
$str .= "test: # test images (optional)\r\n";
$str .= "# Classes\r\n";
$str .= "nc: ".count($arr)." # number of classes\r\n";
$str .= "names: [";
for($i=0;$i<count($arr);$i++){
if($i==count($arr)-1){
$str .="'".$arr[$i]."']\r\n";
}else{
if( ($i+1)%10==0 ){
$str .="'".$arr[$i]."',\r\n";
}else{
$str .="'".$arr[$i]."',";
}
}
}
saveFile("VOC2007/lamp.yaml",$str);
}