当前位置:   article > 正文

阿里天池--宫颈癌检测(基于fastRCNN)新手初次尝试_阿里天池细胞

阿里天池细胞

阿里天池–宫颈癌检测

数据下载(自取嗷,链接失效了是阿里的事= =):https://blog.csdn.net/abyss_miracle/article/details/104720413

官方说明:
赛题链接:https://blog.csdn.net/xiaosongshine/article/details/102497362
赛题背景
大赛旨在通过提供大规模经过专业医师标注的宫颈癌液基薄层细胞检测数据,选手能够提出并综合运用目标检测、深度学习等方法对宫颈癌细胞学异常鳞状上皮细胞进行定位以及对宫颈癌细胞学图片分类,提高模型检测的速度和精度,辅助医生进行诊断。
在这里插入图片描述
赛题数据
本次大赛提供数千份宫颈癌细胞学图片和对应异常鳞状上皮细胞位置标注,数据为kfb格式,需要使用大赛指定SDK读取。每张数据在20倍数字扫描仪下获取,大小300~400M。

初赛环节允许选手下载数据,初赛提供的数据如下:宫颈癌细胞学图片800张,其中阳性图片500张,阴性图片300张。阳性图片会提供多个ROI区域,在ROI区域里面标注异常鳞状上皮细胞位置,阴性图片不包含异常鳞状上皮细胞,无标注。初赛讨论的异常鳞状上皮细胞主要包括四类:ASC-US(非典型鳞状细胞不能明确意义),LSIL(上皮内低度病变),ASC-H(非典型鳞状细胞倾向上皮细胞内高度),HSIL(上皮内高度病变)。(特别注明:阳性图片ROI区域之外不保证没有异常鳞状上皮细胞)
在复赛环节,通过线上赛的方式,不允许选手下载数据,在线完成模型训练,同时在线赛也为选手模型的代码复现和成果落地过程中的工程化开发提供支持。复赛预计提供1000份宫颈癌细胞学数据,通过检测多种细胞类别,进一步判断整个细胞学图片的类别。
本次大赛将合理划分训练集和测试集,隐藏测试标注数据作为模型测评依据。初赛的数据分为train和test两部分:train用来给选手训练模型,会提供给选手宫颈癌细胞学图片kfb文件和对应标注json文件,test用来进行评测。标注json文件内容是一个list文件,里面记录了每个ROI区域的位置和异常鳞状上皮细胞的位置坐标(细胞所在矩形框的左上角坐标和矩形宽高)。类别roi表示感兴趣区域,pos表示异常鳞状上皮细胞。json标注文件示例如下:
[{“x”: 33842, “y”: 31905, “w”: 101, “h”: 106, “class”: “pos”},
{“x”: 31755, “y”: 31016, “w”: 4728, “h”: 3696, “class”: “roi”},
{“x”: 32770, “y”: 34121, “w”: 84, “h”: 71, “class”: “pos”},
{“x”: 13991, “y”: 38929, “w”: 131, “h”: 115, “class”: “pos”},
{“x”: 9598, “y”: 35063, “w”: 5247, “h”: 5407, “class”: “roi”},
{“x”: 25030, “y”: 40115, “w”: 250, “h”: 173, “class”: “pos”}]

本次大赛还特别设置附加赛—VNNI赛道,VNNI赛的赛题和复赛一样,但是限定了深度学习训练框架(TensorFlow和MXNet),要求根据intel提供的模型压缩工具进行模型压缩,并在intel提供的VNNI平台上进行推理测评。VNNI赛道在复赛开赛后开放,需要单独报名,只有报名前30只队伍有资格参加比赛,要求必须在10天内提交一次有效结果,否则报名资格取消,其他队伍可以替补继续报名。
本次比赛将从数据安全角度保证医疗数据安全。本次比赛数据集将基于专门的数据安全脱敏软件,所有宫颈癌细胞学影像数据严格按照国际通行的医疗信息脱敏标准,进行脱敏处理,脱敏信息包括:医院信息、患者信息和标注医师信息,所有数据不可溯,切实保障数据安全,保护患者的隐私。

提交说明
参赛者提交多个json文件组成的文件夹打包压缩成ZIP文件,文件夹名自由选定,用英文小写表示(如:tianchi.zip),文件夹内的每个文件对应一个宫颈癌细胞学图片的检测结果,文件名是图像id号(如: T2019_600.json),json文件的内容是一个list文件,每个元素对应检测到的一个异常细胞,依次为包含肿瘤细胞的矩形左上角坐标xy,矩形宽高wh的数值以及置信度p。样例如下:
T2019_600.json
[{“x”: 22890, “y”: 3877, “w”: 396, “h”: 255,“p”: 0.94135},
{“x”: 20411, “y”: 2260, “w”: 8495, “h”: 7683,“p”: 0.67213},
{“x”: 26583, “y”: 7937, “w”: 172, “h”: 128,“p”: 0.73228},
{“x”: 2594, “y”: 18627, “w”: 1296, “h”: 1867,“p”: 0.23699}]

注意:一共有200张测试集,选手需要提交200个预测结果json文件打包的压缩包,即使没有预测出任何异常细胞,也需要提交一个对应空列表json文件。异常细胞字典一共包含5个key,分别是x,y,w,h和p,均为小写。

