DeepVariant는 DNA 시퀀스에서 RGB 이미지를 어떻게 구성합니까?
DeepVariant 는 DNA 시퀀싱 데이터에서 유전자 변이를 호출하는 파이프 라인입니다.
CNN을 공급하기 전에 중요한 단계는 이러한 DNA 시퀀스를 이미지로 변환하는 것입니다. Google 이 DNA 데이터에서 RGB 이미지 를 구성하는 이유와 방법은 명확하지 않습니다 . 분명히 DNA는 문자 {A, T, C, G}가있는 알파벳 위의 문자열입니다.
단위 테스트 의 소스 코드를 기반으로 매핑 이 어떻게 작동 하는지 이해하기조차 어렵습니다 .
논문의 그림에서 A는 빨간색, C는 녹색, G는 파란색, T는 노란색 (G + R)이지만 3xNxN
이미지 를 구성하는 방법은 아직 명확하지 않습니다 .
Google 블로그 에서 수정 :
이 기사에서는 6 개의 채널을 연속으로 보여 주지만 DeepVariant에서는 3 차원에서 6 개의 레이어로 인코딩되어 각 텐서에 (높이, 너비, 채널)에 해당하는 (100, 221, 6) 모양을 제공합니다. 문제의 변형은 항상 각 누적 이미지의 중앙에 있으며 여기에서는 상단에 작은 선이 표시됩니다.
채널은 다음 순서로 아래 회색조로 표시됩니다.
읽기 기반 : 다른 강도는 A, C, G 및 T를 나타냅니다.
기본 품질 : 시퀀싱 머신에서 설정합니다. 흰색이 더 높은 품질입니다.
매핑 품질 : 정렬 기에서 설정합니다. 흰색이 더 높은 품질입니다.
정렬 가닥 : 검은 색은 앞쪽입니다. 흰색은 반대입니다.
읽기 지원 변형 : 흰색은 읽기가 주어진 대체 대립 유전자를 지원함을 의미하고 회색은 지원하지 않음을 의미합니다.
기준이 기준과 다름 : 흰색은 기준이 기준과 다름을 의미하고 진한 회색은 기준이 기준과 일치 함을 의미합니다.

답변
실제로 신문은 그들이 어떻게했는지 분명히했습니다. 보충 자료를 더 자세히 읽어야합니다.
논문의 그림에서 A는 빨간색, C는 녹색, G는 파란색, T는 노란색 (G + R)이지만 3xNxN 이미지가 어떻게 나타나는지 아직 명확하지 않습니다.
RGB에서 각 차원은 NxN 이미지입니다. 3 차원이 있으므로 3xNxN입니다. 빨간색 차원은 뉴클레오티드 염기를 인코딩하는 데 사용되었습니다. 녹색 차원은 품질 점수를 인코딩하는 데 사용되었습니다. 마지막으로 파란색 차원을 사용하여 가닥 정보를 인코딩했습니다.
분명히 DNA는 문자 {A, T, C, G}가있는 알파벳 위의 문자열입니다.
이것은 쉬워요. 많은 방법. 원-핫 인코딩 또는 DeepVariant가 사용한 것을 수행 할 수 있습니다.
def get_base_color(base):
base_to_color = {'A': 250, 'G': 180, 'T': 100, 'C': 30}
return base_to_color.get(base, 0)
Devon Ryan의 의견에서 언급 한 보충 자료 를 기반으로합니다 .
DeepVariant의 두 번째 단계에서는 각 후보 변형에 대한 참조 및 읽기 지원을 RGB 이미지로 인코딩합니다. 이 구성 요소의 의사 코드는 다음과 같습니다. 여기에는 이미지를 구축하기위한 모든 주요 작업이 포함되어 있으며, 명확한 오류 처리를 위해 생략하고, 변이가 염색체의 시작 또는 끝 근처에서 발생하는 경우와 같은 가장자리 케이스를 처리하는 코드, 비 필수적 및 / 또는 명백한 구현이 포함됩니다. 기능.
주요 기능은 다음과 같습니다.
WIDTH = 221
HEIGHT = 100;
def create_pileup_images(candidate_variants):
for candidate in candidate_variants:
for biallelic_variant in split_into_biallelics(candidate):
start = biallelic_variant.start - (WIDTH-1) / 2
end = WIDTH - span_start
ref_bases = reference.get_bases(start, end)
image = Image(WIDTH, HEIGHT)
row_i = fill_reference_pixels(ref, image)
for read in reads.get_overlapping(start, end):
if row_i < HEIGHT and is_usable_read(read):
add_read(image, read, row_i)
row_i += 1
yield image
def fill_reference_pixels(ref, image):
for row in range(5):
for col in range(WIDTH):
alpha = 0.4
ref_base = ref[col]
red = get_base_color(ref_base)
green = get_quality_color(60) # The reference is high quality
blue = get_strand_color(True) # The reference is on the positive strand
image[row, col] = make_pixel(red, green, blue, alpha)
return 5