lilith.lu 994aa0c2cd 来自svn 6986 8 months ago
..
classify 994aa0c2cd 来自svn 6986 8 months ago
data 994aa0c2cd 来自svn 6986 8 months ago
depends 994aa0c2cd 来自svn 6986 8 months ago
extra_contours_file 994aa0c2cd 来自svn 6986 8 months ago
metrics 994aa0c2cd 来自svn 6986 8 months ago
models 994aa0c2cd 来自svn 6986 8 months ago
segment 994aa0c2cd 来自svn 6986 8 months ago
simulater 994aa0c2cd 来自svn 6986 8 months ago
testdatas 994aa0c2cd 来自svn 6986 8 months ago
ultralytics 994aa0c2cd 来自svn 6986 8 months ago
utils 994aa0c2cd 来自svn 6986 8 months ago
wrongfile 994aa0c2cd 来自svn 6986 8 months ago
TrainSdk.py 994aa0c2cd 来自svn 6986 8 months ago
benchmarks.py 994aa0c2cd 来自svn 6986 8 months ago
detect.py 994aa0c2cd 来自svn 6986 8 months ago
export.py 994aa0c2cd 来自svn 6986 8 months ago
hubconf.py 994aa0c2cd 来自svn 6986 8 months ago
main-seg.py 994aa0c2cd 来自svn 6986 8 months ago
main.py 994aa0c2cd 来自svn 6986 8 months ago
readme.txt 994aa0c2cd 来自svn 6986 8 months ago
val.py 994aa0c2cd 来自svn 6986 8 months ago

readme.txt

整体框架来自于:
https://github.com/ultralytics/yolov5#tutorials
所有基本的都可以查看相关内容

训练检测模型时:使用默认的main.py文件.
训练实例分割模型时:使用main-seg.py文件,因为平台需要默认的main文件,需要修改文件名为main.py文件

默认需要给的yaml文件为:
1.超参数文件,都在data/hyps中,具体的参数说明可以参考hyp.scratch-low文件
2.数据文件,都在data/public_data 或者 data/vinno_data中
public_data:
都是默认数据集的,只有:path train val test names几个参数,默认路径可以修改
vinno_data:
都是读取AI平台数据集的方式,此时path train val test names几个参数可以不设置
额外需要给platform_data_args参数,此时需要区分检测和分割,
检测可以参考:data/vinno_data/Breast-BIRADS-Obj.yaml
分割可以参考:data/vinno_data/Thyroid-TIRADS-Seg.yaml
3.模型文件,检测的都在 models/hub中,分割的都在models/segment中
模型文件中的nc代表类别,去掉背景总共有几类,可以不改,会根据数据确定
depth_multiple和width_multiple涉及模型的大小
anchors 成对出现,默认给1,1的话,会自动调用kmeans获取

修改部分:
1.main文件中,给到默认的三个文件即可,然后调节workers和batch-size即可
parser.add_argument("--cfg", type=str, default=ROOT / "models/hub/XXX.yaml", help="model.yaml path")
parser.add_argument("--data", type=str, default=ROOT / "data/XXX.yaml", help="dataset.yaml path")
parser.add_argument("--hyp", type=str, default=ROOT / "data/hyps/XXX.yaml",
help="hyperparameters path")
在平台上训练改为true即可
parser.add_argument('--is_train_on_platform', type=bool, default=True,
help='True is train on platform,False is train on local')

2.在utils/dataloaders.py添加了LoadImagesAndLabelsPlatform类,用于制作平台数据Dataset,
跟默认的相比只是在读取数据yaml中的平台参数,额外添加了DataGenerator类,调用generate函数,用于得到所需要
的self.labels, self.im_files, self.shapes, self.segments, self.crop_boxes,self.crop_contours 。后续有需求可以修改DataGenerator类,获取自己项目所有的labels和im_files等

3.在计算评价指标时,添加计算基于c++后处理的评价指标,暂时并没有完全去掉已有的评价指标,
只是偶尔计算,得到report。如果有需要可以返回评价指标用于存最好的模型。
计算时,数据根据val_loader中记录的名称重新读取,resize等前处理之后,传入模型,将模型转成onnx,计算report
并没有直接读取val_loader中前处理的数据,
因为:yolo训练的resize方式跟平台已有的不是完全一致,重新做一遍前处理可能更加贴合实际。