评估指标
赛题组会初赛采用目标检测任务常用的mAP(mean Average Precision)指标作为本次宫颈癌肿瘤细胞检测的评测指标。我们采用两个IoU阈值(0.3,0.5)分别来计算AP,再综合平均作为最终的评测结果。我们的评测程序参考VOC2010之后的方法(https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py)。
具体地,对于每张宫颈癌细胞学图片,参赛选手通过检测模型输出整张图像多个预测框位置和置信度,我们后台评测算法会随机生成一些ROI区域,且只在ROI区域中计算mAP。
AP计算过程:首先固定一个IoU阈值,计算每个预测框和真实标签的IoU大小,根据阈值判断预测框是否正确。然后在对预测框根据置信度排序,设定不同的置信度阈值得到一系列召回率和精确率值,在不同的召回率下对准确率求平均,即为AP。
Recall(召回率)=TP/(TP+FN)
Precision(精确率)=TP/(TP+FP)

START
1.由于原始数据不规则,json文件中ROI区域和POS区域混杂,并且训练集中阳性数据不需要讨论ROI以外的区域,故考虑先分割出ROI区域图,并固定此ROI,将对应的POS画出。并且由于原图过大,考虑在不读取原图数据的前提下,直接裁剪出ROI区域。

以下是分离json的程序。用来将ROI的信息规则化。需要注意的是,
json_file = open(json_path).read()
json_list = json.loads(json_file)

load可以把字符串转变成List,而List中包含着字典,这种形式方便索引。

1、分离JSON的每个ROI和对应的JSON文件

import time
import json
import os


start_time = time.time()
def paid_time(start_time,end_time):
    paid_time = end_time - start_time
    return print(f'it cost{paid_time}s ')

def judge_inRoi(name):
    json_path = f'E:/ali_cervical_carcinoma_data/labels/{name}.json'
    print('json_path is: ',json_path)
    print(f'reading filename is pos_0/{name}.kfb \n')
    json_file = open(json_path).read()
    json_list = json.loads(json_file) #字符串转为List里面包含一个字典

    # 将pos和roi坐标分类
    pos_list =[]
    roi_list =[]
    for i in range(0,len(json_list)):

        if json_list[i]['class'] == 'roi':

            roi_list.append(json_list[i])
        elif json_list[i]['class'] == 'pos':

            pos_list.append(json_list[i])
        else:
            print('there are something wrong')
            continue

    #计算右下角
    for i in range(0,len(roi_list)):
        corres_list = []
        corres_list.append(roi_list[i])
        Roi_range_x = roi_list[i]['x']
        Roi_range_y = roi_list[i]['y']
        Roi_range_w = roi_list[i]['w']
        Roi_range_h = roi_list[i]['h']
        rightpoint_x = Roi_range_x +Roi_range_w
        rightpoint_y = Roi_range_y +Roi_range_h
        for j in range(0,len(pos_list)):
            pos_range_x = pos_list[j]['x']
            pos_range_y = pos_list[j]['y']
            #判断某个POS是否在当前循环的ROI内部
            if Roi_range_x<pos_range_x<rightpoint_x and Roi_range_y<pos_range_y<rightpoint_y:
                corres_list.append(pos_list[j])
        jsondata = json.dumps(corres_list)
        f = open(os.path.join(r'E:/ali_cervical_carcinoma_data/corres_labels_0to',f'{name}_Roi{i}.json'),'w')
        f.write(jsondata)
        f.close()

scale = 20

for number in range(0,10):
    root = f'E:/ali_cervical_carcinoma_data/pos_{number}'
    all = os.walk(root)
    for _,_,filelist in all:
        for filename in filelist:
            name = filename[:-4]
            path = f'E:/ali_cervical_carcinoma_data/pos_{number}/{name}.kfb'
            judge_inRoi(name)

#不直接输出数值,将pos_0内的ROI和Pos都分开成了若干份json

end_time = time.time()
paid_time(start_time,end_time)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

2、利用已经分离好的ROI-POS文件,切割出ROI区域,并绘制图片。

import kfbReader
import json
import os
import cv2 as cv
import time

total_time  = 0

#计算相对坐标
def caculate_relative_position(Roi_x,Roi_y,
                               Pos_x,Pos_y,):
    relative_x = Pos_x - Roi_x
    relative_y = Pos_y - Roi_y
    return relative_x,relative_y


# 选中Roi且画框,向函数传递正在处理的labels文件名和相应的json的List
def draw_rectangle(labels_filename, corres_json_list, total_time):
    start_time = time.time()  # 完成画一张图记一次时间
    filename = labels_filename[:-10] + '.kfb'
    Roi_x = corres_json_list[0]['x']
    Roi_y = corres_json_list[0]['y']
    Roi_w = corres_json_list[0]['w']
    Roi_h = corres_json_list[0]['h']
    # 实例化reader类
    path = os.path.join(kfb_image_root, filename)
    image = kfbReader.reader()
    kfbReader.reader.ReadInfo(image, path, Scale, True)

    # 实例化后,按照说明文档的方法,读取kfb格式文件的Roi区域
    draw = image.ReadRoi(Roi_x, Roi_y, Roi_w, Roi_h, scale=20)  # 这个sacle将读取的ROI对应到相应倍数上,影响大
    # 将所有的pos遍历,画在同一张Roi上面
    for i in range(1, len(corres_json_list)):
        Pos_x = corres_json_list[i]['x']
        Pos_y = corres_json_list[i]['y']
        Pos_w = corres_json_list[i]['w']<
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/413946
推荐阅读
相关标签
  

闽ICP备14008679号