注意:
yolo训练的resize方式跟c#那边已有的并不是完全相同。
c#那边有:FitLargeSizeAndPad FitSmallSizeAndCrop Warp三种
如果完全统一可以:c#那边添加一个yolo一致的resize方式,暂时没有计划。
(之前在dsod的项目中,存在c#中一致的三种resize方式,训练、python测试、c#测试,三种对整体效果差异并不大)

因此为了尽量弥补resize方式在训练和c#测试中的差异,默认采用的c#中的warp
默认的LoadImagesAndLabels(Dataset)中的load_image(self, i)
默认的方式:
h0, w0 = im.shape[:2] # orig hw
r = self.img_size / max(h0, w0) # ratio
if r != 1: # if sizes are not equal
interp = cv2.INTER_LINEAR if (self.augment or r > 1) else cv2.INTER_AREA
im = cv2.resize(im, (math.ceil(w0 * r), math.ceil(h0 * r)), interpolation=interp)
return im, (h0, w0), im.shape[:2] # im, hw_original, hw_resized

修改后的方式:
h0, w0 = im.shape[:2] # orig hw
r = self.img_size / max(h0, w0) # ratio
if r != 1: # if sizes are not equal
interp = cv2.INTER_LINEAR if (self.augment or r > 1) else cv2.INTER_AREA
# 直接resize成需要的大小,默认的在后面的操作中默认填充边框,暂时没用这样的操作
im = cv2.resize(im, (self.img_size, self.img_size), interpolation=interp)

resize之后的图像已经跟训练图像size一致,后续经过letterbox函数,ratio和pad都为0,
类似warp,后续有人测试有较大差异,影响结果,可以自行改成默认的。

4.utils/augmentations.py中Albumentations类,可以根据自己的需求修改,暂时给到了甲状腺病灶检测和乳腺病灶检测的参数


默认的示例:
将testdatas文件夹中相应文件夹的数据放到simulater的TestFiles和TrainFiles中,可以本地试用和调试。
1.乳腺检测模型:
注意:检测那边一般的负样本较少,低于15%以下最好,如果负样本较多确实影响整体结果。
因此在data那边添加了class_aug_times,参数根据标签,将该图像重复采集,这样可以将负样本的比例降低。
因为乳腺那边的负样本较多、都想使用,而且有些恶性的比例较少,因此扩充比例较大。
训练轮次200-300轮,训练轮次较多,因为之前提到模糊等图像也需要检出,如果整体效果不变的话,宁愿多训练轮次来提高泛化。

使用
Breast-BIRADS-Obj.yaml
hyp.scratch_breast-birads.yaml
yolov5s-ghost.yaml
直接训练即可。
训练时,采用上述的三个文件,超参数中mosaic和mixup有利于提升召回率和减少背景误判,但是一直开的话会导致模型的精确率越来越高,召回越来越低。因此建议前60-80轮,开启这两个数据增强方式,后续resume时关闭mixup,降低或者关闭mosaic。
操作如下:
将保存的 xx.pt文件和opt.yaml放到main.py同级的目录下,将opt.yaml中mixup和mosaic设成所需要的。
在main.py中 default给到相应的模型
parser.add_argument("--resume", nargs="?", const=True, default=ROOT / 'xx.pt', help="resume most recent training")
也可以自己弄个文件夹路径也可以,给到default那边即可。
重新训练即可。
由于分级效果不好,边训练边测试看不出整体变化,为了查看模型效果,可以将模型val_loader中的single_cls改为true,此时训练就是多类别,测试的时候为单类别,只是为了查看csv中的精确率和召回率,并不影响整个收敛。该处并不规范,只是大概看效果而已。
修改部位为:main.py中的:
第一处:
val_loader = create_dataloader(
val_path,
imgsz,
batch_size // WORLD_SIZE * 2,
gs,
single_cls = True, #此处修改
hyp=hyp,
cache=None if noval else opt.cache,
rect=True,
rank=-1,
workers=workers * 2,
pad=0.5,
prefix=colorstr("val: "),
)[0]

第二处:
results, maps, _ = validate.run(
data_dict,
batch_size=batch_size // WORLD_SIZE * 2,
imgsz=imgsz,
half=amp,
model=ema.ema,
single_cls = True, #此处修改
dataloader=val_loader,
save_dir=save_dir,
plots=False,
callbacks=callbacks,
compute_loss=compute_loss,
use_v7_loss=use_v7_loss,
is_train_on_platform=is_train_on_platform,
)

第三处:
results, _, _ = validate.run(
data_dict,
batch_size=batch_size // WORLD_SIZE * 2,
imgsz=imgsz,
model=attempt_load(f, device).half(),
iou_thres=0.65 if is_coco else 0.60, # best pycocotools at iou 0.65
single_cls = True, #此处修改
dataloader=val_loader,
save_dir=save_dir,
save_json=is_coco,
verbose=True,
plots=plots,
callbacks=callbacks,
compute_loss=compute_loss,
use_v7_loss=use_v7_loss,
is_train_on_platform=is_train_on_platform,
) # val best model with plots

2.甲状腺检测模型:
image_weight参数关闭,有利于减少平常图像误判;添加扩充比例,疾病检出无变化,分级那边指标会提高;

使用
Thyroid-TIRADS-Obj.yaml
hyp.scratch_thyroid-tirads.yaml
yolov8.yaml
直接训练即可。
训练时,采用上述的三个文件,训练时前60轮设置mosaic=0.9,mixup=0.9,后20轮关闭该参数,提高分类的置信度
操作如下:
将保存的 xx.pt文件和opt.yaml放到main.py同级的目录下,将opt.yaml中mixup和mosaic设成0。
在main.py中 default给到相应的模型
parser.add_argument("--resume", nargs="?", const=True, default=ROOT / 'xx.pt', help="resume most recent training")
也可以自己弄个文件夹路径也可以,给到default那边即可。
重新训练即可。
由于分级效果不好,边训练边测试看不出整体变化,为了查看模型效果,将模型val_loader中的single_cls改为true,操作如上述乳腺检测一致。

3.颈部脏器分割模型:
使用
Neck-Organ-Seg.yaml
hyp.scratch_neck-ogran.yaml
yolov8-seg.yaml
直接训练即可。
后续可以降低mosaic和mixup的数据增强。

4.肝脏检测或者分割模型:
肝脏模型暂时未上传模型的训练参数和后处理参数,可以拿已有的参数试用。
数据yaml为:
Liver-Focal-Obj.yaml 或者 Liver-Focal-Seg.yaml
该模型需要将额外的脏器轮廓裁掉,在裁完图的图像中训练和测试,
如果有项目类似,相关参数可以参考上述的两个yaml文件。